
Speicherauszug eines PPL mit einem Userland-Exploit
⚠️ 2022-07-24 - Ab Windows 10 21H2 10.0.19044.1826 (Update Juli 2022) funktioniert der in PPLdump implementierte Exploit nicht mehr. Ein Patch in NTDLL verhindert nun, dass PPLs Known DLLs laden. Weitere Informationen hier.
Dieses Tool implementiert einen Userland-Exploit, der ursprünglich von James Forshaw (auch bekannt als @tiraniddo) in diesem Blogbeitrag diskutiert wurde, um den Speicher eines beliebigen PPL als Administrator auszudumpen.
Ich habe zwei Blogbeiträge zu diesem Tool geschrieben. Der erste Teil behandelt die Konzepte von Protected Processes, während der zweite Teil die Umgehungstechnik selbst erläutert.
Führen Sie einfach die ausführbare Datei ohne Argumente aus, und Sie erhalten eine detaillierte Hilfe/Verwendung.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
Zunächst: PPLs wurden mit Windows 8.1 eingeführt, daher werden ältere Windows-Versionen offensichtlich nicht unterstützt. Dieses Projekt zielt hauptsächlich auf Windows 10 (und dessen Server-Editionen) ab, aber ich habe es auch auf älteren Versionen getestet. Eine Zusammenfassungstabelle der von mir durchgeführten Tests finden Sie im gleichnamigen Abschnitt.
Andere PPL-Bypass-Tools führen normalerweise beliebigen Code im Kernel über einen digital signierten Treiber aus. Dieses hier unterscheidet sich, da es nur Userland-Tricks verwendet und (fast) dateilos ist.
Dieses Tool nutzt einen sehr cleveren Trick, der ursprünglich von James Forshaw im Jahr 2018 diskutiert wurde (siehe Credits). Dabei wird die API-Funktion DefineDosDevice verwendet, um das System dazu zu bringen, einen beliebigen Known DLL-Eintrag zu erstellen. Da PPLs die digitale Signatur von Known DLLs nicht überprüfen, kann dies später für einen DLL-Hijacking-Angriff genutzt werden, um beliebigen Code in einem PPL auszuführen.
Obwohl dieses Tool in einer zweiten Stufe einen DLL-Hijacking-Angriff durchführt, erstellt es keine neue DLL-Datei auf der Festplatte. Stattdessen wird eine NTFS-Transaktion verwendet, um den Inhalt einer vorhandenen Datei virtuell zu ersetzen – eine Technik, die direkt von der Arbeit von @_ForrestOrr inspiriert ist (siehe Credits).
Die kurze Antwort lautet "nein". Erstens erfolgt kein direkter Kernel-Zugriff, daher besteht aus dieser Sicht kein Risiko eines BSOD. Im schlimmsten Fall könnte das Tool den erstellten Known DLL-Eintrag nicht entfernen, aber dies führt nicht zu einem Denial of Service. Es bleibt einfach bis zum nächsten Neustart des Rechners bestehen. Da der erstellte Eintrag nur ein symbolischer Link auf einen nicht existierenden Abschnitt wäre, würde das System letztendlich auf den Standard-Speicherort (d. h. den System32-Ordner) zurückfallen, sodass er andere auf dem Rechner laufende Programme nicht beeinträchtigt.
⚠️ Der Exploit schlägt auf vollständig aktualisierten Windows 8.1 / Server 2012 R2-Rechnern fehl. Ich muss noch herausfinden, welcher Patch den Fehler verursacht hat.
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ Unter Windows 8.1 / Server 2012 R2 müssen Sie die Binärdatei möglicherweise statisch kompilieren (siehe "Build-Anleitung" unten).
Diese Visual Studio-Projektmappe besteht aus zwei Projekten (der ausführbaren Datei und einer Payload-DLL), die in einer bestimmten Reihenfolge kompiliert werden müssen. Alles ist vorkonfiguriert, sodass Sie einfach diesen einfachen Anweisungen folgen müssen. Die kompilierte Payload-DLL wird automatisch in die endgültige ausführbare Datei eingebettet.
Release / x64 oder Release / x86, je nach Architektur des Zielrechners.Build > Projektmappe erstellen.Unter Windows 8.1 / Server 2012 R2 müssen Sie die Binärdatei möglicherweise statisch kompilieren.
PPLdump.Konfigurationseigenschaften > C/C++ > Codegenerierung.Multithreaded (/MT) als Laufzeitbibliothek-Option.| Windows-Version | Build | Edition | Arch | Admin | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |