引言
在本实验中,你将学习如何有效地使用 Gobuster 进行 DNS 子域枚举,特别关注如何处理通配符 DNS 记录。通配符 DNS 记录通常会在子域扫描中产生大量误报,使得识别合法子域变得困难。Gobuster 提供了一个 --wildcard 标志,可以帮助过滤掉这些响应,从而获得更清晰、更准确的结果。你将识别一个带有通配符记录的域,观察标准扫描的影响,然后使用 --wildcard 标志来查看差异。
在本实验中,你将学习如何有效地使用 Gobuster 进行 DNS 子域枚举,特别关注如何处理通配符 DNS 记录。通配符 DNS 记录通常会在子域扫描中产生大量误报,使得识别合法子域变得困难。Gobuster 提供了一个 --wildcard 标志,可以帮助过滤掉这些响应,从而获得更清晰、更准确的结果。你将识别一个带有通配符记录的域,观察标准扫描的影响,然后使用 --wildcard 标志来查看差异。
在此步骤中,你将识别一个使用通配符 DNS 记录的域。通配符 DNS 记录(*.example.com)意味着任何没有特定 DNS 记录的子域都将解析到一个预定义的 IP 地址。这会在子域枚举过程中引起问题,因为许多不存在的子域似乎都会解析成功,从而导致误报。
我们将使用 dig 命令查询目标域 wildcard.labex.io 的一个不存在的子域,以确认其通配符行为。
首先,让我们查看目标域文件的内容:
cat ~/project/target_domain.txt
你应该会看到 wildcard.labex.io 作为输出。
现在,让我们使用 dig 查询一个不存在的子域,例如 nonexistent.wildcard.labex.io。如果它解析到一个 IP 地址,则表明存在通配符记录。
dig nonexistent.wildcard.labex.io
观察输出中的 ANSWER SECTION。如果你看到 nonexistent.wildcard.labex.io 的 IP 地址,则证实存在通配符 DNS 记录。
; <<>> DiG 9.18.1-1ubuntu1.7-Ubuntu <<>> nonexistent.wildcard.labex.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;nonexistent.wildcard.labex.io. IN A
;; ANSWER SECTION:
nonexistent.wildcard.labex.io. 300 IN A 192.0.2.123 ## Example IP, will vary
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Jan 01 12:00:00 UTC 2023
;; MSG SIZE rcvd: 78
对于一个明显不存在的子域,如果存在 ANSWER SECTION,则证实 wildcard.labex.io 具有通配符 DNS 记录。
在此步骤中,你将使用 Gobuster 对 wildcard.labex.io 执行标准的 DNS 子域枚举扫描,而不进行任何通配符过滤。这将展示通配符 DNS 记录如何导致大量误报,使得区分合法子域和由通配符解析的子域变得困难。
我们将使用 gobuster dns 命令,并使用 -d 标志指定域名,使用 -w 标志指定我们的单词列表。
gobuster dns -d wildcard.labex.io -w ~/project/wordlist.txt
观察输出。你很可能会发现单词列表中的几乎所有条目都解析到了一个 IP 地址,即使它不是一个“真实”的子域。这是因为通配符 DNS 记录捕获了所有这些查询并解析了它们。
Gobuster v3.6
by OJ <oj@zerokopter.com>
[+] Url: wildcard.labex.io
[+] Threads: 10
[+] Wordlist: /home/labex/project/wordlist.txt
[+] Timeout: 10s
[+] User Agent: gobuster/3.6
2023/01/01 12:00:00 Starting gobuster
Found: test.wildcard.labex.io (192.0.2.123)
Found: dev.wildcard.labex.io (192.0.2.123)
Found: www.wildcard.labex.io (192.0.2.123)
Found: mail.wildcard.labex.io (192.0.2.123)
Found: blog.wildcard.labex.io (192.0.2.123)
Found: admin.wildcard.labex.io (192.0.2.123)
Found: api.wildcard.labex.io (192.0.2.123)
Found: cdn.wildcard.labex.io (192.0.2.123)
Found: ftp.wildcard.labex.io (192.0.2.123)
Found: vpn.wildcard.labex.io (192.0.2.123)
2023/01/01 12:00:05 Finished
正如你所见,单词列表中的所有条目都被“找到”了,但由于通配符 DNS 记录,这具有误导性。这突显了子域枚举中误报的问题。
在此步骤中,你将重新运行 Gobuster DNS 扫描,但这次将包含 --wildcard 标志。此标志告诉 Gobuster 执行初始的通配符 DNS 记录检查,然后过滤掉所有后续解析到与通配符相同 IP 地址的结果。这可以显著减少误报,并提供更清晰的输出。
再次执行 Gobuster 命令,添加 --wildcard 标志:
gobuster dns -d wildcard.labex.io -w ~/project/wordlist.txt --wildcard
密切关注输出。你应该会注意到 Gobuster 首先识别出通配符 IP,然后继续过滤掉与之匹配的结果。
Gobuster v3.6
by OJ <oj@zerokopter.com>
[+] Url: wildcard.labex.io
[+] Threads: 10
[+] Wordlist: /home/labex/project/wordlist.txt
[+] Timeout: 10s
[+] User Agent: gobuster/3.6
[+] Wildcard DNS detected. Filtering responses for 192.0.2.123 ## Example IP
2023/01/01 12:00:00 Starting gobuster
2023/01/01 12:00:05 Finished
注意 [+] Wildcard DNS detected. Filtering responses for 192.0.2.123 这行。这表明 Gobuster 已成功识别出通配符 IP,并且现在正在主动过滤解析到该 IP 的结果。在此特定示例中,由于所有子域都解析到通配符 IP,你可能看不到任何“Found”条目,这对于具有完整通配符设置且单词列表中没有合法子域的域来说是正确的行为。
在此步骤中,我们将通过观察 Gobuster 的 --wildcard 标志在略微修改的场景下的行为,来更深入地了解其工作原理。虽然我们之前的示例展示了完整的过滤,但理解其机制很重要。Gobuster 首先会查询一个随机的、不存在的子域(例如 randomstring.yourdomain.com)。如果此查询解析到一个 IP 地址,Gobuster 就会认为该 IP 地址是通配符 IP。在枚举过程中找到的任何后续子域,如果解析到这个相同的通配符 IP,都将被过滤掉。只有解析到不同 IP 地址的子域才会被报告。
为了说明这一点,让我们假设我们的 wildcard.labex.io 域还有一个合法的 www.wildcard.labex.io 子域,指向一个不同的 IP 地址。如果那样的话,Gobuster 仍然会过滤掉所有其他通配符条目,但会报告 www.wildcard.labex.io。
在本实验中,由于 wildcard.labex.io 配置为所有子域都解析到相同的通配符 IP,因此上一步的输出(其中没有“找到”子域)是预期且正确的行为,证明了有效的过滤。
让我们重新运行命令,并关注确认通配符检测的初始输出行:
gobuster dns -d wildcard.labex.io -w ~/project/wordlist.txt --wildcard
需要观察的关键行是:[+] Wildcard DNS detected. Filtering responses for <IP_ADDRESS>。这证实了 Gobuster 已识别出通配符 IP,并正在积极使用它来过滤结果。
Gobuster v3.6
by OJ <oj@zerokopter.com>
[+] Url: wildcard.labex.io
[+] Threads: 10
[+] Wordlist: /home/labex/project/wordlist.txt
[+] Timeout: 10s
[+] User Agent: gobuster/3.6
[+] Wildcard DNS detected. Filtering responses for 192.0.2.123 ## Example IP
2023/01/01 12:00:00 Starting gobuster
2023/01/01 12:00:05 Finished
此步骤强化了对 Gobuster 的 --wildcard 标志对于在具有通配符 DNS 记录的域上获得准确的子域枚举结果至关重要的理解。
在最后一步中,你将分析从标准 Gobuster 扫描和使用 --wildcard 标志执行的扫描获得的结果之间的差异。目标是体会 --wildcard 标志如何通过消除误报来提供更清晰、更准确的结果。
回顾第 2 步(不带 --wildcard)的输出:
单词列表中的每个条目都被报告为“Found”,即使它们只是由于通配符 DNS 记录而解析的。此输出非常冗余,使得无法识别真正存在的子域。
回顾第 3 步和第 4 步(带 --wildcard)的输出:
Gobuster 明确显示 [+] Wildcard DNS detected. Filtering responses for <IP_ADDRESS>。在我们的特定案例中,由于所有子域都解析到通配符 IP,因此没有报告“Found”条目。这是正确且准确的结果,表明我们单词列表中的子域都不是合法的,并且解析到唯一的 IP 地址。
如果存在合法的子域(例如,www.wildcard.labex.io 解析到的 IP 地址与通配符 IP 不同),那么在使用 --wildcard 标志时,它们将被列在输出中。这展示了该标志在区分真实子域和通配符条目方面的强大功能。
--wildcard 标志对于高效准确的子域枚举至关重要,尤其是在处理大型单词列表和广泛使用通配符 DNS 记录的域时。它通过减少手动过滤误报的需要来节省时间,并确保你的枚举工作集中在真正相关的子域上。
你已成功学会如何识别通配符 DNS 记录并使用 Gobuster 的 --wildcard 标志来获得准确的子域枚举结果。
在本实验中,你通过 Gobuster 在子域枚举过程中获得了处理通配符 DNS 记录的实践经验。你学会了识别带有通配符记录的域,观察了标准扫描如何产生误报,最重要的是,掌握了使用 --wildcard 标志来过滤掉这些误导性结果的方法。这项技能对于任何进行侦察或渗透测试的人来说都至关重要,因为它确保了子域发现过程的准确性和效率。通过应用 --wildcard 标志,你可以专注于合法的子域,从而节省宝贵的时间和资源。