このステップでは、先ほど作成した資格情報ファイルを使用して、Hydra を使って模擬 HTTP サービスを攻撃します。このステップを実行するために、まず認証が必要なシンプルな HTTP サーバーをセットアップします。このサーバーは、意図的にブルートフォース攻撃に対して脆弱になっています。
-
基本認証付きのシンプルな HTTP サーバーを作成する:
Python の組み込み http.server
モジュールを使用して、認証が必要な基本的な HTTP サーバーを作成します。まず、~/project
ディレクトリに webserver.py
という名前のファイルを作成します。
nano ~/project/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 encoded
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()
このスクリプトは、基本認証が必要なシンプルな HTTP サーバーを作成します。正しいユーザー名は admin
、パスワードは password
です。Base64 エンコードされた文字列 YWRtaW46cGFzc3dvcmQ=
は admin:password
を表しています。
ファイルを保存し (Ctrl+O
を押し、次に Enter
を押す)、nano
を終了します (Ctrl+X
を押す)。
-
HTTP サーバーを起動する:
Python スクリプトを実行して、HTTP サーバーを起動します。
python3 ~/project/webserver.py
サーバーが起動し、ポート 8000 で待機します。Hydra 攻撃を行うためにサーバーを実行し続ける必要があるため、このターミナルウィンドウを開いたままにしておきます。
-
Hydra を使用して HTTP サービスを攻撃する:
新しいターミナルウィンドウを開きます。次に、最初のステップで作成した資格情報ファイルを使用して、Hydra を使って HTTP サービスを攻撃します。
hydra -C ~/project/credentials.txt 127.0.0.1 http-get /
Hydra は、credentials.txt
ファイル内の各ユーザー名/パスワードの組み合わせを HTTP サービスに対して試行します。ルートパス /
にアクセスしようとします。
Hydra が異なるユーザー名/パスワードの組み合わせを試行していることを示す出力が表示されるはずです。Hydra が正しい資格情報 (admin:password
) を見つけることに成功すると、出力にそれらが表示されます。
成功した攻撃の出力例:
Hydra v9.1 (c) 2020 by van Hauser/THC - Use freely but carefully.
...
[http-get] 1 of 1 target
[http-get] Trying login: admin/password
...
[http-get] host: 127.0.0.1 login: admin password: password
...
1 target completed, 1 valid password found
攻撃が成功すると、Hydra は正しいユーザー名とパスワードを表示します。
-
HTTP サーバーを停止する:
webserver.py
スクリプトが実行されているターミナルウィンドウで、Ctrl+C
を押してサーバーを停止します。