rsubdomain
基于Rust实现的高性能子域名暴破工具,实现原理参考 ksubdomain
为什么选择rsubdomain
- 🚀 高性能: 基于原始套接字的异步DNS查询,支持高并发
- 🔍 功能丰富: 支持子域名发现、HTTP/HTTPS验证、DNS记录解析
- 📊 多格式输出: 支持JSON、XML、CSV、TXT四种输出格式
- 🌐 智能网络: 自动检测网络设备,支持手动指定网络接口
- 📈 网速测试: 内置DNS包发送速度测试功能
- 🎯 泛解析检测: 智能识别并处理泛解析域名
- 📋 实时统计: 提供详细的汇总统计信息
安装要求
使用前需要安装libpcap或npcap:
Linux/macOS
# Ubuntu/Debian
# CentOS/RHEL
# macOS
Windows
需要安装以下组件:
- 使用MSVC工具链的Rust版本
- 安装 WinPcap 或 npcap (推荐npcap,需选择WinPcap兼容模式)
- 从 WinPcap Developers 下载
Packet.lib并放置在项目根目录的lib文件夹中
编译安装
使用方法
基本用法
# 基本子域名扫描
# 使用自定义字典文件
# 从文件读取目标域名
# 从标准输入读取目标域名
|
# 排除不想扫描的域名
# 从文件批量排除域名
# 从文件读取DNS解析器
# 自定义运行期控制
# 指定多种查询类型
# 静默模式(只输出发现的域名)
# 扫描多个域名
网络功能
# 列出所有网络接口
# 网速测试(默认目标8.8.8.8)
# 指定目标IP进行网速测试
# 手动指定网络设备
# 带宽限制
验证和解析功能
# HTTP/HTTPS验证模式
# DNS记录解析
# 输出原始逐记录结果
# 同时启用验证和解析
输出和统计
# 显示汇总统计
# 导出为JSON格式
# 导出为CSV格式
# 导出为XML格式
# 导出为TXT格式
# 导出包含查询类型的多记录扫描结果
高级用法
# 完整功能组合使用
命令行参数详解
| 参数 | 长参数 | 描述 | 默认值 |
|---|---|---|---|
-d |
--domain |
需要扫描的目标域名(可多个) | 与 --domain-file / --stdin 三选一即可 |
--domain-file |
从文件读取目标域名,每行一个 | - | |
--stdin |
从标准输入读取目标域名,每行一个 | false | |
--exclude-domain |
排除的目标域名,可逗号分隔 | - | |
--exclude-domain-file |
从文件读取排除域名,每行一个 | - | |
-l |
--list-network |
列出所有网络接口 | - |
-r |
--resolvers |
DNS解析器路径 | 系统默认DNS |
--resolver-file |
从文件读取DNS解析器,每行一个 | - | |
-s |
--slient / --silent |
静默模式,只输出域名 | false |
-f |
--file |
自定义字典文件路径 | 内置字典 |
-w |
--skip-wildcard |
跳过泛解析域名检测 | true |
-n |
--network-test |
执行网速测试 | - |
--target-ip |
网速测试目标IP | 8.8.8.8 | |
-b |
--bandwidth |
带宽限制 (K/M/G) | 3M |
-v |
--verify |
HTTP/HTTPS验证模式 | - |
--retry |
DNS查询超时后的最大重试次数 | 5 | |
--wait-seconds |
发包完成后的最大等待时间(秒) | 300 | |
--verify-timeout |
HTTP/HTTPS验证超时时间(秒) | 10 | |
--verify-concurrency |
HTTP/HTTPS验证并发度 | 50 | |
--resolve-records |
解析DNS记录 | - | |
--qtype |
主动发送的查询类型,可逗号分隔 (a/aaaa/cname/mx/ns/txt) | a | |
-e |
--device |
手动指定网络设备 | 自动检测 |
-o |
--output |
输出文件路径 | - |
--format |
输出格式 (json/xml/csv/txt) | json | |
--summary |
显示汇总统计 | - | |
--raw-records |
实时输出逐条DNS记录,而不是聚合视图 | false |
输出示例
标准输出
域名 查询 IP地址 记录类型 时间戳
------------------------------------------------------------------------------------------------------------------------
www.example.com A 93.184.216.34 A 14:23:45
mail.example.com MX 10 mail.example.com MX 14:23:46
ftp.example.com CNAME ftp.example.org CNAME 14:23:47
验证结果输出
域名 IP地址 HTTP HTTPS 标题 存活
------------------------------------------------------------------------------------------
www.example.com 93.184.216.34 200 200 Example Domain YES
api.example.com 93.184.216.35 404 N/A N/A NO
汇总统计
============================================================
汇总统计
============================================================
发现记录总数: 156
唯一域名数量: 98
唯一IP数量: 23
已验证域名: 45
存活域名: 32
记录类型分布:
A: 134
CNAME: 18
MX: 4
IP段分布 (前10个):
93.184.216.0/24: 12 个IP
192.168.1.0/24: 8 个IP
10.0.0.0/24: 5 个IP
性能特点
- 高并发: 支持数万并发DNS查询
- 智能重试: 自动处理DNS查询超时和失败
- 带宽控制: 可限制发送速度避免网络拥塞
- 内存优化: 高效的数据结构减少内存占用
- 实时输出: 边扫描边输出,无需等待完成
技术实现
- 原始套接字: 直接构造和解析DNS包
- 异步处理: 基于Tokio的异步I/O
- 智能解析: 正确解析各种DNS记录类型
- 网络检测: 自动识别最佳网络接口
- 数据导出: 支持多种结构化数据格式
注意事项
- 权限要求: 需要管理员/root权限运行(原始套接字)
- 防火墙: 确保DNS流量(UDP 53端口)未被阻止
- 网络环境: 建议在稳定的网络环境下使用
- 目标限制: 请合理使用,避免对目标造成压力
- 法律合规: 仅用于授权的安全测试
更新日志
v1.2.13 (最新)
- 🐛 修复API中
send_dns_queries方法参数不匹配问题 - 🐛 修复带宽限制器创建和使用逻辑
- 🐛 修复超时域名处理中的变量借用问题
- 🐛 修复资源清理时机导致结果丢失的问题
- ⚡ 优化DNS查询发送逻辑,支持文件和列表两种模式
- ⚡ 改进超时和重试处理机制
- 📚 更新API文档和使用示例
- 🔧 增强错误处理和状态管理
v1.2.3
- 🐛 修复多个API稳定性问题
- ⚡ 优化内存使用和性能
v1.2.0
- ✨ 新增HTTP/HTTPS验证功能
- ✨ 新增DNS记录解析功能
- ✨ 新增多格式输出支持(JSON/XML/CSV/TXT)
- ✨ 新增网速测试功能
- ✨ 新增手动指定网络设备
- ✨ 新增汇总统计功能
- 🐛 修复DNS记录解析显示问题
- 🐛 修复CNAME、MX、TXT记录解析异常
- ⚡ 优化异步处理性能
- 📊 增强实时输出和表格显示
v1.1.0
- ✨ 新增泛解析检测
- ✨ 新增带宽限制功能
- 🐛 修复多域名扫描问题
- ⚡ 优化内存使用
v1.0.0
- 🎉 初始版本发布
- ✨ 基本子域名暴破功能
- ✨ 自动网络设备检测
作为库使用
rsubdomain不仅可以作为命令行工具使用,还可以作为Rust库集成到你的项目中。
添加依赖
在你的Cargo.toml中添加依赖:
[]
# 从 crates.io
= "1.2.13"
# 或从本地路径 / Git 仓库
# rsubdomain = { path = "/path/to/rsubdomain" }
# rsubdomain = { git = "https://github.com/o0x1024/rsubdomain" }
# 异步运行时(必需)
= { = "1.0", = ["full"] }
如果你只想把它当作库引用,而不需要 CLI / HTTP 验证 / 导出能力,可以关闭默认特性:
[]
= { = "1.2.13", = false }
= { = "1.0", = ["full"] }
快速开始
use ;
async
高级配置
use ;
async
API 参考
主要结构体
SubdomainBruteConfig - 暴破配置
domains: Vec<String>- 目标域名列表 可由-d、--domain-file、--stdin组合输入,并在 CLI 层做去重和排除过滤resolvers: Vec<String>- DNS服务器列表 可由-r和--resolver-file组合输入,CLI 层会做归一化和去重dictionary_file: Option<String>- 字典文件路径skip_wildcard: bool- 是否跳过泛解析检测bandwidth_limit: Option<String>- 带宽限制verify_mode: bool- 是否启用HTTP/HTTPS验证max_retries: u8- DNS超时后的最大重试次数max_wait_seconds: u64- 发包结束后的最大等待时间verify_timeout_seconds: u64- HTTP/HTTPS验证超时时间verify_concurrency: usize- HTTP/HTTPS验证并发度resolve_records: bool- 是否解析DNS记录query_types: Vec<QueryType>- 主动发送的DNS查询类型silent: bool- 静默模式raw_records: bool- 是否输出原始逐记录结果device: Option<String>- 网络设备名称
SubdomainResult - 暴破结果
domain: String- 发现的域名ip: String- 对应的IP地址query_type: QueryType- 主动查询类型record_type: String- DNS记录类型verified: Option<VerifyResult>- HTTP/HTTPS验证结果dns_records: Option<DnsResolveResult>- DNS记录解析结果
SubdomainScanData - 从 SubdomainResult 派生出的汇总视图
raw_results: Vec<SubdomainResult>- 保真原始扫描结果,适合 JSON 导出discovered_domains: Vec<DiscoveredDomain>- 可展示/导出的发现结果aggregated_domains: Vec<AggregatedDiscoveredDomain>- 按域名聚合后的展示结果verification_results: Vec<VerificationResult>- HTTP/HTTPS验证结果列表summary: SummaryStats- 汇总统计
主要函数
brute_force_subdomains() - 便捷的暴破函数
pub async
run_speed_test() - 网速测试函数
pub async
export_results() - 结果导出函数
export_subdomain_results() - 直接导出扫描结果
JSON 导出会额外包含:
raw_results:每条原始扫描记录,包含query_typeaggregated_domains:按域名聚合后的展示视图verified/dns_records:在启用对应功能后保留详细结果
完整示例
查看 examples/ 目录中的完整示例:
examples/quick_start.rs- 快速入门示例examples/library_usage.rs- 完整功能示例
运行示例:
# 运行快速入门示例
# 运行完整示例
注意事项
- 权限要求: 库使用原始套接字,需要管理员权限
- 异步运行时: 必须在tokio运行时中使用
- 网络依赖: 需要稳定的网络连接
- 系统依赖: 需要安装libpcap/npcap
- 错误处理: 建议使用
?操作符或match进行错误处理
集成建议
- 在Web应用中,建议将暴破任务放在后台队列中执行
- 在桌面应用中,建议使用进度回调显示扫描进度
- 在服务中,建议添加速率限制和超时控制
- 建议缓存DNS解析结果以提高性能
许可证
MIT License
贡献
欢迎提交Issue和Pull Request!
免责声明
本工具仅用于授权的安全测试和学习研究。使用者需遵守相关法律法规,作者不承担任何滥用责任。