chasejstone/Crucible
GitHub: chasejstone/Crucible
一款纯本地运行的 CLI 可疑文件分析工具,通过静态检查与可选的隔离动态执行给出百分制可疑评分和 MITRE ATT&CK 映射报告。
Stars: 0 | Forks: 0
# Crucible
你扔给它一个可疑的文件,它就会告诉你这文件有多可疑。就这样。
它是一个完全在你的笔记本上运行的 CLI 工具(不需要云服务,不需要注册,也不会联网回传),对你指定的任何文件执行一系列静态检查,并可选择在一个小“笼子”里运行该文件以观察它会尝试做什么,最后生成一份带有百分制评分的报告。
## 为什么开发它
每次有人发给我一个奇怪的文件时,我总是要敲同样的五个命令。`file`、`strings`、`sha256sum`,如果我想搞得高级一点,还会用 `readelf`,如果我觉得自己胆子够大,就会用 `strace`。在敲了一百次之后,我想干脆把它们拼凑在一起,再加个评分器,这样我就不用费力去解读输出了。这就是这个工具的由来。
此外,这也是一个用于展示个人作品集的项目,所以代码相当干净,有测试用例,文档字符串也绝非虚假。
## 它究竟做了什么
### 不运行文件就进行的操作
- 计算 md5 / sha1 / sha256 哈希值(标准的分诊操作)
- 嗅探文件类型(elf、pe、shell 脚本、python、纯文本)
- 仅使用纯标准库解析 elf 头,不需要额外的库
- 使用 `pefile` 解析 pe 头(导入、导出、节区)
- 计算每个节区的熵值以检测加壳工具(任何高于 7.2 bits/byte 的值都可能被压缩或加密了)
- 提取所有可打印的字符串(ascii + utf-16le,因为 windows 恶意软件偏爱宽字符串),并运行正则表达式来标记那些敏感的内容:ip、url、注册表项、`VirtualAlloc` / `CreateRemoteThread` 之类的东西、反弹 shell 一行命令、加密钱包地址、电子邮件
- 对其运行 yara 规则(在 `rules/` 中有一套入门规则集,你可以把自己的规则放进去)
### 在文件运行时进行的操作(如果你允许的话)
- 在 `unshare -rn` 内部启动它,这样它就会获得一个全新的、没有任何接口的网络命名空间。它仍然可以*尝试*进行网络调用,我们只是会捕获它们,而这些调用哪里也去不了
- 使用 `strace -f` 包装进程,以记录它及其子进程进行的每一次系统调用
- 使用 `psutil` 监视任何衍生出的子进程
- 通过查看系统调用日志,弄清楚文件系统的活动(读取了什么、写入了什么、删除了什么、是否触碰了像 `/etc/cron.d` 或 `~/.ssh` 这样的敏感位置)
- 网络活动同理:socket、connect、bind、sendto
- 设置了超时,触发时会杀掉整个进程组
### 你会得到什么
- 一个 0-100 的分数及其理由
- 针对任何触发项匹配的 MITRE ATT&CK 技术 ID
- 一个 json 文件(适合通过管道传递给其他工具)和一个 markdown 文件(适合用眼睛直接阅读),两者都会被放入 `reports/` 目录中
## 它是如何组合在一起的
```
flowchart TD
A[file] --> B[what is this thing?]
B --> C[static stuff]
B --> D{can we run it on linux?}
C --> C1[hashes]
C --> C2[pe / elf parser]
C --> C3[strings + flags]
C --> C4[entropy check]
C --> C5[yara]
D -- yeah --> E[sandbox]
D -- nope --> F[skip]
E --> E1[syscall tracer]
E --> E2[process watcher]
E1 --> G1[fs activity]
E1 --> G2[net activity]
E2 --> G3[child procs]
C1 --> H[findings bucket]
C2 --> H
C3 --> H
C4 --> H
C5 --> H
G1 --> H
G2 --> H
G3 --> H
F --> H
H --> I[scorer]
I --> J[mitre tags]
J --> K[json report]
J --> L[markdown report]
```
## 开始运行
你需要 linux、python 3.9 或更高版本、`strace`、`unshare`,以及用于 yara 绑定的 `libyara`。
```
git clone
cd Crucible
make install
```
或者如果你想手动安装:
```
pip install -r requirements.txt
pip install -e .
```
## 使用方法
```
# 普通扫描,static + dynamic
crucible scan ./weird_file
# 仅 static,如果你不想执行任何内容
crucible scan ./weird_file --no-dynamic
# 更长的超时和详细的日志
crucible scan ./weird_file --timeout 30 -v
# 将报告放在其他位置,使用你自己的 yara rules
crucible scan ./weird_file --output /tmp/out --rules ./my-rules/
```
你会得到类似这样的结果:
```
Suspicion score: 34/100 (medium)
JSON report: reports/sample_9c1f3b72a1f8.json
Markdown report: reports/sample_9c1f3b72a1f8.md
```
文件名包含了 sha256 的前 12 个字符,因此对同一个文件重新运行会干净地覆盖,而不同的文件也不会互相冲突。
## 评分是如何生成的
这是一个积分包。每个指标都有单次命中分值和上限,这样一个嘈杂的指标就不会导致总分爆炸。把它们全加起来,最高限制在 100。如果你想调整权重,完整的表格在 [`crucible/report/scorer.py`](crucible/report/scorer.py) 中。
| 事物 | 每次命中得分 | 上限 |
| --- | --- | --- |
| 加壳的节区 | 15 | 15 |
| 高熵(未完全加壳) | 8 | 8 |
| yara 规则匹配 | 20 | 40 |
| win32 api 字符串 | 5 | 20 |
| 反弹 shell 字符串 | 15 | 15 |
| shell 一行命令字符串 | 10 | 10 |
| 字符串中的 url | 3 | 9 |
| 字符串中的 ipv4 | 3 | 9 |
| 尝试 `connect()` | 15 | 15 |
| 尝试 `sendto()` | 10 | 10 |
| 写入敏感路径 | 15 | 30 |
| 写入 crontab | 20 | 20 |
| 写入 systemd unit 目录 | 20 | 20 |
| 写入 ssh 配置 | 20 | 20 |
| 启动了 shell | 10 | 10 |
| 启动了 curl / wget / nc | 15 | 15 |
标签:
| 分数 | 标签 |
| --- | --- |
| 0-24 | 低危 |
| 25-49 | 中危 |
| 50-74 | 高危 |
| 75-100 | 严重 |
## mitre 标签
每个指标都映射到一个或多个 ATT&CK 技术 ID。表格位于 [`crucible/report/mitre.py`](crucible/report/mitre.py) 中。示例:
| 触发项 | mitre |
| --- | --- |
| packed_sections | T1027.002 Software Packing |
| suspicious_api_import | T1055 Process Injection, T1106 Native API |
| reverse_shell_strings | T1059.004 Unix Shell |
| url_strings | T1071.001 Web Protocols |
| network_send | T1041 Exfiltration Over C2 Channel |
| write_crontab | T1053.003 Cron |
| write_ssh | T1098.004 SSH Authorized Keys |
## 别犯傻
动态分析阶段会在你的实体机器上运行该文件,只是把它放在一个附加了 strace 的网络命名空间中。这*不*是一个真正的沙箱。如果你正在研究某个你明知有风险的文件,请先启动一个虚拟机。当你只想查看字节而不执行任何内容时,请使用 `--no-dynamic`。
pe 文件永远不会被执行。你只会得到静态分析结果和报告中的一条注释。
## 测试
```
make test
```
涵盖了哈希、熵值计算、字符串标记、文件类型嗅探、评分器边缘情况、mitre 映射、strace 行解析以及 syscall -> 文件系统分类。该测试套件能在不到一秒的时间内运行完毕。
## 目录结构
```
crucible/
├── crucible/ # the actual package
│ ├── cli.py
│ ├── static/ # hashes, entropy, strings, pe, elf, yara
│ ├── dynamic/ # sandbox + monitors
│ ├── report/ # scorer, mitre, json + markdown
│ └── utils/
├── rules/ # yara rules
├── reports/ # output lands here
├── tests/
├── requirements.txt
├── pyproject.toml
└── Makefile
```
## 它不是什么
- 不是一个 windows 工具。仅支持 linux,因为动态分析部分需要 strace 和 unshare。
- pe 文件仅进行静态分析,不支持 wine。刻意保持较小的依赖。
- 它并不打算成为 cuckoo 或 any.run。请将动态分析阶段视为一种提示,而不是一种隔离手段。
- 内置的 yara 规则只是通用的入门规则。如果需要进行严肃的分析,请将真正的规则放入 `rules/` 中。
## 许可证
MIT。请参阅 [LICENSE](LICENSE)。
标签:DAST, YARA, 云安全监控, 云资产可视化, 恶意软件分析, 逆向工具, 静态分析