
허용된 프로세스에만 페이로드를 제공하기 위해 Windows 프로젝션 파일 시스템 기능 사용
ProjFS 공급자. 파일의 내용이 어떤 프로세스가 읽는지에 따라 달라지는 파일을 프로젝션합니다. 페이로드는 AES-256-CBC 암호화되어 디스크에 저장되며, 런타임 시에만 메모리에서 복호화됩니다. 허용된 프로세스가 읽으려고 할 때만 페이로드가 디스크에 기록되므로 이는 EDR을 우회하지 않아야 합니다. 그 외 모든 것은 액세스 거부됩니다. 분석가의 도구가 파일을 읽지 못하거나 단순히 디코이를 로드하기 때문에 일부 분석가를 화나게 할 수 있습니다. 하지만 리파스 포인트를 사용하는 ProjFS라는 것을 쉽게 알 수 있습니다.
1) 키 생성: PhantomFS.exe -keygen
2) 페이로드 암호화: PhantomFS.exe -encrypt mimikatz.exe -key <key> -out mimikatz.enc
3) 서비스: 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가 읽으면 복호화된 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>] (반복 가능, 기본값: powershell.exe, pwsh.exe, cmd.exe)
[-deny-read <process_substring>] (반복 가능)
[-quiet]
ProjFS 콜백은 모든 파일 액세스 시 TriggeringProcessImageFileName을 수신합니다.
GetFileDataCallback: 규칙에 따라 프로세스를 확인하여 페이로드 또는 디코이 바이트를 제공합니다.NotificationCallback PRE_DELETE: 허용되지 않은 프로세스의 삭제를 차단합니다.FILE_HANDLE_CLOSED: 재수화를 강제하기 위해 PrjDeleteFile을 호출합니다.재수화 트릭은 ProjFS가 첫 번째 읽기 후 파일 내용을 캐시하기 때문에 필요합니다. 이 트릭이 없으면 두 번째 읽기 프로세스는 첫 번째 프로세스가 받은 내용을 그대로 받게 됩니다.
PrjStartVirtualizing API 호출IO_REPARSE_TAG_PROJFS 리파스 포인트PrjFlt 마이크로필터 (fltmc.exe)Microsoft-Windows-ProjFS ETW 공급자영감: