Original: An7i
Translator: Silic
WinRAR 是为人所熟知的一个在Windows环境下对文件进行压缩和解压缩的软件。他可以把软件压缩成ZIP格式或是RAR格式。
本文将为大家展示一个我刚发现的关于winRAR 4.20的漏洞(可能适用于其他版本),可以进行文件名欺骗。首先我们来看下zip文件的格式
Offset | Bytes | Description |
---|---|---|
0 | 4 | Local file header signature = 0x04034b50 (read as a little-endian number) |
4 | 2 | Version needed to extract (minimum) |
6 | 2 | General purpose bit flag |
8 | 2 | Compression method |
10 | 2 | File last modification time |
12 | 2 | File last modification date |
14 | 4 | CRC-32 |
18 | 4 | Compressed size |
22 | 4 | Uncompressed size |
26 | 2 | File name length (n) |
28 | 2 | Extra field length (m) |
30 | n | File name |
30+n | m | Extra 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只是实现文件名反转,在实际利用中有成功概率,但是完美攻击有一定难度。