GSB Bruteforce

C / libcurl

C言語と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が返されます。

したがって、上記のどちらの方法を用いてもパスワードを特定できたはずです。最後に、プログラムはユーザー名とパスワードを表示します。

GitHubでプロジェクトを見る

ギャラリー