切られたしっぽ

産業廃棄物の投下場所

某のフィッシングキットから見る、調査のときに留意したいクローキングのこと

はじめに

フィッシング詐欺は企業にも個人にも迫る身近なサイバー脅威の1つであり、それが占める被害件数の割合はサイバー攻撃全体で見てもおそらく最大クラスです。
大規模な SOC や CSIRT に所属している方にとっては、対応することが多いアラート・インシデントの一つになっているのではないかと思います。
もちろんアラート・インシデントがあれば対応者がフィッシングサイトの調査をする必要が出てきますが、ここで一つ課題になるのは クローキング の存在です。

クローキングは一般的なIT用語なのですでに知っている方も多いと思いますが、いわゆるアクセス元の情報を頼りに表示するコンテンツを変える技術のことですね。
wacul-ai.com

フィッシングサイトもクローキングによってフィッシング用コンテンツと良性コンテンツの表示を切り替えているのですが、問題はこのクローキング技術は対応者・リサーチャー側からは見えないブラックボックスの存在であるという点です。
「User Agent によって動作が変わる」, 「IPアドレスによっても動作が変わる」なんて話も人から聞いたことはありますが、実際にコードを見たことがないので調査も伝聞の知見をもとにやるしかありません。

筆者もこれまではサーバ側のコードを見たことがなかったので勘で調査を行っていたのですが、今回ひょんな機会でフィッシングキットを見る機会があったので、フィッシングサイトが使うクローキング技術をコードレベルで確認してみることにしました。
せっかくの長期休暇中なのでいつもと違う分析もしてみようというモチベもあり、調べた結果を簡単ではありますがメモ書き程度に残します。筆者と同じような境遇にいてフィッシングサイトの調査をする機会があった場合参考にしていただければ幸いです。

免責事項

本投稿はフィッシングキットの使用を促す内容ではありません。よって、フィッシングサイトの構築といった部分には触れることもありません。
あくまで行うことはソースコードをベースに攻撃者が行っているクローキング手法を分析することであり、リサーチャーが効果的にフィッシングサイトを調査するための視点を学ぶことを目的としています。
本投稿内容を悪用目的では使用しないでください。

ことのあらまし

2023年9月の頭、16shop というフィッシングキットを使用していたサイバー犯罪者が海外で逮捕された事件は皆さんの記憶にも新しいと思います。
筆者も下記のTrendMicroさんの記事を見ながらその功績の詳細を追うとともに、簡単にフィッシングサイトを作成できる「16shop」というツールキットについても概要を知ることができました。
www.trendmicro.com

......が、記事の中で一枚の画像が目に留まります。それは Maltego での分析画像でしたが、VirusTotal に16shopのフィッシングキットがアップロードされているようです。

フィッシングキット16shopの分析、トレンドマイクロとインターポールのパートナーシップ(TrendMicro)』, 図5:複数のフィッシングキットが保存されているサーバ より画像引用

なぜキットがアップロードされているか理由はわかりませんが、ツールは海賊版も存在しているようなので、どこかで海賊版を入手した攻撃者がウイルスのチェックをするために VirusTotal にアップロードしたりしたのかもしれません。何はともあれ、`16shop` というキーワードのある zip だけで VirusTotal から見つけることができそうです。

試しに、以下のクエリを試してみると 47 件ほど存在しました。 TrendMicro さんの記事にある命名と同じなので、これらが海賊版(?)の16shopフィッシングキットのようです。

entity:file tag:zip name:16Shop
VirusTotal で16shopのフィッシングキットを search する

せっかく見つかったので、ツールキットを分析して筆者の中でブラックボックス化していたクローキング技術をクリアにしてみることにしました。
これで、勘でやっていたクローキング対策がより論理的に行使されるようになるでしょう。

16shop フィッシングキットの調査

基本情報

今回の分析する対象は以下のキットです。これを対象とした理由は、投稿日時が最も新しかったためです。
www.virustotal.com

ファイル名が『16Shop-Amazon.zip』なので、おそらく Amazon のフィッシングサイト構築用だと思われます。zip の Bundle info にある Latest Content Modification が 2023-05-31 なので、おそらく4か月ほど前に作られたものなのではないかと推測できます。

概要

今回入手したツールの中身を覗いてみると、どうやら php で書かれているツールのようで、index.php へのアクセスからすでに大量のクローキング処理が行われています。画像に見える blocker.php, blocklist.php などがそれに該当する処理ですね。読み込んでいる php ファイルの量が多くすべての処理を列挙していると記事の内容が非常に長くなってしまうため、いくつかにグルーピングして要点だけまとめていきたいと思います。

ディレクトリ構成


余談ですがTrendMicro さんの記事を見た際はツールキットは python で実装されているように見えたので、時代や種類によってキットの構成は一新されているのかもしれません。*1

クローキング処理部分の詳細分析

16shop の場合、フィッシングコンテンツを表示させるかどうかに使っている情報は以下のようです。

  • CLIENT-IP, X-FORWARDED-FOR ヘッダ
  • アクセス元のIPアドレス
  • アクセス元のホスト名
  • アクセス元のISP
  • User-Agent ヘッダ
  • Referer ヘッダ

そこそこあるように書きましたが、実態としては アクセス元のIPアドレス と HTTP header にある User-Agent の2つで、おまけ程度に Referer がある程度です。しかし、IPアドレス部分についてはそこから正規利用者かどうかの判定ロジックが多いのと、そもそもIPアドレスをどのようにして判定するかというロジックがあるため少し小分けにして記述してます。ここからは、各項目を細かく見ていきます。

CLIENT-IP, X-FORWARDED-FOR ヘッダ

大前提として、このフィッシングキットはアクセス元のIPアドレスを取得し、それがbotのアクセスやblacklistに登録されたIPアドレスであった場合はフィッシングコンテンツを返さずブロックするという仕様を持っています。では、そもそもアクセス元のIPアドレスをどのように取得しているかというと以下の部分のコードです。

アクセス元のIPアドレス取得部分

筆者も見て驚きましたが、ロジックがかなりザルです。このコードでは HTTP header に CLIENT-IP または X-Forwarded-For がある場合、それらを真っ先に優先してIPアドレスとして認識します。この先に様々なクローキング処理がありますが、まずは理想に見えるIPアドレスをこれらのヘッダーに入れることから試してみてもよさそうです。

アクセス元のIPアドレス

では理想的に見えるIPアドレスは何かというと、blacklist に載っていないIPアドレスを選択することになります。blacklist に載っているIPアドレスは単発のものもあれば一定のレンジのものもあるので注意が必要ですね。例えば、レンジでのblacklistを見るとTOR や AMAZONIPアドレス帯などは基本的にblockされています。とりあえず TOR からアクセスしてもクローキングに阻まれてしまう可能性は十二分にありますね。

アクセス元のホスト名

ここではIPアドレスからgethostbyaddrでホスト名を問い合わせ、blacklist にないかをチェックします。しかし、なぜか先述べたIPアドレスチェックのロジックではなく $_SERVER['REMOTE_ADDR'] で取得したIPアドレスからホスト名を取得しているので、結局のところアクセス元のIPアドレスはHeader以外でもきちんと偽装する必要がありそうです。

中をざっと見てみると VPN のホスト名などもチェックしていたので、VPN アクセスかどうかもクローキングの対象にしているようです。筆者は NordVPN や ExpressVPN を使いますがどちらもblacklistに入っていたのでVPNの契約バリエーションを増やす必要があるなと再認識しました。

アクセス元のISP

こちらはIPアドレスの取得ロジックで取得したIPv4に対して、Internet Service Provider を問い合わせてblacklistに当てはまった場合弾くロジックです。
中を見ると、Digital Ocean やら Choopa やらリサーチャー側がよく攻撃インフラとして使われているのを見る文字列は見えましたが、OCN などの日本の利用者向けのものは見えませんでした。ここらの Provider は bot ばかりで一般的な利用者がいないという判断なのでしょうかね。

User-Agent ヘッダ

このヘッダも、基本的には blacklist にマッチしたものを弾く仕組みなので、Webで検索して一般人が使用する OS, Browser のものを引っ張ってくれば弾かれることはなさそうでした。もちろん雑に curl したり、python の requests で訪れたりした場合は弾かれるので CLI から検証をする場合は必ず User-Agent を変更しましょう。


Referer ヘッダ

Referer の blacklist は .htaccess 側にその記載がありました。どうやら phishtank からのアクセスなどはここで弾けるようにしている実装のようです。Referer はヘッダに入っていた場合に弾く材料として使われているようなので基本は設定せずとも問題ないとは思いますが、Webサービス経由で調査を行う場合などは考慮する必要がありそうです。

その他、気になったこと

これはクローキングの仕組みとはずれる話となりますが、blacklist などによってbot判定された場合のIPアドレスや理由はその都度記録されていて、そこは「よくできているなー」という感想が漏れました。例えば、以下のコードは antibot[.]pw にIPアドレスを問い合わせて bot かどうかを判定する処理なのですが、bot 判定された場合はそのIPアドレスをファイルに書き出しています。

bot 判定された場合、そのIPアドレスを別途記憶する処理

書きだされたIPアドレスが即座に使われる様子は今回のコードから確認できませんでしたが、おそらくここで手に入れたIPアドレスを利用して、攻撃者が今後のblacklist拡張などに活用するものと思われます。このような処理は他の blacklist 処理のコードでも散見されるため、調査の一番最初できちんとクローキングを意識したアクセスをするかどうかが非常に大切なことがわかりますね。もし弾かれた場合、即座にVPNの切り替えなどを行った方が賢明かもしれません。

余談ですが、コードを最初に見たときは「『一度アクセスしたIPアドレスbot判定されたら blacklist 入りする』といった設定が入っていた場合、とりあえずメールに書かれているURLを全部雑にcurlすることで企業ネットワークの同じ出口にいる従業員の被害を最小限にできるかなー」とか妄想していたのですが、16shop の場合それができなそうなので残念でした。

まとめ

簡単ですが、フィッシングキットの調査をしてブラックボックスだったクローキング技術をクリアにしました。基本的にはクローキングはblacklist方式で行われているようで、フィッシングサイトにアクセスする際には

  • CLIENT-IP, X-FORWARDED-FOR ヘッダ
  • User-Agent ヘッダ
  • Referer ヘッダ
  • 出口となるVPN

を最低限工夫してから初動の調査を行われなければいけないことがわかりました。リサーチャーの場合、攻撃者の環境には分析用の仮想環境から TOR, VPN などを経由してアクセスすることになると思いますが、フィッシング関連のインシデント報告を受けてアクセスした結果それらしいものが表示されない場合、VPN を別のものに切り替えたり調査用の専用線からアクセスするようなアクションが必要となりそうです。

最後になりますが、本投稿はあくまで特定の1つのフィッシングキットを分析したサマリになります。他のフィッシングキットは同じような動作をするとは限りませんし、より入念な準備をしている攻撃者ならblacklist以外のクローキング技術を施しているかもしれません。しかしインデント対応者はその仮説が外れた場合、ブラックボックスな状態から変数を考察して次の手を打つことは必須です。この投稿がフィッシングインデントの対応者にとっての、初動対応を考えるための一助になればと思います。

*1:もしかしたら、この php のものは古い海賊版を改造しながら使いまわしている可能性もあるかもしれません。