
ScareCrow - EDRバイパスを中心に設計されたペイロード作成フレームワーク。
最新バージョンのScareCrowを表示するか、問題を報告するには、https://github.com/Tylous/ScareCrow を参照してください。
このフレームワークで使用されている技術について詳しく知りたい場合は、Part 1 と Part 2 をご覧ください。
ScareCrowは、正当なWindowsプロセスにサイドローディング(インジェクションではなく)を行い(アプリケーションホワイトリスト制御をバイパスする)ペイロード作成フレームワークです。DLLローダーがメモリに読み込まれると、プロセスのメモリ内で実行中のシステムDLLからEDRのフックを除去する技術を利用します。これは、EDRのフックがプロセス生成時に配置されることを利用しています。
ScareCrowは、VirtualProtect API関数を使用して、プロセスのメモリ領域のアクセス許可を別の値、具体的にはExecute-ReadからRead-Write-Executeに変更することで、これらのDLLをメモリ上で操作できます。
ScareCrowは、フックを解除するために2つの方法のうち1つを使用します。
実行されると、ScareCrowは C:\Windows\System32\ にあるシステムDLLのディスク上のバイトをコピーします。これらのDLLは、新しいプロセスが生成されるときに変更されていないコピーをロードするためにシステムによって使用されるため、EDRのフックがかかっていない「クリーンな」状態でディスクに保存されています。EDRはこれらのプロセスをメモリ上でのみフックするため、それらは変更されていません。ScareCrowはDLLファイル全体をコピーするのではなく、DLLの.textセクションのみに焦点を当てます。DLLのこのセクションには実行可能なアセンブリが含まれており、これにより、ファイル全体を再読み取りするとEDRがシステムリソースの変更を検出する可能性があるため、ScareCrowは検出の可能性を低減します。データは、各関数のオフセットを使用して適切なメモリ領域にコピーされます。各関数には、ベースアドレスからの正確なバイト数を示すオフセットがあり、スタック上での関数の位置を提供します。
これを行うために、ScareCrowはVirtualProtectを使用して.textメモリ領域のアクセス許可を変更します。これはシステムDLLですが、制御可能なプロセスにロードされているため、昇格された特権を必要とせずにメモリ許可を変更できます。
ScareCrowは、まずシェルコードを復号化してメモリにロードします。このシェルコードは、以下で説明する3つの暗号化方法のいずれかで暗号化されています。復号化されてロードされると、シェルコードが実行されます。指定されたローダーオプションに応じて、ScareCrowはDLLに対して異なるエクスポート関数を設定します。ロードされたDLLには、すべてのDLLが通常動作するために必要とされる標準のDLLMain関数も含まれていません。ただし、DLLは問題なく実行されます。これは、ロード先のプロセスがこれらのエクスポート関数を探し、DLLMainが存在するかどうかを気にしないためです。
After
KnownDLLsは、Windowsのシステム起動プロセス中にロードされるDLLのリストです。これらのDLLはオペレーティングシステムの機能に不可欠であると見なされるため、キャッシュされてロード時間を短縮し、アプリケーション起動時のパフォーマンスを向上させます。KnownDLLsには、kernel32.dll、kernelbase.dll、ntdll.dllなどのDLLが含まれます。
これらのKnownDllsを利用して、ScareCrowは NtOpenSection と NtMapViewOfSection の組み合わせを使用して \KnownDlls\<dllname> からDLLのコピーをマッピングし、プロセスのメモリにロードします。ScareCrowはDLL全体をロードするのではなく、DLLの.textセクションのみをロードします(このセクションにはすべてのシステムコールが含まれているため)。そこから、ScareCrowは間接システムコールを使用して NtProtectVirtualMemory を呼び出し、DLLの.textメモリセクションのアクセス許可を変更して、ScarecrowがEDRのフックを上書きできるようにしてから、権限を復元します。
詳細については、modexpの詳細な記事をお読みください。
これらのフックが削除されると、ScareCrowはカスタムシステムコールを使用してメモリ内のシェルコードをロードおよび実行します。ScareCrowは、EDRのフックが削除された後でも、Event Tracing for Windows(ETW)やその他のイベントログメカニズムなどの非ユーザーランドでフックベースのテレメトリ収集ツールによる検出を回避するためにこれを行います。これらのカスタムシステムコールは、前述のEDRによって配置されたフックを削除するためのVirtualProtect呼び出しを実行するためにも使用され、EDRの改ざん防止制御による検出を回避します。これは、VirtualProtectシステムコールのカスタムバージョンである NtProtectVirtualMemory を呼び出すことによって行われます。ScareCrowは、これらのローダーを生成するためにGolangを使用し、これらのカスタムシステムコール関数にはアセンブリを使用します。
ローダーの作成プロセス中に、ScareCrowはビーコンがコールバックした後にバックグラウンドに溶け込むためのライブラリを利用します。このライブラリは2つのことを行います。
コード署名証明書で署名されたファイルは、通常、監視が緩やかであり、実行が妨げられにくくなります。信頼できる名前で署名されたファイルは、他のファイルよりも疑われにくいためです。ほとんどのマルウェア対策製品は、これらの証明書を検証および確認する時間がありません(現在は一部の製品が行っていますが、一般的なベンダー名は通常ホワイトリストに含まれています)。ScareCrowは、ツール limelighter のGoパッケージバージョンを使用してpfx12ファイルを作成し、これらの証明書を生成します。このパッケージは、ユーザーが指定したドメイン名を入力として受け取り、そのドメインのコード署名証明書を作成します。必要に応じて、valid コマンドラインオプションを使用して、既存のコード署名証明書を使用することもできます。
clone コマンドラインオプションと、証明書をコピーするファイルへのパスを使用して、DLLまたは.exeファイルを対象に使用できます。 ローダーをmicrosoft.comで署名する場合、WINDOWS DEFENDER ATP製品に対しては、それらが証明書を検証して自分たちのものであると確認できるため、効果が薄い可能性があります。Windows製品に対してローダーを使用する場合は、別のドメインを使用することをお勧めします。
これらのファイルとGoコードを使用して、ScareCrowはc-sharedライブラリオプションを使用してそれらをDLLにクロスコンパイルします。DLLがコンパイルされると、壊れたbase64文字列に難読化され、ファイルに埋め込まれます。これにより、ファイルをリモートで取得、アクセス、およびプログラム的に実行できるようになります。
ScareCrowには広範なファイル属性リストがありますが、カスタム(環境固有の場合もある)属性のセットが必要な状況もあります。これに対応するために、ScareCrowは属性を含むJSONファイルの入力を許可します。-configfile コマンドラインオプションを使用すると、ScareCrowはScareCrowに既存の属性の代わりにこれらの属性とファイル名を使用します。ファイル main.json には、JSON構造が正しく機能するためのサンプルテンプレートが含まれています。"InternalName" として使用するものは、ファイル名になることに注意してください。
ScareCrowは、ローダーをコンパイルするためにgolang 1.19.1以降が必要になりました。古いバージョンを実行している場合は、バージョン1.19.1以降を使用してください。
新しいバージョンについては、https://golang.org/dl/ を参照してください。
最初のステップは、いつものようにリポジトリをクローンすることです。ScareCrowをコンパイルする前に、依存関係をインストールする必要があります。
インストールするには、次のコマンドを実行します。``` go get github.com/fatih/color go get github.com/yeka/zip go get github.com/josephspurrier/goversioninfo go get github.com/Binject/debug/pe go get github.com/awgh/rawreader
以下のものがお使いのOSにインストールされていることを確認してください。```
openssl
osslsigncode
mingw-w64
次にビルドします``` go build ScareCrow.go
さらに、ScareCrowはすべてのloadersを難読化するために[Garble](https://github.com/burrowers/garble)を利用しています。
注意: いくつかの依存関係はWindows上でのコンパイルに適していません。そのため、loadersのコンパイルはOSXまたはLinux上で行うことを推奨します。
## ヘルプ```
./ScareCrow -h
_________ _________
/ _____/ ____ _____ _______ ____ \_ ___ \_______ ______ _ __
\_____ \_/ ___\\__ \\_ __ \_/ __ \/ \ \/\_ __ \/ _ \ \/ \/ /
/ \ \___ / __ \| | \/\ ___/\ \____| | \( <_> ) /
/_______ /\___ >____ /__| \___ >\______ /|__| \____/ \/\_/
\/ \/ \/ \/ \/
(@Tyl0us)
“Fear, you must understand is more than a mere obstacle.
Fear is a TEACHER. the first one you ever had.”
Usage of ./ScareCrow:
-Evasion string
Sets the type of EDR unhooking technique:
[*] Disk - Retrives a clean version of the DLLs ".text" field from files stored on disk.
[*] KnownDLL - Retrives a clean version of the DLLs ".text" field from the KnownDLLs directory in the object namespace.
[*] None - The Loader that WILL NOT removing the EDR hooks in system DLLs and only use custom syscalls. (default "Disk")
-Exec string
Set the template to execute the shellcode:
[*] RtlCopy - Using RtlCopy to move the shellcode into the allocated address in the current running process by making a Syscall.
[*] ProcessInjection - Process Injection Mode.
[*] NtQueueApcThreadEx - Executes the shellcode by creating an asynchronous procedure call (APC) to a target thread.
[*] VirtualAlloc - Allocates shellcode into the process using custom syscalls in the current running process (default "RtlCopy")
-I string
Path to the raw 64-bit shellcode.
-Loader string
Sets the type of process that will sideload the malicious payload:
[*] binary - Generates a binary based payload. (This type does not benefit from any sideloading)
[*] control - Loads a hidden control applet - the process name would be rundll32 if -O is specified a JScript loader will be generated.
[*] dll - Generates just a DLL file. Can be executed with commands such as rundll32 or regsvr32 with DllRegisterServer, DllGetClassObject as export functions.
[*] excel - Loads into a hidden Excel process using a JScript loader.
[*] msiexec - Loads into MSIexec process using a JScript loader.
[*] wscript - Loads into WScript process using a JScript loader. (default "binary")
-O string
Name of output file (e.g. loader.js or loader.hta). If Loader is set to dll or binary this option is not required.
-clone string
Path to the file containing the certificate you want to clone
-configfile string
The path to a json based configuration file to generate custom file attributes. This will not use the default ones.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-delivery string
Generates a one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader (Compatible with Binary, Control, Excel, and Wscript Loaders).
[*] hta - Generates a blank hta file containing the loader along with an MSHTA command to execute the loader remotely in the background (Compatible with Control and Excel Loaders).
[*] macro - Generates an office macro that will download and execute the loader remotely (Compatible with Control, Excel, and Wscript Loaders).
-domain string
The domain name to use for creating a fake code signing cert. (e.g. www.acme.com)
-encryptionmode string
Sets the type of encryption to encrypt the shellcode:
[*] AES - Enables AES 256 encryption.
[*] ELZMA - Enables ELZMA encryption.
[*] RC4 - Enables RC4 encryption. (default "ELZMA")
-export string
For DLL Loaders Only - Specify an Export function for a loader to have.
-injection string
Enables Process Injection Mode and specify the path to the process to create/inject into (use \ for the path).
-noamsi
Disables the AMSI patching that prevents AMSI BufferScanner.
-noetw
Disables the ETW patching that prevents ETW events from being generated.
-nosign
Disables file signing, making -domain/-valid/-password parameters not required.
-nosleep
Disables the sleep delay before the loader unhooks and executes the shellcode.
-obfu
Enables Garbles Literal flag replaces golang libray strings with more complex variants, resolving to the same value at run-time. This creates a larger loader and times longer to compile
-outpath string
The path to put the final Payload/Loader once it's compiled.
-password string
The password for code signing cert. Required when -valid is used.
-sandbox
Enables sandbox evasion using IsDomainJoined calls.
-url string
URL associated with the Delivery option to retrieve the payload. (e.g. https://acme.com/)
-valid string
The path to a valid code signing cert. Used instead -domain if a valid code signing cert is desired.
ローダーは、シェルコードをターゲットシステムにロードするために使用されるテクニックの種類を決定します。ローダーオプションが選択されていない場合、ScareCrowは標準のDLLファイルをコンパイルします。このDLLは、rundll32、regsvr32、またはDLLを利用するその他のテクニックで使用できます。ScareCrowは、シェルコードをメモリにロードするために3種類のローダーを利用します。
ScareCrowは、必要に応じて-Loaderコマンドラインオプションを使用してバイナリベースのペイロードを生成することもできます。これらのバイナリはサイドバイサイドローディングテクニックの恩恵を受けませんが、状況に応じてシェルコードを実行するための追加のテクニックとして機能します。
ScareCrowは、まずプロセスを作成してからバックグラウンドに移動させるテクニックを利用します。これには2つの目的があります。第一にプロセスを隠蔽し、第二にEDR製品による検出を回避します。プロセスをすぐにバックグラウンドで生成することは非常に疑わしく、悪意のある指標となり得ます。ScareCrowは、プロセス作成後、EDRのフックがロードされた後に'GetConsoleWindow'と'ShowWindow'のWindows関数を呼び出し、ウィンドウ属性を非表示に変更することでこれを実現します。ScareCrowは、従来の-ldflags -H=windowsguiを使用する代わりにこれらのAPIを利用します。これは、ほとんどのセキュリティ製品で高度にシグネチャ化され、侵害の指標として分類されているためです。
-consoleコマンドラインオプションが選択された場合、ScareCrowはプロセスをバックグラウンドに隠しません。代わりに、ローダーが何をしているかを表示するいくつかのデバッグメッセージを追加します。
ScareCrowはシェルコードを実行するために異なるテンプレートを使用します。テンプレートを選択するには-Execコマンドラインオプションを使用します。これらのテンプレートには以下が含まれます。
ScareCrowはプロセスインジェクション攻撃を行う機能を含んでいます。ローダープロセスとインジェクション先プロセスの両方でのフッキングや検出を避けるため、ScareCrowはまず通常通りローダープロセスのフックを解除し、プロセス内にフックがないことを確認します。完了後、ローダーは作成コマンドで指定されたプロセスを生成します。生成されると、ローダーはプロセスに対するハンドルを作成し、ロードされたDLLのリストを取得します。DLLを見つけると、リモートプロセス内の各DLLのベースアドレスを列挙します。WriteProcessMemory関数を使用して、ローダーはディスクに保存されているシステムDLLのバイト(EDRフックがないため"クリーン")を、最初にメモリのアクセス許可を変更する必要なく書き込みます。ScareCrowはWriteProcessMemoryを使用します。この関数には主にデバッグで使用される機能があり、メモリのセクションが読み取り専用であっても、WriteProcessMemoryへの呼び出しが正しければ、一時的にアクセス許可を読み取り/書き込みに変更し、メモリセクションを更新してから元のアクセス許可に戻します。これが完了すると、どちらのプロセスにもEDRフックがないため、ローダーは問題なくシェルコードを生成されたプロセスに注入できます。
このオプションは任意のローダーオプションと組み合わせて使用できます。プロセスインジェクションを有効にするには、-injectionコマンドラインオプションと、インジェクション先のプロセスのフルパスを指定します。パスを引数として指定する際は、フルパスを""で囲むか、パス内の各ディレクトリに二重の\を使用することが重要です。
ScareCrowはAMSI(Antimalware Scan Interface)およびETW関数をパッチする機能を含んでおり、プロセスによるイベントの生成を防止します。
AMSIはWindowsネイティブAPIであり、Windows Defender(または他のアンチマルウェア製品)がWindowsオペレーティングシステムの深部と連携し、特にメモリベースの攻撃に対する強化された保護を提供できるようにします。AMSIにより、セキュリティ製品は悪意のある指標をより適切に検出し、脅威の阻止を支援できます。AMSIはWindowsにネイティブであるため、製品はAMSIを「フック」する必要はなく、必要なDLLをロードしてプロセスへの強化された洞察を得ます。このため、ScareCrowはAMSI.dllをロードしてパッチし、スキャンインターフェースからの結果がすべてクリーンとして返されるようにします。AMSIのパッチはすべてのローダーでデフォルトです。AMSIをパッチしない場合は、-noamsiコマンドラインオプションを使用してローダーで無効にします。
ETWは組み込みのシステムコールを利用してこのテレメトリを生成します。ETWもWindowsに組み込まれたネイティブ機能であるため、セキュリティ製品は情報を得るためにETWシステムコールを「フック」する必要はありません。その結果、ETWを防ぐために、ScareCrowは多数のETWシステムコールをパッチし、レジスタをフラッシュして実行フローを次の命令に戻します。ETWのパッチは現在すべてのローダーでデフォルトです。ETWをパッチしない場合は、-noetwコマンドラインオプションを使用してローダーで無効にします。
現在、これらのオプションは親プロセスに対してのみ機能します。-injectionコマンドラインオプションが使用された場合、プライマリプロセスはAMSIとETWをパッチしますが、インジェクション先のプロセスは
シェルコードの暗号化は、EDRや他のセキュリティ製品による検出や分析から保護するために使用される重要な技術です。ScareCrowはシェルコードを暗号化するための複数の方法を備えており、AES、ELZMA、RC4が含まれます。
AES(Advanced Encryption Standard)は、データの暗号化に広く使用されている対称暗号アルゴリズムです。ScareCrowはAES 256ビットサイズを使用してシェルコードを暗号化します。AESを使用してシェルコードを暗号化する利点は、強力な暗号化を提供し、暗号ライブラリで広くサポートされていることです。ただし、固定ブロックサイズの使用は、パディングオラクル攻撃などの特定の攻撃に対して脆弱になる可能性があります。
ELZMAは、コードを難読化するためにマルウェアでよく使用される圧縮および暗号化アルゴリズムです。ELZMAを使用してシェルコードを暗号化するには、まずシェルコードをELZMAアルゴリズムで圧縮します。圧縮データはランダムな鍵で暗号化されます。暗号化されたデータと鍵はエクスプロイトコードに埋め込まれます。ELZMAを使用してシェルコードを暗号化する利点は、単一のアルゴリズムで圧縮と暗号化の両方を提供することです。これにより、エクスプロイトコードのサイズを削減し、検出をより困難にすることができます。
RC4は、マルウェアでシェルコードを暗号化するためによく使用される対称暗号アルゴリズムです。可変長鍵を使用できるストリーム暗号であり、そのシンプルさと速度で知られています。
-obfuコマンドラインオプションを使用すると、コンパイルプロセス中にGarbles Literalフラグが有効になります。これにより、Go言語のライブラリ参照や文字列が、実行時に同じ値に解決されるより複雑なバージョンに置き換えられます。このプロセスは完了までに時間がかかり、結果としてGOファイルが大きくなります。ファイルがコンパイルされると、ScareCrowは新しく作成されたファイルを解析し、Go文字列ベースのIOCを除去します。
deliveryコマンドライン引数を使用すると、リモートソースから被害者のホストにファイルをリモートでプルするコマンドまたはコード文字列(マクロの場合)を生成できます。これらの配信方法には以下が含まれます。