ni5arga/ct-enum
GitHub: ni5arga/ct-enum
基于证书透明度日志的轻量级被动子域名枚举工具,通过crt.sh和Censys源实现无交互的资产发现。
Stars: 1 | Forks: 0
# ct-enum

[](https://www.python.org/)
[](https://docs.aiohttp.org/)
[]()
[]()
通过 Certificate Transparency 日志进行被动子域名枚举(crt.sh + 可选 Censys)。
## 项目结构
```
ct-enum/
├── main.py # CLI entry point
├── ct_sources.py # CT provider implementations (crt.sh, Censys)
├── parser.py # Name extraction, normalization, filtering
└── utils.py # Domain validation, backoff, formatting
```
## 环境要求
- Python 3.11+
- [aiohttp](https://docs.aiohttp.org/)
```
pip install aiohttp
```
## 用法
```
python main.py example.com
```
输出:
```
[*] Target : example.com
[*] Providers: CrtShProvider, CensysProvider
[*] Timeout : 30.0s
[*] Querying Certificate Transparency logs...
[+] Done - 5 unique subdomains found
TARGET example.com FOUND 5
▸ dev.example.com
▸ m.example.com
▸ products.example.com
▸ support.example.com
▸ www.example.com
```
### JSON 输出
```
python main.py example.com --json
```
```
{
"domain": "example.com",
"count": 5,
"subdomains": [
"api.example.com",
"cdn.example.com",
"mail.example.com",
"staging.example.com",
"www.example.com"
]
}
```
### 保存到文件
```
python main.py example.com --output results.txt
python main.py example.com --json --output results.json
```
### 其他参数
```
python main.py example.com --timeout 60 # custom timeout (default: 30s)
python main.py example.com -v # verbose/debug logging
```
## 参数标志
| 标志 | 类型 | 默认值 | 描述 |
|------|------|---------|-------------|
| `domain` | positional | | 目标域名,例如 `example.com` |
| `--json` | flag | off | 以 JSON 格式输出 |
| `--output FILE` | string | | 将输出写入文件 |
| `--timeout SECS` | float | `30.0` | HTTP 请求超时时间(秒) |
| `--verbose` / `-v` | flag | off | 启用调试日志 |
## Censys 集成
Censys 是可选的,需要从 [censys.io](https://search.censys.io/) 获取免费的 API 账户。
```
export CENSYS_API_ID="your-api-id"
export CENSYS_API_SECRET="your-api-secret"
```
当凭据存在时,Censys 会与 crt.sh 一起被自动查询。如果未设置,则会静默跳过。
## 工作原理
1. 查询 `crt.sh` 获取所有匹配 `%.example.com` 的证书
2. 可选查询 Censys(如果已设置凭据)
3. 解析每个证书条目中的 `name_value` 和 `common_name` 字段
4. 规范化名称:转换为小写,去除通配符前缀(`*.`)
5. 去重,过滤出目标的有效子域名,排序并返回
失败的请求和速率限制会通过指数退避重试(最多 4 次尝试,上限 60 秒)。
## 示例
```
python main.py tesla.com
python main.py github.com --json --output github_subs.json
python main.py google.com --timeout 120 -v
python main.py example.com --json | jq '.subdomains[]'
```
## 扩展
在 `ct_sources.py` 中实现 `CTProvider` 抽象基类,并在 `get_providers()` 中注册它:
```
from ct_sources import CTProvider
class MyProvider(CTProvider):
async def fetch(self, domain: str, session: aiohttp.ClientSession) -> list[dict]:
...
def get_providers() -> list[CTProvider]:
return [CrtShProvider(), CensysProvider(), MyProvider()]
```
## 注意事项
- 结果反映的是历史证书数据,而非活动/在线子域名
- 通配符证书(`*.example.com`)会被排除;它们不映射到具体的子域名
- 不执行 DNS 解析;此工具完全是被动式的
标签:aiohttp, CT日志, ESC4, GitHub, OSINT, Python, Sigma 规则, 域名分析, 子域名枚举, 安全工具库, 异步编程, 无后门, 系统安全, 网络安全, 被动侦察, 证书透明度, 逆向工具, 隐私保护