
A vulnerabilidade de escalonamento de privilégios do Windows Print Spooler (CVE-2019-1040/CVE-2019-1019) foi implementada como uma Reflective DLL para testes de penetração.
O PrintSpoofer é uma ferramenta que realiza escalonamento local de privilégios ao explorar uma vulnerabilidade no serviço Windows Print Spooler (CVE-2019-1040 / CVE-2019-1019). Este projeto implementa o exploit PrintSpoofer no formato Reflective DLL, tornando-o adequado para uso com frameworks de teste de penetração, como o Cobalt Strike.
O PrintSpoofer explora uma vulnerabilidade no serviço Windows Print Spooler que permite que um usuário de baixo privilégio obtenha privilégios de nível SYSTEM. O exploit abusa da forma como o serviço Print Spooler lida com named pipes.
O PrintSpoofer opera executando as seguintes etapas:
O exploit primeiro verifica se o token atual possui o privilégio SE_IMPERSONATE_NAME. Isso é necessário para fazer a impersonação do token de outro usuário.
Um named pipe é criado usando um UUID aleatório. O caminho do pipe é:
\\.\pipe\<UUID>\pipe\spoolss
Uma conexão assíncrona é aguardada no named pipe criado. Um evento é criado e o pipe é preparado para aceitar conexões de entrada.
Em uma thread separada, uma chamada RPC é feita ao serviço Print Spooler.
Ao invocar RpcRemoteFindFirstPrinterChangeNotificationEx, o serviço tenta se conectar ao pipe que criamos.
Quando o serviço Print Spooler (executando como SYSTEM) se conecta ao named pipe, o exploit usa ImpersonateNamedPipeClient para fazer a impersonação do token do serviço.
Isso resulta na obtenção de privilégios de SYSTEM.
Com um token SYSTEM, ações de alto privilégio agora podem ser executadas.
O serviço Windows Print Spooler processa notificações de impressora por meio de named pipes. Como o serviço não valida adequadamente as conexões de pipe, um atacante pode forçá-lo a se conectar a um pipe malicioso e então fazer a impersonação do token SYSTEM.
O projeto se comunica com o serviço Print Spooler usando o MS-RPRN (Print System Remote Protocol). Este protocolo é definido por meio de um arquivo IDL (Interface Definition Language) e permite chamadas RPC.
Uma reflective DLL se comporta de maneira diferente das DLLs padrão:
LoadLibraryAbra o arquivo PrintSpoofer.sln no Visual Studio.
Selecione sua Plataforma de Solução e Configuração:
x64 ou Win32 (dependendo da arquitetura de destino)Release (produção) ou Debug (desenvolvimento)Compile a solução por meio de Build Solution (Ctrl+Shift+B).
A DLL compilada estará localizada em:
PrintSpoofer\x64\Release\PrintSpoofer.dll (for x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (for x86)
O projeto usa as seguintes definições de pré-processador:
REFLECTIVE_DLL_EXPORTS: Habilita as exportações de Reflective DLLREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: Usa um DllMain personalizadoREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: Habilita o LoadRemoteLibraryR (no modo Release)O PrintSpoofer pode ser usado com o comando elevate do Cobalt Strike:
elevate PrintSpoofer LISTENER_NAME
Onde:
PrintSpoofer: O nome do módulo de elevaçãoLISTENER_NAME: O listener que receberá o shell elevadoA DLL pode ser carregada manualmente usando técnicas de injeção de Reflective DLL.
Uma execução bem-sucedida do exploit exibirá:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppEsta ferramenta destina-se apenas a fins educacionais e a testes de penetração autorizados.
Este projeto é licenciado sob a Licença MIT. Para mais informações, consulte o arquivo LICENSE.