
Despejar a memória de um PPL com um exploit de userland
⚠️ 2022-07-24 - A partir de Windows 10 21H2 10.0.19044.1826 (atualização de julho de 2022), o exploit implementado no PPLdump não funciona mais. Um patch na NTDLL agora impede que PPLs carreguem Known DLLs. Mais informações aqui.
Esta ferramenta implementa um exploit em modo de usuário que foi inicialmente discutido por James Forshaw (também conhecido como @tiraniddo) - neste post do blog - para despejar a memória de qualquer PPL como administrador.
Escrevi dois posts no blog sobre esta ferramenta. A primeira parte trata dos conceitos de Processos Protegidos, enquanto a segunda discute a técnica de bypass em si.
Basta executar o executável sem qualquer argumento e você obterá uma ajuda/uso detalhado.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | versão 0.4
|__| |__| |_____|___|___|_|_|_| _| por @itm4n
|_|
Descrição:
Despejar a memória de um Processo Protegido Leve (PPL) com um exploit em *modo de usuário*
Uso:
PPLdump.exe [-v] [-d] [-f] <NOME_PROC|ID_PROC> <ARQUIVO_DUMP>
Argumentos:
NOME_PROC O nome de um processo para despejar
ID_PROC O ID de um processo para despejar
ARQUIVO_DUMP O caminho do arquivo de dump de saída
Opções:
-v (Verboso) Ativar modo verboso
-d (Depuração) Ativar modo de depuração (implica verboso)
-f (Forçar) Ignorar verificação de erro DefineDosDevice
Exemplos:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
Primeiramente, PPLs foram introduzidas com Windows 8.1, então versões mais antigas do Windows obviamente não são suportadas. Este projeto tem como alvo principal o Windows 10 (e suas edições de servidor), mas também o testei em versões mais antigas. Você encontrará uma tabela resumo dos testes que realizei na seção homônima.
Outras ferramentas de bypass de PPL geralmente executam código arbitrário no Kernel através de um driver assinado digitalmente. Esta é diferente, pois envolve apenas truques em modo de usuário e é (quase) sem arquivos.
Esta ferramenta aproveita um truque muito inteligente que foi inicialmente discutido por James Forshaw em 2018 (veja Créditos). Envolve o uso da função de API DefineDosDevice para enganar o sistema e criar uma entrada arbitrária de Known DLL. Como os PPLs não verificam a assinatura digital das Known DLLs, isso pode ser posteriormente usado para realizar um ataque de sequestro de DLL e executar código arbitrário dentro de um PPL.
Embora esta ferramenta realize um ataque de sequestro de DLL como segundo estágio, ela não cria um novo arquivo DLL no disco. Em vez disso, utiliza uma transação NTFS para substituir virtualmente o conteúdo de uma DLL existente, uma técnica diretamente inspirada no trabalho de @_ForrestOrr (veja Créditos).
A resposta curta é "não". Primeiro, ela não envolve nenhum acesso direto ao Kernel, portanto não há risco de causar uma BSOD desse ponto de vista. No pior cenário, a ferramenta pode falhar ao remover a entrada de Known DLL criada, mas isso não causará uma Negação de Serviço. Ela simplesmente permanecerá lá até a próxima reinicialização da máquina. Como a entrada criada seria apenas um link simbólico apontando para uma seção inexistente, o sistema eventualmente voltará ao local padrão (ou seja, a pasta System32), portanto não afetará outros programas em execução na máquina.
⚠️ O exploit falha em máquinas Windows 8.1 / Server 2012 R2 totalmente atualizadas. Ainda preciso descobrir qual patch causou o erro.
[-] DefineDosDevice falhou com código de erro 6 - O manipulador é inválido.
⚠️ No Windows 8.1 / Server 2012 R2, você também pode precisar compilar o binário estaticamente (veja "Instruções de compilação" abaixo).
Esta Solução do Visual Studio compreende 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 é automaticamente incorporada no executável final.
Release / x64 ou Release / x86 dependendo da arquitetura da máquina alvo.Build > Build Solution.No Windows 8.1 / Server 2012 R2, você pode precisar compilar o binário estaticamente.
PPLdump.Propriedades da Configuração > C/C++ > Geração de Código.Multi-threaded (/MT) como a opção de Biblioteca de Tempo de Execução.| Versão do Windows | Compilação | Edição | Arquitetura | Admin | 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 | ⚠️ | ⚠️ |