【漏洞详情】

这是一个存在于WinRAR上的漏洞,用它来可以获得受害者计算机的控制。攻击者只需利用此漏洞构造恶意的压缩文件,当受害者使用WinRAR解压该恶意文件时便会触发漏洞。该漏洞是由于WinRAR所使用的一个陈旧的动态链接库UNACEV2.dll所造成的,没有任何的基础保护机制(ASLR,DEP等)。动态链接库的作用是处理ACE格式文件。而WinRAR解压ACE文件时,由于没有对文件名进行充分过滤,导致其可实现目录穿越,将恶意文件写入任意目录,甚至可以写入文件至开机启动项,导致代码执行。

【验证工具】

WinACE

WinRAR 5.6

Hex Editor Neo

Acefile.py

【影响版本】

影响版本:

WinRAR < 5.70 Beta 1

Bandizip < = 6.2.0.0

好压(2345压缩) < = 5.9.8.10907

360压缩 < = 4.0.0.1170

【验证详情】

  • 验证条件

  • 验证过程

    • 首先在桌面上创建一个普通的txt文件。

    • 下载安装WinACE进行压缩,这里选中store full path以保存完整路径。

    • 使用acefile脚本查看ace文件的header信息,脚本地址为

      1
      https://github.com/droe/acefile/blob/master/acefile.py
    • 执行命令

      1
      python3 poc.py --headers /Volumes/\[C\]\ Windows\ 7/Users/lllh/Desktop/test.ace

    • 使用16进制编辑器打开该ace文件。下面结合acefile.py给出的header信息理解ace文件各部分内容的含义。
      下面第一个圈对应的是hdr_crc也就是一个校验和,值为0x85e1;第二个圈是hdr_size,也就是从hdr_size到文件内容前这一段的长度,值为0x003a;第三个圈是filename的长度,值为0x001b;第四部分是filename。

    • 该漏洞的利用思路是通过修改文件名,形成目录穿越漏洞,将恶意文件写入任意目录,因此这里目标是修改filename段。修改完filename,需要再依次向前修改文件头,使得文件可用。

    • 首先把filename修改为c:\c:\test.txt。该filename长度为14,即16进制的0x0e,因此修改文件中的filename长度字段为0e 00

    • 然后修改hdr_size,为下图中选中部分,长度是45,即16进制的0x2d。修改下图圈中字段为2d 00

    • 下一步修改hdr_crc。首先通过之前的脚本,查看该文件现在正确的hdr_crc值。直接执行该脚本,会报错。

    • 在源代码里定位header CRC failed

    • 这里ace_crc16(buf)的值就是ace文件hdr_cr对应的值,直接打印出该值并将该位置的值修改即可。

    • 对应的值为2227,即16进制的0x08b3。修改文件中对应的值为b3 08

    • 最终的文件内容为

    • 再次执行脚本,可以正常解析,并看到filename已经修改成功。

    • 由于我将文件穿越路径设为C盘根目录,这个目录需要管理员权限才能写入,因此需要以管理员身份打开WinRAR,然后解压缩此ace文件到任意目录,可以在C盘根目录下看到生成了test.txt。漏洞复现完成。

【漏洞修复】

  • WinRAR升级到5.70 Beta 1

  • 删除UNACEV2.dll文件