
Compile un pilote ELAM et un service qui lance un processus enfant signé en tant que processus protégé anti-malware léger (PPL) sous Windows, à des fins de recherche en sécurité.
Ce projet a pour but de permettre l'exécution d'un processus « arbitraire* » en tant que Anti Malware Protected-Process-Light (PPL), à des fins de recherche. (* Voir la section Restrictions pour plus de détails)
Voir cet article de blog que j'ai écrit pour plus de détails et le raisonnement derrière ce projet.
Le processus protégé par le système est un modèle de sécurité sous Windows conçu pour protéger les processus système et antivirus contre la falsification ou l'introspection, même par des Administrateurs/SYSTEM.
Les processus démarrés en tant qu'Anti Malware « Protected Process-Light » (PPL) sont limités dans ce qu'ils peuvent faire, ne peuvent charger que du code signé, mais ne peuvent pas être débogués, inspectés ou arrêtés par des processus non protégés. De plus, ils peuvent
accéder à des données spéciales, telles que le fournisseur ETW Microsoft-Windows-Threat-Intelligence.
Ce projet crée un pilote Early-Launch Anti Malware (ELAM) et un service en mode utilisateur. Le service lancera un processus enfant configurable lors de son démarrage, lequel sera également marqué comme PPL.
Le binaire enfant doit être signé avec le même certificat que le service, ainsi que quelques autres restrictions, mais peut sinon être n'importe quel binaire et arguments de ligne de commande de votre choix.
Honnêtement, je n'explique pas très bien ce que sont ELAM et PPL, je recommande plutôt de commencer ici :
Vous pouvez récupérer une version pré-construite et signée du service PPLRunner et du module noyau depuis les Releases. La release contient également le certificat et la clé privée générés automatiquement dans un fichier .pfx
protégé par mot de passe avec le mot de passe password. Je vous avais bien dit que c'était uniquement à des fins de recherche, non ?
Pour générer et construire votre propre projet :
Assurez-vous que les Windows SDKs sont installés.
Ouvrez generate_cert.ps1 et sign_file.ps1, et changez la variable $password par autre chose (elles doivent correspondre entre elles).
Exécutez generate_cert.ps1. Cela générera un ppl_runner.pfx avec un nouveau certificat privé et public.
Celui-ci sera utilisé pour signer tous les binaires utilisés par PPLRunner.
Compilez ppl_runner.sln. Cela produira 3 binaires :
Le pilote noyau ELAM qui contient les informations de certificat. Le pilote ne fait en réalité rien, et ne sera pas réellement chargé, il sert simplement de véhicule pour le certificat de signature.
L'installateur et binaire du service. En tant que service PPL, lors de son démarrage il lancera un processus enfant, également en PPL, puis s'arrêtera et se terminera.
Un exécutable d'exemple qui sera signé avec le bon certificat par Visual Studio au moment du build. PPLRunner peut exécuter presque n'importe quel binaire, ce n'est qu'un exemple qui sera automatiquement signé.
NOTE N'installez que sur une machine de test, pas en production/sur votre PC personnel.
Une fois compilé, copiez elam_driver.sys et ppl_runner.exe dans un dossier sur la machine cible.
Activez la signature de test en exécutant ceci depuis une invite élevée, puis redémarrez :
bcdedit /set testsigning on
ppl_runner.exe install
Cela devrait installer un service nommé ppl_runner.
Pour signer un binaire à exécuter, signez-le avec le certificat ppl_runner.pfx, en utilisant soit le script sign_file.ps1,
soit en exécutant simplement signtool.exe vous-même. Si vous ne disposez pas de signtool.exe, il se trouve dans les Windows SDKs.
Créez la clé de registre HKLM\SOFTWARE\PPL_RUNNER.
Définissez la clé par défaut/vide comme une valeur REG_SZ, contenant le chemin complet du binaire à exécuter,
ainsi que tout argument de ligne de commande. Par exemple, depuis la ligne de commande :
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Pour que le service lance l'exécutable, exécutez simplement depuis une invite élevée :
net start ppl_runner
En tant que service PPL, une fois démarré, ppl_runner lira la clé de registre, lancera le processus enfant,
également en tant que PPL, puis s'arrêtera et se terminera. Un lancement réussi affichera toujours the service failed to run,
mais si vous vérifiez le code de retour avec sc query ppl_runner, il devrait être 0, c'est-à-dire ERROR_SUCCESS.
Le processus enfant ne sera pas visible, toutefois si vous pouvez utiliser les sorties de débogage et DBGView.exe pour obtenir
une forme de sortie (voir le code child_example).
Comme le service est également un PPL Anti-Malware, il ne peut être arrêté et supprimé que par un processus de niveau tout aussi élevé. Cependant, nous pouvons utiliser PPLRunner pour se supprimer lui-même, il suffit de définir la commande dans la clé de registre comme suit :
C:\path\to\ppl_runner.exe remove
Et exécutez le service. c'est-à-dire exécutez :
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 doit être réexécuté après chaque redémarrageLancez DBGView de Sysinternals et journalisez Win32 Global, en filtrant sur *[PPL_RUNNER]*.
Cela affichera tous les journaux du service et de l'installateur.
À définir - blog Sealighter
James Forshaw a créé un excellent projet pour injecter du code dans des processus PPL existants.
Suivre Alex Ionescu est probablement le meilleur moyen d'en apprendre davantage sur ELAM et PPL. Commencez éventuellement par ceci : https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Suivre Matt Graeber et James Forshaw est une autre excellente option.
Un immense merci à Matt pour le script powershell permettant d'obtenir le hash « To-Be-Signed » à partir d'un certificat.