ESET/マルウェア情報局

スパイグループ「Turla」のPowerShell使用方法を分析

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はキヤノンマーケティングジャパンが提供する「マルウェア情報局」に掲載された「【徹底解説】スパイグループ「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は、常駐化を確実にするための方法を示しています。

図1 WMIを使用した常駐化

 これらのイベントは、それぞれ15:30:40およびシステムアップタイムが300〜400秒の間に実行されます。変数$HL39fjhには、Base64エンコードされたPowerShellコマンドが含まれています(図2参照)。このコマンドは、暗号化されたペイロードが格納されているWindowsレジストリキーを読み取り、ペイロードの復号化に必要なパスワードとソルトを含みます。

図2 WMIコンシューマのPowerShellコマンド

 最後に、このスクリプトは暗号化されたペイロードをWindowsレジストリに保存します。攻撃者は組織ごとに異なるレジストリの場所を使用しているようです。したがって、類似した侵入を検出する指標としては有用ではありません。

Profile.ps1

 前者の場合、攻撃者はPowerShellプロファイルを改ざんします。Microsoftのドキュメントには、次のように書かれています。

 PowerShellプロファイルは、PowerShellの起動時に実行されるスクリプトです。プロファイルをログオンスクリプトとして使用すれば、環境をカスタマイズできます。コマンド、エイリアス、関数、変数、スナップイン、モジュール、およびPowerShell ドライブを追加できます。

 図3は、Turlaによって改ざんされたPowerShellプロファイルを示しています。

図3 乗っ取られたprofile.ps1ファイル

 Base64でエンコードされたPowerShellコマンドは、WMIコンシューマで使用されているものと非常によく似ています。

復号化

 Windowsレジストリに格納されているペイロードは、もう1つのPowerShellスクリプトです。これは、侵入テストフレームワークPowerSploitのオープンソーススクリプトOut-EncryptedScript.ps1を使用して生成されています。さらに、変数名はスクリプトを難読化するためにランダム化されます(図4参照)。

図4 復号化ルーチン

 ペイロードの復号化には3DESアルゴリズムが使用されます。この例では初期化ベクトルはPINGQXOMQFTZGDZXですが、初期化ベクトルはサンプルごとに異なります。キーおよびソルトもスクリプトごとに異なり、スクリプトには保存されずにWMIフィルタまたはprofile.ps1ファイルにのみ保存されます。

PEローダー

 前の手順で復号化されたペイロードは、PowerShellリフレクティブローダーです。これは、同じPowerSploitフレームワークのスクリプトInvoke-ReflectivePEInjection.ps1がベースになっています。実行ファイルはスクリプトにハードコードされており、システム上ですでに実行されているランダムに選択されたプロセスのメモリに直接ロードされます。

 一部のサンプルでは、攻撃者はバイナリを挿入するべきではない実行ファイルのリストを指定しています(図5参照)。

図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の先頭を改ざんします。結果、マルウェア対策製品はバッファを受信しないため、すべてのスキャンが回避されます。

図6 AmsiScanBuffer関数のパッチ

ペイロード

 上記のPowerShellスクリプトは、RPCバックドアやPowerShellバックドアなど、さまざまなペイロードをロードするために使用される汎用コンポーネントです。

RPCバックドア

 Turlaは、RPCプロトコルに依存する一連のバックドアを開発しました。これらのバックドアは、外部のC&Cサーバーに依存することなく、ラテラルムーブメント(侵入後の感染拡大)を実行し、ローカルネットワーク内の他のマシンを制御するために使用されます。

 ファイルのアップロード、ファイルのダウンロード、cmd.exeまたはPowerShellによるコマンドの実行など、実装される機能は非常に基本的なものです。ただし、このマルウェアはプラグインの追加もサポートしています。

 このRPCバックドアは、サーバーとクライアントという2つのコンポーネントに分割されます。図7で要約しているとおり、オペレーターはクライアントコンポーネントを使用して、サーバーコンポーネントが存在する別のマシンでコマンドを実行します。

図7 RPCバックドアの使用法

 たとえば、次の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を示しています。

図8 RPCバックドアクライアントのMIDL(左側)とサーバーのMIDL(右側)

 前述したように、このバックドアはプラグインのロードもサポートしています。サーバーは、パターン「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リポジトリから切り取られたもののようです。

図9 リモートプロセスでrpcrt4.dllの .dataセクションを検索するコードスニペット(Hex-Raysのスクリーンショット)

 当初、取得した情報がどのように使用されていたのかが不明でしたが、別のサンプル(SHA-1:B948E25D061039D64115CFDE74D2FF4372E83765)のおかげで判明しました。図10に示すように、このサンプルはRPCインタフェースを取得し、フラグの設定を解除してRPC_IF_ALLOW_SECURE_ONLYにし、WriteProcessMemory関数を使用してメモリ内の「ディスパッチテーブル」にパッチを適用します。これらの操作により、このサンプルは既存のRPCインタフェースにRPC関数を追加できます。カスタムインタフェースを作成するよりも既存のRPCインタフェースを再利用する方がステルス性は高いと判断されます。

図10 現在のプロセスのRPCディスパッチテーブルを取得するコードスニペット(Hex-Raysのスクリーンショット)

PowerStallion

 PowerStallionは、クラウドのストレージサービスであるMicrosoft OneDriveをC&Cサーバーとして使用する軽量なPowerShellバックドアです。認証情報はスクリプトの先頭にハードコードされています(図11参照)。

図11 PowerStallionスクリプトの中のOneDriveの認証情報

 Outlook BackdoorLightNeuronのように、Turlaのオペレーターが再び無料の電子メールプロバイダーGMXを使用したのは興味深い点です。Turlaのオペレーターはまた、電子メールアドレスにターゲット組織の実際の従業員の名前を使用していました。

 続いて、net useコマンドを使用してネットワークドライブに接続します。次に、コマンドが使用可能かどうかをループでチェックします(図12参照)。このバックドアが実行できるのは、追加のPowerShellスクリプトのみです。コマンドの結果を別のOneDriveサブフォルダーに書き込んだ後、XORキー0xAAを使用して暗号化します。

図12 PowerStallionバックドアのメインループ

 もう1つの興味深いアーチファクトは、このスクリプトが正規のファイル(この例ではdesktop.ini)の時間と一致させるために、ローカルログファイルのMAC(変更、アクセス、作成)時間を改ざんしていることです(図13参照)。

図13 ローカルログファイルのMAC時間の改ざん

 このバックドアは、CarbonGazerなどの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チャンネルを介して情報を持ち出します。