reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,129 @@
---
name: re-ti
description: >
威胁情报查询与关联:VT/Any.run/hybrid-analysis、MISP。
触发词:威胁情报、VirusTotal、Any.run、沙箱查询、MISP、样本关联
capabilities: [threat-intel]
---
# 威胁情报查询与关联
## 何时使用 / 何时不用
- 用:拿到样本 hash / 域名 / IP 要查已知恶意背景("这个样本是什么""哪个家族");沙箱报告解读;家族/团伙关联;MISP 事件关联;情报进报告
- 用:分析完成后用情报验证结论([[re-malware]] / [[re-forensics]] 的线索需要外部佐证)
- 不用:只想跑行为分析——那走 [[re-sandbox]] / [[re-behavior]],沙箱查询只是情报手段之一
- 不用:纯离线环境无外网(只能做静态本地匹配);VT 无结果≠干净(见坑 1)
## 工具准备
本技能以查询/解读为主,不运行样本;上传到沙箱的动态执行须在 [[re-sandbox]] 内(默认沙箱最高原则,见 [[re-analyze/platform-tips]])。
### VirusTotal(核心查询,网页 + API)
- 网页: https://www.virustotal.com/ —— 查 hash/域名/IP,无安装
- API key: https://www.virustotal.com/gui/my-apikey 生成;存环境变量 `VT_API_KEY`(`export VT_API_KEY=...`,Windows 用 `setx`)
- 验证: `[ -n "$VT_API_KEY" ] && echo ok`;带 key 请求返回 JSON(401/403 说明 key 无效或配额用完)
- 隐私注意:查私有样本前确认数据策略——VT 是共享情报,上传会向第三方公开,内部样本先问归属/权限(见坑 2)
### curl —— API 请求
- Linux: `apt install curl` / `dnf install curl` / `pacman -S curl`(多数自带)
- macOS: 自带
- Windows/WSL: Windows 10+ 自带 curl.exe;WSL 用 Linux 包
- 验证: `curl --version`
### Any.run / hybrid-analysis(沙箱报告,网页)
- Any.run: https://any.run/ 注册即可查/提交(网页交互式沙箱,有公开报告库)
- hybrid-analysis: https://www.hybrid-analysis.com/ 注册即可查/提交(API 免费额度)
- 无安装;上传样本前同样确认数据公开策略
### MISP(可选,团队自建情报库)
- 部署(Linux): `docker run -d --name misp -p 8080:80 harvarditsecurity/misp`(社区镜像,正式部署按官方文档)
- 验证: 浏览器打开 https://localhost:8080 能登录(默认账号 admin@admin.test / admin)
- 没有现成 MISP 实例时跳过本环节,不阻塞查询
### jq(可选,解析 API JSON)
- Linux: `apt install jq` / `dnf install jq` / `pacman -S jq`
- macOS: `brew install jq`
- Windows: `winget install jqlang.jq`
- 验证: `jq --version`
## 操作步骤
按顺序执行;步骤 1-3 对每个线索(hash/域名/IP)都过一遍,记下结果与查询时间(证据)。
1. **哈希/域名/IP 查询(VT)**:
```sh
curl -s --request GET \
--url "https://www.virustotal.com/api/v3/search?query=<sha256_or_domain_or_ip>" \
-H "x-apikey: $VT_API_KEY" | jq '.data[0].attributes | {last_analysis_stats, names, tags, popular_threat_category}'
```
- 网页同样可查:hash 页看检测数(`last_analysis_stats` 的 malicious 计数)、厂商命中、tags、popular_threat_category
- 域名/IP 页看解析记录、历史检测、关联样本;查不到检测不直接判干净(见坑 1)
- 隐私选项:上传/查询私有对象用 VT 的私有 API(企业版)或先确认数据公开风险(见坑 2)
2. **沙箱报告解读(Any.run / hybrid-analysis)**:
- 查询: 在 Any.run/hybrid-analysis 搜同一 hash,找公开报告;提交新样本执行须在 [[re-sandbox]] 隔离环境内(网络隔离 INetSim/fake DNS,见 [[re-analyze/platform-tips]] 最高原则)
- hybrid-analysis API(key 在个人 profile 的 API key 页生成,请求头 `api-key`):
```sh
curl -s -H "api-key: $HA_API_KEY" \
"https://hybrid-analysis.com/api/v2/search/hash?hash=<sha256>" | jq '{sha256s, verdicts: [.reports[].verdict]}'
```
- Any.run 有 API(api.any.run,key 在 profile 生成),端点与鉴权以官方文档为准;未配置 key 时网页查询同样可用
- 解读三块:
- **行为**: 启动的进程树(有无注入/镂空)、持久化动作(Run 键/计划任务/服务)、文件操作(写哪、删哪)
- **网络**: 回连域名/IP/端口、DNS 解析、请求 URL(对照 [[re-behavior]] 的捕获)
- **文件操作**: 释放的文件与 hash(dropper 落盘产物,进 [[re-ioc]])
- 记录报告编号与截图时间戳作为证据;报告不可全信(见坑 3)
3. **家族/团伙关联(VT graph、tag)**:
```sh
curl -s --request GET \
--url "https://www.virustotal.com/api/v3/files/<sha256>/graphs" \
-H "x-apikey: $VT_API_KEY" | jq '.data[].type' | sort -u
```
- 端点注意:关联图端点是 `/graphs`(复数)——`/graph` 是 API v2 时代的路径,v3 返回 404
- VT hash 页的关联: 同 C2 域名/同签名/同互斥体命中的其他样本、`popular_threat_category`(如 "trojan.agent")与 family 标签
- tags 与 graph 把样本归到家族——写进报告时标注依据(哪些厂商归的、关联靠什么属性)
- 家族名以多厂商一致为准,单厂商命名只做参考
4. **MISP 事件关联(如有实例)**:
```sh
# 查询事件的属性(hash/域名/IP)——POST + JSON body
curl -s --request POST "https://<misp>/events/restSearch" \
-H "Authorization: <MISP_API_KEY>" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data-binary '{"returnFormat":"json","value":"<sha256>"}' | jq '.response[]?.Event | {info, date, orgc}'
```
- body 必须原样 JSON(`--data-urlencode` 会把它 URL 编码,MISP 解析不到 value);`value` 传字符串
- 响应形如 `{"response": [{"Event": {...}}]}`——jq 用 `.response[]?.Event` 展开;不同 MISP 版本响应结构有差异(见 [[gotchas]])
- 命中说明组织内已标记过该样本/基础设施——引用事件编号(event ID)作为内部证据
- 没实例就跳过,此步不阻塞结论
5. **情报进报告(衔接 [[re-ioc]])**:
- 汇总: 每个线索一行——类型(hash/域名/IP)、VT 检测数、家族/分类、关联样本、来源(报告编号/事件 ID)、查询时间
- 情报直接进 [[re-ioc]] 报告: IOC 列表(外部确认的恶意指标 + 可信度)、摘要段的家族判定依据、结论段引外部情报佐证
- 只写结论不写来源等于没查(证据链要求,见坑 4)
## 跨域联合
- [[re-forensics]]:本网关工作流第 4 步——本技能是情报关联环节
- [[re-malware]]:恶意样本分析第 6 步前用本技能佐证家族/判定;反沙箱样本的静态情报尤其依赖本技能
- [[re-behavior]]:步骤 2 解读沙箱报告的基线来自行为分析产物(进程/网络/文件对照)
- [[re-ioc]]:步骤 5 情报汇总进 IOC 列表与报告(衔接)
- [[re-sandbox]]:本技能动态执行必须在其内(默认沙箱最高原则,见 [[re-analyze/platform-tips]])
- 回传 [[re-analyze]]:按 RE_REPORT 偏好把情报摘要写进最终报告
## 常见坑与陷阱
- **私有样本 VT 无结果 ≠ 干净**:现象——查某个 hash 检测数为 0 或报"not found",据此判定无害;原因——VT 只有公开库,私有/未公开样本查不到是常态(也可能是新样本未收录);对策——无结果只标"未见记录"并注明查询时间,用 [[re-behavior]] / [[re-mem-forensics]] 的实际行为证据下结论;多渠道交叉(Any.run/hybrid-analysis/MISP)后再定性
- **上传私有样本泄露情报**:现象——内部样本/客户样本传上 VT/Any.run 后对外公开,触发保密问题;原因——沙箱与 VT 默认共享数据(公开报告);对策——上传前确认数据策略:VT 用私有 API(企业)或先脱敏(去 PII 后上传),任何.run/hybrid-analysis 选 private 分析(如有),拿不准先问归属方
- **沙箱报告不可全信(反沙箱样本)**:现象——沙箱报告显示"无恶意行为/进程退出",但实际环境检测到回连;原因——样本检测到沙箱特征(VM 硬件、调试器、网络环境)后休眠/走正常分支,报告是假的阴性;对策——结合 [[re-behavior]] 真实环境结果与 [[re-mem-forensics]] 内存残留交叉验证;反沙箱样本靠静态深挖([[re-binary-core]])与内存线索
- **API 配额/限速**:现象——VT 免费 key 请求返回 403/429,或者批量查询中途被限;原因——免费 key 有日配额与分钟限速,批量脚本不打间隔必触发;对策——脚本循环内 sleep(如 15 秒)、用 `/search` 批量聚合、配额耗尽换网页查询或等重置;jq 只取需要的字段减少请求次数
- **哈希误报需多重确认**:现象——某个厂商把良性文件标成恶意(hash 误报),或哈希命中但样本内容不匹配(改名/拼接的旧哈希);原因——单厂商签名粒度粗、VT 聚合统计不加权,原始 hash 与文件内容没有强绑定验证;对策——"恶意"判定看多厂商一致 + 家族标签 + 行为证据,不认单厂商;查询前先对本地文件重算 sha256 与查询值核对(防错 hash 查询)
- 端点速查与操作序列见 [[commands]];API 版本与数据质量坑见 [[gotchas]]

View File

@@ -0,0 +1,107 @@
# 威胁情报 API 端点速查与操作序列
查询源分工:VirusTotal(检测/关联主源)、hybrid-analysis(沙箱报告 API)、MISP(组织内部匹配)、Any.run(网页报告库,API 以官方文档为准)。所有端点以官方文档为最终依据(VT: docs.virustotal.com;MISP: 实例自身 /events/restSearch 行为;HA: hybrid-analysis.com/docs/api/v2)。
## 端点速查
### VirusTotal API v3(鉴权头 `x-apikey`)
| 用途 | 端点 |
|---|---|
| 通用搜索(hash/域名/IP/URL) | `GET https://www.virustotal.com/api/v3/search?query=<值>` |
| 文件检测对象 | `GET https://www.virustotal.com/api/v3/files/<sha256>` |
| 域名对象 | `GET https://www.virustotal.com/api/v3/domains/<domain>` |
| IP 对象 | `GET https://www.virustotal.com/api/v3/ip_addresses/<ip>` |
| 关联图(家族/基础设施) | `GET https://www.virustotal.com/api/v3/files/<sha256>/graphs`(复数 graphs,v2 的 /graph 已废弃) |
| 文件关联对象 | `GET https://www.virustotal.com/api/v3/files/<sha256>/related` |
| 文件行为摘要 | `GET https://www.virustotal.com/api/v3/files/<sha256>/behaviour_summary` |
通用请求模板(所有 GET 共用):
```sh
curl -s --request GET --url "<端点>" -H "x-apikey: $VT_API_KEY" | jq '.data.attributes | {last_analysis_stats, names, tags, popular_threat_category}'
```
### hybrid-analysis API v2(鉴权头 `api-key`,base `https://hybrid-analysis.com/api/v2`)
| 用途 | 端点 |
|---|---|
| 按 hash 查报告 | `GET /search/hash?hash=<md5|sha1|sha256>`(返回 `{sha256s, reports[]}`,reports 含 verdict) |
| 概览 | `GET /overview/<sha256>` |
| 报告摘要 | `GET /report/<id>/summary` |
| 提交文件 | `POST /submit/file`(multipart,需 default 及以上权限 key) |
```sh
curl -s -H "api-key: $HA_API_KEY" "https://hybrid-analysis.com/api/v2/search/hash?hash=<sha256>" | jq '{sha256s, verdicts: [.reports[].verdict]}'
```
### MISP(鉴权头 `Authorization: <API_KEY>`)
| 用途 | 端点 |
|---|---|
| 按属性值搜事件 | `POST /events/restSearch`(body: `{"returnFormat":"json","value":"<值>"}`) |
| 按属性值搜属性 | `POST /attributes/restSearch`(同样式) |
| 按标签过滤 | body 加 `"tags": ["tag1", "!tag2"]`(`!` 排除) |
| 限制条数 | body 加 `"limit": 20, "page": 1` |
```sh
curl -s --request POST "https://<misp>/events/restSearch" \
-H "Authorization: <MISP_API_KEY>" -H "Accept: application/json" \
-H "Content-Type: application/json" \
--data-binary '{"returnFormat":"json","value":"<sha256>"}' \
| jq '.response[]?.Event | {info, date, orgc}'
```
### jq 常用提取
```sh
# 检测统计(malicious 计数与厂商数)
jq '.data.attributes.last_analysis_stats | {malicious, suspicious, undetected}'
# 首次/最后出现时间与提交名
jq '.data.attributes | {first_submission_date, last_submission_date, names: .names[0:3]}'
# graph 节点类型分布(关联来源)
jq '.data[].type' | sort | uniq -c | sort -rn
```
## 常用操作序列
### 1. 样本 hash 背景查询(第一步必做)
```
本地重算 sha256(与情报值核对)→ VT /search?query=<sha256> → 检测数 + tags + 家族
→ 无结果 → hybrid-analysis /search/hash 与 Any.run 网页再查 → 仍无 → 标"未见记录"+ 查询时间
```
### 2. 域名/IP 基础设施关联
```
VT /domains/<域名> 看解析记录与历史检测 → /ip_addresses/<ip> 看托管关系
→ VT hash 页关联样本(同 C2/同签名)→ 域名反查关联域名/样本 → 结果进 [[re-ioc]] 基础设施图
```
### 3. 家族归因(多源一致才定性)
```
VT tags + popular_threat_category + graph 关联 → hybrid-analysis verdict 对照
→ 多厂商一致 + 行为证据([[re-behavior]])→ 家族结论;单厂商命名只做参考
```
### 4. MISP 内部匹配(组织历史事件)
```
POST /events/restSearch value=<hash|域名|IP> → 命中则取 event ID/日期/orgc
→ 引用事件编号作为内部证据;未命中不阻塞外部情报结论
```
## 实现教训(内化)
- 查询值先本地核验:重算 sha256 再查,防"错 hash 查空"浪费时间
- 一次请求取全字段:jq 一次提取多个 attributes,别为每个字段单独请求(配额)
- 批量查询循环内加 sleep(如 15 秒)并记录每个查询时间戳——证据链要求"什么时间查到什么"
- 网页与 API 结果一致才落结论:API 返回结构与网页展示字段存在差异,敏感结论两边对照
## 使用注意
- 上传/查询前确认数据公开策略(私有样本先问归属,见 [[gotchas]])
- 动态执行(提交沙箱)在 [[re-sandbox]] 内([[re-analyze/platform-tips]] 最高原则)
- 情报入报告:IOC 列表 + 来源(报告编号/event ID)+ 查询时间([[re-ioc]] 衔接)

View File

@@ -0,0 +1,37 @@
# 威胁情报查询工具特有坑与边界
## 数据质量:无结果 ≠ 干净
- **私有/未收录样本查不到是常态**:VT 只有公开库——检测数 0 或 not found 只标"未见记录"并注明查询时间,用行为证据([[re-behavior]] / [[re-mem-forensics]])下结论
- **hash 误报**:单厂商签名粒度粗,聚合统计不加权——"恶意"判定要求多厂商一致 + 家族标签 + 行为证据;改名/拼接样本的旧 hash 命中要核对内容(重算 sha256 比对)
- **沙箱报告假阴性**:反沙箱样本在公开沙箱里休眠/走正常分支——报告"无恶意行为"不代表真实环境无行为;结合真实环境动态分析交叉验证
## 隐私与数据公开
- **上传即公开**:VT/Any.run/hybrid-analysis 的免费通道默认公开报告——内部/客户样本上传前确认归属与数据策略(VT 企业私有 API、脱敏后上传、或选 private 分析选项)
- **查询也算数据暴露**:API 查询行为与 key 关联——批量查询内部基础设施前评估暴露面
- 拿不准先问归属方,不做默认上传([[re-analyze/platform-tips]] 敏感数据处理原则)
## API 配额与限速
- **VT 免费 key**:有日配额与分钟限速,返回 403(无效/配额)与 429(限速)——脚本循环内 sleep(如 15 秒),聚合用 /search 少发请求,jq 只取所需字段
- **hybrid-analysis**:restricted key 只能查不能提交/下载;`/search/hash` 返回体含当前限额(Api-Limits 头)——超额先等重置
- **MISP**:配额取决于实例配置(无统一限速),但大结果集(不设 limit)会拖垮实例——查询带 `limit` + `page` 分页
## API 版本与端点漂移
- **VT v2 → v3**:v2 的 `/vtapi/v2/*` 与 `/graph` 路径已废弃;v3 统一 `/api/v3/`,鉴权头 `x-apikey`——旧脚本 404 先查端点是否 v3 化(如 graphs 复数)
- **MISP 响应结构版本差异**:restSearch 响应从 `{"response": [...]}` 演变(老版本 `.response[0].Event` 直接对象、新版本数组包一层)——jq 用 `.response[]?.Event` 兼容展开;以实例实际返回为准
- **hybrid-analysis**:`POST /search/hash` 已标记弃用(被 `GET /search/hash` 取代);`/report/summary` 弃用(用 `/report/<id>/summary`);`/report/{id}/dropped-files` 被 `-v2` 取代——按 v2.x 现文档写脚本
- **Any.run**:API 端点与鉴权以官方文档(any.run/api-documentation)为准,不同套餐能力不同——脚本化前先核对
## 关联误判边界
- **graph/关联样本是启发式**:同 C2/同签名/同互斥体命中不代表同一家族——关联强度分级写报告(强=多属性一致,弱=单属性巧合)
- **家族名口径不一**:不同厂商对同一家族命名不同——以多厂商一致名称为准,报告里注明判定依据
- **时间漂移**:历史检测/解析记录会随时间变化(下架/改名)——结论记录查询时间,复查时重新拉取
## 使用注意
- 查询证据链:值 + 来源 + 查询时间戳逐条入档([[re-triage]] 惯例)
- 外部情报是佐证不是结论:最终判定以本地静态/动态证据为准([[re-analyze/analysis-contract]])