
사용자 영역 익스플로잇으로 PPL의 메모리를 덤프
⚠️ 2022-07-24 - Windows 10 21H2 10.0.19044.1826 (2022년 7월 업데이트) 기준으로 PPLdump에 구현된 익스플로잇은 더 이상 작동하지 않습니다. NTDLL의 패치로 인해 이제 PPL이 _Known DLL_을 로드할 수 없습니다. 자세한 정보는 여기를 참조하세요.
이 도구는 James Forshaw(@tiraniddo)가 블로그 게시물에서 처음 논의한 사용자 영역(userland) 익스플로잇을 구현하여, 관리자 권한으로 __모든 PPL의 메모리를 덤프__할 수 있습니다.
이 도구에 관한 두 개의 블로그 게시물을 작성했습니다. 첫 번째 파트는 보호된 프로세스 개념에 관한 것이고, 두 번째 파트는 우회 기법 자체를 다룹니다.
인수 없이 실행 파일을 실행하면 자세한 도움말/사용법이 표시됩니다.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
우선, PPL은 Windows 8.1에서 도입되었으므로 이전 Windows 버전은 당연히 지원되지 않습니다. 이 프로젝트는 주로 Windows 10(및 서버 에디션)을 대상으로 하지만, 이전 버전에서도 테스트했습니다. 동명의 섹션에서 수행한 테스트 요약 표를 확인할 수 있습니다.
다른 PPL 우회 도구는 일반적으로 디지털 서명된 드라이버를 통해 커널에서 임의 코드를 실행합니다. 이 도구는 사용자 영역 트릭만을 사용하며 (거의) 파일리스(fileless)라는 점에서 다릅니다.
이 도구는 James Forshaw가 2018년에 처음 논의한 매우 영리한 트릭을 활용합니다(참고자료 참조). DefineDosDevice API 함수를 사용하여 시스템을 속여 임의의 Known DLL 항목을 생성합니다. PPL은 Known DLL의 디지털 서명을 확인하지 않기 때문에, 이를 이용해 DLL 하이재킹 공격을 수행하고 PPL 내에서 임의 코드를 실행할 수 있습니다.
이 도구는 2단계로 DLL 하이재킹 공격을 수행하지만, 디스크에 새 DLL 파일을 생성하지는 않습니다. 대신 NTFS 트랜잭션을 사용하여 기존 DLL의 내용을 가상으로 대체하는데, 이 기술은 @_ForrestOrr의 작업에서 직접 영감을 받았습니다(참고자료 참조).
간단히 답변하자면 "아니오"입니다. 첫째, 커널에 직접 접근하지 않으므로 BSOD가 발생할 위험이 없습니다. 최악의 시나리오에서는 생성된 Known DLL 항목을 제거하지 못할 수 있지만, 이로 인해 서비스 거부가 발생하지는 않습니다. 해당 항목은 다음 재부팅까지 그대로 남아 있을 뿐입니다. 생성된 항목은 존재하지 않는 섹션을 가리키는 심볼릭 링크일 뿐이므로, 시스템은 결국 기본 위치(예: System32 폴더)로 대체되어 머신에서 실행 중인 다른 프로그램에 영향을 주지 않습니다.
⚠️ 완전히 업데이트된 Windows 8.1/Server 2012 R2 머신에서는 익스플로잇이 실패합니다. 어떤 패치가 오류를 유발했는지 아직 확인하지 못했습니다.
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ Windows 8.1/Server 2012 R2에서는 바이너리를 정적으로 컴파일해야 할 수도 있습니다(아래 "빌드 지침" 참조).
이 Visual Studio 솔루션은 특정 순서로 컴파일해야 하는 두 개의 프로젝트(실행 파일과 페이로드 DLL)로 구성됩니다. 모든 것이 사전 구성되어 있으므로 간단한 지침을 따르기만 하면 됩니다. 컴파일된 페이로드 DLL은 최종 실행 파일에 자동으로 포함됩니다.
Release / x64 또는 Release / x86을 선택합니다.빌드 > 솔루션 빌드를 선택합니다.Windows 8.1/Server 2012 R2에서는 바이너리를 정적으로 컴파일해야 할 수 있습니다.
PPLdump 프로젝트를 마우스 오른쪽 버튼으로 클릭합니다.구성 속성 > C/C++ > 코드 생성으로 이동합니다.런타임 라이브러리 옵션으로 다중 스레드(/MT)를 선택합니다.| Windows 버전 | 빌드 | 에디션 | 아키텍처 | 관리자 | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |