CVE--漏洞实战分析之目录穿越篇

时间:2024-03-14 17:29:48

目录

 

一、概述

二、漏洞介绍

三、漏洞分析

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文件进行解压操作时,由于没有对文件名进行充分过滤,产生了“目录穿越”现象,其中隐藏的恶意文件可以实现被写入计算机的任意目录下,甚至可以写入开机启动项中,导致恶意文件的执行。经研究发现这种漏洞的影响非常广,其影响范围包括:

  • 发布时间早于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任意代码执行漏洞缺陷概述

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                                图1 常见攻击方式

该种方式是比较简单常见的攻击方式,攻击者利用此漏洞构造恶意的压缩文件,当被攻击者在不知情的情况下对其解压释放时,解压软件需要对解压目标的相对路径进行解析。此时unacev2.dll中的CleanPath函数因存在过滤不严导致目录穿越漏洞,隐藏其中的恶意木马将被写至开机启动项,最终用户重启电脑时将促成恶意木马的执行。

因此为了该漏洞的深层原因,我们需要探究unacev2.dll的使用细节,通过对其进行代码逆向,发现两个关于ACE文件归档提取的关键函数:初始化函数ACEInitDll和提取函数ACEExtract。然而在IDA中难以查看这两个函数的参数定义,于是另辟蹊径在github中找到了一个同样使用这种结构的开源项目FarManager,该项目使用此dll另外该项目的创建者也是WinRAR的创建者,具有较高的可信度。

下载完毕后通过使用sourceinsight程序编辑器打开FarManager工程,快速搜索关于ACEInitDll和ACEExtract的具体定义,其结果如下图,本文仅展示函数在项目中的大概位置,具体定义读者可自行实践获得:

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                                 图2 ACEInitDll函数定义

 

 

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                              图3 ACEExtract函数定义

其中pACEInitDllStruc 指针结构体比较关键,需要重点注意一下:

CVE-2018-20250漏洞实战分析之目录穿越篇
                                                                        图4 pACEInitDllStruc指针结构体定义

结合Check Point团队发布的漏洞原理解析文章,下面结合IDA静态分析对unacev2.dll进行深入研究,重点关注以下四个关键函数:CleanPath、GetDevicePathLen函数、WinRAR Validators/Callbacks回调函数以及触发目录遍历漏洞的sprintf函数。

3.2 CleanPath关键函数分析

下面是关于CleanPath函数的伪代码:

 

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                            图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函数的伪代码:

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                       图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。例子如下:

  • 待检查路径为C:\some_folder\some_file.ext则函数返回值3
  • 待检查路径为\some_folder\some_file.ext则函数返回值1
  • 待检查路径为some_folder\some_file.ext则函数返回值0

3.4 WinRAR Validators/Callbacks回调函数分析

下面是关于WinRAR Validators/Callbacks回调函数的伪代码:

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                    图7 WinRAR Validators/Callbacks回调函数伪代码

其中return返回的为宏定义常量,具体含义可参考FarManager项目中的定义说明。

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                              图8 宏定义常量定义

由分析可知该函数会对待提取文件的相对路径进行检查(其中伪代码里“SourceFileName”表示待提取文件的相对路径),确保路径满足以下条件:

1.第一个字符不等于“\”或“/”;

2.文件名不以字符串“..\”或“../”开头;

3.字符串中不存在“\..\”、“\../”、“/../”或“/..\”。

3.5 触发目录遍历漏洞的sprintf函数

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                        图9 触发目录遍历漏洞的sprintf函数在IDA中的位置

在IDA中最终定位到产生漏洞的真正元凶,即红圈中的sprintf函数。在loc_40CC32基本块的上方有两个分支,而GetDevicePathLen的函数的调用结果影响着代码流的走向。

如果调用GetDevicePathLen的结果等于0,则执行:

CVE-2018-20250漏洞实战分析之目录穿越篇

反之,则执行:

CVE-2018-20250漏洞实战分析之目录穿越篇

而最后一个sprintf即是触发目录遍历漏洞的错误代码,这意味着相对路径实际上将被视为应写入/创建的文件/目录的完整路径。

3.6 漏洞利用思路

经过对解压过程中unacev2.dll中起作用的若干关键函数模块的分析,我们便可尝试构造攻击向量,构造思路如下图所示:

CVE-2018-20250漏洞实战分析之目录穿越篇

                                                                                  图10 攻击向量构造思路

通过该思路我们可以找到一个找到了一个向量,它允许我们将文件提取到系统自启动文件夹,而无需关心用户名。下面我们正向分析它:

CVE-2018-20250漏洞实战分析之目录穿越篇

先由CleanPath函数过滤转换为下列路径,再次过程中删除了“C:\C:”:

CVE-2018-20250漏洞实战分析之目录穿越篇

接着由GetDevicePathLen函数验证路径序列得到返回2,故此目标文件夹将被忽略,将触发目录遍历漏洞的sprintf函数。

  • 接着由WinRAR的回调函数对解压目标路径进行验证:

参考3.4中的验证条件可发现上面得到最终路径可以绕过路径遍历验证。但是只能回退一个文件夹。而我们需要在不知道用户名的情况下将文件解压缩到目标系统自启文件夹。

  • 最后分析文件提取完毕后的路径

如果从WinRAR安装目录中启动解压软件,则“当前目录”将是:

CVE-2018-20250漏洞实战分析之目录穿越篇

然而通过双击存档文件或右键单击存档文件中的“extract”来执行WinRAR,则WinRAR的“当前目录”将成为存档所在文件夹的路径。

例如,如果存档位于用户的“下载”文件夹中,则WinRAR的“当前目录”将为:

CVE-2018-20250漏洞实战分析之目录穿越篇

 

 

CVE-2018-20250漏洞实战分析之目录穿越篇 如果存档位于Desktop文件夹中,则“当前目录”路径将为:

 

CVE-2018-20250漏洞实战分析之目录穿越篇 所以当在桌面或是在下载文件夹中进行解压操作时将得到最终路径为:

 

四、漏洞实例分析与验证

对该漏洞的利用攻击不能跨盘符,即受害者进行解压文件触发漏洞时,必须在系统盘,且在不知道计算机主机名的情况下,只能在主浏览器的默认下载路径下(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文件,最终的漏洞利用便是将该文件写入系统启动项中:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 使用WinACE对1.bat进行压缩,选择store full path模式,得到文件1.ace:

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

红色部分为需要修改的内容,同时使用010Editor打开1.ace,对比可知(该ace文件为小端模式):

CVE-2018-20250漏洞实战分析之目录穿越篇

 

第一个红色框内为:hdr_crc的值:0xC98C;

第二个红色框内为:filename即文件的名字,包括其路径。前面的0x001A为filename的长度,十进制为26。

 

CVE-2018-20250漏洞实战分析之目录穿越篇

红色框内为:hdr_size,代表头部大小,值为0x0039表示其头部大小57。

 

CVE-2018-20250漏洞实战分析之目录穿越篇

稍作修改:

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 修改filename的长度:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 修改hdr_size:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 使用acefile.py解析ace文件,可以看到报错,需要修改hdr_crc:

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 使用acefile.py脚本检查文件1.ace的header信息:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 修改完毕后另存为1.rar(实际上不该也行,即下一步直接解压1.ace):

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 选择解压到当前文件夹或解压到文件夹1都可以,可以看到bat文件成功解压到开机启动项里。

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 重启电脑发现自动运行bat文件弹窗。

CVE-2018-20250漏洞实战分析之目录穿越篇

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地址:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 接着拿到shell.exe后门程序后构造压缩文件,可参考4.1节中恶意压缩文件的构造过程。对构造后的文件使用acefile.py脚本检查其header信息:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 对改造后的shell.ace文件选择解压到当前文件夹或解压到文件夹shell都可以,可以看到bat文件成功解压到开机启动项里。

 

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 在kali中进入msfconsole,加载exploit/multi/handler模块:

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 设置本地主机ip地址及监听端口,然后尝试攻击监听exploit :

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

  • 重启win7,发现kali中已渗透成功,拿到目标机器shell:

 

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

 

CVE-2018-20250漏洞实战分析之目录穿越篇

 

 

 

五、心得体会

在分析漏洞过程中,查阅了各种资料,本身漏洞利用机制比较容易理解,但是真正的利用原理是比较复杂的,需要阅读相关项目的代码以及需要在IDA中找到关键函数。结合文档和静态分析结果基本能把基本的逻辑搞明白,剩下的实践过程相对比较简单。

经过岁月的洗礼,如今在网上搜索WinRAR漏洞利用案例,可发现其利用手段在富有想象力与能动力的黑客手中已经更新出了很多版本。挑选两个比较典型的升级版攻击利用手段如下所示:

CVE-2018-20250漏洞实战分析之目录穿越篇

CVE-2018-20250漏洞实战分析之目录穿越篇

 

 

通过对该漏洞的分析实践,笔者对解压软件中的一些模块具有了更深的了解,特别在对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