CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)は元来、ボット、マルウェア、人工知能(AI)がWebページを操作できないようにするために設計されました。1990年代には、スパムボットの防止を目的としていました。現在では、クレデンシャルスタッフィングのような、より悪質な自動攻撃を防ぐ手段として、組織がCAPTCHAを使用しています。
しかし、CAPTCHAが導入されると、サイバー犯罪者はすぐに効果的な回避方法を編み出しました。これに対抗して、防御側は「強化された」CAPTCHAを導入しましたが、結果は変わりません。自動化を阻止しようとするテストが、自動化によって回避されているのです。
CAPTCHAを突破する方法はいくつもあります。一般的な方法の1つは、発展途上国の低賃金労働者にCAPTCHA画像を解かせるCAPTCHA解読サービスを利用することです。サイバー犯罪者はこうしたサービスを契約し、APIを介して解答を自動化ツールに取り込み、標的のWebサイトに入力します。このような不審な事業者は広く存在しており、Googleで簡単に検索するだけでも、次のようなサービスが多数見つかります。
- DeathbyCAPTCHA
- 2Captcha
- Kolotibablo
- ProTypers
- Antigate
この記事では、攻撃者が2Captchaを組み込んでクレデンシャルスタッフィング攻撃を組織的に実行する方法を説明します。
2Captcha
2Captcha.comにアクセスすると、以下の画像が表示され、1)2Captchaで働くか、2)2Captchaをサービスとして購入するかを選択するよう求められます。

選択肢1:2Captchaで働く
2Captchaで働くには、メールアドレスと報酬の振込先となるPayPalアカウントを入力して、アカウントを登録するだけです。テストでは、アカウントは数分以内に認証されました。
新規ワーカーは、CAPTCHAをすばやく解く方法を学ぶ1回限りのトレーニングコースを受講する必要があります。このコースでは、大文字と小文字を区別する必要がある場合とない場合などのヒントも提供されます。十分な正答率でトレーニングを修了すると、報酬を得られるようになります。

[Start Work]を選択すると、作業者は上図のワークスペース画面に移動します。そこでCAPTCHAが提示され、解答の送信を求められます。正しく解答すると、報酬が電子的な「財布」に入金され、作業者はいつでも支払いを申請できます。ワークスペースにはCAPTCHAが際限なく表示されるように見えることから、このサービスには安定した需要があることがうかがえます。

2Captchaのワーカーが正しい解答を提出する動機となるのは、Uberのドライバーが優れたサービスを提供する動機と同じく、顧客による評価です。2Captchaの顧客は、受け取ったCAPTCHA解答の正確性を評価します。ワーカーの評価が一定の基準を下回ると、そのワーカーはプラットフォームから除外されます。一方、評価が最も高いワーカーには、需要が少ない時間帯にCAPTCHAが優先的に割り当てられます。
オプション2 – サービスとしての2Captcha
2Captchaをサービスとして利用する顧客(すなわち攻撃者)は、2Captcha APIを攻撃に組み込んでデジタルサプライチェーンを構築します。これにより、標的サイトのCAPTCHA問題を自動的に送信し、標的サイトに入力する解答を受け取ります。
2Captchaでは、C#、JavaScript、PHP、Pythonなど、さまざまなプログラミング言語でAPI呼び出しを生成するためのサンプルスクリプトが用意されています。以下に、Pythonで記述されたサンプルコードを転載します。

自動攻撃への2CAPTCHAの組み込み
攻撃者は、クレデンシャルスタッフィング攻撃で2Captchaをどのように利用するのでしょうか。以下の図は、CAPTCHAを回避するプロセスにおいて、各エンティティがどのように連携するかを示しています。

技術的なプロセス:
- 攻撃者は、標的サイトからCAPTCHAのiframeソースと、CAPTCHA画像の埋め込みに使用されるURLを取得し、ローカルに保存します
- 攻撃者が2Captcha WebサイトにAPIトークンをリクエストする
- 攻撃者はHTTP POSTを使用してCAPTCHAを2Captchaサービスに送信し、Captcha IDを受け取ります。Captcha IDは、2Captchaに送信されたCAPTCHA画像に割り当てられる数値IDです。このIDはステップ5で使用され、2CaptchaへのAPI GETリクエストによって解答済みのCAPTCHAを取得します。
- 2CaptchaはCAPTCHAを作業者に割り当てます。作業者はCAPTCHAを解き、その解答を2Captchaに送信します。
- 攻撃者は、CAPTCHA IDを使用して2Captchaに問い合わせるスクリプトを作成します(解決されるまで5秒ごと)。その後、2Captchaは解決済みのCAPTCHAを送信します。まだ解決処理中の場合、攻撃者は2Captchaから「CAPTCHA_NOT_READY」と示す応答を受け取り、プログラムは5秒後に再試行します。
- 攻撃者は、各フィールドに入力した情報(盗まれたリストから取得した認証情報一式)とCAPTCHAの解答を添えて、標的サイトにログインリクエストを送信します。
- 攻撃者は、CAPTCHA画像ごとにこのプロセスを繰り返します。
SeleniumやPhantomJSなどのWebテストフレームワークと組み合わせることで、攻撃者は人間のように標的のWebサイトを操作しているように見せかけ、既存の多くのセキュリティ対策を実質的に回避して、クレデンシャルスタッフィング攻撃を仕掛けることができます。
収益化と犯罪エコシステム
このような洗練された仕組みのもとで、金銭面のエコシステムはどのように成り立ち、各当事者はどのように利益を得ているのでしょうか。
収益化:CAPTCHAソルバー
CAPTCHAソルバーとして働いても、十分な収入は得られません。2CaptchaのWebサイトに掲載されている指標に基づくと、報酬額は次のように算出できます。
CAPTCHA 1件の処理に6秒かかると仮定すると、作業者は1分あたり10件、1時間あたり600件のCAPTCHAを送信できます。1日8時間では4,800件です。2Captchaの作業者として試行した際の報酬(1件の処理につき約$0.0004)に基づくと、1日あたり$1.92に相当します。
先進国に住む人にとっては時間の無駄ですが、1日数ドルでも比較的大きな価値を持つ地域に住む人にとって、CAPTCHA解決サービスは手軽に収入を得る手段です。
収益化:攻撃者
攻撃者は、第三者である2Captchaに対し、CAPTCHAの解答1,000件を1セットとして料金を支払います。攻撃者は解答に入札し、1セットあたり1~5ドルを支払います。
多くの攻撃者は、大規模なクレデンシャルスタッフィング攻撃の一環としてCAPTCHA解決サービスを利用しており、その費用に見合う成果を得ています。たとえば、攻撃者がPastebinから入手した100万件の認証情報を標的サイトで試す攻撃を仕掛けるとします。この場合、認証情報1件ごとに1つのCAPTCHAを回避する必要があり、費用は約1,000ドルです。認証情報の再利用成功率を1.5%と仮定すると、攻撃者は15,000件のアカウントを乗っ取ることができ、そのすべてを収益化できます。
収益化:2Captcha
2Captchaは、攻撃者からCAPTCHA 1,000件ごとに支払いを受けます。前述のとおり、顧客(つまり攻撃者)はCAPTCHA 1,000件につき1~5ドルを支払います。2Captchaのようなサービスは入札額の一部を手数料として受け取り、残額を作業を担う人員に分配します。CAPTCHA解読サービスは大規模に利用されるため、利益は相当な額に上ります。2Captchaの受取額が解読済みCAPTCHA 1,000件につきわずか1ドルであっても、1セット当たり少なくとも60セントの純利益が得られます。こうしたサイトの所有者自身も発展途上国にいることが多いため、一見少額に思える収益でも大きな意味を持ちます。
GoogleのInvisible reCAPTCHAはどうでしょうか?
今年3月、GoogleはreCAPTCHAのアップグレード版となる「Invisible reCAPTCHA」をリリースしました。すべてのユーザーに悪名高い「私はロボットではありません」ボタンのクリックを求める「no CAPTCHA reCAPTCHA」とは異なり、Invisible reCAPTCHAでは、人間であることが確認されているユーザーはそのまま通過でき、不審なユーザーにのみreCAPTCHAの画像認証が表示されます。
テストされているタイミングが攻撃者には分からないため、これで攻撃を阻止できると思うかもしれません。しかし、GoogleがInvisible reCAPTCHAを導入したわずか1日後、2CAPTCHAはその攻略方法を解説するブログ記事を公開しました。
Googleは、ユーザーがリクエストしたページに以前アクセスしたことがあるかどうかを、ブラウザのCookieを確認して判定し、それに基づいてユーザーが人間であると判断します。同じユーザーが新しいデバイスを使い始めた場合や、最近キャッシュを消去した場合、Googleはその情報を利用できないため、reCAPTCHAチャレンジを提示せざるを得ません。
攻撃者が2Captchaを使用してクレデンシャルスタッフィング攻撃を自動化するには、CAPTCHAチャレンジが必ず発生するようにする必要があります。そのため、Invisible reCAPTCHAを回避する方法の1つは、リクエストのたびにブラウザーのデータを消去するコードを攻撃スクリプトに1行追加し、解答可能なreCAPTCHAチャレンジを確実に発生させることです。
Invisible reCAPTCHAでやや厄介なのは、CAPTCHAチャレンジが非表示になっている点ですが、回避策はあります。ブラウザーの「要素を検証」ツールを使用すれば、CAPTCHAを「見つける」ことができます。そのため、攻撃者は非表示のCAPTCHAの場所を示すパラメーターを含むPOSTリクエストを2Captchaに送信できます。攻撃者が2CaptchaからCAPTCHAの解答を受け取ると、次の2つの方法のいずれかでInvisible reCAPTCHAを自動的に突破できます。
- ページのフォーム送信時に、解決済みトークンを渡す関数を呼び出すJavaScriptアクション
- 通常のCAPTCHAコードのスニペットを解決済みトークンの入力に置き換えるため、Webページ内のHTMLコードを直接変更
Invisible reCAPTCHAを回避できるのは、新しいCAPTCHAの設計に致命的な欠陥があるからではありません。合格条件が判明していれば、どのような逆チューリングテストも本質的に突破可能だからです。
CAPTCHAが存在する限り、2Captchaのようなサービスも存在し続けます。これは、その経済構造が犯罪者にとって非常に有利だからです。低コストの人手を利用することで事業コストを最小限に抑え、大規模に展開すれば、サイバー犯罪者は数百万ドルを超える利益を得ることも可能です。また、世界には人件費の安い地域が常に存在するため、絶え間ない需要によって、2Captcha側でも供給が途切れることはありません。
このアプローチ全体には根本的な限界があるため、より優れたCAPTCHAを開発する必要はありません。代わりに、その限界を認識し、攻撃者が通過条件を把握できない、または少なくとも把握することが困難な防御策を実装すべきです。
出典
Holmes, Tamara E.「プリペイドカードとギフトカードの統計」。 CreditCards.com。Creditcards.com、2015 年 12 月 1 日。Web。
Hunt, Troy.「人力の自動化によるCAPTCHAの突破」ブログ記事。 Troy Hunt. Troy Hunt, 2012年1月22日。Web.
Motoyama, Marti、Kirill Levchenko、Chris Kanich、Stefan Savage。「Re: CAPTCHAs–経済的背景から見るCAPTCHA解読サービス」。第19回USENIX Security Symposium予稿集、ワシントンD.C.。印刷版。
著者について
関連するブログ記事

F5 Application Study Tool:OpenTelemetryによるF5 BIG-IP環境の監視
F5の新しいオープンソースツールは、BIG-IP環境を詳細に可視化し、データを追跡するとともに、強力でカスタマイズ可能なインサイトを得るための基盤を提供します。
F5 BIG-IPでAI防御を実現
F5 BIG-IP Advanced WAF、BIG-IP APM、BIG-IP SSL Orchestratorが、生成AIアプリ向けに包括的なセキュリティソリューションを提供する仕組みをご覧ください。
F5 Advanced WAFによるGraphQL APIの保護
ここ数年、多くの組織がデジタルトランスフォーメーションを進めており、COVID-19のパンデミックによってその動きは加速しています。
アプリケーションサービスの現状 通信業界版:リーダーとしての台頭
通信ネットワークが進化し、さまざまな業界の幅広いユースケースに対応するなか、通信業界の回答者がテクノロジーリーダーとしての存在感を高めていることがわかります。
デジタルトランスフォーメーションは、単なるペーパーレス化ではない
デジタルトランスフォーメーションは、単なるペーパーレス化ではありません。真のモダナイゼーションにアプリケーションアーキテクチャとセキュリティの再構築が必要な理由を、F5ブログでご覧ください。
やめましょう。もう本当にやめましょう。HTTPSはHTTPより高速ではありません。
もうやめましょう。HTTPSはHTTPより高速ではありません。プロトコルのパフォーマンスに関する微妙な違いと、暗号化トラフィックを適切に最適化する方法については、F5ブログをご覧ください。