CAPTCHA の突破#
CAPTCHA は主にログインフォームでのログイン検証に使用され、フォームがブルートフォース攻撃されるのを防ぎます。CAPTCHA モジュールが不適切に設定されている場合(例えば、クライアント側の検証、サーバー側の CAPTCHA が期限切れにならないなど)、CAPTCHA は形骸化します。
一般的に以下のような CAPTCHA の分類があります:
- 画像 CAPTCHA
- SMS CAPTCHA
- メール CAPTCHA
- スライド CAPTCHA
- 音声 CAPTCHA
SMS CAPTCHA#
CAPTCHA のブルートフォース攻撃#
現在の SMS CAPTCHA のほとんどは 6 桁の数字ですが、6 桁の CAPTCHA は簡単には破られません。しかし、4 桁の CAPTCHA に遭遇し、失効時間や CAPTCHA の送信回数に制限がない場合、ブルートフォース攻撃を試みることができます。
4 桁の CAPTCHA は 10000 回の試行で破ることができ、これは少ない回数です(0000~9999 の範囲)。
ケース 1: 任意のユーザー登録
攻撃者は任意の電話番号を入力して登録し、サーバーは攻撃者が入力した電話番号に SMS CAPTCHA を送信します。このケースの CAPTCHA は 4 桁で、CAPTCHA の範囲は 0000~9999 に設定されており、CAPTCHA をブルートフォース攻撃して成功した場合、自動的にアカウントが登録されます。
返されたデータパケットを通じて、攻撃が成功したかどうかを判断できます。
上の図のように、返り値の長さから、サイズが 49 の応答が正しい CAPTCHA であることが判定できます。
修正提案:
CAPTCHA に対するブルートフォース攻撃に対して、以下の強化策を講じることをお勧めします:
(1)CAPTCHA の失効時間を設定し、180 秒を推奨;
(2)単位時間内の CAPTCHA の失敗試行回数を制限する。例えば、5 分以内に連続して 5 回失敗した場合、そのアカウントを 15 分間ロックする。
CAPTCHA のバイパステスト#
脆弱性の原理:
いくつかのケースでは、フロントエンドがサーバーに送信するデータ(例えば、res_code などのフィールド)を変更することで、CAPTCHA をバイパスし、リクエストを実行できます。
テストプロセス:
攻撃者はアカウント登録ページに入り、任意の電話番号を入力して CAPTCHA を取得し、アカウント登録ページに任意の CAPTCHA を入力してリクエストを送信し、パケットをキャプチャします。キャプチャツールを使用して返されたパケット情報を確認し、変更して返されたデータパケットを転送し、登録が成功したかどうかを確認します。
応答パケットを変更
修正提案:
この脆弱性に対して、サーバー側で CAPTCHA の認証メカニズムを追加し、クライアントが送信した CAPTCHA を二重に検証することをお勧めします。
CAPTCHA の再利用#
脆弱性の原理:
ウェブサイトのログインやコメントなどのページで、CAPTCHA 認証が成功した後にセッションを即座にクリアしない場合、CAPTCHA が最初の認証成功後に再利用可能になります。テスト時には、CAPTCHA を含むデータパケットをキャプチャして再送信し、成功したかどうかを確認できます。
テストプロセス:
攻撃者は通常のプロセスでアカウントを登録し、ページの CAPTCHA を入力し、送信されたデータパケットをキャプチャします。データパケット内のユーザー名フィールドを変更して再送信し、複数のアカウントが成功裏に登録されたかどうかを確認します。
修正提案:
認証回数の問題に対して、CAPTCHA が一度認証成功した後、サーバー側で認証成功のセッションをクリアすることをお勧めします。これにより、CAPTCHA の一度の認証が繰り返し使用される問題を効果的に防ぐことができます。
CAPTCHA の GET 伝送漏洩#
CAPTCHA が GET パケット内にあり、直接取得できることがわかります。これにより、存在しない電話番号でも登録でき、CAPTCHA を直接入力できます。
SMS バンピング#
脆弱性の原理:
SMS 送信モジュールで、SMS の送信回数に制限がないため、無制限に SMS CAPTCHA を送信できます。
テストプロセス:
攻撃者は SMS 送信部分に電話番号を入力し、CAPTCHA を送信するボタンをクリックしてパケットをキャプチャし、複数回 SMS CAPTCHA を受信できるかどうかを確認します。1 秒間に複数の CAPTCHA を受信できる場合、SMS バンピングの脆弱性が存在します。
いくつかのバイパス方法:
- スペースを利用してバイパス
- クッキー値を変更してバイパス
- IP を利用してバイパス
- 返り値を変更してバイパス
- 異なるアカウントから SMS を送信してバイパス
画像 CAPTCHA#
CAPTCHA のバイパス(クライアント側)#
js フロントエンド検証
JavaScript を無効にする
ブラウザの F12 - 設定 - JavaScript を無効にする
ログインボックスに到達
burp でパケットをキャプチャ
intruder でブルートフォース攻撃成功
CAPTCHA のバイパス(サーバー側)#
同じ CAPTCHA が複数回送信されても期限切れにならず、ブルートフォース攻撃が可能で、成功裏にログインできます。
画像 CAPTCHA 自動認識テスト#
captcha-killer-modified をダウンロード#
captcha-killer的修改版,支持关键词识别base64编码的图片,添加免费ocr库,用于验证码爆破,适配新版Burpsuite
Releasesから jar ファイルをダウンロード
burpsuite にこの jar ファイルを読み込む
次に、captcha-killer-modified のソースリポジトリをダウンロードします。codereg.py ファイルが必要で、このファイルは CAPTCHA 認識モジュールを起動するためのもので、dddddocr ライブラリをインストールする必要があります。
git clone https://github.com/f0ng/captcha-killer-modified.git
ddddocr ライブラリをインストール#
リポジトリのアドレス:https://github.com/sml2h3/ddddocr
注:私の環境は mac m1 pro です
# brewでonnxruntimeをインストール
brew install onnxruntime
pip3 install ddddocr # python3.9でcodereg.pyを実行するとエラーが出る
python3.10 を使用して aiohttp をインストール
pip310 install aiohttp -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
python310 codereg.py
を実行
エラー:TypeError: The port is required to be int.
エラーの解決:
スクリプト内のdefault="8888"
をdefault=8888
に変更して再実行します。
再度python310 codereg.py
を実行すると、正常に動作します。
実戦ケース 1#
ターゲットは pikachu のターゲットです
- burp で CAPTCHA の URL をリクエスト
CAPTCHA の URL をリクエストし、取得をクリックすると、右側の CAPTCHA を取得できます。
上の図の左側のリクエスト内容は、ログインボックスのパケットをキャプチャし、POST 内の URL を CAPTCHA の URL に変更します。下の図で captcha-killer-modified プラグインに送信します。
他のケースでは、キーワード
を抽出します。
- ddddocr インターフェースの URL を設定
リクエストテンプレートを設定します。
POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Authorization:Basic f0ngauth
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8332
<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>
インターフェースアドレスをhttp://127.0.0.1:8888 に設定し、codereg.py が起動するサービスです。
設定は以下の通りです:
この時、captcha-killer-modified パネルの内容は以下の通りで、CAPTCHA を正確に認識しました。
- intruder でブルートフォース攻撃を開始
- attack type を pitchfork に設定
- パスワードフィールドと vcode CAPTCHA フィールドをブルートフォース攻撃します。
パスワードのペイロードを設定
CAPTCHA のペイロードを設定
最終的な認識率は、ここで使用しているターゲットの CAPTCHA が比較的複雑です。
codereg.py の出力
参考#
- https://gv7.me/articles/2019/burp-captcha-killer-usage/
- 書籍参考:《web 攻防業務安全実戦指南》