ni5arga/ct-enum

GitHub: ni5arga/ct-enum

基于证书透明度日志的轻量级被动子域名枚举工具,通过crt.sh和Censys源实现无交互的资产发现。

Stars: 1 | Forks: 0

# ct-enum ![截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/cd7d1c9e4c183515.png) [![Python](https://img.shields.io/badge/python-3.11+-blue?style=flat-square&logo=python&logoColor=white)](https://www.python.org/) [![aiohttp](https://img.shields.io/badge/aiohttp-async-blue?style=flat-square)](https://docs.aiohttp.org/) [![被动侦察](https://img.shields.io/badge/recon-passive-green?style=flat-square)]() [![CT 日志](https://img.shields.io/badge/source-crt.sh%20%2B%20Censys-orange?style=flat-square)]() 通过 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 规则, 域名分析, 子域名枚举, 安全工具库, 异步编程, 无后门, 系统安全, 网络安全, 被动侦察, 证书透明度, 逆向工具, 隐私保护