Hydra 攻撃結果の保存

HydraBeginner
オンラインで実践に進む

はじめに

この実験では、Hydra 攻撃の結果を保存する方法を学びます。Hydra は強力なパスワードクラッキングツールであり、シミュレートされた HTTP ログインフォームのセキュリティをテストするために使用されます。まず、ターゲットのウェブサーバーに対して、ユーザー名とパスワードのリストを使用して基本的な HTTP 攻撃を実行します。

この実験では、-oオプションを使用して攻撃結果を保存し、-bオプションを使用して JSON 形式で出力する方法を説明します。最後に、テキスト出力と JSON 出力の比較を行い、Hydra がその結果を提示するさまざまな方法を理解します。

ターゲットサービスとユーザー/パスワードリストの設定

このステップでは、シミュレートされた HTTP ログインサービスを設定し、Hydra が使用する必要なユーザー名とパスワードリストを作成します。これにより、Hydra の出力を保存する練習のための制御された環境が提供されます。

まず、プロジェクトディレクトリに移動します。

cd ~/project

次に、HTTP ログインサービスをシミュレートするシンプルな Python スクリプトを作成します。このスクリプトはポート 80 でリスニングし、/login.phpへの POST リクエストに応答します。adminを正しいユーザー名、passwordを正しいパスワードと見なします。

login.pyファイルを作成するには、nanoを使用します。

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 ログインフォームをターゲットとします。

http-post-formモジュールを使用します。これは、HTTP POST メソッドを使用して送信するウェブフォームを攻撃するために設計されています。ターゲットサービスはポート 80 で127.0.0.1上で動作しており、ログインフォームは/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 が有効なユーザー名とパスワードの組み合わせを見つけると、指定されたファイルに人間が読めるシンプルな形式で書き込まれます。

同じシナリオを続けます。ポート 80 で127.0.0.1上で動作するシミュレートされたウェブサーバーと/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オプションで十分です。

JSON 出力オプション (-b) で結果を出力する

このステップでは、-b オプションを使用して Hydra 攻撃の結果を JSON 形式で出力する方法を説明します。JSON (JavaScript Object Notation) は、人間が読み書きしやすく、機械がパースおよび生成しやすい軽量なデータ交換形式です。この形式は、Hydra の結果を他のツールやスクリプトに統合する場合など、結果をプログラム的に処理する必要がある場合に特に便利です。

-b オプションは、-o オプションと組み合わせることで、指定された形式で出力ファイルを保存するように Hydra に指示します。-b オプションには、text (デフォルト)、json、または jsonv1 のフォーマットパラメータが必要です。

同じシナリオを続けます。ポート 80 で127.0.0.1上で動作するシミュレートされたウェブサーバーと/login.phpのログインフォーム、users.txtpasswords.txtファイルを使用します。

~/projectディレクトリにhydra.jsonという名前のファイルに 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 はhydra.jsonファイルに JSON 形式で出力を保存するように指示します。

コマンドを実行すると、Hydra は各ユーザー名とパスワードの組み合わせを使用してログインを試みます。ログインが成功すると、ユーザー名とパスワードはhydra.jsonファイルに 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 がその発見を提示する柔軟性を示しており、攻撃結果の迅速な確認とプログラムによる処理の両方を可能にしました。