TwoA2U/iocscan

GitHub: TwoA2U/iocscan

一款聚合多源威胁情报的快速富化工具,支持IP、哈希和域名的多维度查询与自动风险评分。

Stars: 1 | Forks: 0

# iocscan [![Go Version](https://img.shields.io/badge/go-1.22+-00ADD8?logo=go)](https://go.dev) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Latest Release](https://img.shields.io/github/v/release/TwoA2U/iocscan)](https://github.com/TwoA2U/iocscan/releases/latest) [![Platforms](https://img.shields.io/badge/platforms-linux%20%7C%20macOS%20%7C%20windows-lightgrey)](#supported-platforms) **快速、多源威胁情报富化工具,支持 IP、文件哈希和域名。** 从本地 Web UI 查询 VirusTotal、AbuseIPDB、ThreatFox、ipapi.is、MalwareBazaar 和 GreyNoise 的指标。打包为单一自包含二进制文件,无运行时依赖。 ## 目录 - [功能特性](#features) - [工作原理](#how-it-works) - [安装说明](#installation) - [快速入门](#quick-start) - [Web UI](#web-ui) - [API 参考](#api-reference) - [输出格式](#output-format) - [风险评分](#risk-scoring) - [数据来源](#data-sources) - [支持平台](#supported-platforms) - [项目结构](#project-structure) - [添加新集成](#adding-a-new-integration) - [已知限制](#known-limitations) - [开发指南](#development) - [贡献指南](#contributing) - [许可证](#license) ## 功能特性 - **IP 富化** — 地理位置、ASN、使用类型、滥用评分、VirusTotal 判定、ThreatFox C2 情报以及 GreyNoise 互联网扫描器分类。AbuseIPDB 字段包括置信度评分、报告数量、独立报告者、使用类型、域名、Tor 出口节点标志、公共/白名单状态、主机名以及映射为可读名称的去重报告类别 - **哈希富化** — VirusTotal 检测(含最后扫描时间戳)、MalwareBazaar 元数据、代码签名验证、Sigma 规则命中、沙箱分类 - **域名富化** — VirusTotal 多引擎判定、信誉度、注册商、创建日期、A 记录、分类以及 ThreatFox C2 情报 - **多信号风险评分** — 基于所有集成中清单驱动的规则计算 `riskLevel`;任何单一信号均可独立提升风险等级 - **插件架构** — 每个集成为实现单一接口的独立 Go 文件;添加新供应商仅需一个文件和一行注册代码 - **Web UI** — Tailwind CSS + Vue 3,卡片/表格视图,列可见性切换,导出为 CSV/JSON,扫描历史。卡片显示完整供应商数据,包括 AbuseIPDB 类别、VirusTotal 最后扫描时间和 GreyNoise 分类。出现 API 错误的卡片会自动隐藏 —— 错误详情保留在原始 JSON 面板中 - **批量扫描** — 每次请求最多支持 100 个 IP、哈希或域名 - **本地缓存** — 每个集成使用 SQLite 支持的缓存,避免冗余 API 调用 - **速率限制** — 内置令牌桶限制器,请求体上限 1 MB - **单一二进制** — Web UI 在编译时嵌入,无需外部文件 - **极简依赖** — 总共 3 个外部 Go 依赖 (yaml.v3, x/time/rate, sqlite) ## 工作原理 ``` Input (IP, Hash, or Domain) | v +-----------+ | iocscan | Web UI +-----+-----+ | registry.ForIOCType() -> enabled integrations for this IOC type +-------+------------------------------------------+ | | | | | v v v v v ipapi.is AbuseIPDB VirusTotal ThreatFox GreyNoise geo/ASN abuse multi-engine C2/botnet internet VPN/DC score verdicts IOC intel scanner | | | | | +-------+------------------------------------------+ | orchestrator collects Results + Errors | evaluateOverallRisk() reads manifest RiskRules v JSON result (Web UI) | v SQLite cache (per-integration table, auto-created) ``` 每个指标的所有集成均并发查询。风险评分由每个集成清单中的声明式规则驱动。缓存表在启动时根据集成清单自动创建。 ## 安装说明 ### 下载 release 版本 从 [Releases](https://github.com/TwoA2U/iocscan/releases/latest) 获取适用于您平台的最新预构建二进制文件。 | 平台 | 文件 | |----------|------| | Linux x64 | `iocscan_linux_amd64.zip` | | Linux ARM64 | `iocscan_linux_arm64.zip` | | macOS x64 | `iocscan_darwin_amd64.zip` | | macOS Apple Silicon | `iocscan_darwin_arm64.zip` | | Windows x64 | `iocscan_windows_amd64.zip` | 请根据每个 release 中包含的 `checksums.txt` 验证下载。 ### 从源码构建 需要 Go 1.22+。 ``` git clone https://github.com/TwoA2U/iocscan.git cd iocscan go mod tidy go build -o iocscan . ``` ## 快速入门 ### 1. 启动服务器 ``` iocscan # starts web UI on http://localhost:8080 iocscan -p 9090 # custom port iocscan --help # show usage ``` ### 2. 输入您的 API 密钥 打开浏览器。顶部的 API Keys 面板接受每个供应商的密钥。密钥随每次扫描请求发送。 | 供应商 | 密钥来源 | 必需 | |--------|-----------|----------| | VirusTotal | [virustotal.com/gui/my-apikey](https://www.virustotal.com/gui/my-apikey) | 是 (IP + 哈希 + 域名) | | AbuseIPDB | [abuseipdb.com/account/api](https://www.abuseipdb.com/account/api) | 是 (IP 扫描) | | ipapi.is | [ipapi.is/developers.html](https://ipapi.is/developers.html) | 否 — 免费层无需即可使用 | | abuse.ch | [bazaar.abuse.ch/api](https://bazaar.abuse.ch/api/) | 否 — MalwareBazaar + ThreatFox | | GreyNoise | [viz.greynoise.io/signup](https://viz.greynoise.io/signup) | 否 — 无密钥每天 10 次查询 | 密钥在 Web UI 的 API Keys 面板中输入。它们随每次扫描发送,绝不存储在磁盘上。 ### 3. 配置文件 (可选) 创建 `~/.iocscan/config.yaml` 以设置默认端口或数据库路径: ``` server: port: 8080 database: path: "" # default: ~/.iocscan/iocscan.db ``` `-p` 标志始终覆盖配置文件中的端口。 ## Web UI **IP 模式** — ipapi.is (地理/ASN) + AbuseIPDB (完整报告数据、类别) + VirusTotal + ThreatFox + GreyNoise。 **哈希模式** — VirusTotal (含最后扫描时间戳) + MalwareBazaar + ThreatFox。 **域名模式** — VirusTotal (判定、注册商、A 记录、分类) + ThreatFox。 | 功能 | 描述 | |---------|-------------| | 卡片视图 | 每个指标的详情卡片,带有风险徽章和来源链接。出错的卡片会被隐藏 —— 数据仍可在原始 JSON 面板中查看 | | 表格视图 | 可排序的多指标对比表格 | | 列切换 | 显示/隐藏每个部分的单独字段 | | 批量输入 | 粘贴多个指标或上传 `.txt` / `.csv` 文件 | | 导出 | 将结果下载为 CSV 或 JSON | | 复制 | 复制到剪贴板为 JSON、CSV 或仅原始指标 | | 扫描历史 | 最近 20 次扫描,支持一键重新扫描 | | 缓存切换 | 每次扫描控制 SQLite 结果缓存 | ## API 参考 所有 API 响应均使用 `Content-Type: application/json`,包括错误。 ### `GET /api/health` ``` { "status": "ok", "service": "iocscan" } ``` ### `GET /api/integrations` 返回每个已注册集成的完整清单。前端在启动时获取一次,以驱动卡片布局、表格列和风险阈值。 ### `POST /api/scan` IP 富化。 ``` { "ip": "1.2.3.4", "vt_key": "...", "abuse_key": "...", "ipapi_key": "...", "abusech_key": "...", "greynoise_key": "...", "use_cache": true } ``` ### `POST /api/scan/hash` 哈希富化。接受最多 100 个哈希 (MD5, SHA1, 或 SHA256)。 ``` { "hashes": ["", ""], "vt_key": "...", "abusech_key": "...", "use_cache": true } ``` ### `POST /api/scan/ioc` 混合 IOC 富化。IP、哈希和域名会被自动检测并路由到正确的管道。 ``` { "iocs": ["1.2.3.4", "", "evil.com"], "vt_key": "...", "abuse_key": "...", "abusech_key": "...", "greynoise_key": "...", "use_cache": true } ``` ### `POST /api/cache/clear` ``` { "table": "all" } ``` 当前缓存表:`VT_IP`, `ABUSE_IP`, `IPAPIIS_IP`, `GN_IP`, `VT_HASH`, `MB_HASH`, `TF_IP`, `TF_HASH`, `VT_DOMAIN`, `TF_DOMAIN`。 ### 错误响应 ``` { "error": "description of what went wrong" } ``` ## 输出格式 ### IP 富化 ``` { "ipAddress": "45.77.34.87", "riskLevel": "CRITICAL", "geo": { "isp": "Vultr", "country": "Singapore", "city": "Singapore", "timezone": "Asia/Singapore" }, "virustotal": { "malicious": 5, "suspicious": 1, "reputation": -11, "lastAnalysisDate": "2026-03-20 06:41 UTC" }, "abuseipdb": { "confidenceScore": 82, "totalReports": 14, "numDistinctUsers": 9, "lastReportedAt": "2026-03-19T14:22:00+00:00", "usageType": "Data Center/Web Hosting/Transit", "domain": "vultr.com", "isTor": false, "isPublic": true, "isWhitelisted": false, "hostnames": [], "categories": ["Port Scan", "Hacking", "Brute-Force", "SSH"] }, "threatfox": { "queryStatus": "ok", "malware": "win.cobalt_strike", "confidenceLevel": 100 }, "greynoise": { "classification": "malicious", "noise": true, "riot": false, "name": "unknown", "lastSeen": "2026-03-19" } } ``` ### 哈希富化 ``` { "hash": "d55f983c...", "hashType": "SHA256", "riskLevel": "CRITICAL", "virustotal": { "malicious": 58, "suggestedThreatLabel": "trojan.sodinokibi/revil" }, "malwarebazaar": { "queryStatus": "ok", "signature": "Sodinokibi", "fileName": "revil.exe" }, "threatfox": { "queryStatus": "ok" } } ``` ### 域名富化 ``` { "domain": "evil.com", "riskLevel": "HIGH", "vtDomain": { "malicious": 8, "registrar": "NameCheap", "suggestedThreatLabel": "malware.generic" }, "threatfox": { "queryStatus": "ok", "malware": "win.emotet", "confidenceLevel": 75 } } ``` ## 风险评分 `riskLevel` 根据每个集成清单中的声明式 `RiskRule` 定义计算。所有集成中的最高严重性生效。 ### IP 评分 | 级别 | AbuseIPDB | VT Malicious | GreyNoise | ThreatFox | |-------|:---------:|:------------:|:---------:|:---------:| | `CRITICAL` | >= 75 | >= 5 | — | — | | `HIGH` | >= 40 | >= 2 | `malicious` | confirmed | | `MEDIUM` | >= 10 | >= 1 | `suspicious` 或 `noise=true` | — | | `LOW` | > 0 | — | — | — | | `CLEAN` | 0 | 0 | `benign` | no results | ### 哈希评分 | 级别 | VT Malicious | MalwareBazaar | ThreatFox | |-------|:-----------:|:-------------:|:---------:| | `CRITICAL` | >= 15 | — | — | | `HIGH` | >= 5 | confirmed | confirmed | | `MEDIUM` | >= 1 | — | — | | `CLEAN` | 0 | not found | no results | ### 域名评分 | 级别 | VT Malicious | ThreatFox | |-------|:-----------:|:---------:| | `CRITICAL` | >= 5 | — | | `HIGH` | >= 2 | confirmed | | `MEDIUM` | >= 1 | — | | `CLEAN` | 0 | no results | ## 数据来源 | 来源 | IOC 类型 | 免费层 | |--------|-----------|----------| | [ipapi.is](https://ipapi.is) | IP | 无密钥每天 1,000 次请求 | | [AbuseIPDB](https://www.abuseipdb.com) | IP | 每天 1,000 次请求 — 详细模式返回带有类别 ID 的完整报告列表 | | [VirusTotal](https://www.virustotal.com) | IP, 哈希, 域名 | 每分钟 4 次请求,每天 500 次请求 | | [MalwareBazaar](https://bazaar.abuse.ch) | 哈希 | 无硬性限制 | | [ThreatFox](https://threatfox.abuse.ch) | IP, 哈希, 域名 | 无硬性限制 | | [GreyNoise](https://greynoise.io) | IP | 无密钥每天 10 次查询 | ## 支持平台 | 操作系统 | amd64 | arm64 | |----|:-----:|:-----:| | Linux | ✓ | ✓ | | macOS | ✓ | ✓ | | Windows | ✓ | ✓ | Linux 和 Windows 二进制文件使用 UPX 压缩。macOS 二进制文件保持未压缩状态,以避免 Gatekeeper 问题。 ## 项目结构 ``` iocscan/ ├── main.go — entry point: -p flag, config load, server start ├── config/ │ └── config.go — load ~/.iocscan/config.yaml via gopkg.in/yaml.v3 ├── server/ │ └── server.go — Start(), HTTP mux, all handlers, rate limiting ├── integrations/ │ ├── integration.go — Integration interface, Manifest types, EvaluateRisk() │ ├── registry.go — All(), ForIOCType(), Manifests(), CacheTables() │ ├── cache.go — RWMutex-protected cache bridge │ ├── abuseipdb.go — AbuseIPDB integration (IP) │ ├── greynoise.go — GreyNoise Community API integration (IP) │ ├── ipapi.go — ipapi.is integration (IP) │ ├── malwarebazaar.go — MalwareBazaar integration (Hash) │ ├── threatfox.go — ThreatFox integrations (IP, Hash, Domain) │ └── virustotal.go — VirusTotal integrations (IP, Hash, Domain) ├── internal/ │ └── httpclient/http.go — shared HTTP client with context support ├── utils/ │ ├── common.go — dynamic InitDB(), cache helpers │ ├── orchestrator.go — generic Scan() fan-out, ScanResult, BuildKeys() │ ├── iputil.go — IP output types, IPProcessor, GNResult │ ├── iputil_shim.go — Lookup() -> Scan() -> ComplexResult │ ├── hashutil.go — hash output types and helpers │ ├── hashutil_shim.go — LookupHash() -> Scan() -> HashResult │ ├── domainutil.go — LookupDomain() -> Scan() -> DomainResult │ └── iocutil.go — IOC type detection (IP, hash, domain) └── web/ ├── components/ │ ├── ColumnDrawer.js — column visibility drawer │ ├── IntegrationCard.js — generic card renderer (driven by manifests) │ ├── IOCScanner.js — main scanner (IP, Hash, Domain tabs) │ └── ResultsTable.js — sortable results table ├── composables/ │ ├── useColumnVisibility.js — column toggle state │ ├── useDomainResults.js — domain scan state, table, export │ ├── useHashResults.js — hash scan state, table, export │ ├── useIntegrations.js — manifest fetch at boot │ ├── useIOCScan.js — central scan orchestration │ ├── useIPResults.js — IP scan state, table, export │ └── useScanHistory.js — scan history management ├── index.html — main UI entry point ├── main.js — Vue app bootstrap + loadManifests() └── utils.js — shared helpers (highlightJSON, escapeHTML) ``` ## 添加新集成 ### 成本概览 | IOC 类型 | 后端 | 前端 | 预估时间 | |----------|:-------:|:--------:|----------------| | IP | 3 | 2 | ~2h | | 哈希 | 3 | 1 | ~1h 30m | | 域名 | 2 | 1 | ~1h 15m | **后端文件** (所有集成类型): | 文件 | 变更 | |------|--------| | `integrations/yourvendor.go` | 新文件 — 获取函数、`Manifest()`、`Run()` | | `integrations/registry.go` | +1 行 | | `utils/iputil_shim.go` 或 `utils/hashutil_shim.go` | +~10 行映射块 (仅 IP 和哈希) | **前端文件** (所有集成类型必需): | 文件 | 变更 | |------|--------| | `web/components/IOCScanner.js` | 为新供应商添加硬编码卡片模板 | | `web/composables/useIOCScan.js` | 向 `keys` 响应式对象添加密钥 + 扫描请求体 (如果供应商需要密钥) | **需要密钥的 IP 集成的额外连接** (例如 GreyNoise): | 文件 | 变更 | |------|--------| | `server/server.go` | 向 `scanRequest` 结构体添加 `YourVendorKey` 字段,传递给 `NewIPProcessor` | | `utils/iputil.go` | 向 `IPProcessor` 添加 `yourvendorKey` 字段,更新 `NewIPProcessor` 签名 | | `utils/iputil_shim.go` | 传递 `keys["yourvendor"] = p.yourvendorKey` | ### 步骤 1 — 创建 `integrations/yourvendor.go` ``` package integrations import ( "context" "encoding/json" "fmt" "github.com/TwoA2U/iocscan/internal/httpclient" ) type YourVendor struct{} func (y YourVendor) Manifest() Manifest { return Manifest{ Name: "yourvendor", Label: "Your Vendor", Icon: "🔧", Enabled: true, IOCTypes: []IOCType{IOCTypeIP}, Auth: AuthConfig{KeyRef: "yourvendor", Label: "Your Vendor", Optional: true}, Cache: CacheConfig{Table: "YV_IP", TTLHours: 24}, RiskRules: []RiskRule{ { Field: "score", Type: RiskThreshold, Thresholds: []RiskThresholdRule{ {Gte: 75, Level: "HIGH"}, {Gte: 25, Level: "MEDIUM"}, }, }, }, Card: CardDef{ Title: "🔧 Your Vendor", Order: 6, LinkTemplate: "https://yourvendor.com/{ioc}", LinkLabel: "↗ Your Vendor", Fields: []FieldDef{ {Key: "score", Label: "Score", Type: FieldTypeNumber}, {Key: "status", Label: "Status", Type: FieldTypeString}, }, }, TableColumns: []TableColumn{ {Key: "score", Label: "YV Score", DefaultVisible: true}, {Key: "status", Label: "YV Status", DefaultVisible: true}, }, } } func (y YourVendor) Run(ctx context.Context, ioc, apiKey string, useCache bool) (*Result, error) { if useCache { if raw := cachedGet(ioc, "YV_IP"); raw != "" { var r yourVendorResponse if err := json.Unmarshal([]byte(raw), &r); err == nil { return yvToResult(&r), nil } } } r, err := fetchYourVendor(ctx, ioc, apiKey) if err != nil { return &Result{Error: err.Error()}, nil // soft error — partial result } if b, e := json.Marshal(r); e == nil { cachedPut(ioc, string(b), "YV_IP") } return yvToResult(r), nil } ``` ### 步骤 2 — 在 `integrations/registry.go` 中注册 ``` // ── IP integrations ─────────────────────── &VirusTotalIP{}, &AbuseIPDBIntegration{}, &IPAPIIntegration{}, &ThreatFoxIPIntegration{}, &GreyNoise{}, &YourVendor{}, // <- add this line ``` **域名集成到此完成。** 对于 IP 和哈希集成,继续步骤 3。 ### 步骤 3 — 添加 shim 映射 (仅 IP 和哈希) 在 `utils/iputil_shim.go` 中,在 `buildComplexResult()` 内部添加: ``` // ── Your Vendor ─────────────────────────────────────────────────────────────── if f, ok := sr.Results["yourvendor"]; ok { result.YourVendor = &YVResult{ Score: intField(f, "score"), Status: strField(f, "status"), } } else if errMsg, hasErr := sr.Errors["yourvendor"]; hasErr { result.YourVendor = &YVResult{Error: errMsg} } ``` 同时在utils/iputil.go` 的 `ComplexResult` 中添加 `YVResult` 结构体和 `YourVendor *YVResult` 字段。 ### 步骤 4 — 将卡片添加到前端 在 `web/components/IOCScanner.js` 中,在 IP 卡片网格内部(`` 注释之前)添加一个卡片: ```
🔧 Your Vendor ↗ Your Vendor
Score {{ activeResult.yourvendor.score }}
Status {{ activeResult.yourvendor.status }}
{{ activeResult.yourvendor.error }}
``` ### 步骤 5 — 连接 API 密钥 (如果您的集成需要) **`web/composables/useIOCScan.js`** — 将密钥添加到响应式状态和扫描请求: ``` // Add to keys reactive object export const keys = reactive({ vt: '', abuse: '', ..., yourvendor: '' }); // Add to the /api/scan request body in doIPScan() yourvendor_key: keys.yourvendor, ``` **`web/components/IOCScanner.js`** — 向 API Keys 面板添加密钥输入框: ```
``` **`server/server.go`** — 将密钥字段添加到请求结构体并将其传递: ``` type scanRequest struct { // ... existing fields ... YourVendorKey string `json:"yourvendor_key"` } // Pass to NewIPProcessor: processor := utils.NewIPProcessor(..., req.YourVendorKey) ``` **`utils/iputil.go`** — 添加到 `IPProcessor` 和 `NewIPProcessor`: ``` type IPProcessor struct { // ... existing fields ... yourvendorKey string } func NewIPProcessor(..., yourvendorKey string) *IPProcessor { return &IPProcessor{..., yourvendorKey: yourvendorKey} } ``` **`utils/iputil_shim.go`** — 将密钥传递到密钥映射中: ``` keys := BuildKeys(p.vtKey, p.abuseKey, p.ipapiKey, p.abusechKey) keys["yourvendor"] = p.yourvendorKey ``` ## 已知限制 ### 1. Shim 层 (IP 和哈希集成) IP 和哈希扫描结果通过兼容性 shim (`iputil_shim.go`, `hashutil_shim.go`) 传递,该 shim 将通用 `ScanResult` 映射到前端期望的类型化 JSON 结构体。每个新的 IP 或哈希集成都需要在相关 shim 中手动添加映射块(约 10 行)。 域名集成不受此限制影响。 **计划修复:** 当前端迁移到通过清单直接使用 `ScanResult` 时移除 shim。计划与身份验证系统一起进行。 ### 2. 错误卡片隐藏 返回错误(缺少 API 密钥、速率限制、网络故障)的卡片在 UI 中被隐藏以避免杂乱。原始错误消息仍保留在卡片下方的 JSON 面板中以便调试。返回有效“未找到”响应(`no_results`, `hash_not_found`)的卡片仍会渲染 —— 只有硬性错误会被抑制。 ### 3. 无身份验证 当前版本没有用户身份验证。API 密钥在浏览器中按会话输入,不会在会话之间持久化。专为本地或受信任的局域网使用而设计。 **计划修复:** 完整的身份验证系统 —— 用户、`httpOnly` 会话 cookie、服务器端 AES-256-GCM 加密 API 密钥存储。详情请参阅 `COMBINED_PLAN.md`。 ### 4. API 请求中的硬编码密钥字段 每个供应商密钥是请求体中的独立命名字段(`vt_key`, `abuse_key`, `greynoise_key` 等)。添加需要密钥的新集成意味着在 `server/server.go` 的请求结构体中添加一个新字段。 **计划修复:** 在实施身份验证系统时替换为通用的 `"keys": { "keyref": "value" }` 映射(密钥将来自数据库,而非请求体)。 ### 5. AbuseIPDB 类别需要详细模式 仅当使用 `verbose=true` 并设置 `maxAgeInDays` 查询 API 时才返回类别数据。iocscan 始终使用详细模式。类别 ID 使用 [官方 AbuseIPDB 类别列表](https://www.abuseipdb.com/categories) 映射为名称,并在显示之前跨所有报告进行去重。 ### 6. 域名支持仅限 VirusTotal + ThreatFox 域名扫描仅查询 VirusTotal 和 ThreatFox。其他集成 (AbuseIPDB, GreyNoise, ipapi.is) 根据设计仅支持 IP。未来的域名集成 (WHOIS, passive DNS, URLScan.io) 可以遵循标准插件模式添加,无需 shim。 ### 7. SQLite 并发 缓存数据库使用启用 WAL 模式的 SQLite —— 适用于本地和小型团队使用。高并发或多服务器部署应迁移到 PostgreSQL。 ## 开发指南 ### 前置条件 - Go 1.22+ - [GoReleaser](https://goreleaser.com) (仅用于 release 构建) ### 本地运行 ``` git clone https://github.com/TwoA2U/iocscan.git cd iocscan go mod tidy go build -o iocscan . ./iocscan ``` 打开 `http://localhost:8080`,在面板中输入 API 密钥,然后开始扫描。 在开发期间,当目录存在时,iocscan 直接从磁盘读取 `web/` —— 编辑前端文件并刷新而无需重新构建。 ### 健康检查 ``` curl http://localhost:8080/api/health # {"status":"ok","service":"iocscan"} curl http://localhost:8080/api/integrations | jq '.[].name' # "virustotal_ip" "abuseipdb" "ipapi" "threatfox_ip" "greynoise" # "virustotal_hash" "malwarebazaar" "threatfox_hash" # "virustotal_domain" "threatfox_domain" ``` ### 模拟 release 构建 ``` goreleaser release --snapshot --clean ``` ### 打标签并发布 ``` git tag -a v1.2.0 -m "v1.2.0" git push origin v1.2.0 ``` ## 贡献指南 1. Fork 并创建基于 `main` 的分支 2. 使用约定式提交消息 (`feat:`, `fix:`, `docs:`) 进行提交 3. 验证:`go vet ./...` 和 `go build ./...` 4. 向 `main` 发起 Pull Request ### 贡献方向 - 新集成:Shodan InternetDB, OTX, Censys, URLScan — 参见 [添加新集成](#adding-a-new-integration) - 前端迁移到清单驱动渲染(消除 shim 层) - 身份验证系统实现 - 其他 IOC 类型 (URL) - CLI 改进(彩色输出、表格格式化) ### 请避免 - 破坏现有 API 响应格式 - 任何形式的硬编码凭证 - 需要 CGO 的更改(该项目目标是 CGO-free 静态构建) - 向编排器添加特定于供应商的逻辑 — 请改用集成接口 ## 许可证 [MIT](LICENSE) © [TwoA2U](https://github.com/TwoA2U)
标签:AbuseIPDB, Ask搜索, DAST, ESC4, Go, Golang, GreyNoise, IoC扫描, IP信誉查询, IP 地址批量处理, MalwareBazaar, OSINT, Ruby工具, Sigma 规则, TCP SYN 扫描, ThreatFox, VirusTotal, Web UI, 哈希检查, 域名分析, 威胁情报, 安全编程, 安全运营, 密码管理, 库, 应急响应, 开发者工具, 恶意软件分析, 情报富化, 扫描框架, 无服务器架构, 日志审计, 结构化查询, 网络安全, 自动化安全, 自包含二进制, 自定义脚本, 调试插件, 隐私保护, 风险评分