目录
一、概述
二、漏洞介绍
三、漏洞分析
3.1 unacev2.dll任意代码执行漏洞缺陷概述
3.2 CleanPath关键函数分析
3.3 GetDevicePathLen关键函数分析
3.4 WinRAR Validators/Callbacks回调函数分析
3.5 触发目录遍历漏洞的sprintf函数
3.6 漏洞利用思路
四、漏洞实例分析与验证
4.1 UNACEV2.dll校验CRC引发漏洞
4.2 msf利用
五、心得体会
参考资料
众所周知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文件进行解压操作时,由于没有对文件名进行充分过滤,产生了“目录穿越”现象,其中隐藏的恶意文件可以实现被写入计算机的任意目录下,甚至可以写入开机启动项中,导致恶意文件的执行。经研究发现这种漏洞的影响非常广,其影响范围包括:
结合腾讯玄武实验室后续的检测结果,可以发现除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的缩写,远程命令和控制服务器)指令,以实现文件加密勒索、挖矿和下载其他恶意组件等功能。此外木马还可以监视剪切板,当检测到受害者主机进行数字货币交易时,直接替换钱包地址达到抢钱目的,对比特币矿工及数字加密币交易的人群危害极大。
图1 常见攻击方式
该种方式是比较简单常见的攻击方式,攻击者利用此漏洞构造恶意的压缩文件,当被攻击者在不知情的情况下对其解压释放时,解压软件需要对解压目标的相对路径进行解析。此时unacev2.dll中的CleanPath函数因存在过滤不严导致目录穿越漏洞,隐藏其中的恶意木马将被写至开机启动项,最终用户重启电脑时将促成恶意木马的执行。
因此为了该漏洞的深层原因,我们需要探究unacev2.dll的使用细节,通过对其进行代码逆向,发现两个关于ACE文件归档提取的关键函数:初始化函数ACEInitDll和提取函数ACEExtract。然而在IDA中难以查看这两个函数的参数定义,于是另辟蹊径在github中找到了一个同样使用这种结构的开源项目FarManager,该项目使用此dll另外该项目的创建者也是WinRAR的创建者,具有较高的可信度。
下载完毕后通过使用sourceinsight程序编辑器打开FarManager工程,快速搜索关于ACEInitDll和ACEExtract的具体定义,其结果如下图,本文仅展示函数在项目中的大概位置,具体定义读者可自行实践获得:
图2 ACEInitDll函数定义
图3 ACEExtract函数定义
其中pACEInitDllStruc 指针结构体比较关键,需要重点注意一下:
结合Check Point团队发布的漏洞原理解析文章,下面结合IDA静态分析对unacev2.dll进行深入研究,重点关注以下四个关键函数:CleanPath、GetDevicePathLen函数、WinRAR Validators/Callbacks回调函数以及触发目录遍历漏洞的sprintf函数。
下面是关于CleanPath函数的伪代码:
图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被清除掉的。
下面是关于GetDevicePathLen函数的伪代码:
图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。例子如下:
下面是关于WinRAR Validators/Callbacks回调函数的伪代码:
图7 WinRAR Validators/Callbacks回调函数伪代码
其中return返回的为宏定义常量,具体含义可参考FarManager项目中的定义说明。
图8 宏定义常量定义
由分析可知该函数会对待提取文件的相对路径进行检查(其中伪代码里“SourceFileName”表示待提取文件的相对路径),确保路径满足以下条件:
1.第一个字符不等于“\”或“/”;
2.文件名不以字符串“..\”或“../”开头;
3.字符串中不存在“\..\”、“\../”、“/../”或“/..\”。
图9 触发目录遍历漏洞的sprintf函数在IDA中的位置
在IDA中最终定位到产生漏洞的真正元凶,即红圈中的sprintf函数。在loc_40CC32基本块的上方有两个分支,而GetDevicePathLen的函数的调用结果影响着代码流的走向。
如果调用GetDevicePathLen的结果等于0,则执行:
反之,则执行:
而最后一个sprintf即是触发目录遍历漏洞的错误代码,这意味着相对路径实际上将被视为应写入/创建的文件/目录的完整路径。
经过对解压过程中unacev2.dll中起作用的若干关键函数模块的分析,我们便可尝试构造攻击向量,构造思路如下图所示:
图10 攻击向量构造思路
通过该思路我们可以找到一个找到了一个向量,它允许我们将文件提取到系统自启动文件夹,而无需关心用户名。下面我们正向分析它:
先由CleanPath函数过滤转换为下列路径,再次过程中删除了“C:\C:”:
接着由GetDevicePathLen函数验证路径序列得到返回2,故此目标文件夹将被忽略,将触发目录遍历漏洞的sprintf函数。
参考3.4中的验证条件可发现上面得到最终路径可以绕过路径遍历验证。但是只能回退一个文件夹。而我们需要在不知道用户名的情况下将文件解压缩到目标系统自启文件夹。
如果从WinRAR安装目录中启动解压软件,则“当前目录”将是:
然而通过双击存档文件或右键单击存档文件中的“extract”来执行WinRAR,则WinRAR的“当前目录”将成为存档所在文件夹的路径。
例如,如果存档位于用户的“下载”文件夹中,则WinRAR的“当前目录”将为:
如果存档位于Desktop文件夹中,则“当前目录”路径将为:
所以当在桌面或是在下载文件夹中进行解压操作时将得到最终路径为:
对该漏洞的利用攻击不能跨盘符,即受害者进行解压文件触发漏洞时,必须在系统盘,且在不知道计算机主机名的情况下,只能在主浏览器的默认下载路径下(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操作系统。
漏洞主要是由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 |
一切软件安装完毕后,下面正式进入实验部分:
红色部分为需要修改的内容,同时使用010Editor打开1.ace,对比可知(该ace文件为小端模式):
第一个红色框内为:hdr_crc的值:0xC98C;
第二个红色框内为:filename即文件的名字,包括其路径。前面的0x001A为filename的长度,十进制为26。
红色框内为:hdr_size,代表头部大小,值为0x0039表示其头部大小57。
稍作修改:
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 |
在分析漏洞过程中,查阅了各种资料,本身漏洞利用机制比较容易理解,但是真正的利用原理是比较复杂的,需要阅读相关项目的代码以及需要在IDA中找到关键函数。结合文档和静态分析结果基本能把基本的逻辑搞明白,剩下的实践过程相对比较简单。
经过岁月的洗礼,如今在网上搜索WinRAR漏洞利用案例,可发现其利用手段在富有想象力与能动力的黑客手中已经更新出了很多版本。挑选两个比较典型的升级版攻击利用手段如下所示:
通过对该漏洞的分析实践,笔者对解压软件中的一些模块具有了更深的了解,特别在对WinRAR创建者的FarManager项目源码阅读过程中收获颇丰。而对于漏洞攻击利用的升级版本,由于时间有限没有来得及深入研究,但隐约之中感觉到漏洞的利用手段在一定程度上具有相通之处,后续仍需钻研学习之。
[1]Extracting a 19 Year Old Code Execution from WinRAR
https://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 winrar
https://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使用后门程序渗透Windows7
http://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