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 收集的 IoC —— ANY.RUN 组织包含完整的 STIX bundle(111 个指标)](https://raw.githubusercontent.com/RedSideSecurity/AnyStix/main/docs/opencti-import.jpg) 导入到 **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`(它会覆盖原配置单元)。 ## 输出 ![AnyStix 的一次终端运行:匹配项目、SHA-256 丰富以及生成的 STIX 指标模式](https://raw.githubusercontent.com/RedSideSecurity/AnyStix/main/docs/anystix-demo.png) 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, 威胁情报, 开发者工具, 恶意软件分析, 自动化采集, 逆向工具