
Compila un controlador y servicio ELAM que inicia un proceso hijo firmado como Anti-Malware Protected Process-Light (PPL) en Windows, para investigación de seguridad.
Este proyecto tiene como objetivo permitir la ejecución de procesos 'arbitrarios*' como Anti Malware Protected-Process-Light (PPL), con fines de investigación. (* Consulte la sección Restricciones para más detalles)
Consulte este blog que escribí para más detalles y el razonamiento detrás de este proyecto.
El proceso protegido del sistema es un modelo de seguridad en Windows diseñado para proteger los procesos del sistema y antivirus contra manipulación o introspección, incluso por parte de Administradores/SYSTEM.
Los procesos iniciados como Anti Malware 'Protected Process-Light' (PPL) tienen restringido lo que pueden hacer, solo pueden cargar código firmado, pero no pueden ser depurados, inspeccionados ni detenidos por procesos no protegidos. Además, pueden
obtener acceso a datos especiales, como el proveedor ETW Microsoft-Windows-Threat-Intelligence.
Este proyecto crea un controlador Early-Launch Anti Malware (ELAM) y un servicio en modo usuario. El servicio lanzará un proceso hijo configurable cuando se inicie, el cual también será marcado como PPL.
El binario hijo debe estar firmado con el mismo certificado que el servicio, junto con algunas otras restricciones, pero por lo demás puede ser cualquier binario y argumentos de línea de comandos que elija.
Honestamente, no estoy explicando bien qué son ELAM y PPL; en su lugar, recomiendo comenzar aquí:
Puede obtener una versión precompilada y firmada del servicio PPLRunner y del módulo del kernel desde Releases. La versión también incluye el certificado autogenerado y la clave privada en un archivo .pfx
protegido con contraseña, siendo la contraseña password. Ya dije que esto es solo para fines de investigación, ¿verdad?
Para generar y compilar su propio proyecto:
Asegúrese de tener instalados los SDK de Windows.
Abra generate_cert.ps1 y sign_file.ps1, y cambie la variable $password por otra cosa (deben coincidir entre sí).
Ejecute generate_cert.ps1. Esto generará un ppl_runner.pfx con un nuevo certificado privado y público.
Se utilizará para firmar todos los binarios usados por PPLRunner.
Compile ppl_runner.sln. Esto producirá 3 binarios:
El controlador de kernel ELAM que contiene la información del certificado. El controlador en realidad no hace nada y no se cargará realmente; solo se usa como vehículo para el certificado de firma.
El instalador y binario del servicio. Como servicio PPL, al iniciarse lanzará un proceso hijo, también como PPL, y luego se detendrá y saldrá.
Un ejecutable de ejemplo que será firmado con el certificado correcto por Visual Studio en el momento de la compilación. PPLRunner puede ejecutar casi cualquier binario; este es solo un ejemplo que se firmará automáticamente.
NOTA Instálelo solo en una máquina de pruebas, no en producción ni en su PC personal.
Una vez compilado, copie elam_driver.sys y ppl_runner.exe a una carpeta en la máquina de destino.
Habilite la firma de prueba ejecutando esto desde un símbolo del sistema elevado, luego reinicie:
bcdedit /set testsigning on
ppl_runner.exe install
Esto debería instalar un servicio llamado ppl_runner.
Para firmar un binario que se ejecutará, fírmalo con el certificado ppl_runner.pfx, usando el script sign_file.ps1,
o simplemente ejecutando signtool.exe tú mismo. Si no tienes signtool.exe, está en los Windows SDKs.
Crea la clave de registro HKLM\SOFTWARE\PPL_RUNNER.
Establece la clave predeterminada/vacía como un REG_SZ, que contenga la ruta completa al binario a ejecutar,
y cualquier argumento de línea de comandos. p. ej. desde la línea de comandos:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Para hacer que el servicio lance el ejecutable, simplemente ejecute desde un símbolo del sistema con privilegios elevados:
net start ppl_runner
Como servicio PPL, cuando se inicie ppl_runner leerá la clave del registro, lanzará el proceso hijo,
también como PPL, y luego se detendrá y saldrá. Un lanzamiento exitoso seguirá mostrando the service failed to run,
pero si verificas el código de retorno con sc query ppl_runner, debería ser 0, es decir, ERROR_SUCCESS.
El proceso hijo no será visible, sin embargo, si puedes usar Debug Outputs y DBGView.exe para obtener
algún tipo de salida (consulta el código de child_example).
Como el servicio también es Anti Malware PPL, solo puede ser detenido y eliminado por un proceso de nivel similarmente alto. Sin embargo, podemos usar PPLRunner para eliminarse a sí mismo, simplemente establece el comando en la clave del registro como:
C:\path\to\ppl_runner.exe remove
Y ejecuta el Servicio. Es decir, ejecuta:
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 debe volver a ejecutarse después de cada reinicio.Ejecute DBGView de Sysinternals y registre Win32 Global, filtrando por *[PPL_RUNNER]*.
Esto mostrará todos los registros del servicio y del instalador.
Por definir - blog de Sealighter
James Forshaw creó un proyecto increíble para inyectar código en procesos PPL existentes.
Seguir a Alex Ionescu es probablemente la mejor manera de aprender más sobre ELAM y PPL. Posiblemente empezar con esto: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Seguir a Matt Graeber y a James Forshaw es otra gran manera.
Un enorme agradecimiento a Matt por el script de powershell para obtener el hash 'To-Be-Signed' de un certificado.