SigFlip は、オーセンティコード署名付き PE ファイル (exe、dll、sys など) を、既存のオーセンティコード署名に影響を与えたり壊したりしない方法でパッチ適用するためのツールです。言い換えれば、ファイルの署名、整合性チェック、または PE ファイルの機能を壊すことなく、データ (シェルコードなど) を埋め込むことで PE ファイルのチェックサムやハッシュを変更できます。
SigInject は、シェルコードを暗号化して PE ファイルの [WIN_CERTIFICATE] 証明書テーブルに注入します。暗号化キーは、基本的な BOF/C/C# ローダー (SigLoader) で使用するために出力されます。SigInject は変更を修正された PE ファイルに保存し、その署名と証明書の有効性をそのまま保持します。
SigLoader は、SigInject によって作成された修正された PE ファイルのパスと復号化キーをパラメータとして受け取り、埋め込まれたシェルコードを抽出して復号化し、任意のシェルコードインジェクションで使用するための基本的なローダーです。
SigFlip は、PE ハッシュが正常に変更されたかどうかを確認し、エンドポイントがこのような一般的な誤構成に対して強化されている場合には正常に終了してチェックします (「詳細」セクションを参照)。
注意: SigFlip、SigInject、SigLoader は BOF スクリプトと .NET アセンブリの両方で利用可能です。唯一の違いは、BOF ではなく .NET アーティファクトを使用する場合、SigInject 機能が SigFlip (-i) の一部として実装されていることです。
これは主に、永続化、ラテラルムーブメント、またはコードやコマンドの実行に使用でき、以下の点で役立ちます:
このプロジェクトではプリコンパイルされた BOF は提供されていません。Mingw-w64 を使用してコンパイルできます。.NET の場合は VS または csc.exe を使用して .NET プロジェクト (SigFlip、SigLoader) をコンパイルします。BOF の場合は以下の手順を確認してください。
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.oすべてのオブジェクトファイルが sigflip.cna と同じディレクトリに配置されていることを確認し、sigflip.cna スクリプトを Cobalt Strike にロードします。
注意: プリコンパイルされた BOF は mingw-64 v8.0.0_3 でテストされ互換性があります。mingw-64 >= v9 を使用すると動作する可能性がありますが、アクティブなビーコンがクラッシュする可能性があります。詳細については https://github.com/med0x2e/SigFlip/issues/2 を確認してください。
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip "<PE\_FILE\_PATH>" "<OUTPUT\_PE\_FILE\_PATH (拡張子付き)>"SigInject "<PE\_FILE\_PATH> <OUTPUT\_PE\_FILE\_PATH (拡張子付き)>" "<SHELLCODE\_FILE>"SigLoader <PE_FILE_PATH_WITH_SH> <DECRYPTION_KEY> <SPAWNTO_PROCESS_PATH> <PARENT_PROCESS_ID>例
BOF:
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"これは、APT#10 が複数のキャンペーンや侵入セットで使用した既知の手法です。
Authenticode は、Authenticode で署名されたソフトウェアの発行元を特定する Microsoft のコード署名技術です。Authenticode はまた、署名および公開されてからソフトウェアが改ざんされていないことも検証します。
Microsoft は主に、PE バイナリの整合性と発行元を検証するために Authenticode 署名形式に依存しています。Authenticode Portable Executable 形式の仕様によると、Authenticode 署名は Windows PE ファイルに「埋め込む」ことができ、その場所はオプショナルヘッダーデータディレクトリの証明書テーブルエントリで指定されます。Authenticode を使用して Windows PE ファイルに署名する場合、ファイルの Authenticode ハッシュ値を計算するアルゴリズムは特定の PE フィールドを除外します。署名をファイルに埋め込む場合、署名プロセスはファイルのハッシュ値に影響を与えることなく、これらのフィールドを変更できます。これらのフィールドは次のとおりです: チェックサム、証明書テーブル RVA、証明書テーブルサイズ、および属性証明書テーブル。属性証明書テーブルには、PE ファイルの ハッシュ値、ソフトウェア発行元の秘密鍵で作成された 署名、およびソフトウェア発行元の署名鍵を法人にバインドする X.509 v3 証明書 を含む PKCS #7 SignedData 構造が含まれています。
簡単に言うと、オーセンティコードハッシュ計算から除外されるフィールドにデータを変更または埋め込むことができ、オーセンティコード署名やファイル整合性チェックを壊す心配はありません。
このような除外フィールドの詳細:
dwLength: 証明書テーブルのサイズ。wRevision: WIN_CERTIFICATE の「リビジョン」。wCertificateType: カプセル化された証明書データの種類。bCertificate: 実際の証明書データ。WIN_CERT_TYPE_PKCS_SIGNED_DATA の場合、これは前述の PKCS#7 SignedData 構造 (PE ハッシュ値、署名、x.509 証明書を含む) です。これがまさに SigFlip がランダムデータまたはシェルコードを埋め込む場所です。これらを踏まえて、SigFlip は以下の処理を行います:
最初のステップは、システムがオーセンティコード署名付き PE ファイルへのパディングやシェルコード注入を許可するように誤構成されているかどうかを確認するために重要です。そのため、以下の健全性チェックが実行されます:
Windows ローダーは証明書データをプロセスアドレス空間にロードしません。そのため、シェルコードなどのデータを抽出して使用するにはカスタムローダー (例: SigLoader) が必要です。これは、IMAGE_DIRECTORY_ENTRY_SECURITY データディレクトリエントリの RVA が通常のメモリオフセットではなくファイルオフセットである理由も説明しています。
SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "DECRYPTION_KEY" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354