prodrom3/triton

GitHub: prodrom3/triton

一款用 Go 编写的跨平台一体化网络侦察工具,整合了 DNS、端口扫描、TLS 检查、HTTP 探测、地理位置定位等功能,支持并发分析和变更检测。

Stars: 1 | Forks: 0

# triton [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/prodrom3/triton/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/prodrom3/triton?color=blue)](https://github.com/prodrom3/triton/releases) [![Go Reference](https://pkg.go.dev/badge/github.com/prodrom3/triton.svg)](https://pkg.go.dev/github.com/prodrom3/triton) [![Go Report Card](https://goreportcard.com/badge/github.com/prodrom3/triton)](https://goreportcard.com/report/github.com/prodrom3/triton) [![Go 1.23+](https://img.shields.io/badge/go-1.23%2B-00ADD8.svg)](https://go.dev/dl/) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) 一款面向安全、SRE 和网络工程团队的快速、轻依赖网络侦察 CLI。triton 将地理位置定位、DNS、traceroute、端口和 TLS 检查、HTTP 探测、延迟测量以及 WHOIS 整合到一个工具中,提供结构化输出、并发目标分析、变更检测和利于 pipeline 集成的导出功能。 在希腊神话中,Triton 是海洋的信使,是一位能够平息或掀起波浪、熟知每道洋流和海洋深度的神祇。正如 Triton 巡视并统御着浩瀚的海洋网络一样,该工具也用于勘测和绘制庞大的互联网网络,追踪其深处的路由,揭示隐藏在域名下方的信息,并展现 IP 地址背后的地理位置与身份标识。该名称也向三叉戟致敬,这是一种兼具精准度与广度的工具,反映了 triton 在一次扫描中探测端口、检查证书并查询注册信息的能力。

triton

## 目录 - **从这里开始** - [为什么选择 triton](#why-triton) - [快速开始](#quick-start) - [安装说明](#installation) - **参考** - [功能特性](#capabilities) - [用法](#usage) - [配置说明](#configuration) - [输出与集成](#output-and-integration) - **操作** - [架构](#architecture) - [操作说明](#operational-notes) - [负责任的使用](#responsible-use) - [安全政策](#security-policy) - **项目** - [开发指南](#development) - [支持](#support) - [许可证](#license) ## 为什么选择 triton - **单一二进制文件,零运行时依赖。** 静态 Go 二进制文件,仅有一个可选的库依赖(`geoip2-golang`)。可直接放入 air-gapped 运行器、跳板机和最小化的 container 镜像中。 - **Pipeline 优先。** 结构化的 JSON 输出、确定性的 exit code、`--quiet`、基于文件的目标输入以及 stdin 管道,使其能够轻松接入 CI、SOAR playbook 和 cron job。 - **并发与界限。** 支持多目标分析和可配置的 worker;具备 WHOIS 速率限制、TLS 最低版本锁定以及基于 context 的超时机制,确保在负载下行为可预测。 - **内置变更检测。** 使用 `--diff` 对比之前的 JSON 扫描结果,高亮显示新增的主机、更改的证书、变动的 ASN 以及打开或关闭的端口。 - **跨平台支持。** 提供 Linux、macOS 和 Windows(amd64 和 arm64 架构)的预编译版本。 ## 功能特性 **身份与位置** - 通过 MaxMind GeoLite2 进行 IP 地理位置定位(城市、地区、国家、坐标) - 通过 GeoLite2 ASN 进行 ASN 和组织识别 - 支持 ARIN 引用的 WHOIS 查询,内置速率限制器(10次/分钟) **解析与路径** - 带超时的 DNS A / AAAA 记录解析 - 通过原生 Go resolver 并发进行 DNS 记录枚举(MX、TXT、NS、SOA、CNAME) - 系统 traceroute(在 Windows 上无需管理员权限),反向 DNS 丰富信息,超时跳点捕获 **表面检查** - TCP connect 端口扫描(IPv4 和 IPv6),banner grabbing,16 个并发 worker - TLS 证书检查:颁发者、使用者、SAN、有效期、自签名检测、协议版本,所有客户端强制锁定最低 TLS 1.2 - HTTP 探测:状态码、重定向链、server 指纹、安全头审计(HSTS、CSP、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy) - TCP ping 延迟(最小 / 平均 / 最大)及丢包统计 **规模与工作流** - 支持过滤网络/广播地址的 CIDR 扩展(上限为 65,536 台主机) - 具备可配置 worker pool 的并发目标分析 - 目标来源:位置参数、`--targets FILE`、stdin、配置文件 - 配置文件:位于主目录的 `.triton.json`,或通过 `--config` 指定任意文件 - IP 族选择(`-4` / `-6`),私有地址 SSRF 防护(`--no-private`) - 支持 SOCKS5 和 HTTP CONNECT 代理(`--proxy`),全局连接速率限制(`--rate`) - 通过 `--diff` 对比之前的 JSON 扫描进行变更检测 - 导出:结构化 JSON、CSV、HTML 报告、Leaflet 地理地图(防范 XSS 及公式注入) - 优雅关闭:通过 context 传播,SIGINT / SIGTERM 会取消所有正在进行的探测 - 可选的日志记录(`--log`):slog 多处理程序、带时间戳的文件、自动轮换(20 个文件) - 通过 `--update` 从 GitHub releases 进行自我更新,并带有校验和与签名验证 ## 快速开始 ``` # 安装 go install github.com/prodrom3/triton@latest # 下载 GeoLite2 数据库(需要免费的 MaxMind 账户) # GeoLite2-City.mmdb, GeoLite2-ASN.mmdb export GEOIP_DB_PATH=/path/to/GeoLite2-City.mmdb # 基础侦察 triton 8.8.8.8 # 对域名进行全面扫描,JSON 输出 triton --dns-all --ports default --tls --whois --http --json example.com # 扫描子网,机器可读 triton --ports default --no-traceroute --json 192.168.1.0/24 # 建立基线,然后检测 drift triton --output baseline.json example.com triton example.com --diff baseline.json ``` ## 安装说明 ### 二进制版本 适用于 Linux、macOS 和 Windows(amd64 + arm64)的预编译二进制文件发布在 [Releases](https://github.com/prodrom3/triton/releases) 页面。下载后,验证校验和并将其放入 `$PATH` 中。 ### Go 安装 ``` go install github.com/prodrom3/triton@latest ``` ### 从源码构建 ``` git clone https://github.com/prodrom3/triton.git cd triton make build # version-stamped build via ldflags # 或: go build -ldflags "-X main.version=$(cat VERSION)" -o triton . ``` ### 自我更新 ``` triton --update ``` 从 GitHub 下载最新匹配的发布资产,并原子性地替换当前运行的二进制文件。 ### GeoLite2 数据库 triton 读取 [MaxMind GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) 数据库(需要免费账户)。两者都是可选的,但强烈推荐使用: - `GeoLite2-City.mmdb` - 地理位置信息 - `GeoLite2-ASN.mmdb` - ASN 和组织信息 解析顺序: 1. `--db` / `--asn-db` CLI 标志 2. `GEOIP_DB_PATH` 环境变量 3. 主目录 4. Windows:`%APPDATA%\GeoIP\` 和 `%PROGRAMDATA%\GeoIP\` ## 用法 ``` triton [OPTIONS] TARGET [TARGET ...] cat targets.txt | triton [OPTIONS] triton --targets hosts.txt [OPTIONS] ``` ### 标志 | 标志 | 描述 | |---|---| | `TARGET` | IP、域名或 CIDR 范围(也可从 stdin 读取) | | `--db PATH` | GeoLite2-City.mmdb 的路径(或使用 `GEOIP_DB_PATH` 环境变量) | | `--asn-db PATH` | GeoLite2-ASN.mmdb 的路径 | | `--dns-all` | 查询 MX、TXT、NS、SOA、CNAME 记录 | | `--ports [LIST]` | 扫描端口(默认集合,或以逗号分隔:`--ports 22,80,443`) | | `--tls` | 检查端口 443 上的 TLS 证书 | | `--whois` | WHOIS 查询(速率限制为 10次/分钟) | | `--http` | 在开放的 Web 端口上探测 HTTP(状态、标头、重定向) | | `--ping` | TCP ping 延迟测量(3次探测) | | `--ping-port N` | 用于 `--ping` 的 TCP 端口(默认:80) | | `--all-ips` | 对所有解析出的 IP 进行地理定位,而不仅是第一个 | | `--no-traceroute` | 跳过 traceroute | | `--max-hops N` | 最大 traceroute 跳数(默认:20) | | `--timeout SECS` | 网络操作超时时间(默认:30) | | `--workers N` | 并发 worker 数量(默认:4) | | `--rate N` | 全局速率限制,以每秒新连接数计(0 = 不限速) | | `--retries N` | 重试超时的探测连接,最多重试 N 次 | | `--proxy URL` | 通过代理路由 TCP 探测(`socks5://host:port` 或 `http://host:port`) | | `--no-private` | 跳过解析为私有、环回或链路本地地址的目标 | | `-4` | 限制仅解析为 IPv4 地址 | | `-6` | 限制仅解析为 IPv6 地址 | | `--json` | JSON 输出 | | `--csv FILE` | 将结果导出为 CSV | | `--html FILE` | 将结果导出为独立的 HTML 报告 | | `--map FILE` | 将地理地图导出为 HTML(Leaflet / OpenStreetMap) | | `--diff FILE` | 将结果与之前的 JSON 文件进行对比 | | `--output FILE` | 将 JSON 结果保存到文件 | | `--targets FILE` | 从文件读取目标(每行一个,支持 `#` 注释) | | `--config FILE` | 从特定文件加载配置(默认:`$HOME/.triton.json`) | | `--log` | 将轮转的日志文件写入平台状态目录 | | `-q, --quiet` | 抑制进度输出 | | `--verbose` | 输出详细日志到 stderr(显示探测时间) | | `--update` | 将 triton 更新至最新版本(验证校验和) | | `-v, --version` | 显示版本号并退出 | ### 示例 ``` # 用于资产清单的侦察基线 triton --dns-all --tls --whois --ports default --http --json \ --output inventory.json --targets assets.txt # 快速子网扫描,无 traceroute,CSV 格式以供电子表格使用 triton --ports default --no-traceroute --csv hosts.csv 10.0.0.0/24 # 证书过期审计 triton --tls --no-traceroute --json --targets domains.txt \ | jq '.[] | {host: .target, not_after: .tls_cert.not_after}' # CI 中的 drift 检测 triton --output current.json --targets assets.txt triton --diff baseline.json --targets assets.txt # 远程端点的延迟采样 triton --ping --no-traceroute api.example.com # 地理可视化 triton --map map.html --targets vip_hosts.txt # HTTP 安全头审计 triton --http --no-traceroute --json example.com | jq '.http_results[].security_headers' ``` ## 输出与集成 ### 退出代码 | 代码 | 含义 | |---|---| | `0` | 所有目标均已无误分析完毕 | | `1` | 至少有一个目标产生错误(DNS 失败、不可达等) | | `2` | CLI 用法或配置无效 | ### JSON 输出 `--json` 或 `--output FILE` 会生成稳定、强类型的 JSON schema,适合进行后续处理。每个结果对象都包含 `target`、`timestamp` 以及按探测类型划分的子对象(`geolocation`、`dns_records`、`traceroute`、`port_results`、`tls_cert`、`whois`、`http_results`、`ping`)。每个探测的错误会被就地(in-band)捕获,而不是中止整个运行过程。 ``` triton --json 8.8.8.8 | jq '.geolocation.country' triton --json --targets assets.txt | jq '[.[] | select(.tls_cert.self_signed == true)]' ``` ### CSV 和 HTML - `--csv FILE` 将结果扁平化为表格形式,便于 BI 工具和电子表格处理。 - `--html FILE` 生成独立且经过 XSS 转义的 HTML 报告(无外部资源依赖)。 - `--map FILE` 生成 Leaflet 地理地图(使用 OpenStreetMap 切片,采用确保 `textContent` 安全的渲染方式)。 ### CI 示例(GitHub Actions) ``` - name: Recon drift check run: | triton --targets assets.txt --json --output current.json triton --targets assets.txt --diff baseline.json --output diff.json - uses: actions/upload-artifact@v4 with: name: recon-report path: | current.json diff.json ``` ## 配置说明 在您的主目录中创建 `.triton.json` 来设置默认值,或者使用 `--config` 指向特定的文件。CLI 标志的优先级高于配置值。 当前工作目录被刻意排除在配置文件的搜索范围之外:从不受信任的目录自动加载 `.triton.json` 可能会在不知不觉中注入扫描目标或重定向 GeoIP 数据库路径。如果需要,请有意使用 `--config ./project.triton.json` 加载项目本地的配置文件。 ``` { "db": "/path/to/GeoLite2-City.mmdb", "asn_db": "/path/to/GeoLite2-ASN.mmdb", "timeout": 15, "workers": 8, "dns_all": true, "tls": true, "whois": true, "http": true, "ping": true, "ping_port": 443, "ports": "22,80,443,8080", "rate": 50, "retries": 1, "proxy": "socks5://127.0.0.1:1080", "no_private": true, "log": false } ``` ## 架构 ``` flowchart LR CLI[CLI / stdin / targets file / .triton.json] CIDR[CIDR expansion + dedup] PIPE[Pipeline orchestrator] DNS[DNS resolution] GEO[GeoIP lookup] PROBES[Concurrent probes] OUT[Renderer / JSON / CSV / HTML / Map] DIFF[Diff engine] CLI --> CIDR --> PIPE --> DNS --> GEO --> PROBES --> OUT OUT -.previous JSON.-> DIFF --> OUT ``` 针对每个目标的并发探测会以扇出形式展开:traceroute、WHOIS、DNS 记录、端口扫描、TLS、HTTP、ping。每个探测都在共享的 `context.Context` 下运行于其独立的 goroutine 中,因此 `Ctrl+C` 或 `--timeout` 可以干净利落地取消所有待处理的网络调用。 ### 包结构 ``` main.go CLI, signal handling, orchestration internal/models typed results + JSON serialization internal/config config file loader (home or --config) internal/geo GeoLite2 reader + bounded cache (geo, trace, WHOIS by CIDR) internal/network DNS, reverse DNS, WHOIS, rate limiter, proxy dialer, SSRF guard internal/dns DNS record enumeration internal/scanner TCP scan, banner grab, TLS inspection internal/httpprobe HTTP probe + security header audit internal/ping TCP ping latency internal/tracer Cross-platform traceroute (IPv4 and IPv6) internal/pipeline Per-target concurrent orchestration internal/output Renderer (ANSI, cached detection, control-char sanitized) internal/export CSV, HTML, Leaflet map (XSS-safe, formula-injection-safe) internal/diff JSON comparison, change detection internal/logging slog multi-handler + rotation internal/updater Self-update with checksum and signature verification scripts/keygen, scripts/sign release signing helpers ``` ## 操作说明 - **默认设置趋于保守。** 默认开启 4 个 worker,30 秒超时,并默认启用 traceroute。请根据您的环境通过 `--workers`、`--timeout` 和 `--rate` 进行调整。 - **WHOIS 有速率限制**,为 10 次查询/分钟,以符合 RIR 的合理使用政策。结果按网段(同时支持 CIDR 和以连字符分隔的范围)缓存,因此扫描同一范围内的多台主机可复用同一次查询。限制器是基于进程的;如需跨并行调用进行协调请在外部处理。 - **全局速率限制** 可通过 `--rate`(每秒新建连接数)实现,并适用于所有 TCP 探测。`--retries` 仅重试发生超时的连接,绝不重试被拒绝的端口。 - **GeoIP 读取是无锁的**(基于 mmap)。结果缓存使用基于每个 map 的 RWMutex 和有界 FIFO 淘汰机制。 - **IPv6 是一等公民**,全面支持 DNS、扫描器、traceroute 和 HTTP 探测(全程使用 `net.JoinHostPort`)。使用 `-4` 或 `-6` 将运行限制为单一协议族。 - **TLS 客户端锁定最低版本为 1.2。** 证书检查仅在使用 InsecureSkipVerify 拨号读取自签名链时进行回退;结果会标记为 `self_signed: true`。 - **远程数据被视为不受信任的。** 在终端输出之前,banner、WHOIS 字段、TLS 名称、HTTP 标头、DNS 记录和反向 DNS 名称都会被剥离控制字符。HTML 和地图导出通过 `html.EscapeString` 和仅注入 `textContent` 的 DOM 确保防范 XSS;地图导出对其 CDN 资源固定使用 Subresource Integrity。CSV 导出会中和电子表格的公式注入。 - **SSRF 防护。** `--no-private` 会跳过那些解析为私有、环回或链路本地地址(包括云元数据 endpoint)的目标,这在目标列表来源于不受信任的源时非常有用。 - **代理支持。** `--proxy` 会通过 SOCKS5 或 HTTP CONNECT 代理路由所有 TCP 探测。Traceroute 使用系统工具,并且不会通过代理路由。 - **更新经过验证。** `--update` 会为每个下载的资产校验 SHA-256 清单,在配置了签名密钥时验证该清单的 ed25519 签名,并拒绝降级。 - **文件日志记录是可选的**(`--log`),并且会写入平台状态目录,而不是二进制文件所在目录。 - **CIDR 上限为 /16**(65,536 台主机),以防止意外进行互联网规模的扫描。 ## 负责任的使用 triton 旨在用于授权的网络侦察:资产盘点、攻击面管理、蓝队漂移检测、事件响应以及实验室/CTF 环境。 **在对您不拥有的任何网络或主机进行扫描之前,您有责任获得授权。** 在某些司法管辖区,端口扫描、banner grabbing 和激进的 traceroute 可能被视为具有侵入性或非法行为。作者对滥用行为不承担任何责任。 ## 安全政策 请通过提交 [GitHub Security Advisory](https://github.com/prodrom3/triton/security/advisories/new) 私下报告安全漏洞。在修复程序发布之前,请勿公开披露。 ## 开发指南 ``` make build # version-stamped binary make test # go test ./... -v make cover # coverage report (HTML) make lint # go vet + staticcheck go run . 8.8.8.8 ``` ### CI GitHub Actions 会在每次推送和 PR 时使用最小权限的 token 运行: - **测试矩阵**:`{ubuntu, macos, windows} x {go 1.23, go 1.24}`,开启竞态检测器 - **代码检查(lint)**:`go vet` + 固定版本的 `staticcheck` - **漏洞检查**:针对 Go 漏洞数据库执行 `govulncheck` - **gosec**:静态安全分析 - **CodeQL**:按计划及每次 PR 进行代码扫描 - **发布(release)**:在打上 `v*` 标签后,交叉编译 linux/darwin/windows x amd64/arm64 架构版本,发布 `SHA256SUMS` 清单,并在配置了签名密钥时对其进行签名(详见 [docs/RELEASING.md](docs/RELEASING.md)) ### 依赖项 - [geoip2-golang](https://github.com/oschwald/geoip2-golang) - MaxMind GeoLite2 读取器 - 其他所有功能均使用 Go 标准库(网络、TLS、DNS、CLI、JSON、CSV、HTTP) ## 支持 - **问题和功能请求**:[GitHub Issues](https://github.com/prodrom3/triton/issues) - **安全漏洞**:参见[安全政策](#security-policy) - **贡献**:fork 仓库,新建分支,提交 PR。请包含测试,并在提交前运行 `make lint`。 ## 许可证 MIT。详见 [LICENSE](LICENSE)。 由 [radamic](https://github.com/radamic) 旗下的 [prodrom3](https://github.com/prodrom3) 创建。
标签:DNS解析, EVTX分析, GitHub, Go, Ruby工具, TLS检查, 实时处理, 开源项目, 插件系统, 数据统计, 日志审计, 端口扫描