
Proof of concept, strumento e approfondimento tecnico di Process Herpaderping. Process Herpaderping aggira i prodotti di sicurezza oscurando le intenzioni di un processo.
[
][png.HerpaderpIcon]
Process Herpaderping è un metodo per oscurare le intenzioni di un processo modificando il contenuto su disco dopo che l'immagine è stata mappata. Ciò risulta in un comportamento curioso da parte dei prodotti di sicurezza e del sistema operativo stesso.
![][png.mimioogle]
![][gif.SurivDemo]
Generalmente, un prodotto di sicurezza interviene sulla creazione di un processo registrando un callback nel kernel di Windows ([PsSetCreateProcessNotifyRoutineEx][msdn.PsSetCreateProcessNotifyRoutineEx]). A questo punto, un prodotto di sicurezza può ispezionare il file usato per mappare l'eseguibile e determinare se questo processo deve essere autorizzato a essere eseguito. Questo callback del kernel viene invocato quando il thread iniziale viene inserito, non quando l'oggetto processo viene creato.
A causa di ciò, un attore può creare e mappare un processo, modificare il contenuto del file, quindi creare il thread iniziale. Un prodotto che effettua l'ispezione al callback di creazione vedrebbe il contenuto modificato. Inoltre, alcuni prodotti utilizzano un approccio di scansione su scrittura che consiste nel monitorare le scritture dei file. Un'ottimizzazione comune qui è registrare che il file è stato scritto e rimandare l'ispezione effettiva fino a quando non si verifica [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP] (ad esempio quando l'handle del file viene chiuso). Pertanto, un attore che utilizza un flusso di lavoro write -> map -> modify -> execute -> close eluderà la scansione su scrittura che si basa esclusivamente sull'ispezione a [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP].
Per abusare di questa convenzione, scriviamo prima un binario su un file di destinazione su disco. Quindi, mappiamo un'immagine del file di destinazione e la forniamo al sistema operativo da usare per la creazione del processo. Il sistema operativo mappa gentilmente il binario originale per noi. Usando l'handle del file esistente, e prima di creare il thread iniziale, modifichiamo il contenuto del file di destinazione per oscurare o falsificare il file che supporta l'immagine. Qualche tempo dopo, creiamo il thread iniziale per iniziare l'esecuzione del binario originale. Infine, chiuderemo l'handle del file di destinazione. Esaminiamolo passo dopo passo:
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 : Crea il file di destinazione, mantieni l'handle aperto.
Write : Scrivi il payload sorgente nel file di destinazione.
Modify : Oscura il file su disco.
NtCreateSection : Crea la sezione usando l'handle del file.
NtCreateProcessEx : La sezione immagine per il processo viene mappata e memorizzata nella cache nell'oggetto file.
NtCreateThreadEx : La sezione in cache viene utilizzata.
NtCreateThreadEx : Le routine di notifica del processo scattano nel kernel.
Inspect : I contenuti su disco non corrispondono a ciò che è stato eseguito.
Inspect : L'ispezione del file in questo momento porterà a un'attribuzione errata.
@enduml
Vedrai nella demo qui sotto, CMD.exe è usato come destinazione di esecuzione. La prima esecuzione sovrascrive i byte su disco con un pattern. La seconda esecuzione sovrascrive CMD.exe con ProcessHacker.exe. Lo strumento Herpaderping aggiusta il binario per assomigliare il più possibile a ProcessHacker.exe, conservando persino la firma originale. Nota le molteplici esecuzioni dello stesso binario e come il processo appare all'utente rispetto a ciò che è nel file su disco.
![][gif.ProcessHerpaderp]
![][png.procmon]
Abbiamo osservato il comportamento e parte di questo potrebbe sorprendere. Proviamo a spiegare questo comportamento.
[Approfondimento tecnico][md.DivingDeeper]
Nella progettazione di prodotti per la protezione delle piattaforme Windows, molti ingegneri in questo settore (me compreso) hanno fatto affidamento su nozioni preconcette riguardo a come il sistema operativo gestirà i dati. In questo scenario, alcuni potrebbero aspettarsi che il file su disco rimanga "bloccato" quando il processo viene creato. Non puoi eliminare il file. Non puoi scriverci. Ma puoi rinominarlo. Come si vede qui, nelle giuste condizioni, puoi effettivamente scriverci. Rimani vigile sulle tue supposizioni, mettile sempre in discussione e fai le tue ricerche.
La motivazione per questa ricerca è nata quando ho scoperto come eseguire l'analisi quando un file viene scritto. Con il precedente background nella ricerca su Process Hollowing e Doppelganging, avevo teorizzato che questo potesse essere possibile. L'obiettivo è fornire una migliore sicurezza. Non puoi creare una serratura migliore senza prima capire come rompere quella vecchia.
Herpaderping è simile a Hollowing e Doppelganging, tuttavia ci sono alcune differenze chiave:
Process Hollowing implica modificare la sezione mappata prima che l'esecuzione inizi, che in astratto appare così: map -> modify section -> execute. Questo flusso di lavoro porta il flusso di esecuzione previsto del processo Hollowed a divergere in codice non inteso. Doppelganging potrebbe essere considerato una forma di Hollowing. Tuttavia, Hollowing, a mio parere, è più vicino all'iniezione in quanto Hollowing di solito implica una scrittura esplicita nel codice già mappato. Questo differisce da Herpaderping dove non ci sono sezioni modificate.