Inhale 是一款恶意软件分析与分类工具,能够自动化并扩展多种静态分析操作。
此为测试版发布版本,用于测试、反馈及社区开发。
Inhale 最初是我在从多个来源收集和分析大量恶意软件时使用的一系列小脚本。市面上已有许多框架和工具可以完成类似工作,但没有一个能真正匹配我快速查找、分类和存储大量文件信息的工作流程。有些工具还要求昂贵的 API 密钥及其他付费服务。
最终我将这些脚本整合成了一个可以快速部署和使用的工具,无论你是在研究服务器、笔记本电脑还是像树莓派这样低成本的计算机上运行都可以。
本工具设计在 Linux 系统上运行,依赖 Python3、ElasticSearch、radare2、yara 和 binwalk。同时还需要 jq 来美化数据库输出。以下是基本安装说明。
config.yml 文件中包含许多尚未实际设置的项目,除非本说明文档另有说明,否则请勿改动。
安装依赖
python3 -m pip install -r requirements.txt
使用 Inhale 并非必须配置数据库,但如果你希望设置一个,请按照以下说明操作,并将 config.yml 中的 "enable_database" 选项设为 True。
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch
sudo service elasticsearch start
你也可以按照这份文档进行手动安装。
此外,你还可以搭建完整的 ELK 栈用于可视化与数据分析。对于使用本工具来说并非必需。
务必从仓库安装 radare2,而不是通过包管理器。包管理器版本缺少 Inhale 所需的所有功能。
git clone https://github.com/radare/radare2
cd radare2
sys/install.sh
sudo apt-get install automake libtool make gcc
wget https://github.com/VirusTotal/yara/archive/v3.10.0.tar.gz
tar xvzf v3.10.0.tar.gz
cd yara-3.10.0/
./bootstrap.sh
./configure
make
sudo make install
如果遇到关于共享对象的错误,请尝试以下修复方法。
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
直接从仓库安装 binwalk 通常是最好的选择。
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
有关 binwalk 附加功能的更多安装信息请参阅这里。
这是一个用于恶意软件家族分析的 ELF 文件节区哈希库。telfhash 依赖 tlsh,因此请按以下说明安装两者。
设置 tlsh
git clone https://github.com/trendmicro/tlsh
cd tlsh
./make.sh
cd py_ext/
python3 ./setup.py build
sudo python3 ./setup.py install
设置 telfhash
git clone https://github.com/trendmicro/telfhash
cd telfhash
sudo python3 setup.py install
如果你想使用 Web 服务器托管 Inhale 输出以便分享,请将 config.yml 中的变量设置为相应路径,并确保目录已存在!
web:
gen_html: False
webdir: "/var/www/html/" # 实际的 Web 目录
fqdn: "http://threat.land" # 你的网站
in_path: "/var/www/html/inhaled/" # Inhale 输出的路径
ex_path: "/var/www/html/exhaled/" # 数据库查询缓存输出的路径
要启用 HTML 输出,请按如下方式运行 inhale:
python3 inhale.py [所有参数] --html
通过类型指定要分析的文件:
-f INFILE 分析单个文件
-d DIRECTORY 分析目录中的所有文件
-u URLFILE 分析远程文件(URL)
-r RDIRECTORY 分析远程目录(URL)
-l URLLIST 分析文本文件中的 URL 列表
其他选项:
-t TAGS 为输出添加额外的标签。
-b 关闭 binwalk 签名
-y YARARULES 指定自定义 Yara 规则
-o OUTDIR 将提取的文件存储到指定的输出目录(默认:./files/<日期>/)
-i 仅打印信息,不将文件添加到数据库
--html 将输出保存为 HTML 到 webdir 目录。
运行 inhale.py 将对指定文件/目录/URL 执行所有分析,并将结果显示在终端。
查看 /bin/ls 的信息,但不添加到数据库
python3 inhale.py -f /bin/ls -i
将目录 'malwarez' 添加到数据库
python3 inhale.py -d malwarez/
下载此文件并添加到数据库
python3 inhale.py -u https://thugcrowd.com/chal/skull
下载此远程目录中的所有内容,并全部标记为 "phishing":
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
提示:使用此 Twitter 话题标签搜索来查找可能包含恶意软件的有趣开放目录。使用时请自担风险。
你可以使用 -y 参数传递自己的 yara 规则。这仍是一个进行中的大工程,YaraRules 中的几乎所有规则都来自 https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules。感谢 @KevTheHermit
使用 db.sh 进行查询(很快会变成一个好用的脚本)
db.sh *something* | jq .
以下是用于 elasticsearch 数据库的当前数据模型。并非每个字段都会用于每个文件。通常,所有 r2_* 标签都保留给二进制文件。
本项目存在一些已知问题(主要与包管理器的版本有关),在此我将记录所有有解决方案的问题。
如果你遇到如下错误:
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
你可能使用了较旧版本的 ElasticSearch。你可以升级,或者使用以下一行命令增加字段限制。
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
欢迎提交 PR!如果你希望提供具体的反馈,也可以在 Twitter 上通过私信联系我 @netspooky。
感谢所有帮助我测试此工具的人。还要感谢 Plazmaz 对代码进行了初步清理,使其更加整洁。
特别感谢:hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd,以及所有参与 ThreatLand 和 TC Safari Zone 的各位。
| 名称 | 描述 |
|---|
| filename | 二进制文件的完整路径 |
| file_ext | 文件扩展名 |
| filesize | 文件大小 |
| filetype | 基于魔数值的文件类型。不如 binwalk 签名可靠。 |
| md5 | 文件的 MD5 哈希 |
| sha1 | 文件的 SHA1 哈希 |
| sha256 | 文件的 SHA256 哈希 |
| added | 文件添加的日期 |
| r2_arch | 二进制文件的架构 |
| r2_baddr | 二进制文件的基础地址 |
| r2_binsz | 程序代码的大小 |
| r2_bits | 架构位数 - 8/16/32/64 等 |
| r2_canary | 是否启用了栈金丝雀 |
| r2_class | 二进制文件类别 |
| r2_compiled | 二进制文件编译的日期 |
| r2_dbg_file | 二进制文件的调试文件 |
| r2_intrp | 如果动态链接,二进制文件调用的解释器 |
| r2_lang | 源代码的语言 |
| r2_lsyms | 是否存在调试符号 |
| r2_machine | 机器类型,通常指二进制文件所面向的 CPU |
| r2_os | 二进制文件应当运行的操作系统 |
| r2_pic | 是否存在位置无关代码 |
| r2_relocs | 是否存在重定位 |
| r2_rpath | 运行时搜索路径(如果适用) |
| r2_stripped | 二进制文件是否被剥离 |
| r2_subsys | 二进制文件的子系统 |
| r2_format | 二进制文件格式 |
| r2_iorw | 是否存在 ioctl 调用 |
| r2_type | 二进制文件类型,是可执行文件、共享对象等 |
| yara | 包含 yara 规则匹配列表 |
| binwalk | 包含 binwalk 签名及其在二进制文件中的位置列表 |
| tags | 通过 -t 标志传递的任何用户定义标签 |
| url | 如果文件是通过远程下载的,则为其来源 URL |
| urls | 从二进制文件中提取的所有 URL |