好友
阅读权限 20
听众
最后登录 1970-1-1
本帖最后由 Dustin_Du 于 2020-2-15 20:21 编辑
论坛格式调整比较麻烦,其具体可参考CSDN文章,望各位海涵,用户名相同
一、 概述
众所周知 WinRAR 是一款功能强大的压缩包管理器,作为档案工具 RAR 在 Windows 环境下,可用于备份数据、压缩文件、解压 RAR/ZIP 等格式的文件、创建 RAR/ZIP 等格式的压缩文件,得到了较为广泛的应用。 2019 年 2 月 20 日, Check Point 团队爆出了一个关于 WinRAR 存在 19 年的漏洞,不法分子可用利用该漏洞取得受害者计算机的控制权限。该团队经过深入研究检测相继发现了 WinRAR 的四个安全漏洞,分别为 ACE 文件验证逻辑绕过漏洞( CVE-2018-20250 )、 ACE 文件名逻辑验证绕过漏洞( CVE-2018-20251 )、 ACE/RAR 文件越界写入漏洞( CVE-2018-20252 )以及 LHA/LZH 文件越界写入漏洞( CVE-2018-20253 )。漏洞攻击者可利用上述漏洞,通过诱使用户使用 WinRAR 打开恶意构造的压缩包文件,将恶意代码写入系统启动目录或者写入恶意 dll 劫持其他软件进行执行,实现对用户主机的任意代码执行攻击。 国家信息安全漏洞共享平台( CNVD )对上述漏洞的综合评级为 “ 高危 ” ,并于 2019 年 2 月 21 日收录该系列漏洞( CNVD-2019-04911 、 CNVD-2019-04912 、 CNVD-2019-04913 和 CNVD-2019-04910 ,分别对应 CVE-2018-20250 、 CVE-2018-20251 、 CVE-2018-20252 和 CVE-2018-20253 ),同时向外界发出安全公告。
二、漏洞介绍
CVE-2018-20250 漏洞的发现在科技界引起了异常轩然大波,尽管这个漏洞的利用条件很有限,实际危害并不是很高,然而令人恐惧的是这个漏洞已经遗留了 19 年,并且影响到全球 5 多亿的 WinRAR 用户。究其漏洞产生的根本原因,发现问题的关键在于 5.70 Beta 1 之前版本的 WinRAR 使用了陈旧的动态链接库 unacev2.dll 。该动态链接库的编译时间为 2005 年,在处理 ACE 格式文件过程中发挥作用,然而却无任何的基础保护机制 (ASLR, DEP 等 ) 。所以当使用 WinRAR 对恶意构造的 ACE 文件进行解压操作时,由于没有对文件名进行充分过滤,产生了 “ 目录穿越 ” 现象,其中隐藏的恶意文件可以实现被写入计算机的任意目录下,甚至可以写入开机启动项中,导致恶意文件的执行。经研究发现这种漏洞的影响非常广,其影响范围包括:
发布时间早于 5.70 Beta 1 版本的 WinRAR 软件; 使用 unacev2.dll 动态共享库的解压、文件管理类工具软件。
结合腾讯玄武实验室后续的检测结果,可以发现除 WinRAR 软件外,还包括 6.2.0.0 以及之前版本的 Bandizip 压缩工具, 5.9.8.10907 以及之前版本的 2345 好压,早于 4.0.0.1170 版本的 360 压缩等共计 38 款压缩软件此漏洞影响。但好在相关的平台,厂商,软件提供商都在第一时间站了出来,积极应对该系列漏洞,目前网络上漏洞利用原理已公开,厂商也已发布新版本修复此漏洞。 仔细品位,可发现 CVE-2018-20250 此种漏洞思路比较简单,在实际利用过程中简单易用,因此备受病毒黑色产业的青睐。但 WinRAR unacev2.dll 任意代码执行漏洞利用还存在一个明显的不足,即需要受害者重启系统后恶意代码才能得以执行。在腾讯安全御见威胁情报中心对该类型漏洞攻击的后期监控中,发现攻击者对 WinRAR 漏洞利用的手段进行了升级创新,一定程度上减少了对受害者主动重启系统的依赖,同时确保恶意木马能在第一时间启动,如比较有名的 Lime-RAT 远控木马,该远控木马的功能十分强大,可通过修改配置信息或者接收 C2 服务器( C&C 的缩写,远程命令和控制服务器)指令,以实现文件加密勒索、挖矿和下载其他恶意组件等功能。此外木马还可以监视剪切板,当检测到受害者主机进行数字货币交易时,直接替换钱包地址达到抢钱目的,对比特币矿工及数字加密币交易的人群危害极大。
三、 漏洞分析
3.1 unacev2.dll 任意代码执行漏洞缺陷概述
1
图 1 常见攻击方式
该种方式是比较简单常见的攻击方式,攻击者利用此漏洞构造恶意的压缩文件,当被攻击者在不知情的情况下对其解压释放时,解压软件需要对解压目标的相对路径进行解析。此时 unacev2.dll 中的 CleanPath 函数因存在过滤不严导致目录穿越漏洞,隐藏其中的恶意木马将被写至开机启动项,最终用户重启电脑时将促成恶意木马的执行。 因此为了该漏洞的深层原因,我们需要探究 unacev2.dll 的使用细节,通过对其进行代码逆向,发现两个关于 ACE 文件归档提取的关键函数:初始化函数 ACEInitDll 和提取函数 ACEExtract 。然而在 IDA 中难以查看这两个函数的参数定义,于是另辟蹊径在 github 中找到了一个同样使用这种结构的开源项目 FarManager ,该项目使用此 dll 另外该项目的创建者也是 WinRAR 的创建者,具有较高的可信度。 下载完毕后通过使用 sourceinsight 程序编辑器打开Github中的开源 FarManager 工程,快速搜索关于 ACEInitDll 和 ACEExtract 的具体定义,其结果如下图,本文仅展示函数在项目中的大概位置,具体定义读者可自行实践获得:
2
图2 ACEInitDll函数定义
3
图3 ACEExtract函数定义
其中 pACEInitDllStruc 指针结构体比较关键,需要重点注意一下:
4
图4 pACEInitDllStruc指针结构体定义
结合 Check Point 团队发布的漏洞原理解析文章,下面结合 IDA 静态分析对 unacev2.dll 进行深入研究,重点关注以下四个关键函数: CleanPath 、 GetDevicePathLen 函数、 WinRAR Validators/Callbacks 回调函数以及触发目录遍历漏洞的 sprintf 函数。
3.2 CleanPath 关键函数分析
下面是关于 CleanPath 函数的伪代码:
5
图5 CleanPath函数伪代码
1. 如果Path的第2、3个字符为“:”、“\”,那么将Path第4个字符之前的部分清除。
2. 如果Path的第2个字符为“:”,第3个字符不为“\”,那么将Path第3个字符之前的部分清除。
3. 在Path中寻找“..\”出现的位置,PathTraversalPos将指向此位置。若找到,执行4;否则执行7。
4. 如果PathTraversalPos指向的位置正是Path开始的位置(e.g...\some_folder\some_file.ext)或者PathTraversalPos指向位置的前一个字符是“\”,执行5;否则,执行6。
5. 将Path第4个字符之前的部分清除,继续在Path中寻找“..\”出现的位置,若找到,执行4;否则,执行7。
6. 在Path+1处向后寻找“..\”出现的位置,若找到则执行步骤4;否则执行7。
7. 返回Path。
这段伪代码的大概流程可描述为: 由分析可知该函数的作用为过滤一定格式的路径序列,如盘符名 :\ 是在步骤 1 被清除掉的,盘符名 : 是在步骤 2 被清除掉的;盘符名 :\ 盘符名 : 是通过步骤 1 和步骤 2 两个步骤清除掉的;而 \..\ 是在步骤 5 被清除掉的。
3.3 GetDevicePathLen 关键函数分析
下面是关于 GetDevicePathLen 函数的伪代码:
6
图6 GetDevicePathLen函数伪代码
这段伪代码的大概流程可描述为:
1.如果Path中第1个字符为“\”,执行2;否则,执行7。
2.如果Path中第2个字符为“\”,执行3;否则,执行6。
3.如果在Path第3个字符之后没有找到“\”,返回0;否则将SlashPos指向此位置。
4.如果在SlashPos+1之后没有找到“\”,返回0;否则将SlashPos指向此位置。
5.将SlashPos指向位置减去Path指向位置再加1赋值给Result,然后执行步骤9。
6.Result赋值为1,然后执行9。
7.如果Path第2个字符为“:”,Result赋值为2。
8.如果Path第3个字符为“\”,Result值加1。
9.返回Result。
由分析可知该函数的作用为检查文件的相对路径即Path,Result将作为结果表示相对路径的长度返回。可以将Result取值有两种情况:非0和0。
例子如下:l 待检查路径为C:\some_folder\some_file.ext则函数返回值3
l 待检查路径为\some_folder\some_file.ext则函数返回值1
l 待检查路径为some_folder\some_file.ext则函数返回值0
3.4 WinRAR Validators/Callbacks回调函数分析
下面是关于WinRAR Validators/Callbacks回调函数的伪代码:
7
图7 WinRAR Validators/Callbacks回调函数伪代码
其中return返回的为宏定义常量,具体含义可参考FarManager项目中的定义说明。
8
图8 宏定义常量定义
由分析可知该函数会对待提取文件的相对路径进行检查(其中伪代码里“SourceFileName”表示待提取文件的相对路径),确保路径满足以下条件:
1.第一个字符不等于“\”或“/”;
2.文件名不以字符串“..\”或“../”开头;
3.字符串中不存在“\..\”、“\../”、“/../”或“/..\”。
3.5 触发目录遍历漏洞的sprintf函数
9
图9 触发目录遍历漏洞的sprintf函数在IDA中的位置
在IDA中最终定位到产生漏洞的真正元凶,即红圈中的sprintf函数。在loc_40CC32基本块的上方有两个分支,而GetDevicePathLen的函数的调用结果影响着代码流的走向。
如果调用GetDevicePathLen的结果等于0,则执行:
9-1
反之,则执行:
9-2
而最后一个sprintf即是触发目录遍历漏洞的错误代码,这意味着相对路径实际上将被视为应写入/创建的文件/目录的完整路径。
3.6 漏洞利用思路
经过对解压过程中unacev2.dll中起作用的若干关键函数模块的分析,我们便可尝试构造攻击向量,构造思路如下图所示:
10
图10 攻击向量构造思路
通过该思路我们可以找到一个找到了一个向量,它允许我们将文件提取到系统自启动文件夹,而无需关心用户名。下面我们正向分析它:
10-1
先由CleanPath函数过滤转换为下列路径,再次过程中删除了“C:\C:”:
10-2
接着由GetDevicePathLen函数验证路径序列得到返回2,故此目标文件夹将被忽略,将触发目录遍历漏洞的sprintf函数。 接着由WinRAR的回调函数对解压目标路径进行验证:
参考3.4中的验证条件可发现上面得到最终路径可以绕过路径遍历验证。但是只能回退一个文件夹。而我们需要在不知道用户名的情况下将文件解压缩到目标系统自启文件夹。
如果从WinRAR安装目录中启动解压软件,则“当前目录”将是:
10-3
然而通过双击存档文件或右键单击存档文件中的“extract”来执行WinRAR,则WinRAR的“当前目录”将成为存档所在文件夹的路径。
例如,如果存档位于用户的“下载”文件夹中,则WinRAR的“当前目录”将为:
10-4
如果存档位于Desktop文件夹中,则“当前目录”路径将为:
10-5
所以当在桌面或是在下载文件夹中进行解压操作时将得到最终路径为:
10-6
四、漏洞实例分析与验证
对该漏洞的利用攻击不能跨盘符,即受害者进行解压文件触发漏洞时,必须在系统盘,且在不知道计算机主机名的情况下,只能在主浏览器的默认下载路径下(C:\Users\Administrator\Downloads)或者桌面进行解压,或者多猜几个启动项路径。另外产生漏洞的DLL文件即UNACEV2.DLL,不能识别相对路径,所以漏洞利用条件还包括其文件名部分必须为绝对路径。以下是几种操作系统下的开机启动项路径,可以发现在个人PC上由于用户名的多样性故难以猜测到准确的路径,而服务器上用户名一般为Administrator,所以这个漏洞在服务器上利用度比较高。
表1 不同操作系统下的开机启动项路径Win2003
C:\Documents and Settings\Administrator\「开始」菜单\程序\启动
Win2008
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup
Win2012
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup
Win7
C:\Users\用户 \AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup
Win10
C:\Users\用户\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup
本次试验使用的是Win7操作系统。
4.1 UNACEV2.dll校验CRC引发漏洞
漏洞主要是由Winrar用来解压ACE文件时使用的动态链接库UNACEV2.dll引起的,UNACEV2.dll在处理filename时只校验了CRC。故我们可以通过使用010Editor修改filename将恶意文件解压到启动目录,但是在修改完成后,CRC校验会失败,所以我们还要再去修改CRC,具体过程请见下面的分析。首先列出本次实验的工具清单: 工具清单 虚拟机 VMware Workstation11.0.0
系统镜像 Win7家庭版
WinRAR 5.60 简体中文版 https://www.rarlab.com/rar/winrar-x64-560sc.exe
Python-3.7.2-amd64.exe https://www.python.org/ftp/python/3.7.2/python-3.7.2-amd64.exe
010Editor https://download.sweetscape.com/010EditorWin64Installer901.exe
Wace 和模板文件 https://github.com/360-A-Team/CVE-2018-20250
EXP https://github.com/WyAtu/CVE-2018-20250
一切软件安装完毕后,下面正式进入实验部分:
创建一个简单的bat文件,最终的漏洞利用便是将该文件写入系统启动项中:
11
使用WinACE对1.bat进行压缩,选择store full path模式,得到文件1.ace:
12
使用https://github.com/WyAtu/CVE-2018-20250中的acefile.py脚本检查文件1.ace的header信息:
13
红色部分为需要修改的内容,同时使用010Editor打开1.ace,对比可知(该ace文件为小端模式):
14
第一个红色框内为:hdr_crc的值:0xC98C;第二个红色框内为:filename即文件的名字,包括其路径。前面的0x001A为filename的长度,十进制为26。
15
红色框内为:hdr_size,代表头部大小,值为0x0039表示其头部大小57。 复制启动项目录路径,并在ace文件中修改:
16
稍作修改:
17
18
修改filename的长度:
19
修改hdr_size:
20
使用acefile.py解析ace文件,可以看到报错,需要修改hdr_crc:
21
22
使用acefile.py脚本检查文件1.ace的header信息:
23
修改完毕后另存为1.rar(实际上不该也行,即下一步直接解压1.ace):
24
选择解压到当前文件夹或解压到文件夹1都可以,可以看到bat文件成功解压到开机启动项里。
25
重启电脑发现自动运行bat文件弹窗。
26
4.2 msf利用
msf是一个免费的、可下载的框架,它本身附带数百个已知软件漏洞的专业级漏洞攻击工具,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。结合CVE-2018-20250漏洞,本小节实验将实现后门程序的植入,从而复现一次比较有危害性的攻击,具体实验环境如下: 工具清单 虚拟机 VMware Workstation11.0.0
系统镜像 1 Win7家庭版
Win7 ip 192.168.116.147
系统镜像 2 kali-linux-2018.4-amd64.iso
内核版本 2 4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux
Kali ip 192.168.116.128
首先在kali环境下生成目标机器的后门程序,需要知道目标机器ip地址:
27
接着拿到shell.exe后门程序后构造压缩文件,可参考4.1节中恶意压缩文件的构造过程。对构造后的文件使用acefile.py脚本检查其header信息:
28
对改造后的shell.ace文件选择解压到当前文件夹或解压到文件夹shell都可以,可以看到bat文件成功解压到开机启动项里。
29
在kali中进入msfconsole,加载exploit/multi/handler模块:
30
设置本地主机ip地址及监听端口,然后尝试攻击监听exploit :
31
32
重启win7,发现kali中已渗透成功,拿到目标机器shell:
33
34
35
五、 心得体会
在分析漏洞过程中,查阅了各种资料,本身漏洞利用机制比较容易理解,但是真正的利用原理是比较复杂的,需要阅读相关项目的代码以及需要在IDA中找到关键函数。结合文档和静态分析结果基本能把基本的逻辑搞明白,剩下的实践过程相对比较简单。经过岁月的洗礼,如今在网上搜索WinRAR漏洞利用案例,可发现其利用手段在富有想象力与能动力的黑客手中已经更新出了很多版本。挑选两个比较典型的升级版攻击利用手段如下所示:
36
37
通过对该漏洞的分析实践,笔者对解压软件中的一些模块具有了更深的了解,特别在对WinRAR创建者的FarManager项目源码阅读过程中收获颇丰。而对于漏洞攻击利用的升级版本,由于时间有限没有来得及深入研究,但隐约之中感觉到漏洞的利用手段在一定程度上具有相通之处,后续仍需钻研学习之。
参考资料
[1]Extracting a 19 Year Old Code Execution from WinRARhttps://research.checkpoint.com/extracting-code-execution-from-winrar/
[2] WinRAR目录穿越漏洞浅析及复现(CVE-2018-20250)https://mp.weixin.qq.com/s/KbDliC2e0_bkFFur4nx-LQ
[3] WinRAR漏洞CVE-2018-20250攻击样本分析 http://www.52bug.cn/hkjs/5732.html
[4] CVE-2018-20250 winrarhttps://www.cnblogs.com/threesoil/p/10534280.html
[5] [CVE-2018-20250]WinRAR漏洞浅谈https://www.landui.com/help/show-9239
[6] [漏洞复现]WinRAR目录穿越漏洞(CVE-2018-20250)复现https://www.cnblogs.com/fox-yu/p/10495236.html
[7] Metasploit使用后门程序渗透Windows7http://www.myhack58.com/Article/html/3/8/2015/65031.htm
[8] 成功获取WinRAR 19年历史代码执行漏洞https://www.360zhijia.com/anquan/444960.html
[9] FarManager项目https://github.com/FarGroup/FarManager
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。