ESETの研究者は、SprySOCKSのWindowsバリアント2種を新たに発見しました。このバックドアはこれまでLinux専用とされており、I‑SOONという中国系請負業者が運営していると報告されているFishMongerが使用していたものです。マルウェアサンプルはまずVirusTotalで発見されましたが、ESETのテレメトリによると2023年から2024年にかけて実際の攻撃活動が確認されており、ホンジュラス、台湾、タイ、パキスタンに複数の被害者が存在し、標的の多くは政府機関でした。
今回発見されたWindowsバリアントは、内部的にWIN_DRVおよびWIN_PLUSと命名されています。どちらもハードコードされたC&C設定を持ち、TCP、UDP、WebSocketプロトコルによる通信をサポートしています。両バリアントのコアとなるバックドア機能として、30種類以上のC&Cコマンドに対応しており、システム情報の収集、プロセスの列挙、サービス管理、そしてファイルの一覧表示・作成・削除・転送といったファイル管理機能が含まれています。
コアとなるバックドア機能に加え、WIN_DRVバージョンはカーネルドライバを利用してマルウェアのネットワーク接続、プロセス、ファイル、レジストリキーを隠蔽します。さらにTCPトラフィックの転送機能により、マルウェアのオペレーターはバックドアの実際のリスニングポートをネットワークトラフィック上に露出させることなく、被害者デバイスのランダムなTCPポートを通じてバックドアにコマンドを送信することができます。
ESETのテレメトリに基づくと、一部のSprySOCKS攻撃シナリオにはUEFIブートキットのコンポーネントが関与している可能性があり、CVE‑2023‑24932を悪用していると考えられます。
本レポートの分析結果から、これらの新しいWindowsバリアントをFishMongerによるものと高い確度で帰属させることができます。
本ブログ記事のポイント:
- FishMongerのSprySOCKSバックドアの未公開Windowsバリアント2種を発見。
- ESETテレメトリにより2023年から2024年にかけての活動を確認。主にホンジュラス、台湾、タイ、パキスタンの政府機関を標的としていることが判明。
- 両Windowsバリアントともに、TCP、UDP、WebSocketプロトコルによる通信をサポートし、30種類以上のコマンドを実装。
- WIN_DRVバリアントはステルス性の高いパッシブTCPバックドアを生成し、受信したTCPパケット内に特別に細工されたデータが検出されるたびに、カーネルドライバを用いてバックドアの隠蔽されたTCPポートへトラフィックをリダイレクトします。
FishMongerのプロフィール
FishMongerは、中国の請負業者I‑SOONによって運営されていると考えられているサイバースパイグループで(ESETのQ4 2023–Q1 2024 APT活動レポート参照)、Winntiグループの傘下に属し、中国・成都を拠点として活動していると見られています。Earth Lusca、TAG-22、Aquatic Panda、Red Dev 10といった名前でも知られています。ESETは2020年初頭にFishMongerの分析を公開しており、当時このグループは2019年6月に始まった市民抗議運動の最中、香港の大学を集中的に標的にしていました。また、Trend Microが報告しているように、水飲み場型攻撃も行うことで知られています。FishMongerのツールセットには、ShadowPad、Spyder、Cobalt Strike、FunnySwitch、SprySOCKS、およびBIOPASS RATが含まれています。
技術的分析
このセクションでは、FishMongerのSprySOCKSバックドアの新しいWindowsバリアントについて、技術的な分析を提供します。
今回の発見のきっかけとなったアーカイブは、2024年4月にklelam00007.zipという名前でVirusTotalにアップロードされたものです。その内容は図1に示すとおりです。

このアーカイブには、DLLサイドローディングのホストに使用される正規ファイルを含む各種ファイルのほか、.dat拡張子を持つ3つの不審な暗号化ファイルが含まれています。その後の解析により、これらの暗号化ファイルには開発者がWIN_DRVと命名した、FishMongerのSprySOCKSバックドアの未公開Windowsバリアントが含まれていることが明らかになりました。さらに調査を進めると、ESETテレメトリの中にWIN_PLUSと命名された別のバックドアバージョンが存在することも判明しました。
初期アクセス
FishMongerは、初期アクセスを得るために被害者の公開サーバを標的とし、サーバベースのNデイ脆弱性を悪用することで知られています。今回のキャンペーンでFishMongerが被害者のシステムに侵入した正確な経路を確認することはできませんでしたが、一部の被害者デバイスでサーバOSが稼働していたことと、FishMongerの典型的な手口を考え合わせると、攻撃者は設定ミスや未パッチの公開向けアプリケーションを経由して侵入した可能性が高いと考えられます。
Windows版SprySOCKS
2023年9月、Trend Microはアナリストが「SprySOCKS」と命名した新しいFishMongerのLinuxバックドアに関するレポートを公開しました。このバックドアのコードはTrochilusというオープンソースのWindowsリモートアクセストロイ(RAT)をベースにしており、RedLeavesバックドアとも複数の共通点を持っています。ただし、それらから十分に拡張・改変されているため、新しいバックドアとして分類されます。本レポートでは、SprySOCKS v1.8の未公開Windowsバリアント2種を分析します。
- 開発者がWIN_DRVと命名したバリアント。高度なステルス機能のためにカーネルドライバを使用します。
- ドライバを使用しないWIN_PLUSと命名されたバリアント。
図2に示すとおり、バックドアのバージョンタイプと番号はバイナリ内にハードコードされています。

Trend Microのレポートで紹介されたLinux版SprySOCKSバックドアに存在するアーティファクトや機能の大部分は、今回新たに発見されたWindowsバリアントにも同様に確認されています。具体的には以下のとおりです。
- 同一のC&Cメッセージ形式、
- 非常に類似したC&Cコマンド(一部追加コマンドあり)、
- 同一の暗号化キーとアルゴリズム、
- 同一の静的リンクネットワークライブラリ(HP-Socket)の使用。
今回の新しいSprySOCKS両バリアントにおいて、C&C通信と利用可能なコマンドに関するコアのバックドア機能は非常に類似しています。最も顕著な違いは、最終的なバックドアのロード方法、改善されたステルス性、そして使用されるコンポーネント名とパスにあります。
以下のサブセクションでは、まず各SprySOCKSバリアントの実行チェーンに関わるコンポーネントを分析し、次にほぼ同一の内容を持つバックドアコンポーネントについて説明します。
WIN_DRVコンポーネント
VirusTotalにアップロードされたアーカイブの中に、SprySOCKSのWIN_DRVバージョンを発見しました。このバージョンには空のC&C設定が含まれています。そのため、このバージョンはリモートアドレスに対してアクティブに接続を試みることはありません。ただし、被害者デバイスのランダムなポートでTCPサーバを起動する機能は維持しており、パッシブバックドアとして機能します。興味深いことに、攻撃者はこのサーバのTCPポート番号を把握している必要はありません。後述するように、WIN_DRVバージョンが使用するRawWNPFドライバは、受信したTCPパケット内に特別に細工されたデータが検出されるたびに、開いているいずれかのTCPポートのトラフィックをバックドア自体へサイレントに転送する機能を持っているからです(詳細はRawWNPFドライバセクションをご参照ください)。
図1に示すとおり、WIN_DRVバージョンのSprySOCKSを含むアーカイブには以下のファイルが含まれています。
- klelam00007.bat – バックドアの永続化を担当するバッチスクリプト。図3に示すとおり、以下の処理を行います。
○ 現在の作業ディレクトリから%SystemRoot%\Fontsディレクトリにすべてのファイルをコピーします(バッチファイルが正常に機能するには、アーカイブ内の他のファイルと同じディレクトリに配置されている必要があります)。
○ ApphostRagistreationVerifierという名前のスケジュールタスクを作成します。これはNT AUTHORITY\SYSTEM権限で、システム起動のたびにApphostRagistreationVerifier.exe(Microsoftが署名した正規のAppHostRegistrationVerifier.exeに見せかけるために攻撃者がリネームした、正規かつ有効な署名付き実行ファイル)を実行するよう構成されています。攻撃者はWindowsのDLL読み込み仕様を悪用した周知のDLLサイドローディング手法を使用し、正規の署名付きアプリケーションを利用して独自の悪意あるDLL(この場合はtpsvcloc.dll)をロードさせています。具体的には、MFCサテライトDLLを利用したマルウェアサイドローディング手法を使用しています(tpsvcloc.dllファイル名のlocという文字列に注目してください)。
- ApphostRagistreationVerifier.exe – ThinPrintのAutoConnectプリンター作成サービスの正規署名付き実行ファイル(SHA‑1: FFC3AA7909D4E72C360D65A1F45260DFFE5C99B7)で、tpsvc.dllライブラリをロードします。
- tpsvc.dll – tpsvcloc.dllライブラリをロードする正規署名付きライブラリ。
- tpsvcloc.dll – SprySOCKSバックドアローダー。
- X1B5206BDC1743DD.dat – SprySOCKSバックドア本体と次の2ファイルのコピーを含む暗号化コンテナ。
- KX1B5206BDC1743DD.dat – DriverLoader。KW1B5206BDC1743FP.datから別のカーネルドライバをロードする役割を持つ暗号化カーネルドライバ。
- KW1B5206BDC1743FP.dat – RawWNPF。バックドアのファイルとネットワーク活動を隠蔽する役割を持つ暗号化カーネルドライバ。

図4は、SprySOCKS WIN_DRVバリアントの実行チェーンを示しています。

以下の3つのサブセクションでは、SprySOCKSローダー、DriverLoaderドライバ、RawWNPFドライバという前述のコンポーネントについて技術的な分析を提供します。
SprySOCKSローダー
ローダーはまず仮想環境と一部のセキュリティ製品の存在確認チェックを行います。具体的には、ローダーのプロセス内で特定のライブラリ(snxhk.dll、SxWrapper.dll、SxIn.dll、SXIn64.dll、SbieDll.dll)を探索し、いずれか一つでも見つかった場合は終了します。
次のステップとして、図3のklelam00007.batスクリプトによって永続化が正常に設定されているかどうかを確認します。具体的には、現在のローダーイメージが%SystemRoot%\Fonts\ディレクトリからロードされているかどうかを確認し、%SystemRoot%\Fonts\X1B5206BDC1743DD.dat、%SystemRoot%\Fonts\tpsvc.dll、%SystemRoot%\Fonts\tpsvcloc.dllの各ファイルへのアクセスを試みます。これらのファイルが所定の場所に存在しない場合、ローダーは次の処理を行って独自に永続化を設定します。
- 現在の作業ディレクトリから%SystemRoot%\Fonts\ディレクトリへX1B5206BDC1743DD.dat、tpsvc.dll、tpsvcloc.dll、ApphostRagistreationVerifier.exeをコピー。
- システム起動時に自動実行される可能性があるVirtual Disk Service(vds.exe)のデバッガとして%SystemRoot%\Fonts\ApphostRagistreationVerifier.exeを登録するため、レジストリ値HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe\debuggerにアプリケーションのパスを書き込む。
- affair-build.batファイルを%SystemRoot%\Fonts\ディレクトリにドロップし、cmd.exe経由で実行する。図5に示すこのスクリプトは、展開ディレクトリからファイルを削除して痕跡を消去し、vdsサービスを再起動して(%SystemRoot%\Fonts\から)マルウェアを再実行します。

永続化が設定されると、ローダーは%SystemRoot%\Fonts\X1B5206BDC1743DD.datに配置された暗号化コンテナからペイロードのロードを続行します。復号アルゴリズムとキーは、ハードコードされたキーuXQLESMXGaRMs6BLを使用したECBモードの128ビットAESです。
これにより、DllToShellCodeオープンソースツールで生成されたシェルコードが得られます。シェルコードを実行する前に、コンテナ内の残りの暗号化ペイロードを個別のファイルとして展開します。
- %SystemRoot%\Fonts\KX1B5206BDC1743DD.dat
- %SystemRoot%\Fonts\KW1B5206BDC1743FP.dat
これらの処理が完了すると、ローダーはspoolsv.exeから取得したトークンを使ってCreateProcessAsUserWで新しいsvchost.exeプロセスを生成し、プロセスドッペルゲンガー手法を利用してバックドアのシェルコードをそのプロセスにインジェクトします。インジェクション処理中、シェルコードはファイル名プレフィックスがTHの一時ファイルとして%TEMP%ディレクトリにドロップされます。
最後のステップとして、ローダーは先にドロップされたKX1B5206BDC1743DD.datファイル内に隠されているDriverLoader(カーネルドライバ)の復号と実行を行います。DriverLoaderはまず復号され、その内容がC:\Windows\System32\drivers\fsdiskbit.sysに保存されます。実行するために、ローダーはこのドライバをミニフィルタードライバとして手動でインストールします。具体的には、ドロップされたドライバを指すImagePath値を持つmsidiskserverという名前のサービスレジストリキーを新規作成し(図6参照)、このレジストリキーをパラメータとしてNtLoadDriver Windows API関数を呼び出してドライバをロードします。エラーが検出されなければ、msidiskserverレジストリキーとfsdiskbit.sysファイルの両方を削除します。これをもってローダーの処理は完了し、終了します。

DriverLoaderドライバ
DriverLoaderの機能について説明する前に、重要な注意点があります。Windows Vistaのリリースとともに、Microsoftはドライバ署名の強制(DSE)という機能を導入しました。これにより、有効な署名を持つカーネルモードコンポーネントのみがWindowsカーネル上で実行できるようになっています。つまり、fsdiskbit.sysドライバ(DriverLoader)を実行するためには、攻撃者が信頼された証明書で署名する必要があります。
少なくとも一部の古い、あるいは設定に不備のあるシステムでドライバを動作させるために、攻撃者はGitHubのPastDSEプロジェクトリポジトリで公開されている流出証明書を使用し、fsdiskbit.sysドライバに署名しました。使用された証明書に関する情報は図7に示されています。

それではコンポーネントの機能について説明します。このコンポーネントの目的は非常に明快で、別のドライバをメモリ上にのみロードすることです。まず、ローダーが先に作成したC:\Windows\Fonts\KW1B5206BDC1743FP.datファイルの内容を読み取り、復号します。使用するアルゴリズムとキーはローダーと同じで、キーuXQLESMXGaRMs6BLを使用したECBモードの128ビットAESです。復号されたデータにはネイティブPEバイナリ(RawWNPFドライバセクションで説明)が含まれており、手動でマッピングされてそのエントリーポイントが実行されます。
DriverLoaderバイナリにはPDBパスが埋め込まれています。
C:\Users\xdd\Desktop\今天\2023-4-11\2023‑04‑10__注册表驱动加载功能__集成到内测3中-未完成\DriverMemoryLoadDriver\x64\Release\DriverMemoryLoadDriver.pdb
簡体字中国語部分を機械翻訳すると以下のようになります。
- 今天: Today(今日)
- 注册表驱动加载功能__集成到内测3中-未完成: Registry driver loading function__is integrated into internal beta 3-not completed(レジストリドライバロード機能__内部ベータ3に統合中-未完成)
シンボルパスから、このコンポーネントは少なくとも2023年4月から開発されていたと考えられ、DriverLoaderのコンパイルタイムスタンプとも一致しています。同様に、パス内の文字列から、このドライバが属するプロジェクトはコンパイル時点でまだ開発途上であった可能性が高いことがうかがえます。
RawWNPFドライバ
RawWNPFドライバは、SprySOCKSバックドアのWIN_DRVバージョンをWIN_PLUSバリアントと比較して格段にステルス性の高いものにしているコンポーネントです。侵害されたシステム上でバックドアの悪意ある活動を隠蔽できるほか、ドライバのカスタムI/O制御コード(IOCTL)を呼び出すことで設定を変更することができます。このドライバは\Device\RawWNPFというデバイスドライバを作成します。利用可能なIOCTLの一覧と各説明を表1に示します。
表1. RawWNPFドライバが処理するIOCTLの一覧
| IOCTL | 説明 |
| 0x220200 | 指定したローカルTCPポートとの間のアクティブなネットワーク接続を隠蔽するようドライバを設定します。 |
| 0x220300 | 0x220200で設定したネットワーク接続の隠蔽を解除します。 |
| 0x220340 | 隠蔽接続リストにエントリを追加します。 |
| 0x220344 | 隠蔽接続リストからエントリを削除します。 |
| 0x220348 | 隠蔽接続リストをすべて消去します。 |
| 0x22034C | 隠蔽接続リストを読み取ります。 |
| 0x220350 | 指定したPIDを持つプロセスを隠蔽プロセスリストに追加します。 |
| 0x220354 | 指定したPIDを持つプロセスを隠蔽プロセスリストから削除します。 |
| 0x220358 | 隠蔽プロセスリストをすべて消去します。 |
| 0x22035C | 隠蔽プロセスリストを読み取ります。 |
| 0x222000 | ドライバのメイン機能(ネットワーク接続の隠蔽、プロセスの隠蔽、マルウェアコンポーネントの隠蔽、ネットワークフィルタ、永続化の保護)を初期化します。この初期化後、他のIOCTLを使用して何を隠蔽するかを正確に設定できます。 |
| 0x222004 | ハードコードされた2つのDWORD値(1と2)を返します。これはドライバのバージョンを示している可能性があります。 |
| 0x222008 | ドライバのバイナリが存在する場合に削除します。 |
指定プロセスの隠蔽
RawWNPFドライバはプロセスIDに基づいてプロセスを隠蔽するよう設定でき、隠蔽プロセスのリストはIOCTL 0x220358、0x22035C、0x220354、0x220350を呼び出すことで管理できます。プロセスを隠蔽するために、ドライバはNtQuerySystemInformationシステムコールの実行をフックし、実行中のプロセス情報を取得する際(すなわちSystemProcessInformationがSystemInformationClassパラメータに渡された場合)にその出力を改ざんします。このAPI関数で取得されたプロセスのいずれかがドライバの隠蔽プロセスリストと一致する場合、ドライバは該当プロセスを関数の出力から削除します。カーネルドライバがNtQuerySystemInformationシステムコールをフックする方法は、InfinityHookProプロジェクトのソースコードに強く基づいているようです。
ネットワーク活動の隠蔽
このドライバは、特定のアクティブな接続(指定したIP、ポート、またはその組み合わせ)を隠蔽するよう設定でき、netstat.exeなどの一般的なネットワーク管理ツールの出力に表示されなくなります。これは周知の手法(例:[1]、[2]、[3]など)によって実現されており、攻撃者はnsiproxy.sys WindowsカーネルドライバのDeviceIoControl関数内のIOCTL 0x12001Bに対してIoCompletionRoutineをフックします。nsiproxyの0x12001B IOCTLハンドラ内のコードはアクティブな接続リストの取得を担当しており、そのIoCompletionRoutineをフックすることで、攻撃者は取得したリストを走査し、特定のポート、アドレス、またはその両方の存在を確認し、一致が見つかった場合はリスト内の該当接続を隠蔽することができます。図8は、ネットワーク接続の隠蔽を担当するフック関数を示しています。

アクティブなネットワーク接続の隠蔽に加え、このドライバには興味深い機能があります。開いているいずれかのTCPポートで受信したTCPパケットを、IOCTL 0x220200で設定された特定のTCPポート(実際はSprySOCKSバックドアのTCPサーバのポート)へ転送する機能です。ただしこの転送は、受信したTCPデータ内に特別に細工されたデータが含まれている場合にのみ行われます。これを実現するために、ドライバはWindows Filtering Platform(WFP)APIを使用して独自のパケットフィルタオブジェクトを登録し、転送されるIPv4パケットの内容を手動で解析(インバウンドとアウトバウンドの両方を検査)し、受信TCPパケットのデータ内に特別に細工されたデータが検出された場合にトラフィックの転送を行います。この機能の主な目的は、バイナリ内にC&Cアドレスを埋め込まなくても悪意あるバックドアに接続できる機能を提供することにあると考えられます。さらに、転送されたトラフィックはWiresharkなどのツールで検査できますが、転送先の実際のポートは公開されないため、この悪意あるトラフィックの真の宛先を調査することが困難になります。
インストールされたパケットフィルタとその識別情報を表2に示します。
表2. RawWNPFドライバが登録するWFPフィルタオブジェクト
| フィルタレイヤー名 | フィルタオブジェクト名およびGUID | フィルタオブジェクトコールアウト名およびGUID |
| Inbound IP Packet v4 Layer | Delivery Optimization (TCP-In) {E980088D-BE44-4057-8E5C-C7FDF8968795} |
COInbound {DE0D7F67-94ED-4DDB-8215-9C028B54661B} |
| Outbound IP Packer v4 Layer | Delivery Optimization (TCP-Out) {33F76397-DBCB-445E-8EC3-AA51ED302D15} |
COOutbound {8280DDF3-7489‑4402-B9D8-96B50912346B} |
| ALE Connect v4 Layer | Delivery Optimization (TCP-In) {5746AF70-2917‑4861-97E6-D5E4DD569F2D} |
COAuthConnect {A33E1AA8-9B0F-44A3-B24A-AEB04CA54C3B} |
| ALE Listen v4 Layer | Delivery Optimization (TCP-In) {7CB4DFB4-0D20-402D-A49D-BA9660D026E6} |
COAuthListen {40045FAF-6BAE-4B48-9119‑31B48FFEA629} |
| ALE Receive/Accept v4 Layer | Delivery Optimization (TCP-In) {2C1AB6EF-0B65-4634‑8666-BCB2CF9C72E9} |
COAuthAccept {DDFE5189‑389F-437F-9B92-59495ED2181A} |
| ALE ResourceAssignment v4 Layer | Delivery Optimization (TCP-In) {B4AE248F-98D5-446F-88EB-14CF605AE722} |
COAuthResAssignment {FE570356-A1A9-413C-94CC-BD6C448E9969} |
バックドアファイルの隠蔽
このドライバはミニフィルタドライバとして自身を登録し、以下のコールバックをインストールすることで、SprySOCKSバックドアのファイルを隠蔽・保護します。
- すべてのIRP_MJ_CREATE I/Oリクエストで発動するプリオペレーションコールバック。ドライバの隠蔽・保護ファイルリストに含まれるファイルやディレクトリを作成または開こうとするあらゆる試みに対してSTATUS_NO_SUCH_FILEを返す役割を担います。
- すべてのIRP_MJ_DIRECTORY_CONTROL I/Oリクエストで発動するプリオペレーションコールバック。ディレクトリ列挙に関連するリクエストのみがポストオペレーションコールバックに渡されるよう、それ以外のリクエストをフィルタリングします。
- プリオペレーションコールバックのチェックを通過したIRP_MJ_DIRECTORY_CONTROL I/Oリクエストで発動するポストオペレーションコールバック。ディレクトリ一覧の取得試行から隠蔽・保護対象ファイルのエントリを除去する役割を担います。
ドライバによって保護されるファイル名のハードコードリストは以下のとおりです。
- \SystemRoot\Fonts\tpsvc.dll
- \SystemRoot\Fonts\tpsvcloc.dll
- \SystemRoot\Fonts\ApphostRagistreationVerifier.exe
- \SystemRoot\Fonts\X1B5206BDC1743DD.dat
- \SystemRoot\Fonts\KX1B5206BDC1743DD.dat
- \SystemRoot\Fonts\KW1B5206BDC1743FP.dat
永続化の保護
ドライバはCmRegisterCallbackExを呼び出してRegistryCallbackルーティンをインストールし、SprySOCKSローダーの永続化に使用されるレジストリキー(HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe)を隠蔽します。これにより、このキーへのアクセスや列挙のあらゆる試みがドライバによってフィルタリングされます。
WIN_PLUSコンポーネント
SprySOCKSのWIN_PLUSバージョンについては、まず暗号化されたコンテナをESETのテレメトリで発見しました。最初の検出は2024年7月にさかのぼり、パキスタンの被害者デバイスで確認されました。コンテナにはSprySOCKSバックドアとSprySOCKSローダーが含まれており、C&C設定が存在していました(図9参照)。

暗号化されたコンテナは、侵害されたシステム上の以下のパスに配置されていました。
C:\Windows\System32\spool\drivers\color\config.dat
復号すると、コンテナにはSprySOCKSローダーとSprySOCKSバックドア本体が含まれていることがわかります。コンテナに含まれるSprySOCKSバックドアをさらに分析した結果、この場合は暗号化コンテナからSprySOCKSローダーをロードする役割を担う追加のコンポーネントが存在する模様です。このコンポーネントは本分析では「ファーストステージローダー」と呼び、以下のレジストリキーの下にプリントプロセッサとしてインストールされます。
HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\VSPMsg
興味深いことに、このVSPMsgという文字列に関連するものをESETのテレメトリで検索したところ、ホンジュラスの2つの異なる被害者デバイス上でC:\Windows\System32\spool\prtprocs\x64\VSPMsg.dllに展開されたファイルが見つかりました。このファイルは、前述のconfig.datからSprySOCKSローダーを実行する役割を担うファーストステージローダーであることが判明しました。
SprySOCKS WIN_PLUSバリアントの実行図を図10に示します。

ファーストステージローダー
このローダーはまずspoolsv.exeによって実行されたかどうかを確認し、そうでない場合は終了します。これは自動化されたマルウェア解析サンドボックスから動作を隠蔽するためのもので、このローダーはプリントプロセッサとして実行されることを想定しています。次に、暗号化コンテナC:\Windows\System32\spool\drivers\color\config.datからSprySOCKSローダーを復号します。まずハードコードされたキーuXQLESMXGaRMs6BLでローダーを128ビットAES-ECB方式で復号し、次にプロセスドッペルゲンガーを通じて新しく作成したsvchost.exeプロセスにインジェクトします。この過程で、SprySOCKSローダーはファイル名プレフィックスがTHの一時ファイルとして%TEMP%ディレクトリにドロップされます。
このサンプルは2つの関数をエクスポートしています。
- GetErrorMessageModule
- SetErrorMessageModule
SetErrorMessageModule関数は何も処理を行いませんが、GetErrorMessageModule関数はローダー自身の永続化を設定するために使用されます。実行されると、HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\VSPMsgレジストリキーを作成し、Driverレジストリ値をVSPMsg.dllに設定し、ハードコードされたC:\ProgramData\Microsoft Event\PFs\VSPMsg.dllをC:\Windows\System32\spool\prtprocs\x64\ディレクトリにコピーすることで、ローダーをプリントプロセッサとして登録します。次のステップとして、暗号化コンテナをC:\ProgramData\Microsoft Event\PFs\config.datからC:\Windows\System32\spool\drivers\color\config.datへコピーし、完了後にaffair-build.batバッチスクリプトをC:\Windows\System32\spool\drivers\color\ディレクトリに生成して実行します。図11に示すとおり、このスクリプトの目的は元の展開ディレクトリ内のファイルを削除してローダーの痕跡を消し去り、プリントスプーラーサービスを再起動することで新たにインストールされたプリントプロセッサの実行をトリガーすることです。

SprySOCKSローダー
このローダーはまずハードコードされた名前fqwhi2d1qaz2のミューテックスを作成し、次にC:\Windows\System32\spool\drivers\color\config.datにある暗号化コンテナからSprySOCKSバックドアをロードします。ハードコードされたキーuXQLESMXGaRMs6BLでバックドアを128ビットAES-ECB方式で復号し、プロセスドッペルゲンガーを通じて新しく作成したsvchost.exeプロセスにインジェクトします。この過程で、SprySOCKSローダーはファイル名プレフィックスがTHの一時ファイルとして%TEMP%ディレクトリにドロップされます。
SprySOCKSバックドア
いよいよSprySOCKSバックドア本体の分析に移ります。WIN_DRVとWIN_PLUSの両バリアントにおいて、バックドアの機能はほぼ同一であり、違いは使用される特定のファイルパスやレジストリキーのみです。また前述のとおり、WIN_PLUSバージョンは高度なステルス性のためにRawWNPFドライバを使用しません。
本レポートで分析した両バリアントは、オリジナル名PrcsServer.dllのDLLであり、Stopという名前の関数をエクスポートしています。起動時にまずprcs-server-runという名前のミューテックスを作成し、その直後にバックドアのメイン機能の初期化を開始します。これには、ハードコードされた設定に基づいたC&C通信チャネルの初期化と起動、そしてキーロガーの設定が含まれます。これらの処理に加え、WIN_DRVバックドアバージョンはRawWNPFドライバのIOCTL 0x222000を呼び出してドライバを初期化し、次にドライバのIOCTL 0x220350を呼び出して自プロセスを隠蔽します。
キーロギングは、%appdata%\Microsoft\Vault\lgf.datに値keyが1に設定されたconfigセクションを含むINIファイルが存在する場合にのみ有効化されます。これらの条件が満たされると、両バックドアはいずれもGlobal\{DCAA7ED8-521B-4EAB-BE21-65254CF59239}という名前のミューテックスを作成し、クリップボードデータおよびアクティブウィンドウのタイトルとキーストロークを定期的に%appdata%\Microsoft\Vault\lg.datファイルに記録します。ファイル内のデータはキー0x44による単バイトXOR暗号で暗号化されています。
C&C通信
バックドアはC&Cとの通信にTCP、UDP、WebSocketの3つのプロトコルをサポートし、クライアントとサーバの両方として機能することができます。ネットワーク関連の機能はHP-Socketネットワークフレームワークに大きく依存しており、一部の暗号化機能はCrypto++ライブラリを使用して実装されています。
C&C設定はバックドアに埋め込まれており、以下の内容を含むことができます。
- 最大3つのIPアドレスと関連ポート。各通信チャネル(TCP、UDP、またはWebSocket)のC&C IPアドレスとそのポートを指定します。
- 最大3つのポート番号。バックドアが新規接続を待ち受けるポートをそれぞれ指定します。TCPサーバ用、UDPサーバ用、WebSocketサーバ用に各1つ使用されます。
- TCP通信チャネルのC&Cアドレスとポート:207.148.78[.]36:443
- UDP通信チャネルのC&Cアドレスとポート:207.148.78[.]36:53
- WebSocket通信チャネルのC&Cアドレスとポート:207.148.78[.]36:80
- バックドアのTCPサーバリスニングポート:53781
接続を開始したりサーバを起動したりする前に、SprySOCKSのWIN_DRVバージョンはRawWNPFドライバのIOCTL 0x220340と0x220200を呼び出すことで、設定に含まれるアドレスやポートとの間のすべての接続を隠蔽します。これにより、これらの接続は実際にはアクティブであってもnetstat.exeなどのツールの出力に表示されなくなります。さらに、両バックドアバージョンともnetsh.exeユーティリティを2回実行します。
netsh.exe netsh advfirewall firewall delete rule name=”Core Networking – Packet Too Big(ICMPv6 – In)”
netsh advfirewall firewall add rule name=”Core Networking – Packet Too Big(ICMPv6 – In)” dir=in action=allow protocol=tcp localport=53781
最初のコマンドは指定したファイアウォールルールを削除し、2番目のコマンドは削除したものと同じ名前の新しいファイアウォールルールを追加します。これにより、設定に指定されたバックドアのTCPサーバポート宛てのインバウンドTCPトラフィックがすべて許可されます。
C&C設定が空の場合(VirusTotalで発見したWIN_DRVバージョンがこれに該当)、バックドアは侵害されたマシン上のランダムなポートでTCPサーバを起動し、RawWNPFドライバのIOCTL 0x220200を呼び出してそのポートを隠蔽します。この呼び出しは、TCPサーバを標準的なネットワークツールの出力から非表示にするだけでなく、RawWNPFドライバが提供するTCP転送機能も有効化します。この機能により、攻撃者はバックドアが実際にリスニングしているポートを知らなくても、被害者マシンの任意の開いているTCPポートに特別に細工されたTCPデータを送信するだけで、バックドアにコマンドを送ることができます。
TCPチャネルに関しては、C&CプロトコルはTrend Microのレポートで分析されたLinuxバージョンと同一のようです。実際のバックドアデータを送信するたびに、まず12バイトのヘッダーを送信します。このヘッダーには、残りのヘッダーの32ビットCRC、DWORDマジック値0xACACBCBC、およびヘッダーに続くデータのサイズを示すDWORDが含まれています。
UDPおよびWebSocketチャネルでは、マジック値が異なるほか、メッセージヘッダーの形式とサイズも異なります。UDPチャネルでは、マジック値は0xACACBFBCで、36バイトのヘッダーのオフセット0x1Cに配置され、その後に続くデータのサイズを示すDWORDが続きます。WebSocketチャネルでは、WebSocket ヘッダーのMasking-Keyとしてマジック値0x1BDCCBAAが使用されています。図12は、各通信チャネルのマジック値を示すネットワークトラフィックキャプチャを示しています。

ヘッダーに続いて、32ビットCRC、WORD値0x0003(暗号化方式を示している可能性)、そしてbase64エンコードされた128ビットAES-ECBモード暗号化データ(ハードコードされたキーQFTHEYjzX3RBOMgZ使用)が続きます。
デコードおよび復号前後のC&Cメッセージの例を図13に示します。

復号されたC&Cメッセージ内の__msgid値は、バックドアが実行するコマンドをメッセージIDで指定するために使用されます。バックドアがサポートするメッセージIDの一覧と説明を表3に示します。なお、すべてのコマンドを詳細に分析したわけではないため、一部の説明はコード・機能の大まかな概要にとどまっています。
表3. SprySOCKS C&Cコマンド。*が付いた説明は暫定的な評価です
| メッセージID | 説明 |
| 0x09 | クライアント(被害者)のシステム情報を収集します。収集対象:コンピュータ名、OSバージョン、ネットワークアダプター情報、メモリ情報、CPU情報、現在の権限、システム言語とバージョン、現在時刻、バックドアのバージョン(1.8)とバージョンタイプ(WIN_DRVまたはWIN_PLUS)。 |
| 0x0A | インタラクティブコンソールを起動します。 |
| 0x0B | インタラクティブコンソールへの書き込みを行います。 |
| 0x0D | インタラクティブコンソールを停止します。 |
| 0x0E | 追加の通信チャネルを指定します(チャネルは起動しません)。バックアップC&Cの指定に使用される可能性があります。 |
| 0x0F | 別のターゲットにC&Cメッセージを送信します。* |
| 0x11 | すべてのプロセスを列挙します。 |
| 0x12 | PIDで指定したプロセスのモジュールを列挙します。 |
| 0x13 | PIDで指定したプロセスを終了します。 |
| 0x14 | すべての接続を閉じます。 |
| 0x16 | 現在の通信チャネル情報を取得します。 |
| 0x17 | 追加の通信チャネル(TCP、UDP、またはWebSocket)を指定して起動します。 |
| 0x19 | バックドアをアンインストールして終了します。 |
| 0x1E | すべてのサービスを列挙します。 |
| 0x1F | 指定したサービスのStartTypeを設定します。 |
| 0x20 | 指定した名前のサービスを起動します。 |
| 0x21 | 指定したdwControlパラメータを使ってControlService関数を呼び出します。 |
| 0x22 | 指定したサービスをサービスマネージャーから削除します。実行中のサービスは停止しません。 |
| 0x23 | SOCKSプロキシを初期化します。 |
| 0x24 | SOCKSプロキシを終了します。* |
| 0x25 | SOCKSプロキシ経由でデータを送信します。 |
| 0x26 | SOCKSプロキシ関連コマンド。* |
| 0x2A | 指定したファイルをアップロードします。* |
| 0x2B | ファイル転送関連の補助コマンド。* |
| 0x2C | 指定したファイルをダウンロードします。* |
| 0x2D | ファイル転送関連の補助コマンド。* |
| 0x3C | 空きディスク容量を列挙します。 |
| 0x3D | 指定したディレクトリ内のファイルを一覧表示します。 |
| 0x3E | 指定したファイルを削除します。 |
| 0x3F | 指定したディレクトリを作成します。 |
| 0x40 | 指定したファイルを名前変更します。 |
| 0x41 | 既存のファイルを実行します。 |
| 0x42 | 指定したファイルをコピーします。 |
| 0x43 | ログインユーザーのWindowsの「最近使ったファイル」ディレクトリからファイルを一覧表示します: %APPDATA%\Microsoft\Windows\Recent\ %APPDATA%\Microsoft\Office\Recent\ |
ネットワークインフラ
今回のキャンペーンで発見されたC&CアドレスはSprySOCKSバックドアのWIN_PLUSバリアントの設定(図9参照)にハードコードされた207.148.78[.]36の1件のみです。
設定においてバックドアがC&Cとの通信に使用するポートは以下のとおりです。
- TCP: 443
- UDP: 53
- WebSocket: 80
Trend Microのレポートで言及されているとおり、上記C&Cと同じIPレンジ207.148.64.0/20に属するIPアドレス207.148.75[.]122は、2023年6月にFishMongerのオペレーターがSprySOCKSの配布サーバとして使用していました。このIPレンジはVultrクラウドホスティングプロバイダーに属しています。
まとめ
これまでLinux専用バックドアとして知られていたSprySOCKSのWindowsバリアントの発見は、FishMongerのクロスプラットフォーム能力の大きな拡張を意味します。分析の結果、WindowsへのポーティングはLinux版のコアアーキテクチャ(C&Cプロトコル、使用される暗号化、全体的なコマンド処理ロジックを含む)の大部分を維持しつつ、Windows固有のメカニズムに置き換えが必要な箇所を対応し、カーネルドライバを導入することでバックドアのステルス性を向上させていることが明らかになりました。UEFIブートキットが関与している可能性を示す限定的な兆候も確認されていることから、このグループの活動を注視し続けることを強く推奨します。
WeLiveSecurityに掲載された調査に関するお問い合わせは、[email protected]までご連絡ください。
ESETリサーチでは、プライベートAPTインテリジェンスレポートおよびデータフィードを提供しています。このサービスに関するお問い合わせは、ESET脅威インテリジェンスページをご覧ください。
IoC(侵害の痕跡)
ファイル
| SHA‑1 | ファイル名 | 検出名 | 説明 |
| 955BFC3DCC867256F9F4 |
KX1B5206BDC |
Win64/SprySOCKS.A | 暗号化されたSprySOCKS DriverLoaderドライバ。 |
| 44DC4A08C5EB0972C8E1 |
bthcam.sys | Win64/Agent.ESB | SprySOCKS DriverLoaderドライバ。 |
| AB87B29B6F79487C75CA |
KW1B5206BDC |
Win64/SprySOCKS.A | 暗号化されたSprySOCKS RawWNPFドライバ。 |
| 6490B8E4AADE25A3EE2D |
X1B5206BDC1 |
Win64/SprySOCKS.A | SprySOCKSバックドアのWIN_DRVバリアント、暗号化されたSprySOCKS RawWNPFドライバ、SprySOCKS DriverLoaderドライバを含む暗号化コンテナ。 |
| E7484C24B88A1A2407A8 |
klelam00007 |
Win64/Agent.CXZ Win64/SprySOCKS.A BAT/Runner.KS |
VirusTotalに含まれていたZIPアーカイブ。SprySOCKSのWIN_DRVバリアントとすべてのバックドアコンポーネントが含まれており、サイドローディングに使用される正規バイナリも同梱されています。 |
| 621D1952839BE4B0A1B0 |
tpsvcloc.dll | Win64/Agent.CXZ | SprySOCKSローダー。 |
| 2457EED2AB28E37741F1 |
VSPMsg.dll | Win64/Agent.CXZ | SprySOCKSローダーを起動するファーストステージローダー。 |
| D2C706B1EAF662BF0CE1 |
N/A | Win64/SprySOCKS.A | SprySOCKSバックドアのWIN_PLUSバリアント。 |
| 5F3B87CEF56683D9A9E1 |
N/A | Win64/Agent.CXZ | SprySOCKSローダー。 |
| C793CA31E3F6628B5C89 |
config.dat | Win64/SprySOCKS.A | SprySOCKSバックドアのWIN_PLUSバリアントとそのローダーを含む暗号化コンテナ。 |
| 037DB2445F3D72388CB2 |
N/A | BAT/Runner.KS | SprySOCKSのWIN_DRVバリアントを永続化するバッチスクリプト。 |
ネットワーク
| IP | ドメイン | ホスティングプロバイダー | 初回確認 | 詳細 |
| 207.148.78[.]36 | N/A | IRT‑CHOOPALLC‑AP | N/A | SprySOCKSバックドア(WIN_PLUSバリアント)にハードコードされたC&C IPアドレス。 |
MITRE ATT&CKテクニック
この表はMITRE ATT&CKフレームワークのバージョン19を使用して作成されました。
| タクティクス | ID | 名称 | 説明 |
| 偵察 | T1592.004 | 被害者ホスト情報の収集:クライアント設定 | SprySOCKSは侵害されたデバイスに関する情報(コンピュータ名、OSバージョン、メモリとCPUの情報、現在の権限、システム言語とバージョン、現在時刻など)を収集することができます。 |
| T1590.005 | 被害者ネットワーク情報の収集:IPアドレス | SprySOCKSは侵害されたデバイスに関する情報(ネットワークインターフェースと割り当てられたIPアドレスに関する情報を含む)を収集することができます。 | |
| リソース開発 | T1587.001 | 能力の開発:マルウェア | FishMongerはSprySOCKSバックドアを含む、作戦に使用するカスタムマルウェアを開発しています。 |
| 実行 | T1059.003 | コマンドおよびスクリプトインタープリター:Windowsコマンドシェル | SprySOCKSはインタラクティブなcmd.exeコマンドシェルを起動でき、攻撃者は侵害されたマシン上でリモートからコマンドを実行することができます。 |
| T1053.005 | スケジュールタスク/ジョブ:スケジュールタスク | SprySOCKSはシステム起動時にローダーを実行するためにスケジュールタスクを使用します。 | |
| T1569.002 | システムサービス:サービス実行 | SprySOCKSは一時的な実行と永続的な実行の両方にシステムサービスを悪用します。 | |
| T1106 | ネイティブAPI | FishMongerは被害者のシステム上でコードを実行するためにWindows APIを使用しています。 | |
| 永続化 | T1547.012 | 起動またはログオン時の自動実行:プリントプロセッサ | FishMongerは永続化を実現するために、悪意あるローダーをプリントプロセッサとしてインストールします。 |
| 権限昇格 | T1546.012 | イベントトリガー実行:Image File Execution Optionsインジェクション | SprySOCKSはHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe\debuggerを変更することで、Virtual Disk Serviceのデバッガとして自身をインストールできます。 |
| ステルス | T1205.002 | トラフィックシグナリング:ソケットフィルタ | SprySOCKSはRawWNPFカーネルドライバを使用して、パケット内に特定のマジック値が検出された場合にインバウンドTCPトラフィックを設定済みのローカルポートへリダイレクトするパケットフィルタをインストールします。 |
| T1134.002 | アクセストークン操作:トークンを使ったプロセス作成 | FishMongerはプリントスプーラーサービスから取得したトークンを使ってCreateProcessAsUserで新しいプロセスを実行します。 | |
| T1622 | デバッガー回避 | SprySOCKSのRawWNPFドライバはKdDisableDebugger関数を使用して、アクティブな場合はカーネルデバッガーを無効化します。 | |
| T1140 | ファイルまたは情報の難読化解除/デコード | SprySOCKSローダーは暗号化ファイルからSprySOCKSバックドアを復号します。また、SprySOCKSの各コンポーネント内の文字列の大部分は暗号化されています。 | |
| T1070.004 | 痕跡削除:ファイル削除 | SprySOCKSローダーはファイルをコピーして永続化を設定した後、元の展開ディレクトリからファイルを削除します。 | |
| T1070.009 | 痕跡削除:永続化のクリア | SprySOCKSローダーは悪意あるミニフィルタドライバを実行した後、関連するサービスレジストリ値を削除します。 | |
| T1027.007 | ファイルや情報の難読化:動的API解決 | SprySOCKSのコンポーネントは動的API解決を使用しています。 | |
| T1027.013 | ファイルや情報の難読化:暗号化/エンコードされたファイル | SprySOCKSのコンポーネントは被害者のドライブ上のAES暗号化ファイルに格納されています。 | |
| T1055.013 | プロセスインジェクション:プロセスドッペルゲンガー | SprySOCKSローダーはプロセスドッペルゲンガーを使用してsvchost.exeプロセスにバックドアをインジェクトします。 | |
| T1014 | ルートキット | FishMongerはSprySOCKSの悪意ある活動を隠蔽するルートキットとして機能するRawWNPFカーネルドライバを使用します。 | |
| T1497 | 仮想化/サンドボックス回避 | SprySOCKSはエミュレーターやサンドボックスによる自動解析を防ぐため、複数のアンチエミュレーション手法を使用しています。 | |
| T1574.002 | 実行フローのハイジャック:DLLサイドローディング | FishMongerはDLLサイドローディングを使用してSprySOCKSバックドアを実行します。 | |
| 防御機能の無効化 | T1562.004 | システムファイアウォールの無効化または変更 | SprySOCKSはバックドアのリスニングポートへのインバウンドトラフィックをすべて許可するファイアウォールルールを追加します。 |
| 発見 | T1010 | アプリケーションウィンドウの発見 | SprySOCKSはキーロギング機能の一環として、アクティブなフォアグラウンドウィンドウ名を取得します。 |
| T1083 | ファイルとディレクトリの発見 | SprySOCKSは侵害されたシステムからファイルとディレクトリの一覧を取得できます。 | |
| T1518.001 | ソフトウェアの発見:セキュリティソフトウェアの発見 | SprySOCKSのコンポーネントは自身のプロセス内でセキュリティ製品およびサンドボックス製品のライブラリ(snxhk.dll、SxWrapper.dll、SxIn.dll、SXIn64.dll、SbieDll.dll、cmdvrt32.dll)の存在を確認します。 | |
| T1082 | システム情報の発見 | SprySOCKSは侵害されたデバイスに関する情報(コンピュータ名、OSバージョン、メモリとCPUの情報、現在の権限、システム言語とバージョン、現在時刻など)を収集することができます。 | |
| T1614.001 | システムロケーションの発見:システム言語の発見 | SprySOCKSは侵害されたデバイスに関する情報(システム言語を含む)を収集することができます。 | |
| T1007 | システムサービスの発見 | SprySOCKSはシステム上のすべてのサービスを列挙できます。 | |
| T1124 | システム時刻の発見 | SprySOCKSは侵害されたデバイスに関する情報(現在のシステム時刻を含む)を収集することができます。 | |
| 収集 | T1056.001 | 入力のキャプチャ:キーロギング | SprySOCKSはキーロガーを実装しています。 |
| T1115 | クリップボードデータ | SprySOCKSはキーロギング機能の一環として、キャプチャされたキーストロークとともにクリップボードデータを記録します。 | |
| コマンド&コントロール | T1132.001 | データエンコーディング:標準エンコーディング | SprySOCKSはカスタムC&C通信プロトコルでbase64エンコーディングを使用しています。 |
| T1573.001 | 暗号化チャネル:対称暗号 | SprySOCKSはC&Cへの送信データを128ビットAESで暗号化し、C&Cから受信したデータを復号します。 | |
| T1008 | フォールバックチャネル | SprySOCKSはTCP通信チャネルに加え、UDPおよびWebSocketチャネルを使用してC&Cと通信することができます。 | |
| T1665 | インフラの隠蔽 | SprySOCKSのRawWNPFドライバはnetstat.exeなどのネットワークツールを使用した際にバックドアのアクティブな接続が列挙されないよう隠蔽します。 | |
| T1571 | 非標準ポート | SprySOCKSは非標準ポートを使用してC&Cと通信します。 | |
| T1095 | 非アプリケーション層プロトコル | SprySOCKSは非標準プロトコルを使用してC&Cと通信します。 | |
| 情報の持ち出し | T1041 | C2チャネルを通じた情報の持ち出し | SprySOCKSは侵害されたシステムから各種ファイルをC&Cにアップロードすることができます。 |
翻訳元: https://www.welivesecurity.com/en/eset-research/fishmongers-arsenal-upgraded-sprysocks-windows/
