功能特性 • 用法 • 安装 • 用法 • 贡献 • 补充说明
Domainim 是一款用于组织网络扫描的快速域名侦察工具。该工具旨在通过 OSINT、暴力破解、DNS 解析等技术,提供组织结构的简要概览。
当前功能(v1.3.0)-

虚拟主机名枚举
反向 DNS 查询
检测通配符子域名。仅解析到通配符 IP 的被动结果会被隐藏,除非它们曾在 TLS 证书中出现过。可通过 --force-brute 强制进行暴力破解,此时仅解析到通配符 IP 的结果会被丢弃
基本 TCP 端口扫描
接受子域名作为输入
将结果导出为 JSON 文件
部分功能仍在开发中。详情请参阅计划功能。
本项目受 Sublist3r 启发。端口扫描模块大量基于 NimScan。
你可以从源码构建此仓库-
git clone [email protected]:pptx704/domainim
nimble build
./domainim <domain> [--ports=<ports>]
或者,你也可以直接从发布页面下载二进制文件。请注意,该二进制文件仅在基于 Debian 的系统上经过测试。
./domainim <domain> [--ports=<ports> | -p:<ports>] [--wordlist=<filename> | -l:<filename> [--rps=<int> | -r:<int>] [--force-brute | -f]] [--dns=<dns> | -d:<dns>] [--out=<filename> | -o:<filename>]
<domain> 是要枚举的域名。它也可以是一个子域名。-- ports | -p 是要扫描的端口的字符串指定。它可以是以下之一:
all - 扫描所有端口(1-65535)none - 跳过端口扫描(默认)t<n> - 扫描最常见的 n 个端口(与 nmap 相同)。即 t100 扫描最常见的 100 个端口。最大值为 5000。如果 n 大于 5000,将被设置为 5000。80 扫描端口 8080-100 扫描端口 80 到 10080,443,8080 扫描端口 80、443 和 808080,443,8080-8090,t500 扫描端口 80、443、8080 到 8090 以及最常见的 500 个端口--dns | -d 是 DNS 服务器的地址。这应该是一个有效的 IPv4 地址,并且可以选择性地包含端口号:
a.b.c.d - 使用位于 a.b.c.d 端口 53 上的 DNS 服务器a.b.c.d#n - 使用位于 a.b.c.d 端口 n 上的 DNS 服务器--wordlist | -l - 字典文件的路径。这用于暴力破解子域名。如果文件无效,将跳过暴力破解。空行和以 # 开头的行会被忽略。你可以从 SecLists 获取字典。在发布页面中也提供了一个字典。--force-brute | -f - 即使发现通配符记录也进行暴力破解。仅解析到通配符 IP 的子域名会被丢弃。--rps | -r - 暴力破解期间每秒发出的请求数。默认值为 1024 req/s。需要注意的是,DNS 查询是分批进行的,只有前一批完成后才会进行下一批。由于查询可能会受到速率限制,增加该值并不总能保证更快的结果。--out | -o - 输出文件的路径。输出将以 JSON 格式保存。文件名必须以 .json 结尾。示例
./domainim nmap.org --ports=all./domainim google.com --ports=none --dns=8.8.8.8#53./domainim pptx704.com --ports=t100 --wordlist=wordlist.txt --rps=1500./domainim pptx704.com --ports=t100 --wordlist=wordlist.txt --out=results.json./domainim nmap.org --wordlist=wordlist.txt --force-brute./domainim mysite.com --ports=t50,5432,7000-9000 --dns=1.1.1.1可以使用 ./domainim --help 或 ./domainim -h 访问帮助菜单。
Usage:
domainim <domain> [--ports=<ports> | -p:<ports>] [--wordlist=<filename> | -l:<filename> [--rps=<int> | -r:<int>] [--force-brute | -f]] [--dns=<dns> | -d:<dns>] [--out=<filename> | -o:<filename>]
domainim (-h | --help)
Options:
-h, --help Show this screen.
-p, --ports Ports to scan. [default: `none`]
Can be `all`, `none`, `t<n>`, single value, range value, combination
-l, --wordlist Wordlist for subdomain bruteforcing. Bruteforcing is skipped for invalid file.
-f, --force-brute Bruteforce even if a wildcard record is found. Results resolving only to wildcard IPs are discarded.
-d, --dns IP and Port for DNS Resolver. Should be a valid IPv4 with an optional port [default: system default]
-r, --rps DNS queries to be made per second [default: 1024 req/s]
-o, --out JSON file where the output will be saved. Filename must end with `.json`
Examples:
domainim domainim.com -p:t500 -l:wordlist.txt --dns:1.1.1.1#53 --out=results.json
domainim sub.domainim.com --ports=all --dns:8.8.8.8 -l:wordlist.txt -r:1500 -f -o:results.json
结果的 JSON schema 如下:
[
{
"subdomain": string,
"data": [
{
"ipv4": string,
"vhosts": [string],
"reverse_dns": string,
"ports": [int]
}
]
}
]
nmap.org 的示例 json 可在此处找到。
欢迎贡献。请随时提交 pull request 或 issue。
本项目仍处于早期阶段。我清楚存在若干限制。
我使用的引擎(我称它们为引擎,因为 Sublist3r 也这么叫)都是免费、无需密钥的服务,且大多数都有某种响应限制。dnsdumpster 对免费用户最多返回 50 个子域名,rapiddns 约 100 个。hackertarget 每个 IP 每天只允许少量查询,certspotter 只返回当前有效的证书。crt.sh 在结果过多时会随机化结果,并且经常过载(HTTP 502)。因此对于某些域名,不同次运行的结果可能不同。失败的引擎会被报告并跳过;它绝不会中止扫描。被动来源也可能包含过时或由通配符生成的名字。
所有 IP 都在单个事件循环上并发进行端口扫描(最多 4096 个在途连接尝试,每秒最多发起 5000 个,以免本地和路由器队列丢弃 SYN 包)。不响应 ping 的主机不会被扫描。端口扫描器只有 ping 响应时间 + 750ms 的超时。这可能导致漏报。由于 domainim 并非用于端口扫描,而是提供快速概览,此类情况是可以接受的。不过,我计划添加一个标志来增加超时时间。出于同样的原因,被过滤的端口不会显示。如需更全面的端口扫描,我推荐使用 Nmap。Domainim 也不会绕过速率限制(如果存在的话)。
vhostname 的打印方式看起来似乎只是在重复。

像下面这样打印可能会更好——
ack.nmap.org, issues.nmap.org, nmap.org, research.nmap.org, scannme.nmap.org, svn.nmap.org, www.nmap.org
↳ 45.33.49.119
↳ Reverse DNS: ack.nmap.org.
但之前测试时,我发现有些情况下并非所有 IP 都由同一组 vhostname 共享。这就是我决定保持这种方式的原因。

DNS 服务器可能有某种速率限制。这就是我为每次查询的 IPv4 解析添加随机延迟(0-300ms 之间)的原因。这样做是为了不让 DNS 服务器一次性收到所有查询,而是以更自然的方式接收。对于暴力破解方法,该值默认在 0-1000ms 之间,但可以通过 --rps | -r 标志更改。
有一个让我困扰的特定限制是 DNS 解析器不会返回某个域名的所有 IP。因此有必要进行多次查询以获取全部(或大部分)IP。但话说回来,无法知道一个域名有多少个 IP。我仍然需要为此想出一个解决方案。带有 CNAME 记录的域名会被解析为 CNAME 目标的 IPv4 地址。
默认情况下,如果发现可能的通配符子域名,则跳过暴力破解。这是因为,如果域名有通配符子域名,暴力破解将为所有可能的子域名解析 IPv4。使用 --force-brute | -f 强制进行暴力破解。在这种情况下,会先检测通配符 IP,仅解析到这些 IP 的子域名会被丢弃,因此像 scanme.nmap.org 这样的有效子域名仍会被找到。与通配符记录共享 IP 的子域名无法与之区分,也会被丢弃。
被动引擎也可能返回仅因通配符记录而存在的名称(例如某人曾经查询过的拼写错误)。因此,对于有通配符记录的域名,仅解析到通配符 IP 的子域名会被隐藏,除非它们出现在 TLS 证书中(crt.sh 或 certspotter)。隐藏的子域名数量会被打印出来。如果没有证书引擎响应,则不会隐藏任何内容。
对于子域名输入的 VHost 枚举也是如此。由于会返回以给定子域名结尾的 URL,相似域名的子域名不会被考虑。例如,对于 ack.nmap.org,不会打印 scannme.nmap.org,但可能会打印 something.ack.nmap.org。我可以搜索 nmap.org 的所有子域名,但这违背了将子域名作为输入的初衷。
MIT 许可证。完整文本见 LICENSE。