Packer AutoIt veicola il RAT NanoCore

21/03/2019

autoit nanocore Packer rat

NanoCore è un RAT scritto in .NET (probabilmente Visual Basic .NET) che ha la caratteristica di essere modulare. Presenta infatti vari plugin che ne definiscono le funzionalità, tra cui:

  • Upload, download, browsing ed esecuzione di file.
  • Enumerazione e terminazione di processi.
  • Editor del registro.
  • Keylogging
  • Proxy SOCKS per il pivoting nella rete domestica/aziendale.
  • Accesso a microfono e webcam.
  • Furto di password, logging delle applicazioni.
  • Loggin dei domini visitati (vedi parte finale sul payload). Solo i domini presenti in una lista sono riportati al C&C.

Il campione rinvenuto è stato offuscato con Eazfuscator.NET 3.3 ma non presenta tecniche antidebug, antidecompilazione o antivm. Per questo motivo è veicolato tramite un packer scritto con AutoIt che mira a colmare queste lacune.

Packer AutoIt

Il packer è stato compresso con UPX, dato che UPX non è stato sviluppato per offuscare ma per comprimere/comprimere gli eseguibili, quasi tutti i tool di analisi riescono a decomprimere questi eseguibili automaticamente.

Una volta decompresso e caricato su IDA, si nota subito che è un eseguibile creato con AutoIt:

 

AutoIt è un linguaggio di scripting simile al Basic, è possibile recuperare il sorgente con un tool di decompilazione, nel nostra caso è stato utilizzato myAutoIt. Lo script recuperato è banalmente offuscato ma data la sua lunghezza è stato necessario armarsi di pazienza e automatizzare il compito con uno strumento fatto in casa.

Una volta deoffuscato, lo script esegue una serie di azioni volte ad installarsi nel sistema ed eseguirsi, tramite process hollowing, nel contesto dello strumento RegAsm.exe di Microsoft (disponibile con il framework .NET):

In particolare il packer effettua le seguenti azioni:

  • Rimuove il file :Zone.Identifier per essere eseguibile senza avvisi da parte di Windows.
  • Crea un mutex di nome attrib per escludere esecuzioni contemporanee.
  • Carica in memoria il payload, questo punto è analizzato nel dettaglio sotto.
  • Controlla se esistono i processi vmtoolsd.exe e vbox.exe, in caso positivo si chiude (controllo antiVM).
  • Controlla che lo script sia stato eseguito dall’interprete AutoIt originale cercando la classe (di finestra) Progman.
  • Se il procresso non è eseguito come utente admin, esegue un escalation tramite fodhelper (su Windows 10) o tramite eventvwr (su Windows Vista-8).
  • Aspetta 65 secondi.
  • Esegue il payload tramite process hollowing su RegAsm.exe. Questo punto è affrontato in dettaglio sotto.
  • Si installa in %APPDATA%\wlrmdr\LanguageComponentsInstallerComHandler.exe”. Il packer ha la possibilità di installarsi sia tramite i task di Windows, sia tramite un link nella cartella di avvio che lancia un VBS che lancia il packer.

Alcune funzionalità del packer, come mostrare una MessageBox o scaricare ed eseguire un file, non sono usati nel campione analizzato.

Il payload è contenuto nelle due risorse BitLockerWizardElev1 e AssignedAccessManager2 (di tipo Font), le quali si presentano come stringhe esadecimali

Le risorse sono concatenate e decifrate tramite la seguente procedura:

Il packer utilizza AES256 con PBKDF per decifrare il payload, la password è presente nello script. Il payload è un assembly .NET, come anticipato si tratta di NanoCore (un RAT).  Il payload non è eseguito direttamente ma tramite process hollowing, questa operazione non è effettuata dallo script AutoIt ma da uno shellcode invocato dall’apposita procedura:

Lo shellcode è contenuto nello script in forma di stringhe esadecimali (nell’immagine sopra è stato omesso per brevità). Si nota chiaramente che l’offset dell’entry-point è 0xbe, usando IDA è possibile analizzare lo shellcode. Quest’ultimo non è offuscato ed è piuttosto semplice da analizzare, di seguito un estratto di alcune parti del codice:

In particolare lo shellcode:

  • Utilizza la struttura PEB->Ldr per ottenere il base address di ntdll.dll e kernel32.dll.
  • Utilizza una semplice funzione di hashing per confrontare il nome delle API da importare con i nomi nella directory PE di export (in questo modo non è immediato capire quale API viene importata, tuttavia reimplementare la funzione di hash in C ed eseguirla sugli export delle due DLL è immediato e permette di recuperare i nomi).
  • Crea un processo in stato sospeso per il programma host (il cui percorso gli viene passato come argomento dal packer) ed utilizza il fatto non documentato che all’entry-point il loader di Windows lascia l’indirizzo del PEB in EBX e quello dell’entry-point in EAX per recuperare le informazioni necessarie al process hollowing.
  • Rimappa le sezioni del processo host con quelle del payload.
  • Esegue il processo sospeso.

Una volta eseguito il payload ed effettuata l’installazione il packer termina.

Il payload

Il campione rinvenuto è stato configurato per il keylogging e per l’utilizzo del plugin SurveillanceEx:

Un’analisi più dettagliata di NanoCore e del plugin SurveillanceEx seguirà, è tuttavia disponibile la lista dei domini italiani ritenuti di interesse da parte degli autori.

Lista dei domini italiani

Scarica la lista dei domini.

Indicatori di compromissione

IoC (.txt) – IP, Hash

IoC (HASHr.txt) – Lista dei soli hash file da utilizzare in combinazione con il tool HASHr