
Доставка полезных нагрузок только разрешённым процессам с использованием Windows projected file system
Провайдер ProjFS. Проецирует файлы, содержимое которых зависит от того, какой процесс их читает. Полезная нагрузка хранится на диске в зашифрованном виде (AES-256-CBC), расшифровывается только в памяти во время выполнения. Это не должно обходить EDR, так как полезная нагрузка будет записана на диск, когда разрешённые процессы попытаются её прочитать. Всё остальное получает отказ в доступе.
Это может разозлить некоторых аналитиков, так как их инструменты не прочитают файл или просто загрузят приманку. Но вы легко увидите, что это 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
Пример:
PhantomFS.exe C:\Staging -file mimikatz.enc -key 7ed5a44412447be587b2ca2e4eacb17d41c869360663ae0fea1d0caca159483c -decoy C:\Windows\System32\calc.exe
Результат: в файловой системе появляется C:\Staging\calc.exe.
cmd.exe при чтении получает расшифрованные байты mimikatzVS2022, откройте 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>] (повторяемый, по умолчанию: powershell.exe, pwsh.exe, cmd.exe)
[-deny-read <process_substring>] (повторяемый)
[-quiet]
Обратные вызовы ProjFS получают TriggeringProcessImageFileName при каждом обращении к файлу:
GetFileDataCallback: проверяет процесс по правилам, отдаёт байты полезной нагрузки или приманкиNotificationCallback PRE_DELETE: блокирует удаление неразрешёнными процессамиFILE_HANDLE_CLOSED: вызывает PrjDeleteFile, чтобы принудительно выполнить повторное заполнениеУловка с повторным заполнением необходима, так как ProjFS кэширует содержимое файла после первого чтения. Без этого второй читатель получил бы то же самое, что и первый.
PrjStartVirtualizingIO_REPARSE_TAG_PROJFSPrjFlt на высоте 189800 (fltmc.exe)Microsoft-Windows-ProjFSВдохновение: