
Erstellt einen ELAM-Treiber und -Dienst, der einen signierten untergeordneten Prozess als Anti-Malware Protected Process-Light (PPL) unter Windows startet, für Sicherheitsforschung.
Dieses Projekt ermöglicht es, einen „beliebigen*“ Prozess als Anti-Malware Protected-Process-Light (PPL) auszuführen, zu Forschungszwecken. (* Siehe den Abschnitt Einschränkungen für weitere Details)
Siehe diesen von mir geschriebenen Blogbeitrag für weitere Details und die Beweggründe hinter diesem Projekt.
Der systemgeschützte Prozess ist ein Sicherheitsmodell in Windows, das dazu dient, System- und Antivirenprozesse vor Manipulation oder Introspektion zu schützen, selbst durch Administratoren/SYSTEM.
Prozesse, die als Anti-Malware „Protected Process-Light“ (PPL) gestartet werden, sind in dem eingeschränkt, was sie tun können, können nur signierten Code laden, aber können nicht von nicht geschützten Prozessen debuggt, inspiziert oder gestoppt werden. Darüber hinaus können sie Zugriff auf spezielle Daten erhalten, wie etwa den ETW-Provider Microsoft-Windows-Threat-Intelligence.
Dieses Projekt erstellt einen Early-Launch Anti Malware (ELAM)-Treiber und einen Usermode-Dienst. Der Dienst startet bei seinem Start einen konfigurierbaren Kindprozess, der ebenfalls als PPL markiert wird.
Die Kind-Binärdatei muss mit demselben Zertifikat wie der Dienst signiert sein, zusammen mit einigen anderen Einschränkungen, kann aber ansonsten eine beliebige Binärdatei und beliebige Kommandozeilenargumente sein, die Sie wählen.
Ehrlich gesagt gelingt es mir nicht gut, zu erklären, was ELAM und PPL sind; stattdessen empfehle ich, hier zu beginnen:
Sie können eine vorgefertigte und signierte Version des PPLRunner-Dienstes und des Kernelmoduls aus den Releases herunterladen. Das Release enthält außerdem das automatisch generierte Zertifikat und den privaten Schlüssel in einer .pfx-Datei, die mit dem Passwort password passwortgeschützt ist. Ich habe doch gesagt, dass dies nur zu Forschungszwecken dient, oder?
Um Ihr eigenes Projekt zu generieren und zu erstellen:
Stellen Sie sicher, dass Sie die Windows SDKs installiert haben.
Öffnen Sie generate_cert.ps1 und sign_file.ps1 und ändern Sie die Variable $password in etwas anderes (sie müssen zueinander passen).
Führen Sie generate_cert.ps1 aus. Dies erzeugt eine ppl_runner.pfx mit einem neuen privaten und öffentlichen Zertifikat.
Diese wird verwendet, um alle von PPLRunner verwendeten Binärdateien zu signieren.
Erstellen Sie ppl_runner.sln. Dies erzeugt 3 Binärdateien:
Der ELAM-Kernel-Treiber, der die Zertifikatsinformationen enthält. Der Treiber tut eigentlich nichts und wird nicht tatsächlich geladen; er dient lediglich als Träger für das Signaturzertifikat.
Der Dienst-Installer und die Binärdatei. Als PPL-Dienst startet er beim Start einen Kindprozess, ebenfalls als PPL, und beendet sich dann und exitet.
Eine Beispiel-Binärdatei, die zur Build-Zeit von Visual Studio mit dem korrekten Zertifikat signiert wird. PPLRunner kann nahezu jede Binärdatei ausführen; dies ist nur ein Beispiel, das automatisch signiert wird.
HINWEIS Nur auf einer Testmaschine installieren, nicht auf einer Produktions-/Ihrem Heim-PC.
Sobald erstellt, kopieren Sie elam_driver.sys und ppl_runner.exe in einen Ordner auf der Zielmaschine.
Aktivieren Sie das Testsignieren, indem Sie Folgendes in einer erhöhten Eingabeaufforderung ausführen und dann neu starten:
bcdedit /set testsigning on
ppl_runner.exe install
Dadurch sollte ein Dienst namens ppl_runner installiert werden.
Um eine ausführbare Binärdatei zu signieren, signieren Sie sie mit dem Zertifikat ppl_runner.pfx, entweder mit dem Skript sign_file.ps1
oder indem Sie signtool.exe selbst ausführen. Falls Sie signtool.exe nicht haben, befindet es sich in den Windows SDKs.
Erstellen Sie den Registrierungsschlüssel HKLM\SOFTWARE\PPL_RUNNER.
Setzen Sie den Standard-/leeren Schlüssel auf einen REG_SZ, der den vollständigen Pfad zur auszuführenden Binärdatei
sowie etwaige Kommandozeilenargumente enthält, z. B. über die Kommandozeile:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Um den Dienst dazu zu bringen, die ausführbare Datei zu starten, führen Sie einfach in einer Eingabeaufforderung mit erhöhten Rechten aus:
net start ppl_runner
Als PPL-Dienst liest ppl_runner beim Start den Registrierungsschlüssel, startet den untergeordneten Prozess,
ebenfalls als PPL, und beendet sich dann. Ein erfolgreicher Start meldet weiterhin the service failed to run,
aber wenn Sie den Rückgabecode mit sc query ppl_runner prüfen, sollte er 0 sein, d. h. ERROR_SUCCESS.
Der untergeordnete Prozess ist nicht sichtbar, aber Sie können Debug Outputs und DBGView.exe verwenden, um
eine Form von Ausgabe zu erhalten (siehe den child_example-Code).
Da der Dienst ebenfalls Anti-Malware-PPL ist, kann er nur von einem ähnlich hochprivilegierten Prozess gestoppt und gelöscht werden. Wir können jedoch PPLRunner verwenden, um sich selbst zu entfernen; setzen Sie dazu einfach den Befehl im Registrierungsschlüssel auf:
C:\path\to\ppl_runner.exe remove
Und starten Sie den Dienst. D. h. führen Sie aus:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning-Modus.ppl_runner.exe install muss nach jedem Neustart erneut ausgeführt werdenFühren Sie DBGView von Sysinternals aus und protokollieren Sie Win32 Global, gefiltert nach *[PPL_RUNNER]*.
Dadurch werden alle Protokolle des Dienstes und des Installers angezeigt.
Noch festzulegen – Sealighter-Blog
James Forshaw hat ein großartiges Projekt erstellt, um Code in bestehende PPL-Prozesse einzuschleusen.
Alex Ionescu zu folgen ist wahrscheinlich der beste Weg, um mehr über ELAM und PPL zu erfahren. Beginnen Sie möglicherweise hiermit: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Matt Graeber und James Forshaw zu folgen ist ein weiterer großartiger Weg.
Großer Dank an Matt für das powershell-Skript zum Abrufen des „To-Be-Signed“-Hashes aus einem Zertifikat.
James hat viel über PPL und seine Schwachstellen geschrieben.