引言
在 Web 安全领域,侦察(reconnaissance)是至关重要的一步。Gobuster 等工具被广泛用于目录和文件枚举。然而,许多 Web 服务器和 Web 应用防火墙(WAFs)采用了简单的检测机制,例如阻止带有可疑 User-Agent 字符串的请求。默认情况下,Gobuster 使用一个容易被识别的 User-Agent 字符串。
在本实验(lab)中,你将学习如何为 Gobuster 扫描设置自定义的 User-Agent 字符串。这项技术可以帮助你规避简单的检测机制,使你的侦察工作更加隐蔽,从而可能发现更多隐藏的目录和文件。
理解 User-Agent 字符串的目的
在本步骤中,你将了解 User-Agent 字符串是什么以及它在 Web 请求中的重要性。
User-Agent 字符串是客户端(如 Web 浏览器或 Gobuster 等工具)发送给 Web 服务器的一个头部(header)。它通常包含有关客户端的应用程序类型、操作系统、软件供应商和软件版本的信息。Web 服务器使用这些信息来提供为客户端优化的内容或记录客户端统计信息。
对于 Gobuster 等安全工具,默认的 User-Agent 字符串常常会暴露工具的身份,这可能会触发 WAF 或入侵检测系统(IDS)。例如,Gobuster 的默认 User-Agent 可能看起来像 gobuster/3.1.0。
让我们执行一次基本的 Gobuster 扫描,不使用任何自定义 User-Agent,以了解其默认行为。我们将扫描一个在后台设置的本地 Web 服务器。
首先,通过检查其进程来确保 Web 服务器正在运行:
ps aux | grep "python3 -m http.server 8080" | grep -v grep
你应该会看到类似以下的输出,表明服务器正在运行:
labex 1234 0.0 0.1 12345 6789 ? Sl HH:MM 0:00 python3 -m http.server 8080 --directory /tmp/web_root
现在,针对本地服务器的 8080 端口运行一个简单的 Gobuster 扫描。我们将使用一个小的单词列表(wordlist)进行演示。
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -q -x html,txt -t 10
-u http://127.0.0.1:8080: 指定目标 URL。-w /usr/share/wordlists/dirb/common.txt: 指定要使用的单词列表。-q: 静默模式,仅打印结果。-x html,txt: 指定要查找的扩展名。-t 10: 设置并发线程数为 10。
你将看到类似以下的输出,显示已发现的目录和文件:
/admin (Status: 200)
/secret (Status: 200)
/backup (Status: 200)
虽然此扫描有效,但 Gobuster 使用的 User-Agent 是其默认的,这很容易被 WAF 阻止。
查找常见的浏览器 User-Agent 字符串
在本步骤中,你将学习如何查找一个常见的浏览器 User-Agent 字符串,你可以用它来伪装你的 Gobuster 扫描。
为了让你的 Gobuster 扫描看起来像是来自一个合法的 Web 浏览器,你需要使用一个典型浏览器会发送的 User-Agent 字符串。你可以通过以下方式找到这些字符串:
- 在浏览器开发者工具中检查网络请求: 当你浏览一个网站时,打开浏览器的开发者工具(通常是 F12),切换到“Network”选项卡,然后检查任何请求的头部(headers)。
- 在线搜索: 许多网站会收集常见的 User-Agent 字符串列表。
在本实验(lab)中,让我们使用一个适用于 Windows 上最新版 Chrome 的常见 User-Agent 字符串。Chrome 的典型 User-Agent 字符串可能看起来像这样:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
这个字符串表示:
Mozilla/5.0: 一个通用的标记,许多浏览器出于历史原因会包含它。(Windows NT 10.0; Win64; x64): 操作系统信息(Windows 10,64 位)。AppleWebKit/537.36 (KHTML, like Gecko): 渲染引擎信息(WebKit,具有 KHTML 兼容性)。Chrome/120.0.0.0: 浏览器名称和版本。Safari/537.36: 另一个历史标记,通常由基于 WebKit 的浏览器包含。
你可以直接复制这个字符串用于下一步。在命令行中使用 User-Agent 字符串时,将其用引号括起来很重要,特别是当它包含空格或特殊字符时。
使用 -a 标志设置自定义 User-Agent
在本步骤中,你将学习如何在 Gobuster 中使用 -a 标志为你的扫描设置自定义 User-Agent 字符串。
Gobuster 提供了 -a 标志(或 --agent)专门用于此目的。你只需将所需的 User-Agent 字符串作为参数传递给此标志。
让我们准备 Gobuster 命令,使用我们在上一步中确定的自定义 User-Agent 字符串。我们将使用相同的目标和单词列表。
CUSTOM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
echo "Using custom User-Agent: $CUSTOM_USER_AGENT"
现在,构建 Gobuster 命令。请注意 -a 标志的使用方式:
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -a "$CUSTOM_USER_AGENT" -q -x html,txt -t 10
-a "$CUSTOM_USER_AGENT": 这是新增的部分,我们在此传递自定义 User-Agent 字符串。$CUSTOM_USER_AGENT周围的引号至关重要,因为该字符串包含空格。
在执行之前,请考虑这带来的区别。没有 -a 标志时,Web 服务器会看到来自“gobuster”的请求。使用 -a 标志后,它将看到来自“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36”的请求,这看起来像一个合法的浏览器。
使用新的 User-Agent 执行扫描
在本步骤中,你将使用自定义 User-Agent 字符串执行 Gobuster 扫描并观察结果。
现在,运行带有自定义 User-Agent 的 Gobuster 命令。扫描本身的输出将与之前的类似,因为 User-Agent 只影响服务器如何感知请求,而不影响扫描结果本身(除非服务器阻止了默认的 User-Agent)。
执行命令:
CUSTOM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -a "$CUSTOM_USER_AGENT" -q -x html,txt -t 10
你应该会看到发现的目录和文件与之前相同:
/admin (Status: 200)
/secret (Status: 200)
/backup (Status: 200)
尽管输出相同,但关键的区别在于,如果这是一个带有 WAF 或 IDS 的真实场景,与使用 Gobuster 默认 User-Agent 的扫描相比,这次扫描被标记为可疑的可能性会更小。这是道德黑客和渗透测试中避免被检测到的一项基本技术。
讨论为何这有助于规避简单过滤器
在本步骤中,我们将讨论为何设置自定义 User-Agent 可以成为规避简单过滤器和检测机制的有效技术。
许多 Web 应用防火墙 (WAF)、入侵检测系统 (IDS) 甚至基本的服务器配置都采用规则来识别和阻止可疑流量。最简单和最常见的规则之一就是检查 User-Agent 字符串。
以下是设置自定义 User-Agent 有帮助的原因:
- 绕过基于 User-Agent 的阻止: 如果 WAF 有一条规则用于阻止带有“gobuster”、“nmap”、“sqlmap”或其他已知安全工具的 User-Agent 的请求,那么使用常见的浏览器 User-Agent 将使你的请求能够通过此特定规则的检测。
- 降低可疑度: 服务器管理员在查看日志时,可能会注意到来自不寻常 User-Agent(如
gobuster/3.1.0)的大量请求。通过模仿常见浏览器,你的请求会与合法的用户流量融为一体,从而降低被手动调查或自动标记的可能性。 - 在某些情况下规避速率限制: 虽然这与 User-Agent 无直接关系,但某些系统可能会对非浏览器 User-Agent 应用更严格的速率限制。通过伪装成浏览器,你可能会避免这些更严格的限制,从而使你的扫描能够更快或更完整地进行。
需要注意的是,这项技术对于简单过滤器是有效的。更复杂的 WAF 和 IDS 会结合多种因素(例如,请求模式、IP 声誉、行为分析)来检测恶意活动,因此单独使用自定义 User-Agent 可能不足以绕过高级防御。然而,它是隐蔽侦察中一个基本且通常必要的首要步骤。
为了清理环境,你可以停止 Python Web 服务器:
pkill -f "python3 -m http.server 8080"
此命令会查找并终止运行 Python Web 服务器的进程。
总结
在本实验中,你学习了 User-Agent 字符串在 Web 请求中的重要性,以及像 Gobuster 这样的安全工具如何使用它。你成功识别了一个常见的浏览器 User-Agent 字符串,并且最重要的是,在 Gobuster 中使用了 -a 标志为你的扫描设置了自定义 User-Agent。这项实用技能对于使你的侦察工作更加隐蔽和有效至关重要,它能帮助你绕过简单的检测机制并融入合法的 Web 流量。
