结合 Gobuster 与 Nmap 进行目标发现

Beginner
立即练习

引言

在本实验中,你将学习一种强大的目标发现技术,该技术结合了 Nmap 和 Gobuster 的能力。Nmap 是一个多功能的网络扫描器,用于发现计算机网络上的主机和服务;Gobuster 则是一个用于暴力破解 URI(目录和文件)以及 DNS 子域名的工具。通过集成这两个工具,你可以自动化识别给定网络范围内潜在 Web 服务器的过程,然后系统地发现这些服务器上隐藏的目录和文件。这种方法显著增强了你的侦察能力,使发现过程更高效、更全面。

使用 Nmap 扫描网络范围内的开放 Web 端口(80, 443)

在此步骤中,你将使用 Nmap 扫描本地网络范围,查找开放了常见 Web 端口(80 用于 HTTP,443 用于 HTTPS)的主机。这是识别潜在 Web 服务器的初始阶段。我们将扫描 172.17.0.0/24 网络范围,该范围通常由 Docker 用于其内部网络。

首先,让我们确保 Nmap 已安装。它应该已预装在 LabEx VM 上。

nmap --version

你应该会看到类似以下的输出,表明 Nmap 已安装:

Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f libpcre-8.39 libpcap-1.9.1 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

现在,执行 Nmap 扫描。我们将使用 -p 标志指定端口 80 和 443,并使用 -oG 以 Grepable 格式输出结果,这种格式更易于解析。

nmap -p 80,443 -oG nmap_web_scan.txt 172.17.0.0/24

此命令将扫描指定的网络范围,查找开放了端口 80 或 443 的主机,并将输出保存到 nmap_web_scan.txt。扫描可能需要几分钟才能完成。

扫描完成后,你可以查看输出文件的内容:

cat nmap_web_scan.txt

你将看到指示已发现主机及其开放端口的行。例如:

## Nmap 7.80 scan initiated Mon Jan 1 00:00:00 2024 as: nmap -p 80,443 -oG nmap_web_scan.txt 172.17.0.0/24
Host: 172.17.0.2 ()	Ports: 80/open/tcp//http///, 443/open/tcp//https///
Host: 172.17.0.3 ()	Ports: 80/open/tcp//http///
## Nmap done at Mon Jan 1 00:00:00 2024 -- 256 IP addresses (2 hosts up) scanned in 5.00 seconds

解析 Nmap 输出以创建 Web 服务器 URL 列表

在此步骤中,你将解析 nmap_web_scan.txt 文件,提取具有开放 Web 端口的主机的 IP 地址,并将它们格式化为 URL 列表。此列表随后将用作 Gobuster 的输入。

我们将使用 grepawk 来处理 nmap_web_scan.txt 文件。目标是提取包含“open”端口 80 或 443 的行,然后提取 IP 地址,最后构建 URL(例如 http://172.17.0.2https://172.17.0.2)。

执行以下命令来解析 Nmap 输出并创建 web_servers.txt

grep "open" nmap_web_scan.txt | awk '/80\/open/ {print "http://" $2} /443\/open/ {print "https://" $2}' | sort -u > web_servers.txt

让我们分解一下这个命令:

  • grep "open" nmap_web_scan.txt: 从 nmap_web_scan.txt 中过滤包含单词“open”的行,这表示一个开放的端口。
  • awk '/80\/open/ {print "http://" $2} /443\/open/ {print "https://" $2}': 处理过滤后的行。
    • /80\/open/ {print "http://" $2}: 如果一行包含“80/open”,则打印“http://”后跟第二个字段($2),即 IP 地址。
    • /443\/open/ {print "https://" $2}: 如果一行包含“443/open”,则打印“https://”后跟第二个字段($2),即 IP 地址。
    • 注意:一个主机可能同时开放 80 和 443 端口,这将为同一个 IP 生成两个 URL。
  • sort -u: 对 URL 进行排序并删除任何重复的条目。
  • > web_servers.txt: 将最终输出重定向到一个名为 web_servers.txt 的新文件中。

现在,查看 web_servers.txt 文件的内容:

cat web_servers.txt

你应该会看到一个 URL 列表,每行一个,类似如下:

http://172.17.0.2
https://172.17.0.2
http://172.17.0.3

此文件现在包含了我们 Gobuster 扫描的目标。

编写一个简单的 Bash 脚本来循环遍历 URL 列表

在此步骤中,你将创建一个 Bash 脚本,该脚本将读取 web_servers.txt 中的每个 URL,并为 Gobuster 扫描做准备。此脚本将作为我们结合 Nmap 和 Gobuster 工作流的自动化骨干。

首先,让我们使用 nano 创建一个名为 gobust_scan.sh 的新脚本文件:

nano gobust_scan.sh

将以下内容粘贴到 gobust_scan.sh 文件中:

#!/bin/bash

## 定义 Gobuster 的单词列表
WORDLIST="/usr/share/wordlists/dirb/common.txt" ## 用于目录暴力破解的常用单词列表

## 检查单词列表是否存在
if [ ! -f "$WORDLIST" ]; then
  echo "Error: Wordlist not found at $WORDLIST. Please ensure it exists."
  echo "You might need to install 'dirb' or 'wordlists' package, e.g., sudo apt install dirb"
  exit 1
fi

## 检查 web_servers.txt 是否存在
if [ ! -f "web_servers.txt" ]; then
  echo "Error: web_servers.txt not found. Please run Step 2 first."
  exit 1
fi

echo "Starting Gobuster scans..."
echo "-------------------------"

## 循环遍历 web_servers.txt 中的每个 URL
while IFS= read -r url; do
  echo "Scanning $url..."
  ## Gobuster 命令的占位符 - 将在下一步添加
  ## gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"
  echo "Finished scanning $url."
  echo "-------------------------"
done < web_servers.txt

echo "All scans completed."

通过按 Ctrl+X,然后按 Y 确认,最后按 Enter 以当前文件名保存,来保存文件。

接下来,使脚本可执行:

chmod +x gobust_scan.sh

现在,让我们测试脚本以确保它能正确地循环遍历 URL。它还不会运行 Gobuster,但会为每个 URL 打印消息。

./gobust_scan.sh

你应该会看到类似以下的输出,表明脚本正在正确读取和处理每个 URL:

Starting Gobuster scans...
-------------------------
Scanning http://172.17.0.2...
Finished scanning http://172.17.0.2.
-------------------------
Scanning https://172.17.0.2...
Finished scanning https://172.17.0.2.
-------------------------
Scanning http://172.17.0.3...
Finished scanning http://172.17.0.3.
-------------------------
All scans completed.

这证实了我们的脚本已准备好集成 Gobuster 命令。

在脚本中为每个发现的目标调用 Gobuster

在此步骤中,你将修改 gobust_scan.sh 脚本以集成 Gobuster 命令。对于 Nmap 发现的每个 URL,Gobuster 将尝试使用常用的单词列表查找隐藏的目录和文件。

首先,让我们确保 Gobuster 已安装。它应该已预装在 LabEx VM 上。

gobuster --version

你应该会看到类似以下的输出:

gobuster v3.1.0

现在,再次打开 gobust_scan.sh 脚本进行编辑:

nano gobust_scan.sh

找到占位符行: ## gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"

取消注释此行,并确保其外观与此完全一致:

#!/bin/bash

## 定义 Gobuster 的单词列表
WORDLIST="/usr/share/wordlists/dirb/common.txt" ## 用于目录暴力破解的常用单词列表

## 检查单词列表是否存在
if [ ! -f "$WORDLIST" ]; then
  echo "Error: Wordlist not found at $WORDLIST. Please ensure it exists."
  echo "You might need to install 'dirb' or 'wordlists' package, e.g., sudo apt install dirb"
  exit 1
fi

## 检查 web_servers.txt 是否存在
if [ ! -f "web_servers.txt" ]; then
  echo "Error: web_servers.txt not found. Please run Step 2 first."
  exit 1
fi

echo "Starting Gobuster scans..."
echo "-------------------------"

## 循环遍历 web_servers.txt 中的每个 URL
while IFS= read -r url; do
  echo "Scanning $url..."
  ## Gobuster 命令
  gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"
  echo "Finished scanning $url."
  echo "-------------------------"
done < web_servers.txt

echo "All scans completed."

保存修改后的脚本(Ctrl+XYEnter)。

现在,执行脚本。这将为每个 URL 运行 Gobuster,并将结果保存到单独的文件中。

./gobust_scan.sh

脚本现在将为每个 URL 执行 Gobuster。你将在终端中直接看到 Gobuster 的输出,它还会将结果保存到名为 gobuster_172.17.0.2.txtgobuster_172.17.0.2_443.txt 等的文件中(具体文件名取决于 URL)。

脚本完成后,你可以列出生成的 Gobuster 输出文件:

ls gobuster_*.txt

你应该会看到类似以下的文件:

gobuster_172.17.0.2.txt  gobuster_172.17.0.2_443.txt  gobuster_172.17.0.3.txt

整合所有目标的 Gobuster 结果

在最后一步中,你将把所有单独的 Gobuster 输出文件整合到一个全面的报告中。这样可以更轻松地查看所有扫描的 Web 服务器上发现的所有目录和文件。

我们将使用 cat 命令将所有匹配 gobuster_*.txt 的文件合并到一个名为 all_gobuster_results.txt 的文件中。

cat gobuster_*.txt > all_gobuster_results.txt

此命令将获取所有以 gobuster_ 开头并以 .txt 结尾的文件内容,并将它们合并到 all_gobuster_results.txt 中。

现在,你可以查看整合后的结果:

cat all_gobuster_results.txt

你将看到 Gobuster 在扫描的 Web 服务器上找到的所有目录和文件的合并输出。输出将根据 Web 服务器的内容而有所不同,但可能看起来像这样:

===============================================================
Gobuster v3.1.0
...
[+] Found: /index.html (Status: 200)
[+] Found: /css (Status: 301)
[+] Found: /js (Status: 301)
...
===============================================================
Gobuster v3.1.0
...
[+] Found: /admin (Status: 301)
[+] Found: /login.php (Status: 200)
...

此整合文件为所有发现的 Web 资产提供了一个单一的参考点,从而完成了你的自动化目标发现过程。

总结

在此次实验中,你成功地结合了 Nmap 和 Gobuster 来自动化 Web 服务器和目录发现过程。你首先使用 Nmap 扫描网络范围内的开放 Web 端口,然后解析其输出以创建目标 URL 列表。接下来,你开发了一个 Bash 脚本来遍历这些 URL,为每个 URL 调用 Gobuster 以查找隐藏的目录和文件。最后,你将所有 Gobuster 结果整合到一个报告中,展示了一个高效且全面的侦察工作流程。这种集成方法对于任何从事网络安全或 Web 应用程序测试的人来说都是一项宝贵的技能。