kogmau/atlas
GitHub: kogmau/atlas
ATLAS 是一个零外部依赖的攻击面拓扑映射工具,将多源探测结果转化为去重、带置信度评分的结构化资产模型。
Stars: 0 | Forks: 0
# ATLAS
**A**ttack-surface **T**opology, **L**edger & **A**nalysis **S**ystem(攻击面拓扑、台账与分析系统)
一个使用 Go 编写的非攻击性攻击面映射工具——将探测作为一种工程产出,而非 shell pipeline。
[](https://go.dev)
[](go.mod)
[](LICENSE)
**English** · [Português](README.pt-BR.md)
## 项目简介
ATLAS 用于映射域名的外部可达足迹——包括子域名、隐藏在 CDN 后的源站、存活主机、路由以及从 JavaScript bundle 中恢复的 endpoint——并将其转化为一个**去重的、带有置信度评分的模型**,而非一份平铺的字符串列表。
在 bash 脚本中链式调用各种探测工具很简单。真正有价值的部分在于发现之后的工作:
- **规范化去重。** `/api/users/123` 和 `/api/users/456` 属于同一个攻击面,而不是两个发现。
- **相互印证。** 一个源站 IP 只有在两个独立信号达成一致时,才会被*确认*。
- **置信度与严重程度分离。** 资产是否真实存在是一项测量结果。它是否重要则是一种判断。两者绝不会被混为同一个数值。
## 快速开始
```
go build -o atlas ./cmd/atlas
./atlas example.com
```
```
usage: atlas
[--scope d1,d2] [--timeout 30s]
--scope comma-separated allowed domains/CIDRs (default: the target)
--timeout per-request HTTP timeout (default 30s)
```
结果会存放在 `sessions/_/` 目录下:
| 文件 | 内容 |
|---|---|
| `surface.json` | 包含每条事实的类型、置信度、来源和观测次数 |
| `report.html` | 独立且易读的报告 |
**无需外部依赖。** `go.mod` 中没有 `require` 块——一切均使用 Go 的标准库。只要 Go 能编译的地方就能构建它。
## Pipeline
十个确定性模块,每个模块都会向共享存储追加特定类型的事实:
```
DISCOVER → RESOLVE → FINGERPRINT → CRAWL → EXTRACT → CORRELATE → CLASSIFY → REPORT
```
| 模块 | 阶段 | 功能描述 |
|---|---|---|
| `ct-logs` | discover | 证书透明度搜索 (crt.sh) |
| `dns-brute` | discover | 带有泛解析检测的 DNS 暴力破解 |
| `cdn-detect` | fingerprint | 识别目标前置的 CDN/WAF |
| `origin-unmask` | resolve | 穿透 CDN 定位背后的源站 |
| `http-probe` | resolve | 存活探测、状态码及响应特征识别 |
| `crawler` | crawl | 路由、表单和参数清单提取 |
| `js-endpoints` | extract | 从 bundle 中提取 endpoint,包括 `.map` source map 的重建 |
| `correlate` | correlate | 仅在独立的相互印证下,才将事实提升为 `Confirmed` |
| `classify` | classify | 对 endpoint 进行分组并生成摘要(可选的 LLM advisor) |
| `report` | report | 生成 `surface.json` 和 `report.html` |
## 设计准则
**1. 扫描范围是强制执行的约束,而非约定。** 共享的 HTTP client 会拒绝任何目标 host 超出范围的请求——*包括重定向*。一个把你 302 跳转到第三方网站的目标,无法将扫描拖拽出边界。
**2. LLM 只负责提供建议,绝不执行操作。** `classify` 模块会发送事实并接收结构化的 JSON 返回。由一个强类型的 Go 层来决定如何处理它。模型永远不会获得终端、请求或决策权。
**3. 置信度不是严重程度。** 每条事实都带有 `Confirmed`、`Firm` 或 `Tentative` 标签——这是对事实真实性的测量程度。其重要性和风险则是独立的判断。CVSS v4.0 之所以将报告置信度从基础计算公式中移除,也是基于同样的原因。
**4. 存储前先进行身份规范化。** 数据驱动的路径片段在摄取时会被折叠(`/api/users/«id»`),并且在所有 endpoint 中都适用的事实会被标记为 `SYSTEMIC`,超过一定阈值后就会被折叠,而不是重复输出 N 份相同的观测记录。
**5. 非攻击性在代码层面强制执行。** 根本不存在可能会被意外启用的 payload 模块。
完整的原理解释请见 [`ARCHITECTURE.md`](ARCHITECTURE.md)。
## LLM 分类(可选)
`classify` 模块使用由 Groq 托管的模型。这是一个可选项——如果没有提供密钥,pipeline 依然会运行,其他九个模块也会正常输出它们的结果。
```
export GROQ_API_KEY=... # or GROQ_API_KEYS for a comma-separated pool
export GROQ_MODEL=... # optional, overrides the default
```
密钥也可以从 `~/.pentest_keys` 中读取。**本仓库绝不会存储任何密钥。**
## 尚未实现的功能
在此明确列出,以免对上面的表格产生过度解读:
- TLS 指纹匹配(通过 uTLS 实现 JA3/JA4)——目前 HTTP client 使用的是 Go 原生的 `net/http`,其 ClientHello 特征可能会被 WAF 识别并拦截
- 不同运行之间的状态化差异对比——目前每次运行都是单次时间点的快照
- 将 Wayback / 被动 DNS 作为探测来源
- Favicon 哈希追踪
## 测试
```
go test ./...
```
## 开源许可
Apache-2.0 — 详见 [LICENSE](LICENSE)。标签:EVTX分析, GitHub, Go, Ruby工具, 动态插桩, 实时处理, 攻击面测绘, 日志审计