用 SSL/TLS 证书发现子域名
所有 TLS 证书签发时都会被记入公开的 Certificate Transparency (CT) 日志,而每张证书的 SANs 字段列出了它覆盖的域名。搜索 CT 是最可靠的被动子域名枚举方式 —— 包括 staging 主机、内部面板、开发环境,这些 DNS 扫描完全看不到。
为什么 CT 日志能暴露子域名
CA 签发 TLS 证书时必须提交到多个 CT 日志(Chrome 和 Safari 拒绝信任未被记录的证书)。证书的 Subject Alternative Names (SANs) 扩展列出了它覆盖的每个 hostname。证书本体和 SANs 都永久成为公开日志的一部分。
结果是:只要有人为 staging.example.com、internal.example.com 或 admin-old-2019.example.com 申请过 TLS 证书,那个 hostname 就永久可被公开发现 —— 即使主机已下线、即使 DNS 不再解析、即使证书早已过期。
分步操作
1. 在浏览器试一下
在下方搜任意域名 —— CT Radar 会返回该域名及其子域名曾经签发的所有证书。
Try: ···
2. 用 CLI 拿可管道输出
# install $ go install github.com/imfht/ct-radar@latest $ export CT_RADAR_KEY=<your-key> # enumerate $ ct-radar example.com api.example.com admin.example.com internal.example.com staging.example.com dev-old.example.com ... 847 unique subdomains
3. 管道传给 httpx 找活跃主机
$ ct-radar example.com | httpx -silent https://api.example.com [200] https://staging.example.com [403] https://admin.example.com [401] ... 124 live hosts
4. 与主动枚举结合
# CT (passive) + subfinder (passive DNS) + amass (active brute force)
$ {
ct-radar example.com;
subfinder -d example.com -silent;
amass enum -passive -d example.com;
} | sort -u | httpx -silent
... 1,247 live hosts提示与边界
- CT 看不到从未签过证的。只跑 HTTP 的内部主机、或用私有 CA 的,都不会出现。一定要把 CT 和主动 DNS 枚举结合。
- 通配符证书会隐藏子域名。*.example.com 的证书覆盖所有但什么具体的都不暴露。
- 旧证书是金子。2018 年的过期证书可能指向被遗忘但仍在线的 staging 主机。
- 代码里要过滤通配符。管道传给其它工具时,去掉以 *. 开头的条目 —— 大多数 probe 工具不接受。
- Let's Encrypt 在 2025 退出了 CT,但每张 LE 证书仍会被同步到其它运营方的日志,所以 LE 签的子域仍可见。