1. 引入
混合类型文件(polyglot)的检测,目前能找到的工具,都是根据YARA规则来做的。这样的检测方法,没有去解析不同类型文件的结构,势必会产生误报。
如果把混合类型文件,看为一个类似于固件的二进制文件,就能用固件扫描工具来检测并提取其中嵌入的子文件了。
2. binwalk的安装
参考1中有详细的安装方式,也给出了一键安装的脚本。这个脚本笔者在ubuntu上20.04.5上安装失败,折腾老半天,后来无意中发现,在ubuntu上可以直接用apt来安装(apt install binwalk
),几秒钟就安装成功了。
3. 检测文件类型
从参考3中拿一个文件(EXE+HTML+PDF-1.pdf)来做测试(注意参考3中的文件需要用 git-lfs clone xxx
来获取)。
root@aabbcc:/home/prjs/polyglot/binwalk# binwalk EXE+HTML+PDF-1.pdf
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, portable (PE)
64 0x40 PDF document, version: "1.3"
386 0x182 PDF document, version: "1.3"
457 0x1C9 HTML document header
740 0x2E4 HTML document footer
827 0x33B Zlib compressed data, best compression
2496 0x9C0 Zlib compressed data, best compression
15192 0x3B58 Zlib compressed data, best compression
25313 0x62E1 Zlib compressed data, best compression
可见,binwalk能检出其中含有 PE(exe)文件,pdf文件,html文件。
当然,也有一些zlib文件属于错误的检测输出。
4. 提取子文件
使用如下命令,能将检测到的所有文件都提取出来(参考2).
root@aabbcc:/home/prjs/polyglot/binwalk# binwalk --dd='.*' EXE+HTML+PDF-1.pdf
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, portable (PE)
64 0x40 PDF document, version: "1.3"
386 0x182 PDF document, version: "1.3"
457 0x1C9 HTML document header
740 0x2E4 HTML document footer
827 0x33B Zlib compressed data, best compression
2496 0x9C0 Zlib compressed data, best compression
15192 0x3B58 Zlib compressed data, best compression
25313 0x62E1 Zlib compressed data, best compression
这个命令运行成功后,输出和上一节一致,并且会生成一个_开头的文件夹,进入这个文件夹,就能看到binwalk提取出来的子文件:
root@aabbcc:/home/prjs/polyglot/binwalk# cd _EXE+HTML+PDF-1.pdf.extracted/
root@aabbcc:/home/prjs/polyglot/binwalk/_EXE+HTML+PDF-1.pdf.extracted# ll
total 340
drwxr-xr-x 2 root root 4096 Sep 22 18:59 ./
drwxr-xr-x 3 root root 4096 Sep 22 18:59 ../
-rw-r--r-- 1 root root 36371 Sep 22 18:59 0
-rw-r--r-- 1 root root 35985 Sep 22 18:59 182
-rw-r--r-- 1 root root 35914 Sep 22 18:59 1C9
-rw-r--r-- 1 root root 35631 Sep 22 18:59 2E4
-rw-r--r-- 1 root root 337 Sep 22 18:59 33B
-rw-r--r-- 1 root root 35544 Sep 22 18:59 33B.zlib
-rw-r--r-- 1 root root 10291 Sep 22 18:59 3B58
-rw-r--r-- 1 root root 21179 Sep 22 18:59 3B58.zlib
-rw-r--r-- 1 root root 36307 Sep 22 18:59 40
-rw-r--r-- 1 root root 10009 Sep 22 18:59 62E1
-rw-r--r-- 1 root root 11058 Sep 22 18:59 62E1.zlib
-rw-r--r-- 1 root root 12893 Sep 22 18:59 9C0
-rw-r--r-- 1 root root 33875 Sep 22 18:59 9C0.zlib
这些文件,可以用file查看类型:
root@aabbcc:/home/prjs/polyglot/binwalk/_EXE+HTML+PDF-1.pdf.extracted# file 0
0: MS-DOS executable PE32 executable (console) Intel 80386, for MS Windows
root@aabbcc:/home/prjs/polyglot/binwalk/_EXE+HTML+PDF-1.pdf.extracted# file 182
182: PDF document, version 1.3
root@aabbcc:/home/prjs/polyglot/binwalk/_EXE+HTML+PDF-1.pdf.extracted# file 1C9
1C9: data
root@aabbcc:/home/prjs/polyglot/binwalk/_EXE+HTML+PDF-1.pdf.extracted# vim 1C9
其中文件名为0的是PE文件,文件名为182的是pdf文件,文件名为1C9的用vim打开就能看到是html文件。
5. 总结
在ubuntu上,可以用apt快速安装binwalk,使用binwalk也能很方便的进行固件内容的分析,转换一下思路也就能把binwalk用来辅助做混合类型文件的检测与子文件的提取。
本文用到的文件和提取出来的内容都已经放到(https://github.com/ybdesire/polydet_binwalk),供参考。
6. 参考
- https://github.com/ReFirmLabs/binwalk/
- https://stackoverflow.com/questions/36530643/use-binwalk-to-extract-all-files
- https://github.com/Polydet/polyglot-database/tree/master/files
- https://github.com/ybdesire/polydet_binwalk