Skip to content

Instantly share code, notes, and snippets.

@notxesh
Created April 13, 2022 06:59
Show Gist options
  • Save notxesh/94e84ce6ccb9735e965e94dccae29d08 to your computer and use it in GitHub Desktop.
Save notxesh/94e84ce6ccb9735e965e94dccae29d08 to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
# Raw Python3 memcache dumper
# Handy for internals ;)
import sys
from socket import socket, AF_INET, SOCK_STREAM
ip = sys.argv[1] if len(sys.argv)>1 else None
port = int(sys.argv[2]) if len(sys.argv)>2 else 11211
if ip == None:
print('ERROR: No IP specified')
print('USAGE: python3 ' + sys.argv[0] + ' <ip> <port/11211>')
sys.exit(1)
def recvall(sock):
BUFF_SIZE = 4096 # 4 KiB
data = b''
while True:
part = sock.recv(BUFF_SIZE)
data += part
if data[::-1][:5:][::-1] == b'END\r\n':
break
return data
def get_item_numbers(data):
items = []
data = data.decode().split('\r\n')
items = list(set([x.split(':')[1] for x in data if ':' in x]))
return items
def get_item_keys(numbers, sock):
keys = []
for i in numbers:
sock.sendall(bytes(f"stats cachedump {i} 1000\n", 'utf-8'))
d = recvall(s)
keys.append(d.decode().split(' ')[1])
return list(set(keys))
def dump(keys, sock):
for key in keys:
sock.sendall(bytes(f"get {key}\n",'utf-8'))
d = recvall(sock)
d = d.split(b'\r\n')[1]
print(key)
try:
print(d.decode())
except:
print(d)
with socket(AF_INET, SOCK_STREAM) as s:
s.connect((ip, port))
# Get the items from memcahced
s.sendall(b"stats items\n")
d = recvall(s)
# Parse the numbers out of the data dump
numbers = get_item_numbers(d)
keys = get_item_keys(numbers, s)
dump(keys, s)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment