WinRAR扩展名欺骗

Original: An7i
Translator: Silic

WinRAR 是为人所熟知的一个在Windows环境下对文件进行压缩和解压缩的软件。他可以把软件压缩成ZIP格式或是RAR格式。

本文将为大家展示一个我刚发现的关于winRAR 4.20的漏洞(可能适用于其他版本),可以进行文件名欺骗。首先我们来看下zip文件的格式

OffsetBytesDescription
04Local file header signature = 0x04034b50 (read as a little-endian number)
42Version needed to extract (minimum)
62General purpose bit flag
82Compression method
102File last modification time
122File last modification date
144CRC-32
184Compressed size
224Uncompressed size
262File name length (n)
282Extra field length (m)
30nFile name
30+nmExtra field

通过这个文件格式的规范描述,可以很容易看出一个问题:在偏移位置30的地方是被压缩的文件的名称。

在使用WinRAR压缩文件成zip的时候也会和这个文件的格式相相似,不过WinRAR会在规范以外再加上点RAR自己的东西。

比如新建一个名为TEST1.txt的文件,在文件正文写入'AAAAA'的字符串后并将文件进行压缩。

压缩后用工具查看16进制的HEX码,如下:

在上图的压缩包中可以看到,WinRAR在创建压缩包的时候额外加了一个文件名进去。

通过多次更深层的测试得出这样一个结果:第一个文件名是真正的文件名,WinRAR将会对其进行压缩并保存。

而第二个文件名其实就是用于显示在WinRAR的GUI窗口中用的。好了,按照惯例就该出现问题了:如果当第一个和第二个文件名不一致的话会发生什么情况呢?

那么答案是,WinRAR会显示第一个被修改过的具有欺骗性的文件名。通过解压后用户才会看到真正的文件名。

大家一起设想一下,如果一个黑阔哥哥命名为“txt”类文件,比方说名字叫:ReadMe.txt,或是“病毒扫描结果.pdf”这样的pdf文件,更或是极具吸引力的类似于“千人斩茜茜.jpg”,接着你浑身一颤点开了。。。呵呵。。

好了,下面开始来构造一个POC吧

1,首先让我们给文件起个比较有诱惑性的名字aoi_sola.exe,这个exe文件的代码如下,功能是弹出“Silic”

#include <stdlib.h>
int main()
{
 System("mshta javascript:alert(\"Silic\");close();");
 return 0;
}

2,用WinRAR压缩之。。。如图

3,用WinHEX打开压缩包,仅仅修改第二个文件名,将其改成“aoi_sola.jpg”并保存为zip文件。

最后,双击之后,你就上线了~

PS:这里小编个人认为弹窗还不如弹图片更真实一些~~另外,漏洞发现者测试的是5.0以下的版本,小编实测5.0版本已经修复该漏洞。

这对于某些习惯直接在WinRAR中打开文件的人来说,这种文件名欺骗简直就是致命伤。。杀伤力很高的。
但是对于习惯先“解压到文件夹”的人来说,这个漏洞似乎跟他们没有什么关系?黑客的思想是:怎么操作才能通杀!
比如解压后,“苍井空.jpg”会变成“苍井空.exe”,机智的他们就不会打开了。

其实不用怕,有一个漏洞叫做RLO Unicoder Characters,WinRAR将这两个漏洞结合起来使用。
就构成了一次完美的攻击,不管咋样,你都中招了,你看你真是一脸肉鸡样呀~

RLO Unicoder Characters的结合利用应该是这样的,将远控命名为含特殊字符的1.gpj.exe,将WinRAR的Zip压缩包中的文件名改为1.gpj.jpg,解压出来以后因为含有特殊字符的关系,1.gpj.exe在windows下会显示1.exe.jpg。RLO只是实现文件名反转,在实际利用中有成功概率,但是完美攻击有一定难度。