boy-hack/ksubdomain
GitHub: boy-hack/ksubdomain
基于无状态设计和 pcap 的高性能子域名枚举工具,突破传统 DNS 扫描的性能瓶颈,实现每秒百万级查询。
Stars: 1177 | Forks: 162
# KSubdomain: 超快无状态子域名枚举工具
[](https://github.com/boy-hack/ksubdomain/releases) [](https://goreportcard.com/report/github.com/boy-hack/ksubdomain) [](https://github.com/boy-hack/ksubdomain/blob/main/LICENSE)
**KSubdomain 是一款无状态子域名枚举工具,具备前所未有的扫描速度和极低的内存消耗。** 告别传统工具的瓶颈,体验闪电般的 DNS 查询,并依靠可靠的状态表重传机制确保结果的完整性。KSubdomain 支持 Windows、Linux 和 macOS,是大规模 DNS 资产发现的理想选择。

## 🚀 核心优势
* **闪电般的速度:** 采用无状态扫描技术,直接操作网络适配器进行原始套接字(raw socket)数据包发送,绕过系统内核的网络协议栈,实现惊人的发包速率。使用 `test` 命令探测本地网络适配器的最大发送速度。
* **极低的资源消耗:** 创新的内存管理机制,包括对象池和全局内存池,显著减少内存分配和 GC 压力,即使在处理海量域名列表时也能保持低内存占用。
* **无状态设计:** 类似于 Masscan 的无状态扫描,不维护来自系统的状态表,而是构建轻量级状态表,从根本上解决了传统扫描工具的内存瓶颈和性能限制,以及无状态扫描丢包问题。
* **可靠的重传:** 内置智能重传机制,有效应对网络抖动和丢包,确保结果的准确性和完整性。
* **跨平台支持:** 完美兼容 Windows、Linux 和 macOS。
* **易于使用:** 简单的命令行界面,提供验证和枚举模式,内置常用字典。
## ⚡ 性能亮点
KSubdomain 在速度和效率上远超同类工具。以下是在 4 核 CPU、5M 带宽网络环境下,使用 10 万字典进行的对比测试:
| Tool | Mode | Method | Command | Time | Success | Notes |
| ------------ | ------ | ------------ | -------------------------------------------------------------------------- | -------------- | ------- | ------------------------- |
| **KSubdomain** | Verify | pcap network | `time ./ksubdomain v -b 5m -f d2.txt -o k.txt -r dns.txt --retry 3 --np` | **~30 sec** | 1397 | `--np` 禁用实时打印 |
| massdns | Verify | pcap/socket | `time ./massdns -r dns.txt -t A -w m.txt d2.txt --root -o L` | ~3 min 29 sec | 1396 | |
| dnsx | Verify | socket | `time ./dnsx -a -o d.txt -r dns.txt -l d2.txt -retry 3 -t 5000` | ~5 min 26 sec | 1396 | `-t 5000` 设置 5000 并发 |
**结论:** KSubdomain 比 massdns **快 7 倍**,比 dnsx **快 10 倍**!
## 🛠️ 技术创新 (v2.0)
KSubdomain 2.0 引入了多项底层优化,进一步挖掘性能潜力:
1. **状态表优化:**
* **分片锁:** 取代全局锁,显著减少锁竞争,提高并发写入效率。
* **高效哈希:** 优化键值存储,均匀分布域名,提高查找速度。
2. **数据包发送优化:**
* **对象池:** 复用 DNS 数据包结构,减少内存分配和 GC 开销。
* **模板缓存:** 针对相同的 DNS 服务器复用以太网/IP/UDP 层数据,减少冗余构建开销。
* **并行发送:** 多 goroutine 并行发包,充分利用多核 CPU 性能。
* **批处理:** 批量发送域名请求,减少系统调用和上下文切换。
3. **接收优化:**
* **对象池:** 复用解析器和缓冲区,减少内存消耗。
* **并行处理流水线:** 接收 → 解析 → 处理 三级并行,提高处理流水线效率。
* **缓冲优化:** 增加内部 Channel 缓冲区大小,避免处理阻塞。
* **高效过滤:** 优化 BPF 过滤规则和数据包处理逻辑,快速丢弃无效数据包。
4. **内存管理优化:**
* **全局内存池:** 引入 `sync.Pool` 管理常用数据结构,减少内存分配和碎片。
* **结构体复用:** 复用 DNS 查询结构和序列化缓冲区。
5. **架构和并发优化:**
* **动态并发:** 根据 CPU 核心数自动调整 goroutine 数量。
* **高效随机数:** 使用性能更高的随机数生成器。
* **自适应速率:** 根据网络状况和系统负载动态调整发包速率。
* **批量加载:** 批量加载和处理域名,减少单个域名处理开销。
## 📦 安装
### 下载二进制文件
请从 [Releases](https://github.com/boy-hack/ksubdomain/releases) 页面下载对应系统的预编译二进制文件。
1. **下载:** 获取适合您操作系统(Windows、Linux、macOS)的最新版本。
2. **安装 `libpcap` 依赖:**
* **Windows:** 下载并安装 [Npcap](https://npcap.com/)。
* **Linux:** 通常已预装。如未安装,请安装 `libpcap-dev` 或 `libcap-devel`。
* **macOS:** 已预装。
3. **授予执行权限:** `chmod +x ksubdomain`
4. **运行!**
### 从源码构建
确保已安装 Go 1.23+ 和 `libpcap` 环境。
```
git clone https://github.com/boy-hack/ksubdomain.git
cd ksubdomain
go build -o ksubdomain ./cmd/ksubdomain
```
## 📖 使用
```
KSubdomain - Ultra-Fast Stateless Subdomain Enumeration Tool
Usage:
ksubdomain [global options] command [command options] [arguments...]
Version:
Check version: ksubdomain --version
Commands:
enum, e Enumeration mode: Provide root domain for brute-force
verify, v Verification mode: Provide domain list for verification
test Test local network adapter's maximum packet sending speed
help, h Show command list or help for a command
Global Options:
--help, -h Show help (default: false)
--version, -v Print version (default: false)
```
### 验证模式
验证模式快速检查提供的域名列表的存活状态。
```
./ksubdomain verify -h # or ksubdomain v
OPTIONS:
--filename value, -f value Domain file path
--domain value, -d value Domain
--band value, -b value Bandwidth downstream speed, e.g., 5M, 5K, 5G (default: "3m")
--resolvers value, -r value DNS servers (uses built-in DNS by default)
--output value, -o value Output filename
--output-type value, --oy value Output file type: json, txt, csv, jsonl (default: "txt")
--silent Only output domains to screen (default: false)
--retry value Retry count, -1 for infinite retry (default: 3)
--timeout value Timeout in seconds (default: 6)
--stdin Accept stdin input (default: false)
--not-print, --np Don't print domain results (default: false)
--eth value, -e value Specify network adapter name
--wild-filter-mode value Wildcard filtering mode: basic, advanced, none (default: "none")
--predict Enable domain prediction mode (default: false)
--only-domain, --od Only output domains, no IPs (default: false)
--help, -h Show help (default: false)
# Examples:
# Verify multiple domains
./ksubdomain v -d xx1.example.com -d xx2.example.com
# Read domains from file and save to output.txt
./ksubdomain v -f domains.txt -o output.txt
# Read from stdin with 10M bandwidth limit
cat domains.txt | ./ksubdomain v --stdin -b 10M
# Enable prediction mode with advanced wildcard filtering, save as CSV
./ksubdomain v -f domains.txt --predict --wild-filter-mode advanced --oy csv -o output.csv
# JSONL format for tool chaining
./ksubdomain v -f domains.txt --oy jsonl | jq '.domain'
```
### 枚举模式
枚举模式基于字典和预测算法,对指定域名下的子域名进行暴力枚举。
```
./ksubdomain enum -h # or ksubdomain e
OPTIONS:
--domain value, -d value Domain
--band value, -b value Bandwidth downstream speed (default: "3m")
--resolvers value, -r value DNS servers
--output value, -o value Output filename
--output-type value, --oy value Output type: json, txt, csv, jsonl (default: "txt")
--silent Only output domains (default: false)
--retry value Retry count (default: 3)
--timeout value Timeout in seconds (default: 6)
--stdin Accept stdin input (default: false)
--not-print, --np Don't print results (default: false)
--eth value, -e value Specify network adapter
--wild-filter-mode value Wildcard filter mode (default: "none")
--predict Enable prediction mode (default: false)
--only-domain, --od Only output domains (default: false)
--filename value, -f value Dictionary path
--ns Read domain NS records and add to resolvers (default: false)
--help, -h Show help (default: false)
# Examples:
# Enumerate multiple domains
./ksubdomain e -d example.com -d hacker.com
# Use dictionary file
./ksubdomain e -d example.com -f subdomain.txt -o output.txt
# Read from stdin with 10M bandwidth
cat domains.txt | ./ksubdomain e --stdin -b 10M
# Enable prediction with advanced wildcard filtering
./ksubdomain e -d example.com --predict --wild-filter-mode advanced --oy jsonl
```
## ✨ 功能与技巧
* **自动带宽适配:** 只需使用 `-b` 指定您的公网下行带宽(例如 `-b 10m`),KSubdomain 会自动优化发包速率。
* **测试最大速率:** 运行 `./ksubdomain test` 测试当前环境下的理论最大发包速率。
* **自动网络适配器检测:** KSubdomain 自动检测可用的网络适配器。
* **进度显示:** 实时进度条显示 成功 / 已发 / 队列 / 已收 / 失败 / 耗时。
* **参数调优:** 根据网络质量和目标域名数量调整 `--retry` 和 `--timeout` 以获得最佳结果。当 `--retry` 为 -1 时,将无限重试直到所有请求成功或超时。
* **多种输出格式:** 支持 `txt`(实时)、`json`(完成时)、`csv`(完成时)、`jsonl`(流式)。通过 `-o` 和文件扩展名指定(例如 `result.json`)。
* **环境变量:**
* `KSubdomainConfig`:指定配置文件路径。
## 🔗 集成示例
### 配合 httpx
```
./ksubdomain enum -d example.com --od | httpx -silent
```
### 配合 nuclei
```
./ksubdomain enum -d example.com --od | nuclei -l /dev/stdin
```
### 配合 nmap
```
./ksubdomain enum -d example.com --od | nmap -iL -
```
### 使用 JSONL 进行流式处理
```
./ksubdomain enum -d example.com --oy jsonl | \
jq -r 'select(.type == "A") | .domain' | \
httpx -silent
```
### 在 Python 脚本中
```
import subprocess
import json
result = subprocess.run(
['ksubdomain', 'enum', '-d', 'example.com', '--oy', 'jsonl'],
capture_output=True, text=True
)
for line in result.stdout.strip().split('\n'):
data = json.loads(line)
print(f"{data['domain']} => {data['records']}")
```
### 在 Go 程序中
```
import "github.com/boy-hack/ksubdomain/v2/sdk"
scanner := sdk.NewScanner(&sdk.Config{
Bandwidth: "5m",
Retry: 3,
})
results, err := scanner.Enum("example.com")
for _, result := range results {
fmt.Printf("%s => %s\n", result.Domain, result.IP)
}
```
## 🌟 平台说明
### macOS 用户
macOS 使用 BPF (Berkeley Packet Filter),默认缓冲区较小:
```
# Recommended: 5M bandwidth for stability
sudo ./ksubdomain e -d example.com -b 5m
# If buffer errors occur
sudo ./ksubdomain e -d example.com -b 3m --retry 10
# System tuning (optional)
sudo sysctl -w net.bpf.maxbufsize=4194304
```
### WSL/WSL2 用户
```
# Usually use eth0
./ksubdomain e -d example.com --eth eth0
# If network adapter is not up
sudo ip link set eth0 up
```
### Windows 用户
```
# Must install Npcap driver first
# Download: https://npcap.com/
# Run with administrator privileges
.\ksubdomain.exe enum -d example.com
```
## 📊 输出格式
### TXT (默认)
```
www.example.com => 93.184.216.34
mail.example.com => CNAME mail.google.com
api.example.com => 93.184.216.35
```
### JSON
```
{
"domains": [
{
"subdomain": "www.example.com",
"answers": ["93.184.216.34"]
}
]
}
```
### CSV
```
subdomain,type,record
www.example.com,A,93.184.216.34
mail.example.com,CNAME,mail.google.com
```
### JSONL (JSON Lines) - **新功能!** 🆕
```
{"domain":"www.example.com","type":"A","records":["93.184.216.34"],"timestamp":1709011200}
{"domain":"mail.example.com","type":"CNAME","records":["mail.google.com"],"timestamp":1709011201}
```
非常适合流式处理和工具链组合!
## 🛡️ 安全与道德
**负责任地使用:**
* 仅扫描您拥有或有权测试的域名
* 尊重目标系统和网络资源
* 遵守当地法律法规
* 本工具仅供安全研究和授权测试使用
## 📚 文档
- [快速入门指南](./docs/quickstart.md)
- [API 文档](./docs/api.md)
- [最佳实践](./docs/best-practices.md)
- [常见问题](./docs/faq.md)
## 💡 参考
* 原版 KSubdomain: [https://github.com/knownsec/ksubdomain](https://github.com/knownsec/ksubdomain)
* 从 Masscan/Zmap 解析到实践: [https://paper.seebug.org/1052/](https://paper.seebug.org/1052/)
* KSubdomain 无状态工具介绍: [https://paper.seebug.org/1325/](https://paper.seebug.org/1325/)
## 📜 许可证
KSubdomain 基于 MIT 许可证发布。详见 [LICENSE](LICENSE)。
## 🙏 致谢
特别感谢所有贡献者和开源社区!
**如果觉得有用,请给本项目点个 Star ⭐!**
由 KSubdomain 团队用 ❤️ 制作
标签:DNS枚举, EVTX分析, EVTX分析, GitHub, Go语言, KSubdomain, Pcap, Raw Socket, Spyse API, 主动侦察, 低内存消耗, 协议栈, 大规模扫描, 子域名枚举, 子域名爆破, 批量查询, 插件系统, 无状态扫描, 日志审计, 程序破解, 系统安全, 网络安全, 网络安全工具, 资产探测, 隐私保护