Hydra を使って SSL 対応サービスを攻撃する

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

はじめに

この実験では、Hydra を使用して SSL 対応のサービスを攻撃する方法を探ります。この実験では、SSL/TLS で保護されたサービスのパスワードをクラックする Hydra の機能をテストすることに焦点を当てています。

まず、Python と openssl を使用してローカルの HTTPS サーバーをセットアップし、自己署名証明書とキーを生成し、安全な環境をシミュレートします。次に、-S オプションを使用して Hydra を実行して SSL サポートを有効にし、パスワードをクラックしようとします。また、-O オプションを使用して古い SSL プロトコルをテストします。最後に、SSL 攻撃の成功を確認します。

ローカルの HTTPS サーバーをセットアップする

このステップでは、Python の組み込み http.server モジュールを使用して、SSL/TLS を有効にしたシンプルな HTTPS サーバーをセットアップします。これにより、Hydra の SSL 機能をテストするための安全なサーバー環境をシミュレートできます。

まず、自己署名証明書とキーを生成する必要があります。この証明書は、クライアント(Hydra)とサーバー間の通信を暗号化するために使用されます。ターミナルを開き、~/project ディレクトリに移動します。

cd ~/project

次に、openssl コマンドを使用して証明書とキーを生成します。

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

証明書に関するいくつかの情報を入力するように求められます。ほとんどのフィールドは Enter キーを押して空白のままにすることができます。ただし、コモンネームは必須で、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(証明書)の 2 つのファイルが作成されます。

次に、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 を有効にする

このステップでは、前のステップでセットアップした HTTPS サーバーに対して、Hydra を使用してブルートフォース攻撃を行います。-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 サーバーのブルートフォース攻撃を試みます。passwords.txt ファイル内の各パスワードを test というユーザー名に対して試します。

以下のような出力が表示されるはずです(正確な出力は異なる場合があります)。

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 サーバーに正常に認証できたことが確認されます。これは、SSL/TLS 接続であっても、Hydra が脆弱なパスワードのブルートフォース攻撃に有効であることを示しています。

ディレクトリリストの代わりにエラーメッセージが表示された場合は、HTTPS サーバーがまだ実行されていること、および正しいユーザー名とパスワードを使用していることを再度確認してください。

まとめ

この実験では、Hydra を使用して SSL 対応サービスを攻撃する方法を学びました。最初のステップでは、Python の http.server モジュールを使用してローカルの HTTPS サーバーをセットアップし、openssl で自己署名証明書とキーを生成して、安全な環境をシミュレートしました。

次に、Hydra の機能を調べました。-S オプションを使用して SSL 接続を有効にし、-O オプションを使用して古い SSL プロトコルをテストしました。最後に、SSL 攻撃の成功を確認し、Hydra が SSL/TLS を介して資格情報をブルートフォースできる能力を実証しました。