a-mashhoor/ssnatch
GitHub: a-mashhoor/ssnatch
基于C语言和pthreads的多线程SSL证书SAN批量抓取工具,支持CIDR网段扫描,以极致速度采集目标证书中的域名、指纹、过期状态等关键信息。
Stars: 1 | Forks: 0
# ssnatch —— 因为手动查证书这种事是给脚本小子玩的
[](https://en.wikipedia.org/wiki/C_(programming_language))
[](http://www.wtfpl.net/)
[](https://github.com/a-mashhoor)
**ssnatch** 是一个多线程、极其硬核的 SSL 证书 SAN 抓取器。它根本不鸟你那慢吞吞的 Python 脚本或者你手动敲的 openssl 命令。喂给它一个 CIDR、一个主机名、一个端口列表,然后看着它以比你念出“自签名”还要快的速度,把 TLS 证书里的 Subject Alternative Names (SAN) 狠狠撕出来。
如果你还在像 1999 年那样使用 `echo | openssl s_client`,那你活该遇到段错误。这个工具是用 C 语言写的,使用真正的线程,并且不把它网络上每个可达机器里的每一个 SAN 都榨干,它就绝不会停下来。
## 功能特性
- **快到飞起** – C + pthreads = 没有废话。
- **支持 CIDR** – `192.168.1.0/24`?放马过来。我们扫遍全部 256 台主机连汗都不出。
- **多端口支持** – 因为有些白痴会把 HTTPS 跑在 8443、9443 甚至 666 端口上。
- **JSON 输出** – 因为你不是山顶洞人。用 `jq` 去解析它,或者把它塞进你的 SIEM 里。
- **线程数控制** – 如果你的内核扛得住,把它飙到 100 吧。
- **超时调节** – 有些主机就是慢;我们可不会一直死等。
- **SNI 支持** – 虚拟主机?没问题。我们会发送正确的主机名。
- **零成本附加功能** – 需要 SHA256 指纹?序列号?TLS 版本?通配符检测?到期检查?自签名标志?链式主题?主机名不匹配?单独提取 Common Name?只要 SAN?所有这些标志在握手完成后都不会增加任何开销。我们给你数据,但绝不拖慢你的速度。
- **没有依赖地狱** – 只需要 OpenSSL 和 libpthread。如果你连这两个都没有,滚回 Windows 去吧。
## 性能:因为我们他妈在乎速度
我们跟 [tlsx](https://github.com/projectdiscovery/tlsx) 做了一个简单粗暴的对比——这是一个牛逼闪闪、功能多到爆炸的出色工具。但在从单台主机抓取 SAN 这个简单任务上,ssnatch 不仅仅是赢了;它简直把对手按在地上摩擦。
**测试环境:**
- 目标:`google.com`
- 命令:`time tlsx -san -cn -u google.com > /dev/null` 对比 `time ssnatch -t google.com > /dev/null`
- 硬件:同一台机器,没有什么网络黑魔法,只有冰冷坚硬的现实。
**结果:**

- **tlsx:** 7.47 秒。没错,你没看错。做他妈一次查询要七个半秒。
- **ssnatch:** 0.44 秒。这不是打字错误。我们快了 17 倍。17。他妈的。倍。
当然,tlsx 有一大堆花里胡哨的功能——zcrypto、OpenSSL 后端、JSON 美化输出,说不定还能给你煮咖啡。但当你只需要知道证书上有哪些 SAN 时,你真的想等 7 秒钟吗?我知道你不想。
ssnatch 精简、残暴,并且专门为一件事做过极致优化:以内核允许的最快速度把 SAN 从证书里撕出来。没有臃肿,没有废话,只有结果。如果你用 10 个线程扫描一个 /24 网段,在 tlsx 还在热身它的 goroutine 时,你就已经完事了。
所以,去用 tlsx 写你那花里胡哨的合规报告吧。但当你需要速度的时候,你知道去哪找我们。
## 为什么我他妈要用这个?
- **域名侦察与并购:** 你以为你知道目标拥有的所有域名?扯淡。他们的证书会把每一个该死的子域、每一台内部主机、每一台被遗忘的测试服务器都抖落得一干二净。用 ssnatch 扫一次,你就会得到一份能让他们的资产管理团队痛哭流涕的域名列表。并购尽职调查?我们刚为你省下了几周的手工挖掘时间。
- **狩猎 CDN 背后的真实 IP:** CloudFlare、Akamai,随便什么——它们隐藏了真实 IP,对吧?错。太多蠢货直接暴露了他们的源站服务器,用的还是同一张证书,跑在标准甚至是一些非标准端口上(8443、9443,应有尽有)。把目标的 CIDR 地址块给 ssnatch,我们几分钟内就能找到那些暴露的证书。在你的 CDN 处理完你的第一个请求之前,你就已经拿到真实的 IP 了。
- 因为你已经厌倦了等 Python 慢吞吞地启动。
- 因为你需要扫描数千台主机,而你没那一整天的闲工夫。
- 因为你的老板想要一份“全面的 SAN 资产清单”,而你想让自己看起来像个 1337 h4x0r(顶级黑客)。
- 因为 `openssl s_client` 就是一坨只能处理单个主机的垃圾,没个包装脚本根本没法批量用。
- 因为现在你可以在**没有任何性能损耗**的情况下获取 SHA256、过期时间、证书链等信息。我们在保持极高速度的同时塞满了这些功能。
## 安装
```
git clone https://github.com/a-mashhoor/ssnatch.git
cd ssnatch
make
sudo make install # optional, if you're not a pussy
```
依赖项:`libssl-dev`、`gcc`、`make`。在 Kali/Debian/Ubuntu 上执行:
```
sudo apt install libssl-dev build-essential
```
## 使用方法
```
ssnatch -t [options]
```
### 选项
| 短选项 | 长选项 | 描述 | 默认值 |
|-------|---------------|-----------------------------------------------------------------------------|-------------|
| `-t` | `--target` | 目标 CIDR (如 `192.168.1.0/24`) 或主机名 (`example.com`) | **必填** |
| `-p` | `--ports` | 逗号分隔的端口列表 (如 `443,8443,9443`) | `443` |
| | `--timeout` | 连接超时时间 (秒) | `5` |
| `-j` | `--threads` | 工作线程数 (别那么娘,至少用 10 个) | `4` |
| `-o` | `--output` | 将输出写入文件 (代替 stdout) | stdout |
| | `--json` | 输出 JSON 行 (每个目标一个对象) | off |
| | `--hash-sha1` | 在输出中包含 SHA1 指纹 | off |
| | `--hash-sha256`| 在输出中包含 SHA256 指纹 | off |
| | `--serial` | 包含证书序列号 | off |
| | `--org` | 包含 subject 中的组织 (O=) | off |
| | `--tls-version`| 包含使用的 TLS 版本 (如 TLSv1.3) | off |
| | `--wildcard` | 如果证书包含通配符 SAN (`*.example.com`) 则进行标记 | off |
| | `--expired` | 如果证书已过期则进行标记 | off |
| | `--self-signed`| 如果证书是自签名的则进行标记 | off |
| | `--chain` | 输出完整的证书链 (仅主题) | off |
| | `--mismatched`| 检查主机名 (SNI) 是否匹配 SAN/CN;标记为 true/false | off |
| | `--cn` | 单独提取 Common Name | off |
| | `--san` | (仅限人类可读模式) 每行只打印一个 SAN 条目 | off |
| `-h` | `--help` | 显示这些屁话 | |
### 示例
```
# 基础主机名扫描
ssnatch -t example.com -p 443
# 包含三个端口、20 个线程和 JSON 输出的 CIDR 范围
ssnatch -t 192.168.1.0/24 -p 443,8443,9443 -j 20 --json -o results.jsonl
# 带有自定义超时的单一 IP
ssnatch -t 10.0.0.1 -p 443 --timeout 10
# 以 JSON 获取所有内容
ssnatch -t google.com -p 443 --json --hash-sha256 --serial --org --tls-version --wildcard --expired --self-signed --chain --mismatched --cn
# Human 模式:仅 SANs(非常适合通过管道传递给其他工具)
ssnatch -t example.com -p 443 --san
# 带有额外字段的 Human 模式
ssnatch -t example.com -p 443 --hash-sha256 --serial --tls-version
```
## 输出
### 人类可读模式 (默认)
```
Target: 93.184.216.34:443 (SNI: example.com)
Subject: /CN=example.com
Issuer: /C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
SHA256: ba76ec0160db6f9edd49c056075899b6863eaa01a5f214f84a50e083920a6631
Serial: 0x123456789abcdef
TLS version: TLSv1.3
Wildcard: no
Expired: no
Self‑signed: no
Chain:
/CN=example.com
/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
Mismatched: no
CN: example.com
SANs:
DNS: example.com
DNS: www.example.com
```
### JSON 模式 (`--json`)
每一行都是一个有效的 JSON 对象。字段仅在需要时出现。
```
{"ip":"93.184.216.34","port":443,"sni":"example.com","subject":"/CN=example.com","issuer":"/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1","sha256":"ba76ec0160...","serial":"123456789abcdef","tls_version":"TLSv1.3","wildcard":false,"expired":false,"self_signed":false,"chain":["/CN=example.com","/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1"],"mismatched":false,"cn":"example.com","sans":["example.com","www.example.com"]}
```
通过管道传给 `jq` 进行美化和过滤:
```
ssnatch -t 34.64.0.0/24 -p 443 --json | jq '.ip, .sans[]'
```
## 许可证
本项目基于 WTFPL 许可证授权——你想他妈干嘛就干嘛。详情请见 [LICENSE](LICENSE) 文件。
## 作者
**@a-mashhoor** – 因为总得有人把这玩意儿写出来。
如果你把这个工具用于非法用途,那你就是个白痴,并且我根本不认识你。
标签:API安全, CIDR扫描, GitHub, HTTPS安全, JSON输出, OpenSSL, SAN提取, SHA256指纹, SNI支持, SSL/TLS, 二进制发布, 企业安全, 子域名枚举, 安全测试工具, 实时处理, 客户端加密, 开源工具, 性能优化, 恶意行为检测, 插件系统, 攻击路径可视化, 数据展示, 数据统计, 检测绕过, 端口扫描, 系统安全, 红队, 网络安全, 网络资产管理, 证书分析, 隐私保护, 黑客工具, 黑帽SEO