基于CVE-2018-20250的漏洞的漏洞分析与APT-C-27(黄金鼠)攻击文档分析

样本概况

样本信息

文件名:

3a6cc90db63a6d09721886b6e3f795e32f355d42e8faef560349ec068a9435f1.rar

Size: 185528 bytes

Modified: 2020年4月24日, 12:27:20

MD5: 314E8105F28530EB0BF54891B9B3FF69

SHA1: 8C9B88EE829B880E4AF8B7CD7DCCCC16FAA2E413

CRC32: CBD16AD2

测试环境及工具

运行平台:Windows 7 X64

系统监控工具:火绒剑

分析工具:IDA,OD,010editor

功能分析

样本综述

利用WinRAR漏洞(CVE-2018-20250)针对中东地区的定向攻击样本。该恶意ACE压缩包内包含一个以恐怖袭击事件为诱饵的Office Word文档,诱使受害者解压文件,当受害者在本地计算机上通过WinRAR解压该文件后便会触发漏洞,漏洞利用成功后将内置的后门程序(Telegram Desktop.exe)释放到用户计算机启动项目录中,当用户重启或登录系统都会执行该远控木马,从而控制受害者计算机。

详细剖析

样本流程

首先观察此rar中有

 

其中word文档为

 

记录了一次恐怖事件,因其敏感性,提高了样本在受害者方传播性

 

然后使用winrar打开或者解压,发现在下面目录创建了开机启动

 

样本利用漏洞分析

样本利用漏洞介绍

此样本利用了ACE文件验证逻辑绕过漏洞(CVE-2018-20250), 攻击不能跨盘符,即受害者进行解压文件触发漏洞时,必须在系统盘,且在不知道计算机主机名的情况下,只能在主浏览器的默认下载路径下(C:\Users\Administrator\Downloads)或者桌面进行解压,或者多猜几个启动项路径。产生漏洞的DLL文件:UNACEV2.DLL,不能识别相对路径,文件名部分必须为绝对路径。

影响到全球5多亿的WinRAR用户。究其漏洞产生的根本原因,发现问题的关键在于5.70 Beta 1之前版本的WinRAR使用了陈旧的动态链接库unacev2.dll。该动态链接库的编译时间为2005年,在处理ACE格式文件过程中发挥作用,然而却无任何的基础保护机制(ASLR, DEP 等)。所以当使用WinRAR对恶意构造的ACE文件进行解压操作时,由于没有对文件名进行充分过滤,产生了“目录穿越”现象,其中隐藏的恶意文件可以实现被写入计算机的任意目录下,甚至可以写入开机启动项中,导致恶意文件的执行。经研究发现这种漏洞的影响非常广,其影响范围包括:

发布时间早于5.70 Beta 1版本的WinRAR软件;

使用unacev2.dll动态共享库的解压、文件管理类工具软件。

样本利用漏洞分析

unacev2.dll任意代码执行漏洞缺陷概述

恶意ACE文件-》用户利用winrar解压或打开-》恶意木马-》受害者重启电脑-》恶意木马执行。

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

所以需要研究unacev2.dll,经过资料发现关键函数为ACEInitDll和ACEExtract,但是ida逆向难以分析参数定义,于是通过开源项目FarManager,此项目也是winrar创建这,可以观察ACEInitDll和ACEExtract申明。如下:

 

 

 

其中ACEInitDll的参数pACEInitDllStruc 指针结构体比较关键,如下

 

根据发现此漏洞的Check Point的漏洞原理解析文章,重点关注其中几个函数:

CleanPath、GetDevicePathLen函数、WinRAR Validators/Callbacks回调函数以及触发目录遍历漏洞的sprintf函数。

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函数:

 

大概流程可描述为:       

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

WinRAR Validators/Callbacks回调函数分析:

 

Return返回地是:

ACE_CALLBACK_RETURN_OK 否则,如果该回调函数不允许该操作,则它将返回以下常量:ACE_CALLBACK_RETURN_CANCEL,并且该操作将中止。

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

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

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

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

最后造成漏洞的函数

如果调用的结果GetDevicePathLen等于0,则sprintf如下所示:

sprintf(final_file_path, "%s%s", destination_folder, file_relative_path);

除此以外:

sprintf(final_file_path, "%s%s", "", file_relative_path);

所以综上漏洞利用过程即:

 

所以这里样本ace文件构造的路径如下

 

即C:\C:C:../appData\Roaming\Microsoft\Windows\start Menu\Programs \startup\Telegram Desktop.exe

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

C:../appData\Roaming\Micro soft\Windows\sta rt Menu\Programs \startup\Telegra m Desktop.exe

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

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

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

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

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

C:\Program Files\WinRAR

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

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

C:\Users\用户名xxx\Downloads,所以此时../目录即C:\Users\用户名xxx

所以在调用sprintf时候C:../appData\Roaming\Micro soft\Windows\sta rt Menu\Programs \startup\Telegra m Desktop.exe变为了C: C:\Users\用户名xxx\appData\Roaming\Microsoft\Windows\start Menu\Programs \startup\Telegram Desktop.exe。于是就将文件复制到了此目录,此目录就是开机启动目录。

下面就是如果利用此漏洞的注意点。因为漏洞主要是由Winrar用来解压ACE文件时使用的动态链接库UNACEV2.dll引起的,UNACEV2.dll在处理filename时只校验了CRC。故我们可以通过使用010Editor修改filename将恶意文件解压到启动目录,但是在修改完成后,CRC校验会失败,所以我们还要再去修改CRC,比如利用此漏洞利用工具acefile.py脚本检查文件:

 

要注意红框内,首先用010修改filenames的字符串(字符串和字符串长度都要改)然后hdr_size即头长度要改,最后修改hdr_crc。

比如我要制作一个漏洞利用样本,首先用ace制作一个ace文件,如图,记得选择红框的store full path

使用 acefile.py检查

开始是这样,所以使用010editor进行修改,首先原本是这样

首先修改路径,再计算filename长度为50h

 

然后修改hdr_size之前是48(16进制就算30),然后增加的长度即路径增加长度,路径增加11h到50h增加了3Fh即10进制63,所以hdr_size变为48+63=111即6Fh,所以改为6F

然后使用acefile检查crc,如下图,提示从0x45c5变为0xe46f,注意ace文件是小端模式,按着改就行

 

所以hdr_size和hdr_crc改完如下

acefile检查crc正确

然后改个常用压缩文件rar后缀,将起放在C:\Users\用户名\xxx这种目录下,比如下载目录,exp就可以使用了,使用火绒剑等行为检测软件观察当解压时候,

此时已将计算器拷到了开机启动目录,当电脑重启时就会自动运行此程序。

总结

以上就是CVE-2018-20250的漏洞利用样本与漏洞利用分析了,由此看出此漏洞有很大局限性,exp只能在目录:C:\users\当前用户\C:\users\xxx的xxx级目录下才能讲起拷贝到开机自启目录,其他目录都将在C:根目录下直接创建一个AppData/.../test.exe,达不到开机自启目录。

参考

https://www.52pojie.cn/thread-1105652-1-1.html

https://research.checkpoint.com/2019/extracting-code-execution-from-winrar/

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章