
Process Herpaderping – Proof of Concept, Tool und technischer Deep Dive. Process Herpaderping umgeht Sicherheitslösungen, indem es die Absichten eines Prozesses verschleiert.
[
][png.HerpaderpIcon]
Process Herpaderping ist eine Methode, um die Absichten eines Prozesses zu verschleiern, indem der Inhalt auf der Festplatte geändert wird, nachdem das Image gemappt wurde. Dies führt zu seltsamem Verhalten von Sicherheitsprodukten und dem Betriebssystem selbst.
![][png.mimioogle]
![][gif.SurivDemo]
Im Allgemeinen ergreift ein Sicherheitsprodukt Maßnahmen bei der Prozesserstellung, indem es einen Rückruf im Windows-Kernel registriert ([PsSetCreateProcessNotifyRoutineEx][msdn.PsSetCreateProcessNotifyRoutineEx]). Zu diesem Zeitpunkt kann ein Sicherheitsprodukt die Datei überprüfen, die zum Mappen der ausführbaren Datei verwendet wurde, und entscheiden, ob dieser Prozess ausgeführt werden darf. Dieser Kernel-Rückruf wird aufgerufen, wenn der initiale Thread eingefügt wird, nicht wenn das Prozessobjekt erstellt wird.
Aus diesem Grund kann ein Akteur einen Prozess erstellen und mappen, den Inhalt der Datei ändern und dann den initialen Thread erstellen. Ein Produkt, das bei der Erstellungsrückmeldung eine Inspektion durchführt, würde den geänderten Inhalt sehen. Darüber hinaus verwenden einige Produkte einen On-Write-Scan-Ansatz, der darin besteht, Dateischreibvorgänge zu überwachen. Eine bekannte Optimierung besteht darin, zu dokumentieren, dass in die Datei geschrieben wurde, und die eigentliche Inspektion aufzuschieben, bis [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP]
auftritt (z.B. das Dateihandle geschlossen wird). Daher wird ein Akteur, der einen write -> map -> modify -> execute -> close-Workflow verwendet, das On-Write-Scanning umgehen, das ausschließlich auf die Inspektion bei [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP] angewiesen ist.
Um diese Konvention zu missbrauchen, schreiben wir zunächst eine Binärdatei auf eine Zieldatei auf der Festplatte. Dann mappen wir ein Image der Zieldatei und übergeben es dem Betriebssystem zur Prozesserstellung. Das Betriebssystem mappt freundlicherweise die ursprüngliche Binärdatei für uns. Mit dem vorhandenen Dateihandle, und bevor wir den initialen Thread erstellen, ändern wir den Inhalt der Zieldatei, um die das Image unterstützende Datei zu verschleiern oder zu fälschen. Etwas später erstellen wir den initialen Thread, um die Ausführung der ursprünglichen Binärdatei zu beginnen. Schließlich schließen wir das Handle der Zieldatei. Gehen wir Schritt für Schritt vor:
NtCreateProcessEx).NtCreateThreadEx).
![][svg.StateDiagram]
@startuml
hide empty description
[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]
CreateFile : Erstelle Zieldatei, Handle offen halten.
Write : Schreibe Quell-Payload in Zieldatei.
Modify : Verschleiere die Datei auf der Festplatte.
NtCreateSection : Erstelle Section mit Dateihandle.
NtCreateProcessEx : Image-Section für Prozess wird gemappt und im Dateiobjekt zwischengespeichert.
NtCreateThreadEx : Die zwischengespeicherte Section wird verwendet.
NtCreateThreadEx : Prozessbenachrichtigungsroutinen feuern im Kernel.
Inspect : Der Inhalt auf der Festplatte stimmt nicht mit dem Ausgeführten überein.
Inspect : Die Inspektion der Datei zu diesem Zeitpunkt führt zu falscher Zuordnung.
@enduml
Sie werden im untenstehenden Demo sehen, dass CMD.exe als Ausführungsziel verwendet wird. Der erste Durchlauf überschreibt die Bytes auf der Festplatte mit einem Muster. Der zweite Durchlauf überschreibt CMD.exe mit ProcessHacker.exe. Das Herpaderping-Tool repariert die Binärdatei, um sie so nah wie möglich an ProcessHacker.exe aussehen zu lassen, sogar die ursprüngliche Signatur wird beibehalten. Beachten Sie die mehrfachen Ausführungen derselben Binärdatei und wie der Prozess für den Benutzer im Vergleich zu dem, was in der Datei auf der Festplatte ist, aussieht.
![][gif.ProcessHerpaderp]
![][png.procmon]
Wir haben das Verhalten beobachtet und einiges davon mag überraschend sein. Lassen Sie uns versuchen, dieses Verhalten zu erklären.
[Technischer Deep Dive][md.DivingDeeper]
Beim Entwerfen von Produkten zur Sicherung von Windows-Plattformen sind viele Ingenieure in diesem Bereich (mich eingeschlossen) auf vorgefasste Meinungen darüber gestoßen, wie das Betriebssystem mit Daten umgeht. In diesem Szenario könnte man erwarten, dass die Datei auf der Festplatte "gesperrt" bleibt, wenn der Prozess erstellt wird. Man kann die Datei nicht löschen. Man kann nicht hineinschreiben. Aber man kann sie umbenennen. Wie hier zu sehen ist, kann man unter den richtigen Bedingungen tatsächlich hineinschreiben. Bleiben Sie wachsam in Bezug auf Ihre Annahmen, hinterfragen Sie sie immer und recherchieren Sie.
Die Motivation für diese Forschung entstand, als ich herausfand, wie man eine Analyse durchführt, wenn eine Datei geschrieben wird. Mit einem Hintergrund in der Erforschung von Process Hollowing und Doppelganging hatte ich theoretisiert, dass dies möglich sein könnte. Das Ziel ist es, bessere Sicherheit zu bieten. Man kann kein besseres Schloss bauen, ohne zuerst zu verstehen, wie man das alte bricht.
Herpaderping ist ähnlich wie Hollowing und Doppelganging, jedoch gibt es einige wesentliche Unterschiede:
Process Hollowing beinhaltet das Modifizieren der gemappten Section vor Beginn der Ausführung, was abstrakt wie folgt aussieht: map -> modify section -> execute. Dieser Workflow führt dazu, dass der beabsichtigte Ausführungsfluss des Hollowed-Prozesses in unbeabsichtigten Code abweicht. Doppelganging könnte als eine Form von Hollowing betrachtet werden. Allerdings ist Hollowing meiner Meinung nach näher an Injection, da Hollowing normalerweise ein explizites Schreiben in den bereits gemappten Code beinhaltet. Dies unterscheidet sich von Herpaderping, wo keine modifizierten Sections vorhanden sind.