
Iniezione di shellcode utilizzando l'API di debug di Windows
DbgNexum è un Proof-of-Concept per iniettare shellcode utilizzando l'API di Debug di Windows e la Memoria Condivisa (File Mapping). Evita di scrivere e leggere la memoria remota direttamente, utilizzando invece la manipolazione del contesto per forzare il processo target a caricare ed eseguire il payload stesso.
L'iniettore si attacca a un processo target e crea un thread sospeso. Attraverso un ciclo di debug, imposta un Hardware Breakpoint per intrappolare l'esecuzione a un indirizzo di ritorno specifico. Ad ogni trap, l'iniettore modifica i registri della CPU per imitare chiamate di funzione, orchestrando una sequenza di chiamate alle API di Windows all'interno del processo target.
Al momento della stesura di questo README, ho testato la tecnica contro MDE ed Elastic, nessuno dei quali l'ha rilevata.
WriteProcessMemory / VirtualAllocEx: Il payload viene trasferito tramite CreateFileMapping e MapViewOfFile.ReadProcessMemory: L'approccio ottiene tutte le informazioni chiave dal contesto del thread.Il PoC utilizza uno shellcode XORato di msfvenom che avvia "calc.exe". Ma per favore usa il tuo shellcode!
shellcode.hDbgNexum.exe <PID>
Esempio di Output:
[i] Section 'MZ' created and shellcode copied
[+] Bait thread created. Setting HWBP on FileTimeToSystemTime
[i] Execution Redirected:
|-> [0] Preparation & anchoring stack
|-> [1] Setting HWBP & buffer alloc
|-> [2] Copying File-Mapping name
|-> [3] Zeroing stack slot
|-> [4] Opening handle to named file mapping
|-> [5] Mapping payload into mem. with exec. perm.
|-> [6] Cleanup & shellcode execution
[+] Successfully detached from process 19256
[i] Orchestration complete.
Il flusso di esecuzione è un continuo andirivieni tra il Debug Loop dell'iniettore e il processo target.
Fasi di Iniezione
La funzione DebugLoop contiene la logica principale di iniezione e orchestra la "macchina a stati":
0. Preparazione:
ret istantanea.1. Allocazione:
LocalAlloc per (ovviamente) allocare un piccolo buffer.2. Impostazione Dati:
memcpy per copiare la stringa MZ nel buffer precedentemente allocato.3. Preparazione Stack:
memset per azzerare uno slot dello stack. Questo è in preparazione della fase 5, che chiamerà MapViewOfFile. Poiché la funzione userà >4 argomenti, il 5° argomento viene passato tramite lo stack (che impostiamo qui).4. Apri Mapping:
OpenFileMappingA usando il nome MZ, "creato" nelle fasi 2 e 3.5. Mappa Payload:
MapViewOfFile. Questo mappa la sezione di memoria condivisa (contenente lo shellcode) nello spazio degli indirizzi del target con permessi EXECUTE.6. Esecuzione:
RIP all'indirizzo restituito da MapViewOfFile.