
Cria um driver ELAM e um serviço que inicia um processo filho assinado como Anti-Malware Protected Process-Light (PPL) no Windows, para investigação de segurança.
Este projeto tem como objetivo permitir a execução de processos 'arbitrários*' como Anti Malware Protected-Process-Light (PPL), para fins de pesquisa. (* Consulte a seção Restrições para mais detalhes)
Consulte este blog que escrevi para mais detalhes e o raciocínio por trás deste projeto.
O processo protegido pelo sistema é um modelo de segurança no Windows projetado para proteger processos do sistema e antivírus contra adulteração ou introspecção, mesmo por Administradores/SYSTEM.
Processos iniciados como Anti Malware 'Protected Process-Light' (PPL) são restritos no que podem fazer, só podem carregar código assinado, mas não podem ser depurados, inspecionados ou interrompidos por processos não protegidos. Além disso, eles podem
obter acesso a dados especiais, como o Provedor ETW Microsoft-Windows-Threat-Intelligence.
Este projeto cria um driver Early-Launch Anti Malware (ELAM) e um serviço em modo usuário. O serviço iniciará um processo filho configurável quando for iniciado, que também será marcado como PPL.
O binário filho deve ser assinado com o mesmo certificado que o serviço, juntamente com algumas outras restrições, mas fora isso pode ser qualquer binário e argumentos de linha de comando que você escolher.
Honestamente, não estou explicando bem o que são ELAM e PPL; em vez disso, recomendo começar por aqui:
Você pode obter uma versão pré-compilada e assinada do serviço PPLRunner e do módulo de kernel em Releases. A release também contém o certificado autogerado e a chave privada em um arquivo .pfx
protegido por senha com a senha password. Eu avisei que isto é apenas para fins de pesquisa, certo?
Para gerar e compilar seu próprio projeto:
Certifique-se de ter os Windows SDKs instalados.
Abra generate_cert.ps1 e sign_file.ps1, e altere a variável $password para outra coisa (elas devem corresponder entre si).
Execute generate_cert.ps1. Isso gerará um ppl_runner.pfx com um novo certificado privado e público.
Este será usado para assinar todos os binários usados pelo PPLRunner.
Compile ppl_runner.sln. Isso produzirá 3 binários:
O Driver de Kernel ELAM que contém as informações do certificado. O driver não faz nada de fato e não será realmente carregado; ele é usado apenas como um veículo para o certificado de assinatura.
O instalador e binário do Serviço. Como um serviço PPL, quando iniciado, ele lançará um processo filho, também como PPL, e então parará e encerrará.
Um executável de exemplo que será assinado com o certificado correto pelo Visual Studio no momento da compilação. O PPLRunner pode executar quase qualquer binário; este é apenas um exemplo que será assinado automaticamente.
NOTA Instale apenas em uma máquina de teste, não em produção/seu PC pessoal.
Após a compilação, copie elam_driver.sys e ppl_runner.exe para uma pasta na máquina de destino.
Habilite a assinatura de teste executando isto em um prompt elevado e, em seguida, reinicie:
bcdedit /set testsigning on
ppl_runner.exe install
Isso deve instalar um serviço chamado ppl_runner.
Para assinar um binário a executar, assine-o com o certificado ppl_runner.pfx, usando o script sign_file.ps1,
ou simplesmente executando o signtool.exe você mesmo. Se não tiver o signtool.exe, ele está nos Windows SDKs.
Crie a chave de registo HKLM\SOFTWARE\PPL_RUNNER.
Defina a chave predefinida/vazia como REG_SZ, contendo o caminho completo para o binário a executar,
e quaisquer argumentos de linha de comandos. Por exemplo, a partir da linha de comandos:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Para fazer o serviço iniciar o executável, basta executar a partir de um prompt elevado:
net start ppl_runner
Como um serviço PPL, quando iniciado, o ppl_runner lerá a chave de registro, iniciará o processo filho,
também como PPL, e então parará e sairá. Um lançamento bem-sucedido ainda dirá the service failed to run,
mas se você verificar o código de retorno com sc query ppl_runner, ele deve ser 0, ou seja, ERROR_SUCCESS.
O processo filho não será visível, no entanto, se você puder usar Debug Outputs e DBGView.exe para obter
alguma forma de saída (veja o código child_example).
Como o serviço também é Anti Malware PPL, ele só pode ser parado e excluído por um processo de nível igualmente elevado. No entanto, podemos usar o PPLRunner para se remover, simplesmente definindo o comando na chave de registro como:
C:\path\to\ppl_runner.exe remove
E execute o Serviço. Ou seja, execute:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning.ppl_runner.exe install deve ser executado novamente após cada reinicializaçãoExecute o DBGView da Sysinternals e registre Win32 Global, filtrando por *[PPL_RUNNER]*.
Isso mostrará todos os logs do serviço e do instalador.
A definir - blog do Sealighter
James Forshaw criou um projeto incrível para injetar código em processos PPL existentes.
Seguir Alex Ionescu é provavelmente a melhor maneira de aprender mais sobre ELAM e PPL. Possivelmente comece com isto: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Seguir Matt Graeber e James Forshaw é outra ótima maneira.
Agradecimentos enormes ao Matt pelo script powershell para obter o hash 'To-Be-Signed' de um certificado.