保存 Hydra 攻击结果

HydraHydraBeginner
立即练习

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

简介

在本实验中,你将学习如何保存 Hydra 攻击结果。Hydra 是一款强大的密码破解工具,将用于测试模拟 HTTP 登录表单的安全性。你将首先对目标 Web 服务器运行基本的 HTTP 攻击,利用用户名和密码列表。

本实验将指导你使用 -o 选项保存攻击结果,并使用 -b 选项将其输出为 JSON 格式。最后,你将比较文本和 JSON 输出,了解 Hydra 以不同方式呈现其发现结果的方式。

设置目标服务和用户名/密码列表

本步骤中,你将设置一个模拟的 HTTP 登录服务,并创建 Hydra 所需的用户名和密码列表。这将提供一个受控的环境,用于练习保存 Hydra 的输出。

首先,导航到你的项目目录:

cd ~/project

接下来,你将创建一个简单的 Python 脚本,模拟 HTTP 登录服务。该脚本将在端口 80 上监听,并响应发送到 /login.php 的 POST 请求。它将把 admin 视为正确的用户名,password 视为正确的密码。

使用 nano 创建 login.py 文件:

nano login.py

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

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.parse
import os

class LoginHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path == '/login.php':
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length).decode('utf-8')
            parsed_data = urllib.parse.parse_qs(post_data)

            username = parsed_data.get('username', [''])[0]
            password = parsed_data.get('password', [''])[0]

            if username == 'admin' and password == 'password':
                self.send_response(200)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                self.wfile.write(b"Login successful!")
            else:
                self.send_response(401)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                self.wfile.write(b"Invalid username or password")
        else:
            self.send_response(404)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b"Not found")

def run(server_class=HTTPServer, handler_class=LoginHandler, port=80):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on port {port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

Ctrl+X,然后 Y,再按 Enter 保存文件。

现在,在后台运行 Python HTTP 服务器。这将模拟 Hydra 的目标服务。

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

nohup 命令允许进程即使你关闭终端后也能继续运行,> /dev/null 2>&1 & 将所有输出重定向到 /dev/null 并将进程置于后台运行。

接下来,你将创建 Hydra 攻击将使用的用户名和密码列表。

~/project 目录中创建一个名为 users.txt 的文件:

nano users.txt

将以下用户名添加到文件中:

admin
user
test

Ctrl+X,然后 Y,再按 Enter 保存文件。

最后,在 ~/project 目录中创建一个名为 passwords.txt 的文件:

nano passwords.txt

将以下密码添加到文件中:

password
123456
test

Ctrl+X,然后 Y,再按 Enter 保存文件。

你已成功设置了目标 HTTP 服务并准备好了用户名和密码列表。

执行基本 HTTP 攻击

本步骤中,你将使用 Hydra 对你设置的模拟登录服务执行基本的 HTTP 攻击。这将演示 Hydra 如何尝试破解凭据,而无需将输出保存到文件。

Hydra 是一款强大的密码破解工具,可用于测试各种服务的安全性,包括 HTTP。在本场景中,你将针对简单的 HTTP 登录表单。

你将使用 Hydra 的 http-post-form 模块,该模块旨在攻击使用 HTTP POST 方法提交的 Web 表单。目标服务运行在 127.0.0.180 端口上,登录表单位于 /login.php

在你的终端中执行以下 Hydra 命令:

hydra -L ~/project/users.txt -P ~/project/passwords.txt 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

让我们分解这个命令:

  • hydra: 调用 Hydra 工具的命令。
  • -L ~/project/users.txt: 指定用户名列表文件的路径。Hydra 将迭代此文件中的每个用户名。
  • -P ~/project/passwords.txt: 指定密码列表文件的路径。Hydra 将尝试此文件中的每个密码,针对每个用户名。
  • 127.0.0.1: 模拟 HTTP 服务器的目标 IP 地址。
  • http-post-form: Hydra 用于攻击 HTTP POST 表单的模块。
  • "/login.php:username=^USER^&password=^PASS^:Invalid username or password": 这部分至关重要,它定义了 Hydra 如何与表单交互:
    • /login.php: 目标服务器上登录页面的路径。
    • username=^USER^&password=^PASS^: 定义在 POST 请求中发送的参数。^USER^^PASS^ 是 Hydra 用你用户名和密码列表中的值替换的占位符。
    • Invalid username or password: Hydra 在服务器响应中查找的错误消息,以确定登录尝试是否失败。如果 找到此字符串,Hydra 将认为登录尝试成功。

运行命令后,Hydra 将直接在你的终端中显示其进度和任何成功的登录尝试。

示例输出(如果成功):

Hydra vX.X (c) XXXX by van Hauser/THC - Use freely but only for legal purposes.

Hydra is starting...

[DATA] X task, X servers, X login tries (l:X/p:X), ~X try per server
[DATA] attacking service http-post-form on port 80
[ATTACK] attacking 127.0.0.1:80/login.php
[80][http-post-form] host: 127.0.0.1   login: admin   password: password

此输出表明 Hydra 成功找到了 admin 用户名和 password 密码组合。如果未找到成功的登录,Hydra 将完成,而不会显示任何成功的登录凭据。

使用 -o 选项保存结果

本步骤中,你将学习如何使用 -o 选项将 Hydra 攻击的结果保存到文件中。这对于后续分析结果或报告用途非常有用,因为它将任何破解的凭据存储在持久性文件中。

-o 选项允许你指定一个输出文件,Hydra 将在其中存储破解的凭据。如果 Hydra 找到有效的用户名和密码组合,它将以简单易读的格式写入指定的文件。

你将继续使用相同的场景:模拟的 Web 服务器在 127.0.0.180 端口上运行,登录表单位于 /login.php,以及你之前创建的 users.txtpasswords.txt 文件。

要将结果保存到 ~/project 目录中的名为 hydra.log 的文件中,请执行以下命令:

hydra -L ~/project/users.txt -P ~/project/passwords.txt -o ~/project/hydra.log 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

与之前的命令唯一的区别是添加了 -o ~/project/hydra.log 选项。这告诉 Hydra 将结果保存到 hydra.log 文件中,而不是仅在终端中显示它们。

运行命令后,Hydra 将尝试使用每个用户名和密码组合进行登录。如果找到成功的登录,用户名和密码将写入 hydra.log 文件。

要查看 hydra.log 文件的内容,请使用 cat 命令:

cat ~/project/hydra.log

示例输出(如果成功):

如果 Hydra 找到 admin:password 组合,hydra.log 文件将包含类似于此的行:

127.0.0.1 http-post-form: admin:password

如果未找到成功的登录,hydra.log 文件将为空。

需要注意的是,-o 选项将覆盖已存在的输出文件。如果要将结果追加到现有文件中,则应使用 -O(大写 O)选项。但是,对于本实验,-o 选项就足够了。

使用 -b 选项输出 JSON 格式结果

本步骤中,你将探索如何使用 -b 选项以 JSON 格式输出 Hydra 攻击的结果。JSON (JavaScript 对象表示法) 是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。这种格式在需要以编程方式处理结果时特别有用,例如,将 Hydra 的输出集成到其他工具或脚本中。

-b 选项与 -o 选项结合使用,指示 Hydra 将输出保存到指定格式的文件中。-b 选项需要一个格式参数:text (默认)、jsonjsonv1

你将继续使用相同的场景:模拟的 Web 服务器在 127.0.0.180 端口上运行,登录表单位于 /login.php,以及 users.txtpasswords.txt 文件。

要将结果以 JSON 格式保存到 ~/project 目录中的名为 hydra.json 的文件中,请执行以下命令:

hydra -L ~/project/users.txt -P ~/project/passwords.txt -o ~/project/hydra.json -b json 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

在这个命令中,你添加了 -b json 选项以及 -o ~/project/hydra.json 选项。这指示 Hydra 将输出以 JSON 格式保存到 hydra.json 文件中。

运行命令后,Hydra 将尝试使用每个用户名和密码组合进行登录。如果找到成功的登录,用户名和密码将以 JSON 格式写入 hydra.json 文件。

要查看 hydra.json 文件的内容,请使用 cat 命令:

cat ~/project/hydra.json

示例输出(如果成功):

如果 Hydra 找到 admin:password 组合,hydra.json 文件将包含类似于此的 JSON 对象:

{
  "generator": {
    "software": "Hydra",
    "version": "v9.2",
    "built": "2025-05-30 08:10:07",
    "server": "127.0.0.1",
    "service": "http-post-form",
    "jsonoutputversion": "1.00",
    "commandline": "hydra -L users.txt -P passwords.txt -o hydra.json -b json 127.0.0.1 http-post-form /login.php:username=^USER^&password=^PASS^:Invalid username or password"
  },
  "results": [
    {
      "port": 80,
      "service": "http-post-form",
      "host": "127.0.0.1",
      "login": "admin",
      "password": "password"
    }
  ],
  "success": true,
  "errormessages": [],
  "quantityfound": 1
}

如果未找到成功的登录,hydra.json 文件将包含一个空的 JSON 数组:

[]

这种 JSON 格式允许你使用像 Python 或 JavaScript 这样的脚本语言轻松解析结果,以便进行进一步分析或自动化。

总结

在本实验中,你学习了如何使用 Hydra(一个强大的密码破解工具)执行基本的 HTTP 攻击。你搭建了一个模拟的 HTTP 登录服务,并创建了用户名和密码列表。然后,你使用 Hydra 尝试破解 127.0.0.1 上的模拟 HTTP 登录表单。

你探索了如何使用 -o 选项将 Hydra 的输出保存到文件中,创建了一个易于阅读的 hydra.log 文件。此外,你学习了如何使用 -b 选项以 JSON 格式输出结果,生成一个机器可读的 hydra.json 文件。本实验展示了 Hydra 在呈现其发现结果方面的灵活性,允许快速查看和以编程方式处理攻击结果。