
Process Herpaderping – Proof of Concept, Tool und technischer Deep Dive. Process Herpaderping umgeht Sicherheitslösungen, indem es die Absichten eines Prozesses verschleiert.
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.


Im Allgemeinen ergreift ein Sicherheitsprodukt Maßnahmen bei der Prozesserstellung, indem es einen Rückruf im Windows-Kernel registriert (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
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 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).
@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.


Wir haben das Verhalten beobachtet und einiges davon mag überraschend sein. Lassen Sie uns versuchen, dieses Verhalten zu erklären.
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.
Process Doppelganging ist näher an Herpaderping. Doppelganging missbraucht transaktionsbasierte Dateioperationen und umfasst im Allgemeinen diese Schritte:
transact -> write -> map -> rollback -> execute.
In diesem Workflow erstellt das Betriebssystem die Image-Section und berücksichtigt Transaktionen, sodass die zwischengespeicherte Image-Section letztendlich das ist, was Sie in die Transaktion geschrieben haben. Microsoft hat diese Technik gepatcht. Nun, sie haben den Absturz, den sie verursachte, gepatcht. Vielleicht betrachten sie dies als "legale" Nutzung einer Transaktion. Glücklicherweise erkennt Windows Defender die Doppelganging-Technik. Doppelganging unterscheidet sich von Herpaderping dadurch, dass Herpaderping nicht auf transaktionsbasierten Dateioperationen beruht. Und Defender erkennt Herpaderping nicht.
Zur Referenz, die verallgemeinerten Techniken:
| Typ | Technik |
|---|---|
| Hollowing | map -> modify section -> execute |
| Doppelganging | transact -> write -> map -> rollback -> execute |
| Herpaderping | write -> map -> modify -> execute -> close |
Wir können die Unterschiede hier sehen. Während Herpaderping argumentativ lauter ist als Doppelganging, da die schädlichen Bits tatsächlich auf die Festplatte gelangen, haben wir gesehen, dass Sicherheitsprodukte immer noch nicht in der Lage sind, Herpaderping zu erkennen.
Es gibt keine klare Lösung hier. Es erscheint vernünftig, dass das Verhindern des Mappens/Cachens einer Image-Section, wenn Schreibzugriff auf die Datei besteht, das Loch schließen sollte. Dies könnte jedoch eine praktikable Lösung sein oder auch nicht.
Eine andere Option könnte sein, die Änderungen an der Datei auf die zwischengespeicherte Image-Section zu übertragen, wenn sie noch nicht in einen Prozess gemappt wurde. Da das Mapping in den neuen Prozess jedoch bei NtCreateProcess erfolgt, ist dies wahrscheinlich keine brauchbare Lösung.
Aus Erkennungssicht gibt es keine gute Möglichkeit, die tatsächlich gemappten Bits zu identifizieren. Die Inspektion bei IRP_MJ_CLEANUP oder
einem Rückruf, der bei PsSetCreateProcessNotifyRoutineEx registriert wurde, führt zu falscher Zuordnung, da die Bits auf der Festplatte geändert wurden. Man müsste die Datei aus der erstellten Section wiederherstellen. Es ist erwähnenswert, dass es in Windows 10 einen neuen Rückruf gibt, den Sie für PsSetCreateProcessNotifyRoutineEx2 registrieren können. Dieser leidet jedoch unter demselben Problem wie der vorherige Rückruf: Er wird aufgerufen, wenn der initiale Thread ausgeführt wird, nicht wenn das Prozessobjekt erstellt wird. Microsoft hat PsSetCreateThreadNotifyRoutineEx hinzugefügt, der aufgerufen wird, wenn der initiale Thread eingefügt wird, wenn er mit PsCreateThreadNotifyNonSystem registriert ist, im Gegensatz zu dem Zeitpunkt, an dem er kurz vor der Ausführung steht (wie beim alten Rückruf). Die Erweiterung von PSCREATEPROCESSNOTIFYTYPE, um aufgerufen zu werden, wenn das Prozessobjekt erstellt wird, wird auch nicht helfen; wir haben im Abschnitt Tiefer eintauchen gesehen, dass das Image-Section-Objekt bei NtCreateSection zwischengespeichert wird, nicht bei NtCreateProcess.
Wir können nicht ohne Weiteres identifizieren, was ausgeführt wurde. Wir müssen versuchen, das ausbeuterische Verhalten des Akteurs zu erkennen; ich überlasse die Entdeckung der Verhaltensindikatoren als Übung für den Leser.
Nachfolgend finden Sie eine Liste von Produkten und Windows-Betriebssystemen, die bis zum (31.08.2020) getestet wurden. Die Tests wurden mit einer bekannten schädlichen Binärdatei durchgeführt.
Diese Schwachstelle wurde am 17.07.2020 an das Microsoft Security Response Center (MSRC) gemeldet und von MSRC am 22.07.2020 ein Fall eröffnet. MSRC schloss ihre Untersuchung am 25.08.2020 ab und stellte fest, dass die Ergebnisse gültig sind, aber nicht den Schwellenwert für sofortige Wartung erreichen. Der Fall wurde ohne Lösung geschlossen und zur zukünftigen Überprüfung vorgemerkt, ohne Zeitplan.
Wir sind mit der Schwere dieses Fehlers nicht einverstanden; dies wurde MSRC am 27.08.2020 mitgeteilt.
Dieses Repository enthält ein Tool zur Ausübung der Herpaderping-Methode zur Prozessverschleierung. Die Verwendung ist wie folgt:
Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
SourceFile Source file to execute.
TargetFile Target file to execute the source from.
ReplacedWith File to replace the target with. Optional,
default overwrites the binary with a pattern.
-h,--help Prints tool usage.
-d,--do-not-wait Does not wait for spawned process to exit,
default waits.
-l,--logging-mask number Specifies the logging mask, defaults to full
logging.
0x1 Successes
0x2 Informational
0x4 Warnings
0x8 Errors
0x10 Contextual
-q,--quiet Runs quietly, overrides logging mask, no title.
-r,--random-obfuscation Uses random bytes rather than a pattern for
file obfuscation.
-e,--exclusive Target file is created with exclusive access and
the handle is held open as long as possible.
Without this option the handle has full share
access and is closed as soon as possible.
-u,--do-not-flush-file Does not flush file after overwrite.
-c,--close-file-early Closes file before thread creation (before the
process notify callback fires in the kernel).
Not valid with "--exclusive" option.
-k,--kill Terminates the spawned process regardless of
success or failure, this is useful in some
automation environments. Forces "--do-not-wait
option.
Das Repository verwendet Submodule. Nach dem Klonen initialisieren und aktualisieren Sie die Submodule. Die Projektdateien sind auf Visual Studio 2019 ausgerichtet.
git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln
Die folgenden werden ohne Änderungen verwendet. Danksagungen an ihre Autoren.
| Betriebssystem | Version | Angreifbar |
|---|
| Windows 7 Enterprise x86 | 6.1.7601 | Ja |
| Windows 10 Pro x64 | 10.0.18363.900 | Ja |
| Windows 10 Pro Insider Preview x64 | 10.0.20170.1000 | Ja |
| Windows 10 Pro Insider Preview x64 | 10.0.20201.1000 | Ja |
| Sicherheitsprodukt | Version | Angreifbar |
|---|
| Windows Defender AntiMalware Client | 4.18.2006.10 | Ja |
| Windows Defender Engine | 1.1.17200.2 | Ja |
| Windows Defender Antivirus | 1.319.1127.0 | Ja |
| Windows Defender Antispyware | 1.319.1127.0 | Ja |
| Windows Defender AntiMalware Client | 4.18.2007.6 | Ja |
| Windows Defender Engine | 1.1.17300.2 | Ja |
| Windows Defender Antivirus | 1.319.1676.0 | Ja |
| Windows Defender Antispyware | 1.319.1676.0 | Ja |
| Windows Defender AntiMalware Client | 4.18.2007.8 | Ja |
| Windows Defender Engine | 1.1.17400.5 | Ja |
| Windows Defender Antivirus | 1.323.267.0 | Ja |
| Windows Defender Antispyware | 1.323.267.0 | Ja |