Hydra のモジュール固有オプションを探索する

HydraHydraBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Hydra で利用可能な HTTP POST オプションを探索します。特に、HTTP POST を認証に使用するサービスを効果的にターゲットにする方法に焦点を当てます。ユーザー名とパスワード、および POST リクエストを送信する URL を指定する方法を学びます。

この実験では、-U フラグを使用して HTTP POST オプションを確認し、HTTP POST フォームを設定し、特定の -m オプションで Hydra を実行し、POST 攻撃を検証する手順を案内します。HTTP POST を認証に使用するサービスをターゲットにする際に、Hydra を使用してログイン資格情報をブルートフォース攻撃する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hydra(("Hydra")) -.-> hydra/HydraGroup(["Hydra"]) hydra/HydraGroup -.-> hydra/single_username("Single Username Attack") hydra/HydraGroup -.-> hydra/target_ip("Target IP Specification") hydra/HydraGroup -.-> hydra/http_form("HTTP Form Attack") hydra/HydraGroup -.-> hydra/success_detection("Login Success Detection") subgraph Lab Skills hydra/single_username -.-> lab-550767{{"Hydra のモジュール固有オプションを探索する"}} hydra/target_ip -.-> lab-550767{{"Hydra のモジュール固有オプションを探索する"}} hydra/http_form -.-> lab-550767{{"Hydra のモジュール固有オプションを探索する"}} hydra/success_detection -.-> lab-550767{{"Hydra のモジュール固有オプションを探索する"}} end

-U で HTTP POST オプションを確認する

このステップでは、-U フラグを使用して Hydra で利用可能な HTTP POST オプションを探索します。-U フラグは、POST リクエストを実行する際にユーザー名を指定するために使用されます。これは、ターゲットサービスが POST データの一部としてユーザー名を送信する必要がある場合に特に有用です。

実際の例に入る前に、HTTP POST リクエストの基本概念を理解しましょう。HTTP POST は、サーバーにデータを送信してリソースを作成または更新するために使用されるメソッドです。GET リクエストとは異なり、POST リクエストはリクエストボディにデータを含むため、フォーム送信などの大量のデータを送信するのに適しています。

Hydra は、ログイン資格情報をブルートフォース攻撃するための強力なツールです。HTTP POST を認証に使用するサービスをターゲットにする場合、Hydra に必要な情報、ユーザー名とパスワードのフィールド、および POST リクエストを送信する URL を提供する必要があります。

Hydra の -U オプションを使用すると、すべてのログイン試行に使用する単一のユーザー名を指定できます。これは、ユーザー名が既にわかっており、パスワードのみをブルートフォース攻撃する必要がある場合に便利です。

簡単な例で -U オプションの使い方を見てみましょう。HTTP POST をログインに使用する Web アプリケーションを攻撃したいとします。ユーザー名が testuser であることがわかっているとします。次の Hydra コマンドを使用できます。

hydra -l testuser -P ~/project/password.txt "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password" < target_ip > http-post-form

このコマンドでは:

  • hydra:Hydra を起動するコマンドです。
  • -l testuser:ユーザー名を testuser として指定します。ここでは -U ではなく -l を使用しています。-l は単一のユーザー名を指定し、-U はユーザー名のリストが記載されたファイルを指定します。
  • -P ~/project/password.txt:パスワードリストファイルのパスを指定します。~/project ディレクトリに password.txt ファイルがあることを確認してください。nano を使用して作成することができます:
nano ~/project/password.txt

いくつかの一般的なパスワードをファイルに追加します。1 行に 1 つのパスワードを記載します。例えば:

password
123456
qwerty

ファイルを保存し、nano を終了します。

  • <target_ip>:これをターゲットサーバーの IP アドレスに置き換えます。この実験では、攻撃対象のサーバーの実際の IP アドレスに置き換える必要があります。説明のために、ターゲット IP が 127.0.0.1 であると仮定します。
  • http-post-form:HTTP POST フォームモジュールを使用することを指定します。
  • "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password":これが最も重要な部分です。Hydra に POST リクエストを構築する方法を教えます。
    • /login.php:POST リクエストを送信する URL です。
    • username=^USER^&password=^PASS^:POST データです。^USER^^PASS^ は、Hydra がそれぞれユーザー名とパスワードに置き換えるプレースホルダーです。
    • F=Invalid username or password:これは、ログイン試行が失敗したかどうかを判断するために、Hydra がレスポンス内で探す文字列を指定します。Hydra がこの文字列を見つけると、ログイン試行が失敗したことを認識します。

では、サンプルの IP アドレスでコマンドを実行してみましょう:

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

このコマンドは、password.txt ファイル内のパスワードを使用して、testuser アカウントのパスワードをブルートフォース攻撃しようとします。Hydra は、ユーザー名とパスワードのフィールドを適切に設定して、/login.php URL に HTTP POST リクエストを送信します。Hydra が有効なパスワードを見つけると、画面に表示します。

この例は、http-post-form モジュールで -l オプションを使用する基本的な方法を示しています。次のステップでは、Hydra を使用して HTTP POST フォームを攻撃するためのより高度なオプションとテクニックを探索します。

HTTP POST フォームを設定する

このステップでは、Hydra 攻撃のターゲットとして使用できるシンプルな HTTP POST フォームを設定します。基本的な HTML フォームと、フォーム送信を処理する PHP スクリプトを作成します。これにより、Hydra が HTTP POST フォームとどのように相互作用するか、および正しい Hydra コマンドを作成する方法を理解できます。

まず、HTML フォームを作成しましょう。~/project ディレクトリに login.html という名前のファイルを作成します。

nano ~/project/login.html

次に、以下の HTML コードをファイルに貼り付けます。

<!DOCTYPE html>
<html>
  <head>
    <title>Login Form</title>
  </head>
  <body>
    <h1>Login</h1>
    <form method="post" action="login.php">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

この HTML コードは、usernamepassword の 2 つの入力フィールドを持つシンプルなログインフォームを作成します。フォームは POST メソッドを使用し、データを login.php に送信します。

ファイルを保存し、nano を終了します。

次に、フォーム送信を処理する login.php スクリプトを作成する必要があります。~/project ディレクトリに login.php という名前のファイルを作成します。

nano ~/project/login.php

次に、以下の PHP コードをファイルに貼り付けます。

<?php
$username = $_POST['username'];
$password = $_POST['password'];

if ($username == 'testuser' && $password == 'password') {
  echo "Login successful!";
} else {
  echo "Invalid username or password";
}
?>

この PHP スクリプトは、POST データからユーザー名とパスワードを取得し、ハードコードされた値 testuserpassword と一致するかどうかを確認します。資格情報が正しい場合は、「Login successful!」を表示し、そうでない場合は「Invalid username or password」を表示します。

ファイルを保存し、nano を終了します。

これで、基本的な HTTP POST フォームが設定されました。通常、これをテストするには、Web サーバー(Apache や Nginx など)を実行し、これらのファイルを配信する必要があります。今回は Hydra に焦点を当てており、LabEx 環境には事前に設定された Web サーバーが含まれていないため、Web サーバーを通じてこれらのファイルにアクセスできる方法があると仮定して進めます。たとえば、ローカルで Web サーバーを実行し、~/project ディレクトリを配信している場合、Web ブラウザで http://localhost/login.html にアクセスすることでフォームにアクセスできます。

次のステップでは、Hydra を使用してこのフォームを攻撃します。-m オプションを使用して POST データを指定し、-F オプションを使用して失敗メッセージを識別します。

-m オプションで実行する

このステップでは、Hydra の -m オプションを使用して、HTTP POST データを直接指定します。これは http-post-form モジュールを使用する代替方法であり、POST リクエストの構造をより細かく制御できます。

-m オプションを使用すると、POST リクエストのボディ全体を定義できます。POST データ内にユーザー名とパスワードのプレースホルダー (^USER^^PASS^) を指定する必要があります。

前のステップで作成した login.php フォームをターゲットとして使用しましょう。-m オプションを使用して、POST データを username=^USER^&password=^PASS^ と指定します。また、-l オプションを使用して単一のユーザー名 (testuser) を指定し、-P オプションを使用してパスワードリストファイル (~/project/password.txt) を指定します。

以下は、使用する Hydra コマンドです。

hydra -l testuser -P ~/project/password.txt "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password" < target_ip > http-post

このコマンドでは:

  • hydra:Hydra を起動するコマンドです。
  • -l testuser:ユーザー名を testuser として指定します。
  • -P ~/project/password.txt:パスワードリストファイルのパスを指定します。
  • <target_ip>:これをターゲットサーバーの IP アドレスに置き換えます。前と同様に、説明のためにターゲット IP を 127.0.0.1 と仮定します。
  • http-post:HTTP POST モジュールを使用することを指定します。
  • "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password":これは、URL、POST データ、および失敗文字列を指定します。
    • /login.php:POST リクエストを送信する URL です。
    • username=^USER^&password=^PASS^:POST データです。^USER^^PASS^ は、Hydra がそれぞれユーザー名とパスワードに置き換えるプレースホルダーです。
    • F=Invalid username or password:これは、ログイン試行が失敗したかどうかを判断するために、Hydra がレスポンス内で探す文字列を指定します。

では、サンプルの IP アドレスでコマンドを実行してみましょう。

hydra -l testuser -P ~/project/password.txt 127.0.0.1 http-post "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password"

このコマンドは、password.txt ファイル内のパスワードを使用して、testuser アカウントのパスワードをブルートフォース攻撃しようとします。Hydra は、指定された POST データで /login.php URL に HTTP POST リクエストを送信します。Hydra が有効なパスワードを見つけると、画面に表示します。

このコマンドとステップ 1 のコマンドの主な違いは、http-post-form の代わりに http-post を使用していることです。http-post モジュールでは、-m オプションを使用して POST データの文字列全体を指定する必要があります(ここでは URL 文字列に埋め込まれています)。一方、http-post-form はフォームフィールドに基づいて POST データを自動的に構築します。

この例は、-m オプションを使用して POST データを直接指定する方法を示しています。次のステップでは、POST 攻撃を検証し、成功したログインをキャプチャする方法を見ていきます。

POST 攻撃の検証

このステップでは、Hydra が正しいパスワードを正常に特定できることを確認することで、POST 攻撃を検証します。これを効果的に行うために、password.txt ファイルを修正して正しいパスワードを含め、Hydra がそれを見つけられるようにします。また、出力を分析してログインが成功したことを確認します。

まず、~/project/password.txt ファイルを修正して、login.php スクリプトに従って正しいパスワードである password を含めましょう。

nano ~/project/password.txt

ファイルにパスワード password を追加します。結果を素早く得るために、ファイルの冒頭付近に配置するのが良い習慣です。ファイルは次のようになるはずです。

password
123456
qwerty

ファイルを保存し、nano を終了します。

では、前のステップと同じコマンドを使用して、Hydra コマンドを再度実行しましょう。

hydra -l testuser -P ~/project/password.txt 127.0.0.1 http-post "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password"

今回は、Hydra がすぐに正しいパスワードを見つけ、出力に表示するはずです。出力は次のようになるはずです。

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:30:00
[DATA] 1 task, 1 server, 13 login tries (l:1/p:13), ~1 try per task
[DATA] attacking service http-post on 127.0.0.1
[2;32][http-post] host: 127.0.0.1   login: testuser   password: password
Hydra is finishing at 2024-10-27 14:30:05

[http-post] host: 127.0.0.1 login: testuser password: password という行は、Hydra がユーザー名 testuser のパスワード password を正常に見つけたことを示しています。

この出力が表示されない場合は、以下を再確認してください。

  • password.txt ファイルに正しいパスワード (password) が含まれていることを確認してください。
  • login.php スクリプトがユーザー名 testuser とパスワード password を正しくチェックするように設定されていることを確認してください。
  • Hydra コマンドが正しくフォーマットされていることを確認してください。特に、URL、POST データ、および失敗文字列に注意してください。

Hydra コマンドを正常に実行し、出力を確認することで、POST 攻撃を検証し、Hydra が HTTP POST フォームのログイン資格情報を正常にブルートフォース攻撃できることを確認しました。

これで、Hydra を使用した HTTP POST フォームの攻撃に関する実験は完了です。シンプルな HTTP POST フォームを設定する方法、-m オプションを使用して POST データを指定する方法、および Hydra が正しいパスワードを見つけることで攻撃を検証する方法を学びました。

まとめ

この実験では、Hydra の HTTP POST オプションを探索し、Web アプリケーションが認証に HTTP POST を使用する場合のログイン資格情報のブルートフォース攻撃方法に焦点を当てました。すべてのログイン試行に単一のユーザー名を指定する -l オプションについて学び、ユーザー名とパスワードのフィールド、および POST リクエストを送信する URL など、Hydra に必要な情報を提供する方法を学びました。

また、HTTP POST リクエストの基本概念を復習し、POST リクエストはリクエストボディにデータを含むため、フォーム送信などの大量のデータを送信するのに適していることを理解しました。この実験では、ブルートフォース攻撃を成功させるために、ターゲット URL、ユーザー名フィールド、パスワードフィールド、およびログイン試行が失敗したことを識別するための失敗メッセージなど、正しいパラメータを Hydra に提供することの重要性を強調しました。