GSB Bruteforce
C / libcurlC言語とcurl APIを使って開発した、ブルートフォース攻撃を行うためのCLIプログラムです。
背景
BTS SIOの課程で、PHPとCodeIgniterフレームワークを用いてGSBというウェブサイトを開発しました。
その後、サイトのセキュリティをテストし、代表的な脆弱性を修正するよう求められました。
Hydraなど既存のツールを使ってブルートフォース攻撃を試みましたが、サイトの設計、MVCモデル、フレームワークの動作方式により、Hydraでユーザーパスワードを解析することはほぼ不可能でした。
というのも、Hydraはフォームの対象ページのHTML内容をもとにログイン成功の可否を判断しますが、私のサイトは認証情報の正当性を検証するために純粋なPHPページ(HTMLを一切含まない)を経由するためです。
そこで、URLリダイレクトとHTTPステータスコードを利用してログインの成否を判定する、自作のブルートフォースアプリケーションを開発することにしました。これは私のサイトの設計によりマッチする方法です。
動作の仕組み
ソースコードは2つの部分に分かれています。1つ目は、提供されたデータセットで使用されているパスワード規則に従ってパスワードを生成します。つまり、小文字または数字からなる5文字です。プログラム内の数行を変更するだけで、他の長さや文字種にも対応できます。
2つ目は、curl APIとそのCライブラリであるlibcurlを使用し、プログラムに渡されたフォームへPOSTリクエストを送信します。パスワードをテストし、HTTPステータスコードとURLリダイレクトを確認します。正しいURLに到達した場合、ユーザー名とパスワードを表示してプログラムを終了します。
パスワードが見つからなかった場合も、その旨が表示されます。
プログラムのテスト
ユーザー名はすでに判明しているものとします。データセットは常に同じ規則(名の頭文字+姓、アクセント記号なしの小文字)に従っているためです。
まずフォームがあるURLをターゲットにし、ログインを試みます。ブラウザの開発者ツールを使って、送信されたリクエストの内容を確認します。
これでフォームから送信される正確なリクエストと変数名が判明しました。GitHubプロジェクトのソースコードは、すでにこのリクエストを使用しています。
私のプログラムは、URLリダイレクトまたはHTTPステータスコードのいずれかを使ってログイン成功の可否を判定できます。ログイン後に到達するURLが分かっている場合は、それを直接利用できます。分からない場合は、curl APIでいくつかテストを行い、どのHTTPコードがログイン失敗を意味するかを特定した上で、それ以外のコードが返された場合のみ結果を表示します。
この例では、ログイン後のURLが「selection」ページであることをすでに知っているとします。プログラムはあらゆるパスワードの組み合わせをテストします。
ご覧の通り、ログインに失敗した場合はエラーを示すGETパラメータ付きの「index」URLとHTTP 200が返され、ログインに成功した場合は「selection」URLとHTTP 500が返されます。
したがって、上記のどちらの方法を用いてもパスワードを特定できたはずです。最後に、プログラムはユーザー名とパスワードを表示します。