使用 Hydra 攻击启用 SSL 的服务

HydraBeginner
立即练习

介绍

在本次实验中,我们将探索如何使用 Hydra 攻击启用了 SSL 的服务。本实验重点测试 Hydra 在破解由 SSL/TLS 保护的服务密码方面的能力。

首先,我们将使用 Python 和 openssl 搭建一个本地 HTTPS 服务器,生成自签名证书和密钥,模拟一个安全的环境。然后,我们将使用 -S 选项运行 Hydra 以启用 SSL 支持,并尝试破解密码。我们还将使用 -O 选项测试较旧的 SSL 协议。最后,我们将确认 SSL 攻击是否成功。

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

搭建本地 HTTPS 服务器

在这一步中,我们将使用 Python 内置的 http.server 模块搭建一个简单的 HTTPS 服务器,并启用 SSL/TLS。这将使我们能够模拟一个安全的服务器环境,以测试 Hydra 的 SSL 功能。

首先,我们需要生成一个自签名证书和密钥。该证书将用于加密客户端(Hydra)与服务器之间的通信。打开你的终端,导航到 ~/project 目录:

cd ~/project

现在,使用 openssl 命令生成证书和密钥:

openssl req -new -x509 -keyout key.pem -out cert.pem -days 365 -nodes

你将被提示输入一些关于证书的信息。你可以通过按回车键将大多数字段留空。需要输入一个通用名称(Common Name),你可以输入 localhost

Generating a RSA private key
+++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:

此命令会创建两个文件:key.pem(私钥)和 cert.pem(证书)。

现在,让我们为 HTTPS 服务器创建一个 Python 脚本。我们将使用 nano 文本编辑器来创建和编辑脚本:

nano https_server.py

将以下代码复制并粘贴到编辑器中:

import http.server
import ssl
import os

## Create the HTTP server
httpd = http.server.HTTPServer(('127.0.0.1', 443), http.server.SimpleHTTPRequestHandler)

## Create SSL context
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile='cert.pem', keyfile='key.pem')

## Wrap the socket with SSL
httpd.socket = ssl_context.wrap_socket(httpd.socket, server_side=True)

print("Serving HTTPS on 127.0.0.1 port 443 (https://127.0.0.1:443/) ...")
httpd.serve_forever()

在 nano 中保存文件的步骤如下:

  1. Ctrl + X 退出
  2. Y 确认保存
  3. Enter 确认文件名

现在你可以使用以下命令运行 HTTPS 服务器:

python3 https_server.py

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

Serving HTTPS on 127.0.0.1 port 443 (https://127.0.0.1:443/) ...

让这个终端窗口保持运行状态。这就是你的 HTTPS 服务器。在接下来的步骤中,我们将使用 Hydra 尝试破解认证。

重要提示: 请记住让运行 HTTPS 服务器的原始终端窗口保持运行。不要关闭它,因为后续步骤还会用到它。

使用 -S 选项运行 Hydra 以支持 SSL

在这一步中,我们将使用 Hydra 对在上一步中搭建的 HTTPS 服务器进行暴力破解攻击。-S 选项告诉 Hydra 在连接目标服务器时使用 SSL/TLS。

首先,让我们创建一个简单的用户名和密码列表。在 ~/project 目录下创建一个名为 users.txt 的文件,内容如下:

test

接下来,在 ~/project 目录下创建一个名为 passwords.txt 的文件,内容如下:

password
test
123456

你可以使用 echo 命令来创建和编辑这些文件:

echo "test" > ~/project/users.txt
echo "password" > ~/project/passwords.txt
echo "test" >> ~/project/users.txt
echo "123456" >> ~/project/passwords.txt

现在,我们可以使用 -S 选项运行 Hydra 来攻击我们的 HTTPS 服务器。打开一个新的终端窗口(让另一个窗口中的 HTTPS 服务器保持运行),并导航到 ~/project 目录:

cd ~/project

执行以下 Hydra 命令:

hydra -l test -P passwords.txt 127.0.0.1 https-get / -S -vV

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

  • hydra:Hydra 命令行工具。
  • -l test:指定要使用的用户名。在这种情况下,我们使用用户名 test
  • -P passwords.txt:指定密码列表文件。我们使用的是我们创建的 passwords.txt 文件。
  • 127.0.0.1:目标 IP 地址。这是回环地址,指的是我们的本地机器。
  • https-get /:指定要攻击的服务(HTTPS)和请求的路径(/)。https-get 是一个通过 SSL/TLS 执行 HTTP GET 请求的模块。
  • -S:告诉 Hydra 在连接目标服务器时使用 SSL/TLS。这对于攻击 HTTPS 服务至关重要。
  • -vV:启用详细模式,显示登录尝试和找到的任何凭证。

Hydra 现在将使用提供的用户名和密码列表对 HTTPS 服务器进行暴力破解。它将针对用户名 test 尝试 passwords.txt 文件中的每个密码。

你应该会看到类似于以下的输出(具体输出可能会有所不同):

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-04-02 14:10:55
[DATA] max 2 tasks per 1 server, overall 2 tasks, 2 login tries (l:1/p:2), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:443/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "test" - pass "password" - 1 of 2 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "123456" - 2 of 2 [child 1] (0/0)
[443][http-get] host: 127.0.0.1   login: test   password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
[443][http-get] host: 127.0.0.1   login: test   password: 123456
1 of 1 target successfully completed, 2 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-02 14:10:56
hydra ssl attack

如果攻击成功,Hydra 将显示正确的用户名和密码。在这个例子中,用户名是 test,密码是 password

使用 -O 选项测试旧版 SSL

在这一步中,我们将探讨如何使用 Hydra 的 -O 选项来测试旧版、可能存在漏洞的 SSL/TLS 协议。-O 选项会强制 Hydra 使用旧版 SSL 版本,这些版本可能容易受到诸如 POODLE 或 BEAST 等各种攻击。

在继续之前,需要明白由于安全漏洞,通常不建议使用旧版 SSL/TLS 协议。这一步是出于教育目的,用于演示如何使用 Hydra 识别仍支持这些过时协议的系统。

要使用 -O 选项,只需将其添加到我们之前的 Hydra 命令中。确保步骤 1 中的 HTTPS 服务器仍在运行。打开一个新的终端窗口(让另一个窗口中的 HTTPS 服务器保持运行),并导航到 ~/project 目录:

cd ~/project

现在,执行以下 Hydra 命令:

hydra -l test -P passwords.txt 127.0.0.1 https-get / -S -O -vV

此命令与步骤 2 中的命令唯一的区别在于添加了 -O 选项。

  • -O:强制 Hydra 使用旧版 SSL 版本。

Hydra 现在将尝试使用旧版 SSL/TLS 协议对 HTTPS 服务器进行暴力破解。输出将与上一步类似,但你可能会看到与旧版 SSL 版本相关的警告或错误。

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-04-02 14:13:19
[DATA] max 2 tasks per 1 server, overall 2 tasks, 2 login tries (l:1/p:2), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:443/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "test" - pass "password" - 1 of 2 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "123456" - 2 of 2 [child 1] (0/0)
[443][http-get] host: 127.0.0.1   login: test   password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
[443][http-get] host: 127.0.0.1   login: test   password: 123456
1 of 1 target successfully completed, 2 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-02 14:13:19

如果攻击成功,Hydra 将像上一步一样显示正确的用户名和密码。这里的关键要点是,-O 选项使我们能够测试服务器与旧版 SSL/TLS 协议的兼容性。

如果服务器不支持旧版协议,可能会拒绝连接。在这种情况下,Hydra 可能无法找到密码。然而,这一步的目的是演示 -O 选项的用法,而不一定是保证成功登录。

确认 SSL 攻击成功

在这一步中,我们将通过使用发现的凭证尝试访问 HTTPS 服务器,来确认 Hydra 攻击是否成功。这将证明 Hydra 确实能够成功对服务器进行暴力破解。

首先,确保步骤 1 中的 HTTPS 服务器仍在运行。

我们将使用 curl 命令来访问服务器,并验证我们是否可以使用正确的用户名和密码进行身份验证。

打开一个新的终端窗口(让另一个窗口中的 HTTPS 服务器保持运行),并导航到 ~/project 目录:

cd ~/project

现在,执行以下 curl 命令:

curl -k -u test:password https://127.0.0.1

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

  • curl:用于通过 URL 传输数据的命令行工具。
  • -k:允许 curl 继续操作,即使服务器连接通常被认为是不安全的。由于我们使用的是自签名证书,curl 通常会拒绝连接。
  • -u test:password:指定用于身份验证的用户名和密码。我们使用的是在前面步骤中发现的凭证 test:password
  • https://127.0.0.1:HTTPS 服务器的 URL。

如果身份验证成功,curl 将显示服务器根目录的内容。由于我们使用的是 Python 的 http.server 模块,它可能会显示 ~/project 目录的文件列表。

你应该会看到类似于以下的输出(具体输出可能会根据 ~/project 目录中的文件而有所不同):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Directory listing for /</title>
  </head>
  <body>
    <h1>Directory listing for /</h1>
    <hr />
    <ul>
      <li><a href="cert.pem">cert.pem</a></li>
      <li><a href="https_server.py">https_server.py</a></li>
      <li><a href="key.pem">key.pem</a></li>
      <li><a href="passwords.txt">passwords.txt</a></li>
      <li><a href="server.pem">server.pem</a></li>
      <li><a href="users.txt">users.txt</a></li>
    </ul>
    <hr />
  </body>
</html>

这证实了我们能够使用 Hydra 发现的凭证成功对 HTTPS 服务器进行身份验证。这展示了 Hydra 在暴力破解弱密码方面的有效性,即使是在 SSL/TLS 连接上也是如此。

如果你看到的是错误消息而不是文件列表,请再次检查 HTTPS 服务器是否仍在运行,以及你是否使用了正确的用户名和密码。

总结

在这个实验中,我们学习了如何使用 Hydra 攻击启用了 SSL 的服务。第一步是使用 Python 的 http.server 模块搭建一个本地 HTTPS 服务器,并使用 openssl 生成自签名证书和密钥,以模拟一个安全的环境。

然后,我们通过使用 -S 选项启用 SSL 连接,以及使用 -O 选项测试旧版 SSL 协议,来探索 Hydra 的功能。最后,我们确认了 SSL 攻击的成功,展示了 Hydra 在 SSL/TLS 上暴力破解凭证的能力。