网络空间测绘
cert-skills 的测绘能力不是"扫一个站",而是一条发现 → 指纹化 → 归类 → 拓扑 → 追踪的流水线,专为资产盘点、C2 检测、攻击面管理设计。
测绘三段式
批量扫描:map-scan
# 按主机
cert-skills map-scan --hosts a.com,b.com,c.com --ports 443 -o json
# 按 CIDR
cert-skills map-scan --cidrs 192.0.2.0/30 --ports 443,8443
# 全参数
cert-skills map-scan \
--hosts a.com,b.com \
--cidrs 10.0.0.0/24 \
--ports 443 \
--concurrency 100 \
--timeout 5 \
--rate-limit 50 \
--retries 2 \
--server-name example.com # SNI 覆盖每个目标采集:证书链(含 Raw DER)、TLS 版本、密码套件、SNI。默认 InsecureSkipVerify——测绘场景需要看到自签证书和 IP 证书,不能因校验失败就跳过。
输出含测绘摘要:去重统计、按六维聚合、信任拓扑、时间线。并发模型见 批量扫描与拓扑。
离线测绘:map-parse
已经有一堆证书文件(比如从其他扫描器导出的),想复用同一套测绘摘要逻辑:
cert-skills map-parse *.crt *.pem
cert-skills map-parse ./certs/ --extensions零网络,纯本地解析,产出与 map-scan 相同结构的去重/聚合/拓扑摘要。
三个 map 命令的分工
map-scan:在线拨号采集,输入主机/CIDRmap-parse:离线解析已有证书文件,输入.crt/.pemmap-timeline:跨周期汇总,输入多次detect-change --save的快照 JSON
三者产出结构一致,可串联:先 map-scan 采集 → map-parse 复用证书文件做合规审计 → detect-change 定期采快照 → map-timeline 看轮换历史。
生命周期时间线:map-timeline
cert-skills map-timeline snapshots/*.json从多次 detect-change --save 留下的 CertSnapshot JSON 构建证书生命周期时间线:什么时候续期、什么时候换钥、什么时候换 CA。适合长期监控资产轮换。
CT 日志:发现历史签发
证书透明度(CT)日志记录了几乎所有公开 CA 签发的证书,是测绘的"历史档案库"。
# 按域名搜 CT(含通配子域)
cert-skills search-ct example.com
# 子域枚举:按 issuer 分组、标识泛解析、区分 Active/Expired
cert-skills ct-enumerate example.com
# 按证书指纹精确搜
cert-skills search-ct-fingerprint <sha256>ct-enumerate 是测绘侦察利器——一张证书的 SAN 往往暴露多个内部子域。底层走 crt.sh API,详见 CT 日志与子域枚举。
TLS 指纹:JARM / JA3
# JARM:服务端 TLS 实现画像,识别 C2/CDN/VPN
cert-skills jarm suspicious-host.com
# JA3/JA3S:客户端/服务端 Hello 画像
cert-skills ja3 suspicious-host.com| 指纹 | 看什么 | 画像对象 |
|---|---|---|
| JARM | 10 个探针下服务器的 TLS 响应 | 服务端实现(Nginx? Cloudflare? Cobalt Strike?) |
| JA3 | 客户端 ClientHello 字段 | 客户端(浏览器? curl? Metasploit?) |
| JA3S | 服务端 ServerHello 字段 | 服务端 Hello |
JA3 的局限
Go 的 tls.ConnectionState 不暴露原始 ClientHello,cert-skills 的 JA3 反映的是"我们发出的 Hello",而非任意客户端的。JA3S 才是真正对服务端画像。详见 JA3/JA3S 指纹。
指纹库匹配:match-fp
# 采集目标的 JARM/JA3/cert/SPKI 全套指纹,匹配已知服务库
cert-skills match-fp suspicious-host.com
# 离线按单个 hash 匹配
cert-skills match-fingerprint-by-hash --type jarm --hash 07d14d16d21d21d07c42d41d00041d24de...内置 ~60 条已知服务指纹(Cloudflare/AWS/GCP/Azure/Cobalt Strike/Metasploit/Sliver/Nginx/Apache/Postfix/MySQL…),按 cdn/cloud/c2/vpn/web/mail/database/other 分类。可加载自定义 JSON 扩展。匹配算法见 指纹库匹配。
证书信任域名:get-trusted-domains
cert-skills get-trusted-domains example.com提取证书 SAN 里所有信任的域名,含泛解析展开(*.example.com → 列出覆盖范围)与基础域名提取。测绘时用来回答"这张证还能保护哪些域"。
证书变更检测:detect-change
# 首次采集并保存快照
cert-skills detect-change example.com --save --snapshot-dir ./snaps
# 再次运行,对比上次快照
cert-skills detect-change example.com --snapshot-dir ./snaps对比 CertSHA256、SPKISHA256、Issuer、JARMHash、NotAfter,推断变更类型:
这是 map-timeline 的数据来源,也是 workflow-cyberspace-mapping-sweep 的"追踪轮换"阶段。
其他测绘辅助
| 命令 | 作用 |
|---|---|
verify-hostname <domain> | 证书主机名匹配(RFC 6125) |
detect-ev <domain> | 是否 EV 证书(策略 OID) |
check-wildcard <domain> | 泛解析证书模式与风险 |
下一步
- 并发/去重/拓扑算法 → 批量扫描与拓扑
- JARM 10 探针 → JARM 指纹
- CT API 细节 → CT 日志与子域枚举
- 完整测绘编排 → 网络空间测绘扫描工作流