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 が 1 回の認証成功後にサーバー側で認証成功のセッションをクリアすることをお勧めします。これにより、CAPTCHA の 1 回の認証が繰り返し使用される問題を効果的に防ぐことができます。
CAPTCHA の GET 伝送漏洩#
CAPTCHA が GET パケット内にあり、直接 CAPTCHA を取得できることがわかります。これにより、存在しない電話番号でも登録でき、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 攻防業務安全実戦ガイド》