BumbleCrypt
Un Crypter ispirato a Bumblebee
Contesto
Il BumbleCrypt è ispirato al crypter di Bumblebee; nel caso di Bumblebee, la DLL principale di Bumblebee viene caricata in memoria ed eseguita nel seguente modo:
- Decripta e scrive il payload nell'Heap
- Aggancia tre NtApi - NtOpenFile, NtCreateSection e NtMapViewOfSection
- Chiama LoadLibraryW("gdiplus.dll") che attiva gli hook inline poiché le tre API sopra indicate vengono usate da LoadLibrary() per caricare qualsiasi libreria.
- Gli hook inline e la LoadLibrary stessa caricano quindi la DLL principale di Bumblebee al posto di "gdiplus.dll"
- Infine, il controllo viene trasferito alla funzione esportata "SetPath" della DLL principale di Bumblebee
Funzionamento di BumbleCrypt
Analizzando il crypter di BumbleBee, ho realizzato che la DLL decriptata poteva essere caricata con un solo hook inline su "NtMapViewOfSection" invece dei tre hook inline usati nel crypter di Bumblebee.
Di conseguenza è stato sviluppato "BumbleCrypt".
Il BumbleCrypt:
-
Il BumbleCrypt carica prima una risorsa crittografata dalla sezione .rsrc e poi decripta il payload finale della DLL: risorsa crittografata -> Base64 decode -> Rc4 Decrypt -> xor decrypt
-
Il Crypter utilizza l'Heap per memorizzare il payload della DLL decriptata, proprio come il crypter di Bumblebee
-
Una volta decriptato il payload finale, il BumbleCrypt aggancia la NtApi "NtMapViewOfSection" che viene usata per mappare una vista della sezione nello spazio di indirizzi virtuale.
-
Poi il BumbleCrypt chiama LoadLibraryW("msimg32.dll"). Ora capiamo come viene attivato l'hook inline:
- LoadLibraryW() chiama prima NtOpenFile per ottenere l'handle del modulo passato come argomento
- Poi crea un oggetto sezione con l'handle del modulo usando NtCreateSection
- Ora, una volta creata la sezione, LoadLibrary chiama NtMapViewOfSection per mappare la vista di una sezione in memoria
- Qui viene attivato il nostro hook su NtMapViewOfSection, dove la funzione proxy esegue le seguenti azioni:
- Per prima cosa rimuove l'hook da NtMapViewOfSection
- Crea una sezione delle dimensioni richieste usando NtCreateSection()
- Poi mappa la vista della sezione creata nello spazio di indirizzi virtuale usando NtMapViewOfSection (rimosso dall'hook in precedenza)
- Infine mappa manualmente la DLL finale precedentemente decriptata all'indirizzo di base della sezione mappata in memoria e quindi restituisce NTSTATUS_SUCCESS a LoadLibraryW ed esce dalla funzione proxy
- LoadLibraryW riceve quindi NTSTATUS_SUCCESS come risposta a NtMapViewOfSection e l'indirizzo di base della sezione mappata in memoria dove si trova la DLL dannosa decriptata. Inoltre, LoadLibrary carica la DLL in base ai valori restituiti; il risultato è che msimg32.dll può essere vista nei moduli caricati ma punta al payload decriptato. Infine, il Crypter trasferisce il controllo alla DLL decriptata eseguendo la funzione esportata "CallPath".
-
Ora, se diamo un'occhiata allo screenshot dei moduli caricati di BumbleCrypt, possiamo vedere che contiene "msimg32.dll" ma l'indirizzo di base punta al payload dannoso decriptato.
Screenshot


PoC - BumbleCrypter

Grazie mille! Spero che ti sia piaciuto =D
Ciao.
Puoi contattarmi su Twitter se hai feedback o commenti
Twitter: https://twitter.com/knight0x07
Nota
Solo a scopo educativo. È un progetto personale del fine settimana =)