nuclide-research/aimap
GitHub: nuclide-research/aimap
aimap是一款AI/ML基础设施扫描工具,用于发现潜在的安全风险。
Stars: 3 | Forks: 0

在人口规模上指纹 AI/ML 基础设施,并列出内部暴露的内容。
aimap 是一个单一的 Go 可执行文件,通过 TCP 连接到目标机的开放端口,将每个响应与 AI 和 ML 服务的 218 个指纹数据库进行匹配,然后运行多达 62 个专门的深度枚举器,从任何响应服务的服务中提取集合、模型列表、实验数据、HTTP 响应中的凭据、可声明的管理员状态和 PII 字段。三个阶段:端口发现、指纹匹配、深度枚举。深度枚举器并发(有界)地获取每个集合/每个类/每个索引的数据,因此枚举密集型主机(未经身份验证的拥有数百个集合的 Qdrant)可以在几秒钟内完成,而不是几分钟(见性能)。结果是形状适合直接输入 `visorlog ingest`、`winnow` 和 SIEM 管道的 JSON 报告。
我们构建 aimap 是因为通用扫描器(nmap、nuclei)看到开放端口就停止。它们不知道端口 11434 上的 Ollama 暴露了它持有的每个模型,也不知道端口 3000 上的 Flowise 在其凭据面板中存储了 OpenAI 密钥,或者端口 8888 上的 Jupyter 没有令牌。aimap 知道所有这些事情,并在单次遍历中呈现它们。
## 截图
**第二阶段 — AI 服务指纹**

**第三阶段 — 深度枚举**

**服务卡**

**Ollama —未经身份验证的推理(CRIT**)

**One API —默认凭据激活(CRIT**)

**完整摘要 — 11 个主机,14 个服务,ML 相关基础设施**

## 安装
```
go install github.com/nuclide-research/aimap@latest
```
或者从源代码构建:
```
git clone https://github.com/nuclide-research/aimap
cd aimap
go build -o aimap .
```
预构建的 Linux amd64 和 arm64 二进制文件在发布页面。
Go 1.21+,零外部依赖。
## 使用
```
aimap -target 192.0.2.10
aimap -target 10.0.0.0/24 -threads 50 -o audit.json
aimap -list ips.txt -ports-class llm-gateway -threads 30 -o out.json
aimap -version
```
| 标志 | 默认 | 影响 |
|------|---------|--------|
| `-target` | (必需) | 单个 IP、主机名或 CIDR |
| `-list` | | 目标文件,每行一个目标;支持 `#` 注释 |
| `-ports` | 42 端口默认集 | 以逗号分隔的端口列表 |
| `-ports-class` | | 命名的端口配置文件(见下文);覆盖 `-ports` |
| `-timeout` | `5s` | 每个连接的超时时间 |
| `-threads` | `20` | 并发扫描线程数 |
| `-o` | | JSON 报告输出文件 |
| `-v` | 关闭 | 详细输出 |
| `-scan-all-fingerprints` | 关闭 | 在每个开放端口上探测每个指纹,绕过 DefaultPorts 过滤器 |
| `-exclude-compromised` | 关闭 | 从报告中删除勒索擦除的主机(Meow 类) |
| `-version` | | 打印版本并退出 |
默认 42 端口列表:`80,443,1984,2379,3000,3001,4000,4040,4200,5000,5001,5678,6333,7575,7576,7860,8000,8001,8080,8081,8088,8123,8233,8265,8443,8501,8787,8888,8889,9000,9090,9091,9200,10000,11434,15500,18080,18789,19530,30000,51000,55000`
## 端口配置文件
`-ports-class ` 将端口列表缩小到为特定服务类手动编写的集合。在典型的人口调查中,这比 42 端口默认值减少了 5-10 倍的墙时。
| 配置文件 | 端口 | 最佳用途 |
|---------|-------|----------|
| `llm-gateway` | 12 端口 | Ollama、vLLM、TGI、Open WebUI、LiteLLM、sub2api |
| `vector-db` | 11 端口 | Qdrant、Weaviate、ChromaDB、Milvus |
| `observability` | 10 端口 | Langfuse、Helicone、MLflow、Phoenix、Prometheus |
| `registry` | 11 端口 | Docker、Harbor、Quay |
| `network-mesh` | 19 端口 | Envoy admin、Istio、Linkerd、Kiali、Cilium |
| `workflow-orch` | 10 端口 | Prefect、Dagster、Temporal、Argo |
| `browser-control` | 9 端口 | CDP、Selenium Grid、Playwright MCP |
| `sub2api` | 6 端口 | sub2api-class 池化账户代理 |
| `jetson` | 11 端口 | Jetson 边缘 AI、Triton、Frigate |
| `healthcare` | 10 端口 | DICOM / PACS / dcm4chee / Orthanc |
| `finance` | 10 端口 | QuantConnect、OpenBB、JESSE |
| `mcp` | 9 端口 | Model Context Protocol 服务器 |
| `wide` | 42 端口 | 默认的通用,显式选择 |
| `minimal` | 4 端口 | 快速主机存活 HTTP 探测 |
在 `port_classes.go` 中定义新配置文件:一个映射条目,不触及其他文件。
## aimap 指纹(218 个服务,62 个深度枚举器)
| 类别 | 服务 |
|----------|----------|
| 向量数据库 | Weaviate、ChromaDB、Qdrant、Milvus、Marqo、Manticore、SurrealDB、Infinity (InfiniFlow)、Databend、GreptimeDB、Epsilla、OceanBase、Neo4j、Couchbase、Apache Solr、Meilisearch、Typesense、Vespa |
| LLM 运行时 | Ollama、llama.cpp 服务器、vLLM、SGLang、LocalAI、text-generation-webui |
| RAG 框架 | AnythingLLM、LightRAG、PrivateGPT、txtai、Cognita、R2R、Kotaemon、Quivr、Danswer/Onyx、Verba、DocsGPT、Ragapp、Perplexica、RAGFlow |
| 图像生成 | ComfyUI、AUTOMATIC1111 / SD WebUI、InvokeAI、Fooocus、SwarmUI |
| 嵌入式服务器 | HuggingFace TEI、infinity-embedding、Embedding API |
| 模型服务 | TensorFlow Serving、Triton Inference Server、NVIDIA NIM |
| ML 平台 | MLflow、Weights & Biases、WandB Service、ClearML、Aim |
| 编排 / UI | LangServe、Flowise、Dify、Open WebUI、SillyTavern、LiteLLM、One API、NewAPI、BentoML、sub2api |
| AI 代理平台 | OpenHands、AutoGen Studio、Anti-detect CDP 服务器、Mem0、Coolify、OpenClaw |
| MCP 服务器 | MCP 服务器 |
| 代码助手 | Sourcegraph、Sourcebot、Sweep AI、Tabnine Context Engine、Dyad、bolt.diy、Refact |
| 代理内存 | Mem0、Argilla、Zep、Letta |
| 数据标注 | Label Studio、CVAT、Doccano、Prodigy |
| 计算编排 | Ray Serve、Ray Dashboard、Kubeflow、Apache Spark UI、Apache Airflow、Dask Dashboard、Prefect、Temporal Web |
| 容器 / 基础设施 | etcd、Vault、Docker 守护进程、Kubernetes API、Consul、Portainer、Kubelet |
| 服务网格 | Kiali、Hubble UI、Linkerd Viz、Linkerd 代理管理员、Cilium 指标、Istio Envoy Admin、Istiod Debug、Pomerium |
| 身份验证 / 策略 | Open Policy Agent |
| BI / 仪表板 | Metabase、Apache Superset、Redash、Grafana |
| 可观察性 | Langfuse、Arize Phoenix、Helicone Self-Hosted、Lunary、OpenLIT、Pezzo、Prometheus |
| 工作流自动化 | n8n |
| 对象存储 | MinIO |
| 分析数据存储 | ClickHouse、Elasticsearch、Apache Pinot、ScyllaDB REST |
| AI 安全 / 评估 | Promptfoo、NeMo Guardrails、DeepEval、LangSmith Self-Hosted、Inspect AI、Garak REST、Lakera Guard Self-Hosted、LLM Guard API |
| 语音 / 音频 AI | Whisper ASR、Coqui XTTS、Piper TTS、RVC Voice Cloning、OpenVoice、ChatTTS、F5-TTS、Pipecat、Vocode、LiveKit Agents、AI TTS 服务器 |
| 医疗 AI / PACS | MONAI 标签服务器、Orthanc DICOM 服务器、dcm4che / dcm4chee-arc、DICOMweb (QIDO-RS) |
| 笔记本 / 开发 | Jupyter Notebook、Open Directory、Docker Registry |
| 跨切面 | 暴露的 API 凭据(Langfuse、Helicone、Stripe、Anthropic、LangSmith、OpenRouter、Slack) |
218 个服务中有 62 个有专门的深度枚举器。它们呈现:
- 向量数据库集合中的 PII 字段
- 未经身份验证的模型执行表面
- HTTP 响应中暴露的凭据
- 可声明的管理员状态(未配置的 Metabase、Flowise 凭据面板)
- 数据计数、模式名称和实验元数据
## 性能
深度枚举阶段是耗时的地方:拥有数百个集合的向量存储意味着数百个每个集合的元数据读取。aimap 以并发(有界)的方式运行这些每个项目的读取,枚举密集型供应商(Qdrant、ChromaDB、Weaviate、Elasticsearch、ClickHouse)将它们的每个集合/每个类/每个索引的探测分散开来)。在一个 157 个主机的未经身份验证的 Qdrant 人口中进行测量:**4:02 → 0:24,约 10 倍**,发现结果相同。
我们测量了但没有找到作为杠杆的是:
- 提高 `-threads`(主机级别并发):枚举绑定运行没有变化
- 每次运行的 GET 响应缓存(`AIMAP_FETCH_CACHE=1`,可选):正确,约 8% 的请求减少,其本身没有墙时变化
- 每个主机的无阶段屏障管道(`AIMAP_PIPELINE=1`,可选):其本身没有变化
瓶颈是枚举器内部的串行每个项目循环,而不是编排。并行化该循环是加速;两个可选标志默认关闭,并与它一起组成。
## JSON 输出形状
`-o` 标志写入 `ScanReport`:
```
tool string
version string
target string
timestamp string
ports_scanned int
open_ports []{host, port, open, tls, status_code, server, content_type}
services []{host, port, service, version, severity, base_url, match_path}
adjacencies []{...}
enum_results []{service, host, port, base_url, version, auth_status,
risk_level, details, findings[]{category, title, detail,
severity, data}, raw_data}
summary {total_targets, open_ports, services_found, unauthenticated,
total_findings, critical, high, medium, low, info,
scan_duration}
```
风险级别:`critical`、`high`、`medium`、`low`、`info`。升级规则:
`auth == none` + `high` 发现 = `critical`。
## 示例
```
█████╗ ██╗███╗ ███╗ █████╗ ██████╗
██╔══██╗██║████╗ ████║██╔══██╗██╔══██╗
███████║██║██╔████╔██║███████║██████╔╝
██╔══██║██║██║╚██╔╝██║██╔══██║██╔═══╝
██║ ██║██║██║ ╚═╝ ██║██║ ██║██║
╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝
AI Infrastructure Mapper v1.9.50
by NuClide
PHASE 1: PORT DISCOVERY
──────────────────────────────────────────────────────────
Scanning 192.0.2.0/24 (256 hosts)
Ports: 80,443,3000,...
Threads: 20
PHASE 2: AI SERVICE FINGERPRINTING
PHASE 3: DEEP ENUMERATION
```
终端输出是彩色的。JSON 在版本之间是稳定的。
## 添加指纹
1. 在 `fingerprints.go` 中添加 `Fingerprint` 结构。每个探测至少必须携带 `status_code` + `json_field` 或 `body_contains` 联合。单独的裸单词 `body_contains` 在人口规模上是不稳定的:在提及产品名称的博客文章和营销页面上引发假阳性。
2. 可选地添加 `enum` 函数到 `enumerators.go` 并将其连接到 `runEnumerators`。
## 伴随工具:aimap-profile
`aimap-profile/` 是一个单文件 Python 工具。aimap 指纹服务时,aimap-profile 配置目标:身份、WHOIS、ASN、TLS、类别(个人/机构/商业/研究/蜜罐)、道德标志(HIPAA?CFAA 暴露?安全港?)、PTR 邻居和披露渠道(security.txt、赏金计划、滥用联系人)。输出结构化 JSON 以供管道或 LLM 消费。
有关详细信息,请参阅 `aimap-profile/README.md`。
## aimap 不是什么
aimap 不对服务进行身份验证、提交表单、POST 数据、执行漏洞或修改目标上的任何内容。所有探测都是只读的 HTTP GET 和 TCP 连接。它是活动的:它建立真实的连接。仅扫描您拥有或明确书面授权测试的系统。
## 许可证
MIT。属于 NuClide 工具链的一部分。联系方式:[nuclide-research.com](https://nuclide-research.com)
标签:AI/ML 基础设施, Apex, C2日志可视化, EVTX分析, Go 语言, GPT, JSON 报告, Qt框架, 人工智能, 反取证, 威胁情报, 安全评估, 开发者工具, 性能优化, 指纹识别, 数据统计, 日志审计, 服务识别, 未授权访问, 机器学习, 检测绕过, 深度枚举, 漏洞管理, 用户模式Hook绕过, 端口扫描, 网络安全, 认证信息, 逆向工具, 隐私保护, 隐私信息, 默认凭证