
Windows Print Spooler 권한 상승 취약점(CVE-2019-1040/CVE-2019-1019)이 침투 테스트를 위해 Reflective DLL로 구현되었습니다.
PrintSpoofer는 Windows Print Spooler 서비스의 취약점(CVE-2019-1040 / CVE-2019-1019)을 악용하여 로컬 권한 상승을 수행하는 도구입니다. 이 프로젝트는 PrintSpoofer 익스플로잇을 Reflective DLL 형식으로 구현하여, Cobalt Strike와 같은 침투 테스트 프레임워크에서 사용하기에 적합합니다.
PrintSpoofer는 Windows Print Spooler 서비스의 취약점을 악용하여 낮은 권한의 사용자가 SYSTEM 수준의 권한을 획득할 수 있게 합니다. 이 익스플로잇은 Print Spooler 서비스가 명명된 파이프(named pipe)를 처리하는 방식을 남용합니다.
PrintSpoofer는 다음 단계를 수행하여 동작합니다:
익스플로잇은 먼저 현재 토큰에 SE_IMPERSONATE_NAME 권한이 있는지 확인합니다. 이 권한은 다른 사용자의 토큰을 가장하는 데 필요합니다.
임의의 UUID를 사용하여 명명된 파이프가 생성됩니다. 파이프 경로는 다음과 같습니다:
\\.\pipe\<UUID>\pipe\spoolss
생성된 명명된 파이프에 대한 비동기 연결이 대기됩니다. 이벤트가 생성되고, 파이프는 들어오는 연결을 수락할 준비를 합니다.
별도의 스레드에서 Print Spooler 서비스에 RPC 호출이 이루어집니다.
RpcRemoteFindFirstPrinterChangeNotificationEx를 호출함으로써, 서비스는 우리가 만든 파이프에 연결을 시도합니다.
Print Spooler 서비스(SYSTEM 권한으로 실행)가 명명된 파이프에 연결되면, 익스플로잇은 ImpersonateNamedPipeClient를 사용하여 서비스의 토큰을 가장합니다.
이로 인해 SYSTEM 권한을 획득하게 됩니다.
SYSTEM 토큰을 사용하여 높은 권한이 필요한 작업을 실행할 수 있습니다.
Windows Print Spooler 서비스는 명명된 파이프를 통해 프린터 알림을 처리합니다. 서비스가 파이프 연결을 제대로 검증하지 않기 때문에, 공격자는 서비스가 악성 파이프에 연결하도록 강제한 뒤 SYSTEM 토큰을 가장할 수 있습니다.
이 프로젝트는 MS-RPRN(Print System Remote Protocol)을 사용하여 Print Spooler 서비스와 통신합니다. 이 프로토콜은 IDL(Interface Definition Language) 파일로 정의되며 RPC 호출을 가능하게 합니다.
Reflective DLL은 표준 DLL과 다르게 동작합니다:
LoadLibrary API가 필요 없음Visual Studio에서 PrintSpoofer.sln 파일을 엽니다.
솔루션 플랫폼과 구성을 선택합니다:
x64 또는 Win32 (대상 아키텍처에 따라)Release (배포용) 또는 Debug (개발용)빌드 솔루션(Ctrl+Shift+B)을 통해 솔루션을 빌드합니다.
컴파일된 DLL은 다음 위치에 생성됩니다:
PrintSpoofer\x64\Release\PrintSpoofer.dll (for x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (for x86)
이 프로젝트는 다음 전처리기 정의를 사용합니다:
REFLECTIVE_DLL_EXPORTS: Reflective DLL 내보내기 활성화REFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: 사용자 정의 DllMain 사용REFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: LoadRemoteLibraryR 활성화 (Release 모드에서)PrintSpoofer는 Cobalt Strike의 elevate 명령과 함께 사용할 수 있습니다:
elevate PrintSpoofer LISTENER_NAME
여기서:
PrintSpoofer: elevate 모듈 이름LISTENER_NAME: 상승된 셸을 수신할 리스너DLL은 Reflective DLL 인젝션 기법을 사용하여 수동으로 로드할 수 있습니다.
익스플로잇이 성공적으로 실행되면 다음과 같이 표시됩니다:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cpp이 도구는 교육 목적 및 승인된 침투 테스트 용도로만 사용해야 합니다.
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.