
Freeze.rsの最新バージョンを表示したり、問題を報告するには、https://github.com/Tylous/Freeze.rs を参照してください。
このフレームワークで使用されている手法について詳しく知りたい場合は、SourceZero Blog と元のツール をご覧ください。
Freeze.rs は、EDRのセキュリティ制御を回避してシェルコードをステルスに実行するためのペイロード作成ツールです。Freeze.rs は、ユーザーランドのEDRフックを除去するだけでなく、他のエンドポイント監視制御も回避する方法でシェルコードを実行するために、複数の技術を利用しています。
プロセスが作成されると、最初に読み込まれるDLLはNtdll.dllです。これは、EDR DLLが読み込まれる前に行われます。つまり、EDRが読み込まれ、システムDLLのアセンブリをフックして変更し始めるまでにわずかな遅延があります。Ntdll.dll内のWindowsシステムコールを見ると、まだ何もフックされていないことがわかります。中断状態(時間的に凍結された状態)でプロセスを作成すると、Ntdll.dll以外のDLLはロードされていないことがわかります。また、EDR DLLもロードされていないため、Ntdll.dll内のシステムコールは変更されていないことがわかります。
このクリーンな中断プロセスを使用してFreeze.rsローダーからフックを除去するには、プログラムによってクリーンな中断プロセスのメモリを見つけて読み取る方法が必要です。ここで、アドレス空間配置のランダム化(ASLR)が登場します。ASLRは、スタックメモリ破壊に基づく脆弱性を防ぐためのセキュリティメカニズムです。ASLRはプロセス内のアドレス空間をランダム化し、すべてのメモリマップオブジェクト、スタック、ヒープ、実行可能プログラム自体が一意になるようにします。ここからが興味深い点です。ASLRは機能しますが、DLLなどの位置独立コードに対しては機能しません。DLL(特に既知のシステムDLL)では、アドレス空間がブート時に一度だけランダム化されます。つまり、リモートプロセスの情報を列挙してntdll.dllのベースアドレスを見つける必要はありません。なぜなら、それはすべてのプロセス(制御しているプロセスを含む)で同じだからです。すべてのDLLのアドレスはブートごとに同じ場所にあるため、この情報を自身のプロセスから取得でき、中断プロセスを列挙してアドレスを見つける必要はありません。
この情報を使用して、API ReadProcessMemoryを使用してプロセスのメモリを読み取ることができます。このAPI呼び出しは、資格情報ベースの攻撃の一環としてLSASSを読み取ることとよく関連付けられますが、それ自体は本質的に悪意のあるものではありません。特に、メモリの任意のセクションを読み取るだけの場合はそうです。ReadProcessMemoryが疑わしいものとしてフラグされるのは、読み取るべきでないもの(LSASSの内容など)を読み取っている場合だけです。EDR製品は、ReadProcessMemoryが呼び出されたという事実をフラグするべきではありません。この関数には正当な運用上の使用例があり、多くの誤検出が発生するからです。
さらに一歩進んで、Ntdll.dllのすべてのシステムコールが格納されているセクション(.textセクション)のみを読み取り、DLL全体を読み取らないようにすることもできます。
これらの要素を組み合わせることで、プログラムによってNtdll.dllの.textセクションのコピーを取得し、シェルコードを実行する前に既存のフックされた.textセクションを上書きできます。
ETWは組み込みのシステムコールを利用してこのテレメトリを生成します。ETWもWindowsに組み込まれたネイティブ機能であるため、セキュリティ製品は情報にアクセスするためにETWシステムコールを「フック」する必要はありません。その結果、ETWを防ぐために、Freeze.rsは多数のETWシステムコールにパッチを適用し、レジスタをフラッシュして実行フローを次の命令に戻します。ETWパッチは現在、すべてのローダーでデフォルトになっています。
Ntdll.dllのみが復元されるため、シェルコードを実行するための後続の呼び出しはすべてNtdll.dll内に存在する必要があります。RustのNTAPIクレートを使用すると(他の言語でも可能ですが、Rustでは実装が非常に簡単です)、シェルコードの割り当て、書き込み、保護に必要なNTシステムコールを定義して呼び出すことができ、Kernel32.dllやKernelbase.dllにある標準呼び出しを効果的にスキップします。これらのDLLはまだフックされている可能性があるためです。
RustのNTAPIクレートを使用すると、これらの呼び出しはすべてntdll.dllの下には表示されませんが、プロセス内には依然として存在することがわかります。
その結果:
これはRustを学ぶための楽しいプロジェクトとして始まり、独自のフレームワークに成長しました。
Freeze.rsはRustで開発されました。
Rust と Rustup がインストールされていない場合は、インストールしてください。OS XまたはLinuxからコンパイルする場合は、ターゲット "x86_64-pc-windows-gnu" が追加されていることを確認してください。そのために、次のコマンドを実行します:
rustup target add x86_64-pc-windows-gnu
完了したら、Freeze.rsをコンパイルするか、次のコマンドを実行するか、またはコンパイル済みバイナリを使用できます:
cargo build --release
これにより、コンパイルされたバージョンは target/release にあります(注意:--release を指定しない場合、ファイルは target/debug/ にあります)。
___________
\_ _____/______ ____ ____ ________ ____ _______ ______
| __) \_ __ \_/ __ \_/ __ \\___ // __ \ \_ __ \/ ___/
| \ | | \/\ ___/\ ___/ / /\ ___/ | | \/\___ \
\___ / |__| \___ >\___ >_____ \\___ > /\ |__| /____ >
\/ \/ \/ \/ \/ \/ \/
(@Tyl0us)
Soon they will learn that revenge is a dish... best served COLD & Rusty...
使用法:
Freeze-rs [FLAGS] [OPTIONS]
FLAGS:
-c, --console バイナリペイロード専用 - ペイロード実行時に詳細なコンソール情報を生成します。これにより、隠しウィンドウ機能が無効になります。
-h, --help ヘルプ情報を表示します
-n, --noetw ETWイベントの生成を防ぐETWパッチを無効にします。
-s, --sandbox サンドボックス回避を有効にします。次のチェックを行います:
エンドポイントがドメインに参加しているか?
エンドポイントに2つ以上のCPUがあるか?
エンドポイントに4GB以上のRAMがあるか?
-V, --version バージョン情報を表示します
OPTIONS:
-E, --Encrypt <ENCRYPT> シェルコードをAES 256、ELZMA、またはRC4暗号化のいずれかで暗号化します
-I, --Input <INPUT> 生の64ビットシェルコードへのパス。
-O, --Output <OUTPUT> 出力ファイルの名前(例:loader.exe または loader.dll)。定義されたファイル拡張子に応じて、FreezeがDLLまたはEXEのどちらを作成するかが決まります。
-p, --process <PROCESS> 生成するプロセスの名前。このプロセスは C:\Windows\System32\ に存在する必要があります。例:'notepad.exe'
-e, --export <export> 任意のDLLのカスタムエクスポート関数名を定義します。
Freeze.rs は、.exe または .dll ファイルのいずれかを生成できます。これを指定するには、-O コマンドラインオプションの末尾がバイナリの場合は .exe、DLLの場合は .dll で終わるようにしてください。現在、他のファイルタイプはサポートされていません。DLLファイルの場合、Freeze.rs は追加のエクスポート機能も追加できます。これを行うには、-export を特定のエクスポート関数名とともに使用します。
シェルコードの暗号化は、EDRやその他のセキュリティ製品による検出や分析から保護するための重要な技術です。Freeze.rs には、シェルコードを暗号化するための複数の方法が用意されています。これには、AES、ELZMA、RC4が含まれます。
AES(Advanced Encryption Standard)は、データの暗号化に広く使用されている対称暗号化アルゴリズムです。Freeze.rs はAES-256ビットサイズを使用してシェルコードを暗号化します。AESを使用してシェルコードを暗号化する利点は、強力な暗号化を提供し、暗号ライブラリで広くサポートされていることです。ただし、固定ブロックサイズを使用するため、パディングオラクル攻撃などの特定の攻撃に対して脆弱になる可能性があります。
ELZMAは、コードを難読化するためにマルウェアでよく使用される圧縮および暗号化アルゴリズムです。ELZMAを使用してシェルコードを暗号化するには、まずシェルコードをELZMAアルゴリズムで圧縮します。次に、圧縮データをランダムなキーで暗号化します。暗号化されたデータとキーは、エクスプロイトコードに埋め込まれます。ELZMAを使用してシェルコードを暗号化する利点は、単一のアルゴリズムで圧縮と暗号化の両方を提供することです。これにより、エクスプロイトコードのサイズを削減し、検出をより困難にすることができます。
RC4は、マルウェアでシェルコードを暗号化するためによく使用される対称暗号化アルゴリズムです。可変長キーを使用できるストリーム暗号であり、そのシンプルさと速度で知られています。
Freeze.rs は、まずプロセスを作成し、それをバックグラウンドに移動する手法を利用しています。これにより2つの効果があります。第一にプロセスを隠し続けるのに役立ち、第二にEDR製品による検出を回避します。プロセスをすぐにバックグラウンドに生成することは非常に疑わしく、悪意の指標となる可能性があります。Freeze.rs は、プロセスが作成され、EDRのフックがロードされた後に 'GetConsoleWindow' および 'ShowWindow' Windows関数を呼び出し、ウィンドウ属性を非表示に変更することでこれを実現します。
-console コマンドラインオプションが選択された場合、Freeze.rs はプロセスをバックグラウンドに隠しません。代わりに、ローダーが何をしているかを表示するいくつかのデバッグメッセージを追加します。