悪質な活動を続けているスパイ集団「Turla(トゥールラ)」がPowerShellを利用してインメモリのみでマルウェアを実行するという新たなTTP(戦術、手法、手順)について、ESETのリサーチャーが分析しました。
本記事はESET Japanが提供する「ESETブログ」に掲載された「TurlaによるPowerShellの使用を徹底解説」を再編集したものです。
Turla(別名Snake)は、複雑なマルウェアを使用することで知られる悪名高いスパイグループです。Turlaのオペレーターは最近、検出機能を混乱させる目的で、マルウェアの実行ファイルとライブラリを直接インメモリロードして実行するPowerShellスクリプトを使用し始めました。これにより、悪意のある実行ファイルがディスクにドロップされるとトリガーとなる検出を回避できるようになりました。
Turlaの活動は、少なくとも米軍のコンピュータに侵入した2008年から続いていると考えられています。最近では、ドイツ外務省とフランス軍に対する大規模な攻撃にも関与していました。
セキュリティ製品を回避するチャンスを高めるために、TurlaがPowerShellのインメモリローダーを使用するのは今回が初めてではありません。2018年、Kaspersky LabsはオープンソースプロジェクトPosh-SecModをベースに作成されたTurla PowerShellローダーを分析し、レポートを発表しました。当時のスクリプトにはバグが多く、しばしばクラッシュを引き起こしていました。
数カ月後、Turlaはこれらのスクリプトを改良し、現在では従来の「武器庫」からさまざまなカスタムマルウェアをロードするために使用しています。
Turlaは一般的なターゲットを狙います。ESETでは、これらのスクリプトを使用してハッキングされた東欧の外交機関をいくつか特定しました。ただし、西欧および中東の数多くの従来型ターゲットに対して、同じスクリプトが以前よりもグローバルに使用されている可能性があります。そこで、防御側の企業・組織がこれらのPowerShellスクリプトに対抗できるように支援することを目的に、本ブログ記事をお届けします。RPCベースのバックドアやOneDriveをC&Cサーバーとして利用するバックドアなど、さまざまなペイロードについても解説します。
PowerShellローダー
PowerShellローダーの主な手順は、常駐化、復号化、そして埋め込み実行ファイル/ライブラリのメモリへのロード、の3つです。
常駐化
PowerShellスクリプトは単純なドロッパーではありません。埋め込まれた実行ファイルのみをメモリに定期的にロードして、システム上に常駐します。Turlaオペレーターは次の2つの方法で常駐化することが確認されています。
- Windows Management Instrumentation(WMI)イベントサブスクリプション
- PowerShellプロファイル(profile.ps1ファイル)の改ざん
Windows Management Instrumentation
前者の場合、攻撃者は2つのWMIイベントフィルタと2つのWMIイベントコンシューマを作成します。コンシューマは単純なコマンドラインで、Windowsレジストリに格納されている大規模なPowerShellスクリプトをロードするBase64エンコードされたPowerShellコマンドを起動します。図1は、常駐化を確実にするための方法を示しています。
これらのイベントは、それぞれ15:30:40およびシステムアップタイムが300~400秒の間に実行されます。変数$HL39fjhには、Base64エンコードされたPowerShellコマンドが含まれています(図2参照)。このコマンドは、暗号化されたペイロードが格納されているWindowsレジストリキーを読み取り、ペイロードの復号化に必要なパスワードとソルトを含みます。
最後に、このスクリプトは暗号化されたペイロードをWindowsレジストリに保存します。攻撃者は組織ごとに異なるレジストリの場所を使用しているようです。したがって、類似した侵入を検出する指標としては有用ではありません。
Profile.ps1
前者の場合、攻撃者はPowerShellプロファイルを改ざんします。Microsoftのドキュメントには、次のように書かれています。
PowerShellプロファイルは、PowerShellの起動時に実行されるスクリプトです。 プロファイルをログオンスクリプトとして使用すれば、環境をカスタマイズできます。コマンド、エイリアス、関数、変数、スナップイン、モジュール、およびPowerShell ドライブを追加できます。
図3は、Turlaによって改ざんされたPowerShellプロファイルを示しています。
Base64でエンコードされたPowerShellコマンドは、WMIコンシューマで使用されているものと非常によく似ています。
復号化
Windowsレジストリに格納されているペイロードは、もう1つのPowerShellスクリプトです。これは、侵入テストフレームワークPowerSploitのオープンソーススクリプトOut-EncryptedScript.ps1を使用して生成されています。さらに、変数名はスクリプトを難読化するためにランダム化されます(図4参照)。
ペイロードの復号化には3DESアルゴリズムが使用されます。この例では初期化ベクトルはPINGQXOMQFTZGDZXですが、初期化ベクトルはサンプルごとに異なります。キーおよびソルトもスクリプトごとに異なり、スクリプトには保存されずにWMIフィルタまたはprofile.ps1ファイルにのみ保存されます。
PEローダー
前の手順で復号化されたペイロードは、PowerShellリフレクティブローダーです。これは、同じPowerSploitフレームワークのスクリプトInvoke-ReflectivePEInjection.ps1がベースになっています。実行ファイルはスクリプトにハードコードされており、システム上ですでに実行されているランダムに選択されたプロセスのメモリに直接ロードされます。
一部のサンプルでは、攻撃者はバイナリを挿入するべきではない実行ファイルのリストを指定しています(図5参照)。
avp.exe、avpsus.exe、klnagent.exe、およびvapm.exeという名前は、Kaspersky Labsの実行ファイルを指している点に注意してください。Turlaのオペレーターは、何が何でも自分のマルウェアをKasperskyソフトウェアには挿入したくないようです。
AMSIのバイパス
2019年3月以降に展開されたいくつかのサンプルで、Turlaの開発者はAntimalware Scan Interface (AMSI)を迂回する目的でPowerShellスクリプトを修正していました。AMSIは、あらゆるWindowsアプリケーションとインストール済みマルウェア対策製品との統合を可能にするインタフェースです。特にPowerShellとマクロにとって有用です。
Turlaの開発者は新しいバイパスを見つけることはできませんでしたが、「The Rise and Fall of AMSI」(AMSIの栄枯盛衰)と題したBlack Hat Asia 2018での講演で発表された手法を再利用しました。これは、ライブラリ amsi.dll内の関数AmsiScanBufferの先頭のインメモリパッチで構成されています。
PowerShellスクリプトは、AmsiScanBufferのアドレスを取得するための.NET実行ファイルをロードします。その後、VirtualProtectを呼び出して、取得したアドレスへの書き込みを許可します。
最後に、PowerShellスクリプトでパッチが直接実行されます(図6参照)。常に1(AMSI_RESULT_NOT_DETECTED)を返すようにAmsiScanBufferの先頭を改ざんします。結果、マルウェア対策製品はバッファを受信しないため、すべてのスキャンが回避されます。
ペイロード
上記のPowerShellスクリプトは、RPCバックドアやPowerShellバックドアなど、さまざまなペイロードをロードするために使用される汎用コンポーネントです。
RPCバックドア
Turlaは、RPCプロトコルに依存する一連のバックドアを開発しました。これらのバックドアは、外部のC&Cサーバーに依存することなく、ラテラルムーブメント(侵入後の感染拡大)を実行し、ローカルネットワーク内の他のマシンを制御するために使用されます。
ファイルのアップロード、ファイルのダウンロード、cmd.exeまたはPowerShellによるコマンドの実行など、実装される機能は非常に基本的なものです。ただし、このマルウェアはプラグインの追加もサポートしています。
このRPCバックドアは、サーバーとクライアントという2つのコンポーネントに分割されます。図7で要約しているとおり、オペレーターはクライアントコンポーネントを使用して、サーバーコンポーネントが存在する別のマシンでコマンドを実行します。
たとえば、次のSHA-1ハッシュEC54EF8D79BF30B63C5249AF7A8A3C652595B923によって識別されるサンプルはクライアントバージョンです。このコンポーネントは、RpcStringBindingComposeW関数を介して、名前付きパイプ\\pipe\\atctlをプロトコルシーケンス「ncacn_np」で開きます。次に、このサンプルはNdrClientCall2関数を呼び出すことでコマンドを送信します。引数の解析を担当するエクスポートされたプロシージャHandlerWを見ると、匿名トークンを装ったり、コマンドの実行のためだけに他のプロセストークンを窃取しようとしたりする可能性があることがわかります。
これに対応するサーバーは、手間のかかる処理を実行し、さまざまなコマンドを実装します。まず、レジストリキーの値HKLM\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters\NullSessionPipesに「atctl」が含まれているかどうかを確認します。
含まれている場合、サーバーはパイプオブジェクト上のセキュリティ記述子を、SetSecurityInfo関数を介して「S:(ML;;NW;;;S-1-16-0)」に設定します。これにより、誰でもパイプを利用できるようになります(整合性レベル:信頼できない/匿名)。
次の画像は、対応するMIDLスタブ記述子、および類似した構文とインタフェースIDを示しています。
前述したように、このバックドアはプラグインのロードもサポートしています。サーバーは、パターン「lPH*.dll」に一致するファイルを検索するスレッドを作成します。該当するファイルが存在する場合、そのファイルがロードされ、エクスポート関数ModuleStartが呼び出されます。ESETがこれまで発見したさまざまなプラグインの中で、あるプラグインは最近のファイルやUSBメモリに保存されているファイルを盗むことができます。
このRPCバックドアの多くの変種が実環境で使用されています。その中には、ローカルプロキシ(エンドポイントとしてupnprpcを、プロトコルシーケンスとしてncalrpcを使用)と、powershell.exeを使用せずに直接スクリプトを実行するためのPowerShellRunnerを組み込んだ新しいバージョンがあります。
RPC偽装サーバー
ESETは調査の過程で、以下のPDBパスが埋め込まれたPortable Executableファイルも発見しました。 C:\Users\Devel\source\repos\RPCSpoofer\x64\Release_Win2016_10\RPCSpoofServerInstall.pdb(SHA-1: 9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57)
このユーティリティの主な目的は、インタフェースを登録したプロセスのRPC構成を取得することです。その種類のプロセスを発見するため、特定のポートを開いたプロセスのPIDを見つけるまで、あるいは特定の名前付きパイプを開いたプロセスのPIDを取得するまで、TCPテーブルを(GetTcpTable2関数を介して)繰り返し処理します。PIDが見つかると、このユーティリティはリモートプロセスのメモリを読み取り、登録されているRPCインタフェースを取得しようとします。当該部分のコード(図9参照)は、こちらのGithubリポジトリから切り取られたもののようです。
当初、取得した情報がどのように使用されていたのかが不明でしたが、別のサンプル(SHA-1:B948E25D061039D64115CFDE74D2FF4372E83765)のおかげで判明しました。図10に示すように、このサンプルはRPCインタフェースを取得し、フラグの設定を解除してRPC_IF_ALLOW_SECURE_ONLYにし、WriteProcessMemory関数を使用してメモリ内の「ディスパッチテーブル」にパッチを適用します。これらの操作により、このサンプルは既存のRPCインタフェースにRPC関数を追加できます。カスタムインタフェースを作成するよりも既存のRPCインタフェースを再利用する方がステルス性は高いと判断されます。
PowerStallion
PowerStallionは、クラウドのストレージサービスであるMicrosoft OneDriveをC&Cサーバーとして使用する軽量なPowerShellバックドアです。認証情報はスクリプトの先頭にハードコードされています(図11参照)。
Outlook BackdoorやLightNeuronのように、Turlaのオペレーターが再び無料の電子メールプロバイダーGMXを使用したのは興味深い点です。Turlaのオペレーターはまた、電子メールアドレスにターゲット組織の実際の従業員の名前を使用していました。
続いて、net useコマンドを使用してネットワークドライブに接続します。次に、コマンドが使用可能かどうかをループでチェックします(図12参照)。このバックドアが実行できるのは、追加のPowerShellスクリプトのみです。コマンドの結果を別のOneDriveサブフォルダーに書き込んだ後、XORキー0xAAを使用して暗号化します。
もう1つの興味深いアーチファクトは、このスクリプトが正規のファイル(この例ではdesktop.ini)の時間と一致させるために、ローカルログファイルのMAC(変更、アクセス、作成)時間を改ざんしていることです(図13参照)。
このバックドアは、CarbonやGazerなどのTurlaの主要なバックドアが駆除され、オペレーターが侵入先のコンピュータにアクセスできなくなった場合に使用される、リカバリアクセスツールであると考えられます。オペレーターがこのバックドアを次の目的で使用していることはすでに確認されています。
- マルウェア対策製品のログの監視
- Windowsプロセスリストの監視
- Turlaの第2段階バックドアの1つであるComRATバージョン4のインストール
結論
ESETは2018年のブログで、Turlaはますます汎用ツールを使用するようになると予測しました。今回の調査で、ESETの予測が正しかったことが確認されただけでなく、Turlaグループは侵入を成功させるためにはオープンソースの侵入テストフレームワークを躊躇なく使用することが明らかになりました。
しかし、オープンソースを使用しているからといって、攻撃元がTurlaであると特定できなくなる訳ではありません。攻撃者は、こうしたオープンソースツールを自分のニーズに合わせて構成または変更する傾向にあります。つまり、アクティビティをクラスターに分離することは依然可能です。
最後に、オープンソースツールを使用してはいても、Turlaが独自のカスタムツールを使用しなくなった訳ではありません。PowerShellスクリプト、RPCバックドア、およびPowerStallionによって提供されるペイロードは、実際のところ高度にカスタマイズされています。最近ESETが行ったTurla LightNeuronの分析結果も、Turlaグループが引き続き複雑なカスタムマルウェアを開発していることを裏付けています。
IoC(セキュリティ侵害の痕跡情報)
ハッシュ
SHA-1 | 説明 | ESETの検出名 |
---|---|---|
50C0BF9479EFC93FA9CF1AA99BDCA923273B71A1 | ペイロードが暗号化されたPowerShellローダー | PowerShell/Turla.T |
EC54EF8D79BF30B63C5249AF7A8A3C652595B923 | RPCバックドア(クライアント) | Win64/Turla.BQ |
9CDF6D5878FC3AECF10761FD72371A2877F270D0 | RPCバックドア(サーバー) | Win64/Turla.BQ |
D3DF3F32716042404798E3E9D691ACED2F78BDD5 | ファイルを持ち出すRPCプラグイン | Win32/Turla.BZ |
9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57 | RPC偽装サーバーのインストーラ | Win64/Turla.BS |
B948E25D061039D64115CFDE74D2FF4372E83765 | RPCインタフェースパッチャー | Win64/Turla.BR |
ファイル名
- RPCコンポーネント
- o %PUBLIC%\iCore.dat(ログファイル、1バイト XOR 0x55)
- o \\pipe\\atctl(名前付きパイプ)
- PowerStallion
- o msctx.ps1
- o C:\Users\Public\Documents\desktop.db
レジストリキー
- RPCコンポーネント
- o HKLM\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters\NullSessionPipes には atctl が含まれる
MITRE ATT&CK
戦術 | ID | 名称 | 説明 |
---|---|---|---|
実行 | T1086 | PowerShell | ローダーはPowerShellで記述されています。 一部のRPCコンポーネントはPowerShellコマンドを実行できます。 |
常駐化 | T1084 | Windows Management Instrumentationイベントサブスクリプション | PowerShellローダーは常駐化のためにWMIを使用します。 |
防御の回避 | T1027 | ファイルまたは情報の難読化 | RPCバックドアとPowerStallionがログファイルを暗号化します。 |
T1140 | ファイルまたは情報の難読化解除/復号化 | PowerShellローダーが埋め込まれたペイロードを復号化します。 | |
T1055 | プロセスインジェクション | PowerShellローダーがペイロードをリモートプロセスに挿入します。 | |
T1099 | タイムストンプ | PowerStallionがログファイルのタイムスタンプを改ざんします。 | |
検出 | T1083 | ファイルとディレクトリの検出 | RPCプラグインがファイルとディレクトリの情報を収集します。 |
T1120 | 周辺機器の検出 | RPCプラグインがUSBドライブを監視します。 | |
T1012 | クエリレジストリ | RPCバックドアのサーバーコンポーネントがNullSessionPipesのレジストリを照会します。 | |
T1057 | プロセスの検出 | PowerStallionが実行中プロセスのリストを送信します。 | |
収集 | T1005 | ローカルシステムからのデータ | RPCプラグインがローカルファイルシステムから最近のファイルを収集します。 |
T1025 | リムーバブルメディアからのデータ | RPCプラグインがUSBドライブのファイルを収集します。 | |
C&C | T1071 | 標準のアプリケーションレイヤプロトコル | RPCバックドアがRPCを使用し、PowerStallionがSMB経由でOneDriveを使用します。 |
持ち出し | T1041 | C&Cチャネルを介したデータ持ち出し | PowerStallionがC&Cチャンネルを介して情報を持ち出します。 |