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, 云安全监控, 云资产可视化, 恶意软件分析, 逆向工具, 静态分析