目录导航
certgraph是什么
CertGraph 抓取 SSL 证书,创建一个有向图,其中每个域都是一个节点,该域证书的证书替代名称是其他域节点的边。新域在发现时输出。在详细模式下,完成后会打印图形的邻接列表。
抓取默认通过 TCP 连接收集证书,但是有多个驱动程序可以搜索证书透明度日志。
该工具旨在用于通过 SSL 证书进行主机名枚举,但它也可以向您显示域之间的信任“链”以及在它们之间重复使用的证书。
相关背景
这个项目的想法是在检查XKCD.com的 SSL 证书后产生的。
如果您仔细查看下面的屏幕截图,您会发现 XKCD.com 上使用的 SSL 证书也适用于许多与 XKCD 或Randall Munroe无关的域。

此行为是 XKCD 使用的 CDN 的副作用,在本例中为 Fastly。Fastly 将他们的许多客户放在同一个证书上,可能是为了简化他们的部署。这是有效的,因为 SSL 证书可以使用“证书主题备用名称”扩展来添加除了证书中指定的主要名称之外证书应该对其有效的其他主机列表。

也可以为单个域颁发许多证书。这在证书和域之间创建了多对多关系;一个理想的图形目标。
证书透明度
证书透明度日志提供了一个额外的和优秀的 SSL 证书来源以供查询。我们可以从单个日志或索引中获取所有证书,而不是连接到每个主机来获取其证书。
证书透明背景
当前数字证书管理系统中的缺陷因“受信任的”CA 颁发的欺诈性证书引起的引人注目的安全和隐私泄露而变得明显。
Certificate Transparency 的目标是提供一个开放的审计和监控系统,让任何域所有者或证书颁发机构确定他们的证书是否被错误地颁发或被恶意使用。
证书透明度允许域所有者在为其域颁发证书时收到通知,通知他们可能存在的任何未经授权的证书。近乎实时!
实际的 Certificate Transparency 日志有数百 GB 大小且未编入索引,因此搜索它们并不理想,但是,有公共 Certificate Transparency 搜索引擎为我们索引了所有数据,以便我们进行查询。
不幸的是,Facebook 的工具要求您登录 Facebook 帐户才能使用它。但它会在检测到为您正在监控的域颁发的新证书时向您发送即时通知。
证书图表示例
子域枚举
已经有很多子域枚举工具(例如Sublist3r),但它们都可以通过强力域或通过搜索索引(如 Google)来工作。CertGraph 还可以帮助枚举子域,但速度更快,准确度更高。这是因为 CertGraph 遇到的每个域都被称为有效域。尽管 CertGraph 可能不会遇到每个子域,但它应该没有误报。
注意:为了获得最佳结果,请使用带有-ct-subdomains
标志的证书透明度驱动程序。
内部域泄漏
CertGraph 可以帮助枚举您可能不知道在您的证书替代名称中公开列出的所有域。这有时会导致对内部和外部主机都有效的证书被外部猜测,与公众共享内部主机名。下面是一个例子。
$ certgraph -driver crtsh -ct-subdomains netflix.com | grep internal
staging-npp-internal.netflix.com
issues-internal.nrd.netflix.net
dev-npp-internal.netflix.com
npp-internal.netflix.com
api-internal.test.netflix.com
api-int-internal.netflix.com
api-int-internal.test.netflix.com
...
错误配置的证书
CertGraph 可以输出的图形可视化可以被认为是一个信任图。如果证书对一个域有效,而该域由另一个域的证书托管,我们可以说第二个域必须信任第一个域的所有者,因为他们拥有证书。
这个想法可以扩展和链接以包含许多证书。如果您的图表包含许多与您没有任何信任关系的域,这可能表明存在问题。
下面是一个真实的例子,将域更改为红色、绿色和蓝色,以使其更加明显并保护有罪者。
$ certgraph -json blue.com > data.json

在这个例子中,Red、Green 和 Blue 都是不同的组织,我们只在 上运行 certgraph blue.com
,它列举了少数 Blue 的其他域和证书。然而,不知何故 certgraph 最终达到了green.com
,然后red.com
. 这怎么可能?原来blue.com
是green.com
在 alt-name中提供 SSL 证书,并且www.green.com
有一个 .ssl 证书red.com
。
经过一番挖掘,我了解到 Blue 以前拥有green.com
并将其卖给了 Red。但是 Blue 仍然拥有有效的 SSL 证书,green.com
并且正在从blue.com
. 此时 Blue 可以 SSL 中间人 Red 的green.com
域。花一分钟让它沉入其中。
CDN
如果任何已爬取的域使用CDN,则 CertGraph 将默认跳过 CDN 证书。CDN 证书可能包含数百个不相关的替代名称,从而在数据中引入了大量不需要的无用数据。该-cdn
标志会导致 CertGraph 在搜索中包含 CDN 结果,而不是跳过它们。
CertGraph 的工作原理
目前 CertGraph 支持 4 种不同的驱动程序,这是 CertGraph 搜索和获取域证书的方式。
- http连接到端口 443 上的域并从 TLS 握手中收集证书。
- smtp类似
http
,但查找域的 MX 记录并使用端口 25 和starttls
. - crtsh使用crt.sh搜索证书透明度
- 谷歌喜欢使用
crtsh
谷歌的证书透明度搜索工具
方法
在幕后,CertGraph 相当简单。它使用修改后的广度优先搜索来允许它在创建图形时并行地爬行。
通配符域被标准化为其父域。不幸的是,这是必需的,因为我们不知道要连接到哪个子域主机。例子:*.example.com → example.com
Certgraph 也有几种输出模式:
- 域列表 – 列出找到的所有域,发现时每行 1 个(默认)
- 域邻接列表 – 打印更多详细信息,例如主机状态、域的证书哈希和图(
-details
标志)中根的深度 - JSON Graph – 用于在Web UI上绘制图形的 JSON 输出(
-json
标志) - 保存证书 – 以 PEM 格式保存证书以供以后分析(
-save
标志)
certgraph使用方法示例
用法 ./certgraph: [参数]... 主机...
https://github.com/lanrat/certgraph
选项:
-apex
对于找到的每个域,添加域的父域的顶点域
-cdn
包括来自cdn的证书
-ct-expired
在证书透明度搜索中包括过期的证书
-ct-subdomains
在证书透明度搜索中包括子域
-depth uint
最大BFS深度(默认5)
-details
打印有关域名爬行的详细信息
-dns
检查DNS记录,以确定域是否注册
-driver string
使用[crtsh,谷歌,http, smtp]的驱动程序(默认为“http”)
-json
打印json格式的图形,可用于web UI中的图形
-parallel uint
并行检索的证书数量(默认为10)
-regex string
Regex域必须匹配为图的一部分
-sanscap int
证书中uniq顶点域的最大数目,0没有限制(默认为80)
-save string
将证书保存到PEM格式的文件夹
-serve string
address:提供html UI的端口
-timeout uint
TCP超时时间,单位为秒(默认为10)
-updatepsl
更新默认的公共后缀列表
-verbose
详细的日志
-version
打印版本并退出
基本用法:
$ ./certgraph -list eff.org
eff.org
staging.eff.org
leez-dev-supporters.eff.org
micah-dev2-supporters.eff.org
maps.eff.org
web6.eff.org
https-everywhere-atlas.eff.org
s.eff.org
max-dev-supporters.eff.org
httpse-atlas.eff.org
kittens.eff.org
dev.eff.org
max-dev-www.eff.org
atlas.eff.org
域邻接列表以以下格式打印:
Node Depth Status Cert-Fingerprint [Edge1 Edge2 ... EdgeN]
$ ./certgraph -details eff.org
eff.org 0 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [maps.eff.org web6.eff.org eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org kittens.eff.org]
web6.eff.org 1 Good AF842FA69A720E9FB2F37BAF723A20F80B8C2072693E55D0A1EA78C7BABE2699 [*.eff.org *.dev.eff.org *.s.eff.org *.staging.eff.org]
https-everywhere-atlas.eff.org 1 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [kittens.eff.org maps.eff.org web6.eff.org eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org]
maps.eff.org 1 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [maps.eff.org web6.eff.org eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org kittens.eff.org]
atlas.eff.org 1 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org kittens.eff.org maps.eff.org web6.eff.org]
httpse-atlas.eff.org 1 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org kittens.eff.org maps.eff.org web6.eff.org]
kittens.eff.org 1 Good 5C699512FD8763FC50A105A14DB2526A10AE6EAC3E79F5F44A7F99E90189FBE5 [eff.org atlas.eff.org https-everywhere-atlas.eff.org httpse-atlas.eff.org kittens.eff.org maps.eff.org web6.eff.org]
dev.eff.org 2 No Host []
s.eff.org 2 Good AF842FA69A720E9FB2F37BAF723A20F80B8C2072693E55D0A1EA78C7BABE2699 [*.eff.org *.dev.eff.org *.s.eff.org *.staging.eff.org]
staging.eff.org 2 Good AC3933B1B95BA5254F43ADBE5E3E38E539C74456EE2D00493F0B2F38F991D54F [max-dev-supporters.eff.org leez-dev-supporters.eff.org max-dev-www.eff.org micah-dev2-supporters.eff.org staging.eff.org]
leez-dev-supporters.eff.org 3 Good AC3933B1B95BA5254F43ADBE5E3E38E539C74456EE2D00493F0B2F38F991D54F [staging.eff.org max-dev-supporters.eff.org leez-dev-supporters.eff.org max-dev-www.eff.org micah-dev2-supporters.eff.org]
micah-dev2-supporters.eff.org 3 Good AC3933B1B95BA5254F43ADBE5E3E38E539C74456EE2D00493F0B2F38F991D54F [max-dev-supporters.eff.org leez-dev-supporters.eff.org max-dev-www.eff.org micah-dev2-supporters.eff.org staging.eff.org]
max-dev-supporters.eff.org 3 Good AC3933B1B95BA5254F43ADBE5E3E38E539C74456EE2D00493F0B2F38F991D54F [max-dev-supporters.eff.org leez-dev-supporters.eff.org max-dev-www.eff.org micah-dev2-supporters.eff.org staging.eff.org]
max-dev-www.eff.org 3 Good AC3933B1B95BA5254F43ADBE5E3E38E539C74456EE2D00493F0B2F38F991D54F [max-dev-www.eff.org micah-dev2-supporters.eff.org staging.eff.org max-dev-supporters.eff.org leez-dev-supporters.eff.org]
网页界面
CertGraph 还包括一个简单的 Web 界面,可轻松实现图形的可视化。
可以在https://lanrat.github.io/certgraph在线访问,也可以在程序源代码的 docs 文件夹中离线访问。

Web UI 是一个单页 Web 界面,可以在使用-json
标志时可视化图形输出。它可以完全离线运行。
例子: $ certgraph -json example.com > example-graph.json
您可以通过使用数据下拉菜单上传、粘贴或链接到 JSON 文件,将数据加载到 Web 界面。
或者可以通过调用从嵌入式 Web 服务器运行:
certgraph --serve 127.0.0.1:8080



certgraph下载地址
GitHub:
certgraph-darwin-amd64-20210224.zip2.55 MB
certgraph-darwin-arm64-20210224.zip2.49 MB
certgraph-linux-386-20210224.zip2.32 MB
certgraph-linux-amd64-20210224.zip2.47 MB
certgraph-linux-arm-20210224.zip2.29 MB
certgraph-linux-arm64-20210224.zip2.24 MB
certgraph-openbsd-amd64-20210224.zip2.47 MB
certgraph-windows-386-20210224.zip2.4 MB
certgraph-windows-amd64-20210224.zip2.49 MB
certgraph安装方法
kali linux安装
此工具在kali linux中早有集成,如果你运行的kali linux版本大于等于2020.4,那么打开kali即可使用.

如果没有安装的,kali里面可以使用如下命令进行安装:
apt install certgraph

docker安装
CertGraph可以在 Docker Hub 上的自动构建!
$ docker run --rm -it lanrat/certgraph example.com example.com www.example.net www.example.org www.example.com example.org example.net example.edu www.example.edu
编译安装
要编译 certgraph,您的系统上必须有一个可用的 go 1.16 或更新的编译器。
为正在运行的系统编译就像运行 make 一样简单
certgraph$ make go build -o certgraph certgraph.go
或者,您可以使用go get
此在线安装:
go get -u github.com/lanrat/certgraph
项目地址
GitHub: