nuclide-research/VisorGraph
GitHub: nuclide-research/VisorGraph
VisorGraph是一款用于网络基础设施重建的轻量级工具,通过多种探测技术生成详细的网络图。
Stars: 0 | Forks: 0
# 视觉图
种子多态型基础设施重建引擎:证书跳转、服务指纹和域到操作者归因,全部在一个6.7 MB的静态二进制文件中。
VisorGraph接受一个或多个种子(IP、域名或种子文件)并运行一个固定点探测循环,直到图停止增长或预算耗尽。首先对每个种子运行被动探测;在被动饱和后启动主动探测。发现结果以JSONL流的形式输出到stdout进行实时链式处理;在文件末尾后跟一个最终的JSON图对象。沙箱检测器在扫描之前探测两个参考目标,比较响应形状,并在stderr中警告HTTP或TLS拦截活动,以便调用者知道主动探测结论是否可信。
## 安装
```
git clone https://github.com/nuclide-research/VisorGraph
cd VisorGraph
make setup-deps # installs gVisor (runsc) and Go deps
make build # produces ./bin/visorgraph (6.7 MB static binary)
```
或者,不使用make构建:
```
go build -o bin/visorgraph ./cmd/visorgraph
```
Go 1.25或更高版本。gVisor(`runsc`)对于沙箱主动探测是必需的;二进制文件可以不使用它运行,但主动探测将不会被沙箱化。
## 使用
```
visorgraph [-ip ] [-domain ] [-seeds-file ]
[-workers N] [-rps N] [-max-iter N]
[-no-active] [-sandbox-check] [-no-stream]
```
| 标志 | 默认值 | 影响 |
|------|---------|--------|
| `-ip ` | | 种子IP地址 |
| `-domain ` | | 种子域名 |
| `-seeds-file ` | | 每行一个种子的文件;通过`net.ParseIP`自动检测IP或域名;以`#`开头的行是注释;空白后的内联`# notes`将被删除 |
| `-workers ` | 256 | Goroutine池大小 |
| `-rps ` | 0(无限)| 所有探测每秒的最大请求数 |
| `-max-iter ` | 50 | 最大固定点迭代次数 |
| `-no-active` | false | 禁用主动探测;仅被动模式 |
| `-sandbox-check` | false | 扫描前运行MITM/拦截检测 |
| `-no-stream` | false | 抑制JSONL流;仅输出最终的图 |
`-ip`、`-domain`和`-seeds-file`组合添加。至少必须提供一个。
## 探测注册表
默认注册了五个探测。其中三个是主动的,并受被动饱和控制:
| 探测 | 模式 | 实现 |
|-------|------|-------------|
| `ct_logs` | 被动 | 是(crt.sh JSON API) |
| `passive_dns` | 被动 | 拖鞋(需要外部API密钥) |
| `bgp_whois` | 被动 | 拖鞋(需要外部API密钥) |
| `shodan_censys_cached` | 被动 | 拖鞋(需要外部API密钥) |
| `rdns` | 被动 | 拖鞋 |
| `tls_clienthello` | 主动 | 是(TLS握手+SAN提取) |
| `http_head` | 主动 | 是(HEAD请求+头部提取) |
| `prometheus` | 主动 | 是(未认证的Prometheus预言机) |
| `well_known` | 主动 | 拖鞋 |
| `banner_read` | 主动 | 拖鞋 |
`ct_logs`、`tls_clienthello`、`http_head`和`prometheus`有实际实现。其余探测是接受正确种子类型的占位符,并返回空发现,准备连接到API密钥。
## 图输出形状
JSONL流为每个事件输出一个对象。最终的图对象(stdout的最后一行)具有以下形状:
```
{
"nodes": {
"<16-char-hex-id>": {
"type": "host | service | cert | domain | netblock | org | asn",
"value": "...",
"attrs": {},
"provenance": [["seed-id", "..."]],
"first_seen": 1748000000.0,
"last_seen": 1748000000.0,
"exposure": "public_intended | public_accidental | mgmt_exposed | legacy_drift | unknown"
}
},
"edges": {
"": {
"src": "",
"dst": "",
"type": "observed_on | issued_for | resolves_to | announced_by | co_hosted_with | shares_cert_with | belongs_to | drift_from",
"attrs": {},
"first_seen": 1748000000.0
}
},
"created_at": 1748000000.0
}
```
节点身份是其规范字符串的SHA-256,截断为16个十六进制字符。UpsertNode在图的RWMutex下是原子的,因此在工作池中没有TOCTOU竞争。
## 沙箱检测
`-sandbox-check`向三个参考IP(example.com/Akamai、Google DNS、Cloudflare DNS)发送相同的有效载荷并比较响应形状。目标之间的相同形状表示HTTP拦截。它还检查`example.com:443`的TLS发行者并匹配已知的拦截CA。结果发送到stderr,以免污染JSONL流。
## 引擎行为
引擎在最大堆种子优先队列上运行固定点迭代(最高置信度优先)。一个信号量限制并发goroutine的数量为`-workers`。`golang.org/x/time/rate`令牌桶为每个探测RPS设置门控。当队列为空且没有goroutine在飞行时,当预算耗尽或当`-max-iter`迭代完成时,引擎停止。SIGINT和SIGTERM通过上下文取消干净地排空引擎。
## 示例
```
$ ./bin/visorgraph -domain example.com -no-active -no-stream
```
```
{
"nodes": {
"a3c1e4b2d5f60718": {
"type": "domain",
"value": "example.com",
"attrs": {},
"provenance": [["a3c1e4b2d5f60718"]],
"first_seen": 1748000000.0,
"last_seen": 1748000000.1,
"exposure": "public_intended"
},
"9f2a8b1c3d7e4051": {
"type": "cert",
"value": "sha256:abcdef...",
"attrs": {"cn": "www.example.com", "sans": ["example.com", "www.example.com"]},
"provenance": [["a3c1e4b2d5f60718", "9f2a8b1c3d7e4051"]],
"first_seen": 1748000000.2,
"last_seen": 1748000000.2,
"exposure": "unknown"
}
},
"edges": {
"a3c1e4b2d5f60718-issued_for->9f2a8b1c3d7e4051": {
"src": "a3c1e4b2d5f60718",
"dst": "9f2a8b1c3d7e4051",
"type": "issued_for",
"attrs": {},
"first_seen": 1748000000.2
}
},
"created_at": 1748000000.0
}
```
## VisorGraph不是什么
VisorGraph不是一个端口扫描器。它不会扫描范围、暴力破解目录或发送漏洞利用。主动探测是非侵入性的:TLS握手、HEAD请求和未认证的API读取。引擎的RPS标志和预算上限限制了其足迹。对于人口普查扫描,请使用aimap或JAXEN。对于单个监控主机,请使用tiptoe。
## 许可证
MIT。属于NuClide工具链的一部分。联系:[nuclide-research.com](https://nuclide-research.com)
标签:CT日志遍历, EVTX分析, Go语言, gVisor沙箱, JSONL输出, MITM检测, Prometheus数据源, TLS指纹识别, 主动探测, 图分析, 域名归属地, 威胁情报, 安全测试, 开发者工具, 拦截检测, 攻击性安全, 数据流, 日志审计, 程序破解, 被动探测, 证书跳转, 静态二进制