
Knock子域名扫描
✅ 高速 & 异步 • 🔐 侦察 + 暴力枚举 • 🔧 易于扩展
KnockPy 是一个模块化的 Python 3 工具,用于通过被动侦察和暴力枚举来枚举子域名,现已支持 async/await,具有增强的性能和现代化的 HTTP/TLS 处理。
httpx 和 DNS 解析--verbose 单域名诊断(DNS/TCP/TLS/重定向链/请求错误 + 安全检查)show/delete/export/search)git clone https://github.com/guelfoweb/knockpy.git
cd knockpy
# 推荐:在虚拟环境中安装
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -U pip
pip install .
# 备选:为当前用户安装(不使用虚拟环境)
# python3 -m pip install --user .
⚠️ 推荐 Python 版本:3.9+
代码库按职责划分,并提供稳定的外观以保持向后兼容性:
knockpy/
cli.py # CLI 入口(外观/编排)
cli_parts/
status.py # 运行时/状态面板渲染
setup.py # 交互式设置和持久化运行时默认值
report.py # 交互式报告模式
scan_flow.py # 排除规则、侦察测试、通配符辅助函数
core.py # 公共核心外观(兼容性)
engine/
runtime.py # 扫描引擎实现
storage.py # 公共存储外观(兼容性)
storage_parts/
db.py # SQLite 持久化/设置
export.py # 报告导出编排
html_report.py # HTML 报告渲染
output.py # 终端输出渲染
server_versions.py # Web 服务器版本目录
knockpy.py # 兼容模块导出
兼容性说明:
import knockpy 或 from knockpy import KNOCKPY。engine/、cli_parts/ 和 storage_parts/。仅在稳定版本发布到 GitHub 后
pip install knock-subdomains
knockpy -d domain.com [选项]
--threads 和 --timeout这两个选项对大规模扫描的运行时间影响最大。
--threads 控制并发度(并行处理的目标数)--timeout 控制每个网络步骤在放弃前等待的时间权衡:
threads = 扫描更快,但会增加 CPU/网络/DNS 负载,并增加远程频率限制的风险timeout = 扫描更快,但可能遗漏有效但响应慢的目标(假阴性)推荐配置:
--threads 50 --timeout 5--threads 150 --timeout 4--threads 250 --timeout 3 开始如果您在非常大的列表中既需要速度又需要完整性,请使用两遍策略:
--threads 250 --timeout 3--threads 80 --timeout 5(或更高)注意:
--setup)覆盖内置默认值threads=250,timeout=3knockpy -d example.com --recon --bruteforce
knockpy -d example.com --recon --test
knockpy --update-versions
knockpy --check-update
首次运行时,KnockPy 会创建:
~/.knockpy/recon_services.json
您可以通过编辑 services 数组来添加/禁用数据源。
您也可以指向自定义文件路径,无需修改代码:
export KNOCK_RECON_SERVICES=/path/to/recon_services.json
每个服务支持:
nameenabled(true/false)parserurl_template(支持 {domain}、{virustotal_key}、{shodan_key})requires_api(virustotal 或 shodan,可选)支持的解析器:
csv_first_columnrapiddns_html_tdjson_listvirustotal_subdomainsshodan_subdomainsecho "example.com" | knockpy -d
export API_KEY_VIRUSTOTAL=your-virustotal-api-key
export API_KEY_SHODAN=your-shodan-api-key
您可以使用 .env 文件:
API_KEY_VIRUSTOTAL=your-virustotal-api-key
API_KEY_SHODAN=your-shodan-api-key
knockpy -d example.com --recon --bruteforce
knockpy --report list
knockpy --report latest
knockpy --report
交互式报告菜单:
1 show2 delete3 export4 search0 reset db(需要明确确认)退出报告模式:
EnterCTRL+Cknockpy -d forum.example.com --verbose
knockpy -d example.com --wildcard
KnockPy 可作为 Python 模块使用:
import knockpy
result = knockpy.KNOCKPY("example.com", timeout=5.0, threads=20)
print(result["domain"], result["ip"])
或者:
from knockpy import KNOCKPY
domain = 'example.com'
results = KNOCKPY(
domain,
dns="8.8.8.8",
useragent="Mozilla/5.0",
timeout=5,
threads=10,
recon=True,
bruteforce=True,
wordlist=None,
silent=False
)
for entry in results:
print(entry['domain'], entry['ip'], entry['http'], entry['cert'])
默认字典包含在 knockpy/wordlist/wordlist.txt 中。
您可以使用 --wordlist 提供自己的字典文件。
python3 -m pytest
# (可选)快速运行示例脚本
python3 examples/poc.py
根据 GPLv3 许可证授权。
Gianni Amato (@guelfoweb)
| 标志 | 描述 |
|---|
-d, --domain | 目标域名(若不带值使用,则从 stdin 读取) |
-f, --file | 包含域名列表的文件 |
--recon | 启用被动侦察 |
--bruteforce, --brute | 使用字典进行暴力枚举 |
--exclude TYPE VALUE | 排除匹配项(status、length/lenght、body) |
--verbose | 仅对单域名扫描进行深度诊断 |
--wildcard | 测试通配符 DNS 并退出 |
--test | 与 --recon 一起使用,测试每个侦察源(失败/空/数据) |
--setup | 交互式设置(运行时默认值 + 数据库中的 API 密钥) |
--update-versions | 更新本地最新的 Web 服务器版本目录 |
--report [ID|latest|list] | 报告模式(交互式显示/删除/导出/搜索/重置数据库,导出 HTML) |
--check-update | 检查 PyPI 上是否有更新的 Knockpy 版本 |
--wordlist | 运行时覆盖字典文件 |
--dns | 运行时覆盖 DNS 解析器 |
--useragent | 运行时覆盖 HTTP User-Agent |
--timeout | 运行时覆盖超时时间(秒) |
--threads | 运行时覆盖并发工作线程数 |
--silent | 隐藏进度条 |
--json | 仅输出 JSON(强制启用 --silent) |
--status | 打印运行时状态并继续 |
-h, --help | 显示帮助信息 |