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。 [![Go](https://img.shields.io/badge/Go-1.25-00ADD8?logo=go&logoColor=white)](https://go.dev) [![Dependencies](https://img.shields.io/badge/dependencies-stdlib%20only-success)](go.mod) [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](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工具, 动态插桩, 实时处理, 攻击面测绘, 日志审计