RedSideSecurity/AnyStix
GitHub: RedSideSecurity/AnyStix
按国家/地区从 ANY.RUN 沙箱采集恶意样本并生成 STIX 2.1 IoC 情报,支持直接推送至 OpenCTI 等威胁情报平台。
Stars: 1 | Forks: 0
# AnyStix
**按提交国家/地区从 ANY.RUN 收集恶意公开提交**,并
生成 **STIX 2.1** bundle(可选择直接推送至 OpenCTI)。

导入到 **OpenCTI** 的 AnyStix 输出:该国家/地区的恶意提交作为 STIX bundle 落地到 ANY.RUN 组织下,随时可用于关联分析和主动防御。
## 为什么
[ANY.RUN](https://app.any.run/submissions) 运营着互联网上最大规模的**免费公开交互式恶意软件沙箱**之一——每天有数以千计的最新样本和 URL 在那里被引爆,且每一次公开分析都是完全开放的。这个信息宝库是**最新真实世界威胁情报**的金矿,但它并没有围绕*您的*威胁模型进行组织。
**AnyStix 将这个公开数据流转化为以国家/地区为核心的情报源。** 将其指向某个国家/地区(例如 `armenia`),它就会拉取**实际上由您所在地区提交/针对您所在地区**的恶意软件和恶意 URL,仅保留确认恶意的判定结果,通过其 **SHA-256** 对可执行文件进行丰富,并将所有内容打包为符合标准的 **STIX 2.1**。
其结果是一个由您掌控并可用于**主动防御**的情报源:在这些样本到达您的用户之前*,将提取出的 **IoC**(文件哈希、URL、域名、IP)导入您的检测和拦截体系——SIEM、防火墙/代理拒绝列表、EDR、DNS sinkholes。按计划运行它(包含 systemd 定时器),随着您所在地区出现新威胁,该 bundle 会增量增长。
由于输出是纯 **STIX 2.1** 格式,这些 IoC 可以顺利导入开源威胁情报平台——尤其是 **[OpenCTI](https://www.opencti.io/)**
(内置 `--push-opencti`),以及 MISP、Microsoft Sentinel、ThreatConnect 和任何其他支持 STIX/TAXII 的平台——因此这些情报可以直接融入您现有的工作流程中。
```
armenia ─▶ AM
─▶ Meteor DDP method getAnalysisPublicMobileAdvancedTi (country + dateRange)
─▶ paginate via nextCursor, keep verdict.threat_level == 2 (malicious)
─▶ STIX 2.1 bundle (incremental, deduped by task uuid) ─▶ OpenCTI
```
## 无浏览器模式 —— 工作原理
`app.any.run` 是一个 **Meteor.js** 应用;其公开提交数据**不是** HTML 或 REST——而是通过 **Meteor DDP WebSocket** (`/sockjs/.../websocket`) 进行流式传输。此工具直接使用该协议进行通信:
1. 打开 `wss://app.any.run/sockjs///websocket`,发送 DDP `connect`。
2. 调用方法 **`getAnalysisPublicMobileAdvancedTi`** 并附带过滤对象
`{country:"AM", dateRange:[{$date:start},{$date:end}], ...}`。
3. 读取 `result` → `{items[], totalHits, nextCursor}`;通过传入
`cursor: ` 向前翻页,直到提取完毕。
4. 保留 `scores.verdict.threat_level == 2` 的项目,并将其映射为 STIX。
无需 Chrome,无需 Selenium,无需登录,无需 Turnstile——并且输出是干净的 JSON,而不是抓取的 HTML。(按国家/地区过滤不需要账户;它是公开数据流中的一个普通字段。)
`anyrun_ddp.py` 是独立的 DDP 客户端;`anystix.py` 是 CLI。
## 安装
```
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
```
## 使用说明
```
# 过去 30 天内提交的恶意 AM -> AM_anystix.json
python anystix.py --country armenia --date-range 30
# 限制容量 / 放宽判定结果 / 选择输出
python anystix.py --country armenia --max-items 200 --out armenia.json
python anystix.py --country DE --include-suspicious
# 推送到 OpenCTI(token 来自 env — 切勿硬编码)
export OPENCTI_URL=https://127.0.0.1
export OPENCTI_TOKEN=********-****-****-****-************
python anystix.py --country armenia --push-opencti
# 离线:从之前捕获的项目构建 STIX(参见 --dump-items)
python anystix.py --country armenia --from-json AM_items.json
# 原始 fetcher 的快速冒烟测试
python anyrun_ddp.py AM
```
| 选项 | 描述 |
|--------|-------------|
| `--country` | 国家/地区名称或 ISO 代码(`armenia`, `AM`, `arm`)。**必填。** |
| `--date-range` | 回溯窗口(天数)(默认为 `30`)。 |
| `--out` | 输出 bundle 路径(默认为 `_anystix.json`);增量更新。 |
| `--max-items` | 收集的恶意项目数量上限。 |
| `--include-suspicious` | 同时包含 `threat_level == 1`。 |
| `--no-hashes` | 跳过按任务的 SHA-256 丰富(文件指标将仅匹配 `file:name`)。 |
| `--dump-items` | 同时将匹配到的原始数据流项目写入 JSON 文件。 |
| `--from-json` | 从已保存的项目构建 STIX,而不是从网络获取。 |
| `--push-opencti` | 通过 `pycti` 导入 bundle(需要 `OPENCTI_URL`/`OPENCTI_TOKEN`)。 |
## 按计划运行(systemd,Ubuntu)
`install-service.sh` 会为**单个国家/地区**安装一个强化的 **systemd 服务 + 定时器**。每次运行都会写入位于
`/var/lib/anystix/_anystix.json` 的持久化 bundle;由于该工具按任务
UUID 进行去重,每次运行**仅追加新的**恶意条目。
```
# 安装 + 调度(默认按小时),将 app 复制到 /opt/anystix
sudo ./install-service.sh install --country armenia --interval 1h --date-range 30
# 通过 OpenCTI 推送:填写 /etc/anystix.env,然后添加 --push
sudo ./install-service.sh install --country armenia --push
sudo ./install-service.sh run-now # trigger one harvest immediately
sudo ./install-service.sh status # timer state + bundle
sudo ./install-service.sh logs # recent journal output
sudo ./install-service.sh uninstall [--purge] # remove (--purge also drops data)
```
注意:通过 `DynamicUser` + `StateDirectory` 以非特权用户身份运行;`--interval`
接受 systemd 时间跨度(`30min`, `1h`, `6h`)。要跟踪其他国家/地区,
请使用新的 `--country` 重新运行 `install`(它会覆盖原配置单元)。
## 输出

STIX 2.1 `bundle` 包含:
- 一个 `identity`("ANY.RUN",固定 ID 以便多次运行合并为一个来源);
- 每个提交对应一个 `indicator`:
- file → `[file:name = '...']`,url → `[url:value = '...']`,纯主机名 →
`[domain-name:value=...]` / `[ipv4-addr:value=...]`;
- `labels: ["ANY RUN", "malicious", , *tags]`;
- `external_references`:ANY.RUN 任务链接**以及**用作增量**去重键**的
`anyrun-uuid` 条目。
## 注意事项与限制
- 公开数据流列表中没有哈希值,因此对于每个**文件**提交,该工具
会发起第二次 DDP 调用——`getTaskByUUID(uuid)`——并从
`public.objects.mainObject.hashes.sha256` 中读取主对象的 **SHA-256**(忽略 md5/sha1)。
文件指标随后会匹配 `file:name AND file:hashes.'SHA-256'`,并且
SHA-256 会作为 `source_name:"sha256"` 外部引用添加。使用
`--no-hashes` 可跳过此步骤(每个文件提交会多出一次请求)。
- `getAnalysisPublicMobileAdvancedTi` 是数据流方法的“移动端”变体
(从实时应用中捕获);存在一个返回相同数据的桌面端孪生方法。
如果 ANY.RUN 重命名了它,可通过 `anyrun_ddp.DDP_METHOD` 进行覆盖。
- 请遵守 ANY.RUN 的服务条款和速率限制。
标签:DAST, IoC提取, OpenCTI, STIX, 威胁情报, 开发者工具, 恶意软件分析, 自动化采集, 逆向工具