This post is also available in: English (英語)
概要
Unit 42ではあるAPTキャンペーンをTiltedTempleという名前で追跡しています。私たちは最初に、このキャンペーンがZoho ManageEngine ADSelfService Plusの脆弱性 CVE-2021-40539とServiceDesk Plusの脆弱性CVE-2021-44077を利用していることを特定しました。同キャンペーンに関与した脅威アクターらはさまざまな手口で侵害システムへのアクセスと持続性を確保しており、これまでにテクノロジ、エネルギー、ヘルスケア、教育、金融、防衛などのセクタにまたがる十数社の侵害に成功しています。同キャンペーンをさらに分析したところ、持続性維持のために別の高度なツールが使われていることがわかりました。Unit 42 ではこのツールをSockDetourと呼んでいます。
カスタムバックドアであるSockDetourは、プライマリバックドアが削除された場合のバックアップバックドアとして機能するように設計されています。侵害したWindowsサーバー上でファイルレス、ソケットレスで動作するため本ツールの検出は困難です。TiltedTempleキャンペーンのマルウェア配布に使用されたコマンド&コントロール(C2)インフラの1つには、SockDetourのほかにメモリダンプツールや複数のWebシェルなどの雑多なツールがホストされていました。私たちはSockDetourをTiltedTemple内の1つのキャンペーンとして追跡していますが、このアクティビティが単一脅威アクターによるものか複数の脅威アクターがからんでいるのかはまだよくわかっていません。
Unit 42のテレメトリデータと収集サンプルの分析結果から、SockDetourの背後にいる脅威アクターは、このツールを使って米国を拠点とする防衛関連企業を標的にしていたと考えられます。Unit 42は、このキャンペーンで少なくとも4つの防衛関連企業が標的となり、少なくとも1つの請負業者が侵害を受けたという証拠を持っています。
またUnit 42はSockDetourが少なくとも2019年7月から実際に利用されていた可能性があると考えています。公開リポジトリにSockDetourの追加サンプルは見当たりませんでしたので、このバックドアは長い間うまく検出を逃れてきたと言えます。
本稿に関連して観測されたテクニックやそれに対応してとるべき行動指針全体 (CoA) を視覚化した内容についてはUnit 42のATOMビューアからご確認ください。
パロアルトネットワークスのお客様は、Cortex XDRとWildFireによって本稿で紹介する脅威から保護されています。このほか、AutoFocusで関連エンティティを追跡できます。さらに、本稿の末尾に添付されているYARAルールを使ってメモリ内のSockDetourの有無を検出できます。
本稿で扱う脆弱性 | CVE-2021-40539, CVE-2021-44077, CVE-2021-28799 |
影響を受けるオペレーティングシステム | Windows |
Unit 42の関連トピック | TiltedTemple, APT, backdoors |
目次
TiltedTempleキャンペーンの背景
米国の防衛産業を狙うSockDetour
侵害された家庭用/SOHO用NASサーバーにホストされるSockDetour
SockDetourの分析
クライアント認証とC2通信
プラグインのロード機能
結論
保護と緩和策
IoC
TiltedTempleキャンペーンの背景
TiltedTempleというのはUnit 42がある攻撃キャンペーンに与えた名称で、その背後にいる標的型攻撃(APT)グループはさまざまな初期アクセスベクトルを使って世界中のさまざまな標的を侵害しています。私たちが公開したTiltedTempleに関する最初の報告は、侵害されたManageEngine ADSelfService PlusサーバーやManageEngine ServiceDesk Plusを介して発生した攻撃に焦点を当てたものでした。
TiltedTempleキャンペーンは、テクノロジ、エネルギー、ヘルスケア、教育、金融、防衛の各セクタの組織を侵害し、これらのセクタなどへの偵察活動を行っていました。このなかには米国の5つの州に関連するインフラも含まれていました。
TiltedTempleと関連するインフラ上でSockDetourがホストされていることを私たちは確認していますが、これが単一脅威アクターによるものか複数の脅威アクターがからんでいるのかはまだよくわかっていません。
米国の防衛産業を狙うSockDetour
TitledTempleキャンペーンは当初2021年8月に開始されたことが確認されていましたが、最近になって、2021年7月27日に、外部のFTPサーバーから米国の防衛関連企業のインターネットに接続されたWindowsサーバーに対してSockDetourが配信された証拠を発見しました。
またこのFTPサーバーにはほかにもメモリダンプツールやASPWebシェルなど脅威アクターが使用する雑多なツールがホストされていました。
これらの指標を分析・追跡した結果、少なくとも他の3社の米国の防衛関連企業が同じアクターに狙われていたことがわかりました。
侵害された家庭用/SOHO用NASサーバーにホストされるSockDetour
SockDetourをホストしていたFTPサーバーは、侵害されたQNAP(Quality Network Appliance Provider)のSOHO向けネットワーク接続型ストレージ(NAS)サーバーでした。このNASサーバーには既知の脆弱性が複数あり、そのなかにはCVE-2021-28799のリモートコード実行脆弱性も含まれています。この脆弱性は2021年4月の大規模な感染キャンペーンでさまざまなランサムウェアファミリに利用されていました。SockDetourの背後にいる脅威アクターもおそらくはこれらの脆弱性を利用してNASサーバーを侵害した可能性が高いと考えられます。実際にこのNASサーバーはすでに以前のランサムウェアキャンペーンでQLockerに感染済みでした。
SockDetourの分析
SockDetourは64ビットのPEファイル形式としてコンパイルされたカスタムバックドアです。プライマリバックドアが検出されて削除された場合のバックアップバックドアとして機能するように設計されており、TCPポート上でリッスンするサービスを実行しているWindows OS上で動作します。SockDetourは既存ネットワークソケット宛のネットワーク接続を乗っ取り、そのソケットを介してリモートの脅威アクターとの間で暗号化されたC2チャネルを確立します。このためSockDetourは接続を待ち受けるためのリスニングポートを開く必要も、リモートC2チャネルの確立のための外部ネットワーク呼び出しを行う必要もありません。結果、ホストレベルでもネットワークレベルでもバックドア検出が難しくなります。
SockDetourが既存プロセスのソケットを乗っ取るには、プロセスメモリ内にインジェクト(注入)される必要があります。このため脅威アクターはDonutフレームワークと呼ばれるオープンソースのシェルコードジェネレータでSockDetourをシェルコードに変換した後、PowerSploitメモリインジェクタでシェルコードを標的プロセスにインジェクトしました。今回発見されたサンプルにはハードコードされた標的プロセスのPIDが含まれていました。ということはこの脅威アクターは侵害サーバーからインジェクション対象のプロセスを手動で選択したということになります。
標的プロセスにインジェクトされたSockDetourは、Windows上のAPI呼び出しの利用と監視のために設計されたMicrosoft Detoursライブラリパッケージを使ってネットワークソケットを乗っ取ります。DetourAttach()関数を使い、Winsockのaccept()関数がフックされます。このフックにより、対象サービスポート宛の新たな接続が着信しWinsockのaccept()API関数が呼び出されたさい、accept()関数の呼び出しがSockDetourの定義する悪意のある迂回(detour)関数にリルートされます。
その他のC2以外のトラフィックは元のサービスプロセスに戻され、対象サービスの正常動作に支障を生じないようにします。
このような実装をされているSockDetourは侵害されたWindowsサーバー上でファイルレスかつソケットレスで動作できます。また防御側がプライマリバックドアを検出・削除した場合のバックアップバックドアとしても機能します。
クライアント認証とC2通信
SockDetourは正規サービスポートに対する接続をすべて乗っ取るので、まずは正規サービストラフィック宛の通信が混じった着信トラフィックのなかにあるC2トラフィックを検証します。その次に、そのC2接続が正しいクライアントから行われていることを確認する認証を行う必要があります。
SockDetourは以下の手順でC2接続の検証と認証を実現しています。
1. 認証用に、クライアントから137バイトのデータを受け取ることが期待されています。認証データは表1のような構造になっています。
17 03 03 | AA BB | CC DD EE FF | 128バイトのデータブロック |
TLSトラフィックを偽装するために修正されたヘッダ値 | ペイロードのデータサイズ | クライアントの認証に使用される4バイトの変数 | クライアント認証データブロック用のデータ署名 |
表1 SockDetourのクライアント認証データ構造
2. 最初の9バイトのデータを読み出します。このデータは、MSG_PEEKオプションを付けたrecv()関数を使って受信します。それにより、ソケットキューからデータを取り除き、正当なサービスのトラフィックを妨げないようにしています。
3. データが17 03 03で始まっていることを検証します。これは暗号化データが転送されるさいTLSトランザクションのレコードヘッダとしてよく見られるものです。ただしこれは通常のTLSにとっては異常です。通常、適切なTLSハンドシェイクもなしに、TLSの暗号化トランザクションが突然ふってわくことはありません。
4. ペイロードデータAA BBのサイズが251またはそれ以下であることを確認します。
5. ペイロードCC DD EE FFの4バイトが、以下の条件を満たしていることを確認します。
- 88 a0 90 82とのビット単位ANDの結果が88 a0 90 82である
- fd f5 fb efとのビット単位ORの結果がfd f5 fb efである
6. MSG_PEEKオプションを使って同じデータキューから137バイトのデータ全体を読み取り、さらに認証を行います。
7. 表2に示した24バイトのデータブロックを組み立てます。
08 1c c1 78 d4 13 3a d7 0f ab | CC DD EE FF | b3 a2 b8 ae 63 bb 03 e8 ff 3b |
SockDetour内でハードコードされた10バイト | クライアントから受け取った認証用の4バイト | SockDetour内でハードコードされた10バイト |
表2 クライアント認証のために検証される24バイトのデータブロック
8. この24バイトのデータブロックは埋め込まれた公開鍵でハッシュ化されて表1の128バイトのデータ署名と照合されます。この128バイトのデータ署名は、脅威アクターが対応する秘密鍵を使って同じ24バイトのデータブロックのハッシュに署名することにより作成したものと思われます。
これでクライアント認証の手順は完了です。認証に成功するとこのセッションがバックドア用であることが確認されたことになるので、SockDetourはMSG_PEEKオプションを付けずにrecv()関数を使ってTCPセッションを乗っ取ります。
次にSockDetourは、ハードコードされた初期ベクトル値bvyiafszmkjsmqglを使って160ビットのセッションキーを作り、以下のデータ構造でリモートクライアントに送信します。
17 03 03 | AA BB | CC DD EE FF | session_key | random_padding |
TLSトラフィックを偽装するために修正されたヘッダ値 | ペイロードのデータサイズ | セッションキー長 | 160ビットのセッションキー | ランダムなパディング |
表3 SockDetourがクライアントにセッションキーを送信
TLSなどの一般的な暗号化プロトコルでは、セッションキーを公開鍵で暗号化してから転送します。しかし今回のケースでマルウェア作成者はその手順を失念していたらしく、鍵を平文で転送しています。
これでSockDetourとリモートクライアント間でセッションキーが共有されたので、乗っ取られたソケット上でC2接続が暗号化されます。
プラグインのロード機能
バックアップのバックドアとして、SockDetourは、プラグインDLLをロードするという単一の機能のみを提供します。セッションキーの共有後、SockDetourはクライアントから4バイトのデータを受け取りますが、これはSockDetourが最終的なペイロードの配信段階で受け取るデータの長さを示しています。このサイズは5MB以下であることが想定されています。
最終的に受信されるペイロードデータは共有したセッションキーで暗号化されています。復号後の受信データは、appとargsの2つのオブジェクトを持つJSON形式であることが期待されています。appにはbase64でエンコードされたDLLが、argsにはDLLに渡す引数が入ります。SockDetourはこのプラグインDLLを新たに割り当てられたメモリ空間にロードし、次のJSON構造の関数引数を付けてThreadProcという名前のエクスポート関数を呼び出します。
1 2 3 4 5 |
{ "sock": hijacked_socket, "key": session_key, "args": arguments_received_from_client } |
プラグインのDLLサンプルは見つかりませんでしたが、上記の関数の引数から、プラグインも乗っ取られたソケットを介して通信し、セッションキーを使ってトランザクションを暗号化している可能性が高いと考えられます。そのため、SockDetourと同様、そのオペレーションのステルス性は高いものと推測されます。
結論
SockDetourは、侵害されたWindowsサーバー上で密かに動作するように設計されたバックドアで、プライマリバックドアが失われた場合のバックアップバックドアとして機能するようになっています。正規のサービスプロセスにファイルレスでロードされ、正規プロセスのネットワークソケットで、自身の暗号化C2チャネルを確立します。
改変は簡単ですが、今回分析したSockDetourサンプルのコンパイルタイムスタンプを見ると、少なくとも2019年7月以降、このPEファイルは改変されることなく利用されていた可能性が高いと考えられます。また、公開リポジトリにSockDetourの追加サンプルは見つかりませんでした。このことからこのバックドアは長い間うまく検出を逃れてきたと言えます。
プラグインDLLについてはまだわかっていませんが、SockDetourの暗号化チャネル経由で配信され、メモリ内にファイルレスでロードされ、乗っ取られたソケットを介して通信することにより、きわめてステルス性の高い動作をすることが予想されます。
なお、SockDetourをホストしているNASサーバーは一般に中小企業で使用されるタイプのものです。この事例からは、この手のサーバーの修正プログラムはリリースのつどのパッチ適用は欠かせないということがよくわかります。
保護と緩和策
Cortex XDRは、エンドポイントを保護し、メモリインジェクタを悪意のあるものとして正確に特定します。さらに、Cortex XDRには、このアクターらが採用しているラテラルムーブと認証情報窃取の戦術、技術、手順(TTP)を検出する機能があります。
クラウドベースの脅威分析サービスであるWildFireは、このキャンペーンで使用されたインジェクタを悪意のあるものとして正確に特定します。
AutoFocusをお使いのお客様は、SockDetourの活動をSockDetourタグで追跡できます。
サーバー管理者の皆様にはWindowsサーバーを常に最新の状態に保つことを推奨します。
本稿の末尾に添付したYARAルールでメモリ内のSockDetourの有無を検出できます。
SockDetourによる侵害が疑われる場合はインシデントレスポンスの調査を行う必要があります。侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、infojapan@paloaltonetworks.com まで電子メールにてご連絡ください(ご相談は弊社製品のお客様には限定されません)。
IoC
SockDetour PE
0b2b9a2ac4bff81847b332af18a8e0705075166a137ab248e4d9b5cbd8b960df
SockDetourを配信するPowerSploitメモリインジェクタ
80ed7984a42570d94cd1b6dcd89f95e3175a5c4247ac245c817928dd07fc9540
bee2fe0647d0ec9f2f0aa5f784b122aaeba0cddb39b08e3ea19dd4cdb90e53f9
a5b9ac1d0350341764f877f5c4249151981200df0769a38386f6b7c8ca6f9c7a
607a2ce7dc2252e9e582e757bbfa2f18e3f3864cb4267cd07129f4b9a241300b
11b2b719d6bffae3ab1e0f8191d70aa1bade7f599aeadb7358f722458a21b530
cd28c7a63f91a20ec4045cf40ff0f93b336565bd504c9534be857e971b4e80ee
ebe926f37e7188a6f0cc85744376cdc672e495607f85ba3cbee6980049951889
3ea2bf2a6b039071b890f03b5987d9135fe4c036fb77f477f1820c34b341644e
7e9cf2a2dd3edac92175a3eb1355c0f5f05f47b7798e206b470637c5303ac79f
bb48438e2ed47ab692d1754305df664cda6c518754ef9a58fb5fa8545f5bfb9b
SocketDetourに埋め込まれた公開鍵
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWD9BUhQQZkagIIHsCdn/wtRNXcYoEi3Z4PhZkH3mar20EONVyXWP/YUxyUmxD+aTOVp3NB+XYOO9LqQEAWgyGndXyyuDssLWTb7z54n8iDu2pqiAEvJ6h18iwf0EwZ1BzPBDS1Kw+JE4tYIR860rD1DBul0u6OURqMPb5eZT1bQIDAQAB-----END PUBLIC KEY-----
メモリ内のSockDetourを検出するためのYARAルール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
rule apt_win_sockdetour { meta: author = "Unit 42 - PaloAltoNetworks" date = "2022-01-23" description = "Detects SockDetour in memory or in PE format" hash01 = "0b2b9a2ac4bff81847b332af18a8e0705075166a137ab248e4d9b5cbd8b960df" strings: $public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWD9BUhQQZkagIIHsCdn/wtRNXcYoEi3Z4PhZkH3mar20EONVyXWP/YUxyUmxD+aTOVp3NB+XYOO9LqQEAWgyGndXyyuDssLWTb7z54n8iDu2pqiAEvJ6h18iwf0EwZ1BzPBDS1Kw+JE4tYIR860rD1DBul0u6OURqMPb5eZT1bQIDAQAB" $json_name_sequence = {61 70 70 00 61 72 67 73 00 00 00 00 73 6F 63 6B 00 00 00 00 6B 65 79 00 61 72 67 73 00 00} $verification_bytes = {88 [4] A0 [4] 90 [4] 82 [4] FD [4] F5 [4] FB [4] EF} $data_block = {08 [4] 1C [4] C1 [4] 78 [4] D4 [4] 13 [4] 3A [4] D7 [4] 0F [4] AB [4] B3 [4] A2 [4] B8 [4] AE [4] 63 [4] BB [4] 03 [4] E8 [4] FF [4] 3B} $initial_vector = {62 [4] 76 [4] 79 [4] 69 [4] 61 [4] 66 [4] 73 [4] 7A [4] 6D [4] 6B [4] 6A [4] 73 [4] 6D [4] 71 [4] 67 [4] 6C} condition: any of them } |