セキュリティ
Sleepwalker: 独自のコマンド言語を持つパッシブバックドア
Sleepwalker: Passive Backdoor with Its Own Command Language (r136a1.dev)
要約
この記事では、「Sleepwalker」と呼ばれる新しいパッシブバックドアについて解説しています。このマルウェアは、独自のコマンド言語で記述されたネットワークパケットを受信するまでメモリ上で待機し、アクティブになりません。ESET Management Agentの正規DLL(dpapi.dll)になりすまし、DLLサイドローディングによってシステムに侵入します。
全文翻訳
今年の初めにVirusTotal Intelligenceへのアクセスを失ったことは、驚くほど生産的でした。興味深い新しいマルウェアを検索できなくなったため、「TODO」リストに追加するのをやめ、昨年のバックログをようやく消化しました。これにより、BeheMOFの詳細な調査と、このマルウェアの発見につながりました。
さらに詳しく調べると、最初はそれほど注目に値しないように見えたサンプルが、内部を覗いてみると独特のデザインを持っていることが判明しました。それは、明らかなリスニングポートを開かず、ペイロード自体を含まないパッシブバックドアです。特定のネットワークパケットがマシンに到達するまでメモリ内で何もせずに待機しており、そのためSLEEPWALKERと名付けました。
これを記事にする価値があるのは、そのパケットが運ぶもの、つまり読み取り可能なコマンドではなく、バックドア独自のコマンド言語で書かれた短いプログラムです。その23の命令は、スケジューリング、いくつかのデータ移動方法、ステージングされたファイル配信、およびメモリ内でのコード直接実行をカバーしています。暗号化キーを復旧するだけでは、これらのプログラムの1つを理解するには不十分です。バックドアの内部コマンド言語もリバースエンジニアリングする必要があります。
リバースエンジニアリングの観点から見ると、SLEEPWALKERはクールなデザインを持っています。それでも、実装にはいくつかの弱点があり、トップクラスのマルウェアエンジニアリングではありません。これは初期バージョンである可能性がありますが、より新しく改良されたビルドが存在するかもしれません。
この記事では、ファイル自体が明らかにするもの、SLEEPWALKERがどのようにロードされるか、どのように起動するか、ネットワーク上でどのように隠れているか、コマンドがどのように保護されているか、そして内部コマンド言語がどのように機能するかをカバーします。最後の部分は、バックドアが実際に何ができるかの大部分を説明しているため、そこに時間をかけます。IOCセクションと、YARAルールおよび読み取り専用スキャナースクリプトを含む付録で締めくくります。
エグゼクティブサマリー
SLEEPWALKERは、独自のコマンド言語を持つパッシブバックドアです。固定のC2アドレスに連絡することはありません。代わりに、隠されたトリガーパケットを検出するためにネットワークをスニッフィングします。その後初めて、攻撃者が提供したタスクプログラムを復号して実行するために起動します。プログラムは、このファイルだけが解釈方法を知っているバイトコードとして到着し、読み取り可能なコマンドとしては到着しません。
それを運ぶファイルは64ビットのWindows DLLであり、Microsoftのdpapi.dllを偽装し、偽造されたESET Management Agentのバージョンリソースを持っています。これは、ESET Management AgentのWindows実行ファイルであるERAAgent.exeにサイドロードされるように設計されています。ESETは、このエージェントをESET PROTECTおよびESET PROTECT On-Premの不可欠なコンポーネントとして説明しており、管理対象のエンドポイントとサーバーを管理プラットフォームに接続し、ポリシーをローカルに保存および適用します。SLEEPWALKERは、ホストプロセスの名前のみをチェックし、その署名やパスはチェックしません。その名前がERAAgent.exeでない限り、非アクティブなままです。
バックドアのライフサイクルの全体像:
図1: サイドローディングから実行までのパス:一致するパケットが到着するまで何も実行されません。
ファイルに組み込まれた設定は、AES-256-CCMと検証済みの認証タグを使用して復号され、単一のブートストラップコマンドになります。それは無期限にすべてのネットワークインターフェイスを監視してトリガーを待ちます。それ自体では、ファイルは何もしません。バックドアは、スケジューリング、SHA-256検証付きのステージングされたペイロード配信、およびメモリ内シェルコード実行をカバーする23の命令を持つコンパクトなバイトコードインタプリタを搭載しています。そのネットワーク機能には、TCP、UDP、ICMP、SMB名前付きパイプ(提供された資格情報を使用したラテラルムーブメントを含む)、ゲストとホスト間のVMwareの内部VMCIチャネル、およびRAWソケットのプロミスキャススニッフィングが含まれます。2番目のトリガーチャネルは、DNSクエリでコマンドを運ぶこともできます。
認証されていない名前付きパイプアクセスを容易にするために、SLEEPWALKERはホストを積極的に弱体化させます。匿名SMBアクセスを有効にし、EveryoneおよびAnonymous Logonに権限を付与した名前付きパイプを作成します。すべての暗号化は、実行時にロードされるものに依存するのではなく、静的にリンクされたmbedTLS(オープンソース暗号ライブラリ)のコピーによって提供されます。
この組み合わせにより、SLEEPWALKERはネットワーク側から検出するのが困難になります。オペレーターがその1つの細工されたパケットを送信するまでブロックするものは何もありません。そして、それは完全に通常のトラフィック内、細工されたDNSクエリを含むものとして到着することができます。
VMCIを含む複数の隠されたトランスポートを使用し、信頼されたESET管理コンポーネントへのサイドローディングを通じて展開される、このようにトリガーされるパッシブインプラントは、他の未確認のコンポーネントも含む標的型攻撃の一部である可能性が最も高いです。コードは過去に見たものとは異なるため、このマルウェアを特定の攻撃者に帰属させることはできません。
主なポイント
ファイルは署名されておらず、ESETのファイル情報をコピーし、DLLサイドローディングを通じてロードされます。ホストプロセスの名前のみをチェックし、その名前がESET Management AgentのWindows実行ファイルであるERAAgent.exeの場合にアクティブになります。それ自体ではサーバーに連絡しません。何かを実行する前に、特定の暗号化されたネットワークパケットを待ちます。トリガーされると、スケジューリング、複数のネットワークメソッド、ステージングされたファイル配信、およびメモリ内でのコード直接実行をサポートする、小さなカスタムコマンド言語で書かれたプログラムを実行します。ファイル自体には、既製の悪意のあるペイロードは含まれていません。最初の命令以外のすべては、後でネットワーク経由で到着する必要があります。ローカルのWindows設定を変更して、認証されていないネットワーク接続がそれに到達できるようにします。
ファイルの特徴
サンプルは、Windows GUIサブシステムの署名されていない64ビットDLLです。サイズは59,904バイトで、コンパイルタイムスタンプは2024-06-10 09:18:27 UTCです。
SHA-256: d347170752a28e2b8c4b8b9f3cab2e3a6541ba11682c94498d26eb9002779d60
SHA-1: 2ec8aa9661a33bccc002150ce1ed02d90c3986ff
MD5: 2318327b29bb1c0e2d2b5f0211fc7fac
Imphash: 4e2dbfa7e3efd4cca2f3662797df9735
偽装のため、ファイルはESETの実際のManagement Agentからコピーされたバージョンリソースを搭載しています。
フィールド 値
CompanyName ESET
ProductName ESET Management Agent
FileDescription ESET Management Agent Module
InternalName ERAAgent
OriginalFilename dpapi.dll
File / Product version 11.2.2076.0
LegalCopyright Copyright (c) ESET, spol. s r.o. 1992-2024.
ファイルは、実際のdpapi.dllと同じ名前と7つの関数をエクスポートします。
CryptProtectDataNoUI, CryptProtectMemory, CryptResetMachineCredentials, CryptUnprotectDataNoUI, CryptUnprotectMemory, CryptUpdateProtectedState, iCryptIdentifyProtection
それらのそれぞれは、ポインタテーブルを介してジャンプする小さなスタブであり、そのテーブルは最初は空です。
これらの7つの関数のいずれかが初めて呼び出されると、共有リゾルバはLoadLibraryWを使用してdpapisvc.dllという名前のファイルをロードしようとし、その中の実際の関数を見つけて、そのアドレスをポインタテーブルに書き込み、呼び出しを転送できるようにします。
その名前は、正規のWindowsコンポーネントのいずれにも属しません。dpapisvc.dllという名前のファイルはWindowsに同梱されていません。最も近い実際の名前はdpapisrv.dllですが、これは2つのLSA拡張関数のみをエクスポートする無関係なファイルであり、このコードが探している7つとは異なります。
dpapi.dll自体への単純な参照は機能しなかったでしょう。なぜなら、悪意のあるファイルはすでにホストプロセス内でその名前を占有しており、それに対するbareなLoadLibraryW呼び出しは、実際のものに到達するのではなく、それ自体のハンドルを返すからです。他の名前またはパスが必要でしたが、実際に使用されているものは、実際のシステム上のどの名前とも一致しません。
ロードが失敗した場合、リゾルバは単一の呼び出しを単独で失敗させるのではなく、ホストプロセス全体を終了します。
これが実際に発生するかどうかは、このファイルだけでは示せない、これらの7つの特定の関数のいずれかが実際に呼び出されるかどうかにかかっています。
攻撃のより完全なバージョンが、この名前でリネームされた実際のdpapi.dllのコピーを一緒にドロップする可能性があります。なぜなら、アプリケーション自体のフォルダ内のファイルは、WindowsがSystem32をチェックする前に見つかるからです。これは、このバックドアが最初にロードされるために依存しているのと同じ検索順序です。ただし、このファイル自体にはそのようなコピーは含まれておらず、ここにあるものは何もその存在を確認していません。
同じ最初の呼び出しは、バックドア自体の起動チェックも静かに再実行します。gi