XWorm Darknet: analisi malware

Elementi importanti dell’analisi: 

  • Distribuzione del codice sorgente di malware XWorm e RATs via forums Darknet 
  • Presenza di tasks di persistenza 
  • Moduli di data logging e data stealing 
  • Presenza di moduli ransomware interni a RAT threats 
  • Cryptowallets stealing 
  • Connessioni C&C 
  • Threats vendibili sul mercato nero e personalizzabili da qualunque threat actor 
  • Attributi dell’infection kill chain hardcoded nel codice sorgente 
  • Anti-Analysis, Anti-VM, Anti-Sandboxing ed evasion 
  • Remote access management con i protocolli RDP e VNC 
  • Mutexes harcoded nel codice sorgente 
  • UAC bypasses mediante il processo cmstp.exe 

Introduzione 

Nella presente analisi è stato preso in considerazione un malware sample XWorm ottenuto da un forum Darknet che permette il download del codice sorgente e dei samples compilati solo nel caso in cui vi è una reaction del post da parte di un utente. 

XWorm è una tipologia di threat RAT (Remote Access Trojan) venduto nella Darknet in maniera illecita e ha come obiettivo quello di sottrarre informazioni e dati sensibili agli utenti vittima, tra cui dati di login, informazioni dei cryptowallets, accounts con anche capacità di keylogging. Il threat ha iniziato a circolare in rete da Luglio 2022. All’interno del post del forum su Darkweb, dal quale è stata scaricata, la minaccia viene distribuita mediante un pacchetto SFX autoestraente. 

Analisi XWorm 

Il sample XWorm sottoposto ad analisi possiede come hash (l’artefatto estratto dall’archivio SFX.exe) 37a9fdc56e605d2342da88a6e6182b4b.  

Matrice MITRE: 

Il sample è stato compilato con Visual C/C++ 2013-2017 

Tra le funzioni importate dalla libreria KERNEL32.dll vi sono dettagli di DeleteFileW, CreateHardLinkW, GetShortPathNameW e GetLongPathNameW: 

Tra le risorse incluse possiamo notare “GETPASSWORD1”: 

Qui un’evidenza delle sezioni del file, ove si evince il tipo di compilazione: 

Tra le stringhe estraibili abbiamo contezza di funzioni di privileges gaining, creazione di collegamenti simbolici mediante la funzione SeCreateSymbolicLinkPrivilege, funzioni di cifratura di regioni di memoria (CryptProtectMemory). 

La libreria netapi32.dll può essere utilizzata per tasks di share enumeration e discovery all’interno dell’infrastruttura compromessa. 

La libreria RpcRtRemote.dll può essere utilizzata al fine di eseguire Remote Procedure Calls per esecuzioni remote. Vi sono evidenze di costruzioni di strutture HTML come ad esempio il tag head che specifica il content-type: 

Qui un’evidenza del mapping temporaneo dell’archivio SFX e comandi d’estrazione eseguiti facenti riferimento a regole YARA relative a Backdoors: 

Tra le folders di storage vi è quella di root della chiave di registro di OS Autostart items Software\Microsoft\Windows\CurrentVersion: 

La funzione EventRegister può essere utilizzata per scrivere eventi ETW. 

A seguire funzioni di privileges gathering e privileges token setting, registry keys enumeration e files browsing: 

Tra le stringhe in questione possiamo trovare la richiesta di inserimento password per il file criptato: 

Qui evidenze associate ai plugins DLL droppati per la infection killchain, ad esempio Informations.dll (information gathering), Keylogger.dll (keylogging), Maps.dll (victim geolocalization) e Microphone.dll (microphone logging) e Ransomware.dll (file encryption). 

Qui un riferimento al file di configurazione per l’esecuzione XWorm V3.1.exe.config: 

Tra i files di risorse droppati dal threat XWorm vi è “learn all kind of hacking.url” che fa riferimento al dominio blackhatrussia[.]com 

Il sample risulta essere packed con un alto coefficiente d’entropia della sezione d’esecuzione CPU .text: 

Qui alcuni dettagli di patterns esadecimali identificativi dell’archivio SFX autoestraente: 

La data di compilazione risale al 14 Agosto 2016: 

Il requestedExecutionLevel risulta essere “asInvoker”, ovvero possiede i medesimi permessi d’esecuzione del processo chiamante. 

A seguire, all’interno di una sessione di disassembling e debugging, la cifratura di regioni di memoria, il settaggio di attributi di sicurezza di files presi in considerazione, la ricerca di privilegi, enumerazione di chiavi di registro e folders browsing: 

Qui alcuni dettagli dell’attributo di file properties SFX EXE: 

A seguire i riferimenti, nella sezione .rdata, di stringhe e funzioni menzionate precedentemente: 

Vengono eseguite funzioni di debuggers checking ed environment discovery (come ad esempio GetSystemTimeAsFileTime, QueryPerformanceCounter), alcune di tali funzioni possono essere utilizzate in un contesto Anti-VM. 

Qui l’esecuzione di tasks di privileges management e creazione di collegamenti simbolici: 

A seguire un contesto di esecuzione di files enumeration, scrittura su files ottenuti tramite la funzione WriteFile, dialog box per la scelta della folder root ed il consequenziale ottenimento delle passwords ivi contenute. 

La funzione FUN_004074d7 viene richiamata mediante un argomento in input facente riferimento ai privilegi di sicurezza del contesto d’esecuzione in questione, successivamente vengono modificati gli attributi di security dei files presi in considerazione mediante l’oggetto BVar3

A seguire un check di fallimento d’esecuzione della funzione CryptUnprotectMemory per la consequenziale decrittografia di regioni di memoria precedentemente criptate. 

La label LAB_0040db97 fa riferimento alla variabile pwVar4 per la gestione del fallimento d’esecuzione della funzione CryptProtectMemory

Qui una lista di moduli a cui fa riferimento il sample, tra cui la già citata netapi32.dll: 

All’interno della funzione FUN_004175ed vi è un’azione di appending di oggetti HTML per il content-type al fine di poter eseguire le corrette richieste C&C. 

A seguire ulteriori stringhe già evidenziate sopra: 

La stringa “GETPASSWORD1” viene utilizzata come parametro per la creazione di una nuova istanza di un DialogBox al fine di eseguire file choosing management: 

Il malware effettua l’apertura della chiave di registro Software\\Microsoft\\Windows\\CurrentVersion e un’azione di queryvalue inerente alla directory ProgramFilesDir: 

Contestualmente al richiamo della funzione SHFileOperationW vi è l’esecuzione della funzione FUN_00403ce2 con in aggiunta l’attributo “%s.%d.tmp” che include un parametro di tipo String e Decimal. 

A seguire un disassemblato della funzione EventRegister per il monitoraggio e la scrittura di eventi di sistema: 

All’interno del disassemblato della sezione .text vi è un’istruzione di compare tra il puntatore all’indirizzo 0x4391B8 ed il registro ECX

Per l’enumerazione dei files coinvolti il malware utilizza la funzione SetFilePointerEx

A seguire una rappresentazione delle dimensioni delle sezioni del file: 

L’entrypoint è posto all’indirizzo 1CAB5

L’indirizzo dell’import directory è stato 37DA4

L’indirizzo dell’Import Address Table è posto a 2F000

All’interno del codice esadecimale dell’archivio autoestraente vi sono riferimenti all’inserimento per la password dei files criptati: 

Di seguito i dettagli delle sizes e Relative Virtual Addresses (RVA) delle sezioni e directories dell’archivio analizzato: 

Qui uno screenshot dei files estraibili dall’archivio SFX: 

Prendendo in considerazione in particolare il file XWorm V3.1.exe possiamo notare come esso sia stato scritto in VB. NET ma offuscato con .NET Reactor. 

All’interno della sezione .text (codificata in esadecimale) possiamo notare diverse funzioni offuscate non intelligibili: 

Il worm esegue le funzioni di debuggers checking IsDebuggerPresent e CheckRemoteDebuggerPresent a scopo di anti-analysis: 

E’ possibile notare una stringa di logging relativa ad una connessione localhost Accepted 127.0.0.1:# al fine di specificare la porta. 

A seguire un riferimento all’attributo di port connection di XWorm: 

All’interno degli elementi della GUI del Worm possiamo notare tooltips che sono associati a KillProcess, DownloadAndExecute, RemoteDesktop, oggetti Timer, files from URL downloading, archiviazione di files, creazione di files, cifratura di files, caricamento di files verso un server e contestuale creazione dell’oggetto di decryption. 

Vi è evidenza dell’oggetto obfuscator utilizzato in fase di malicious execution, TcpListener, un oggetto di concorrenzialità (TaskAwaiter), un oggetto riferibile all’utenza corrente (get_CurrentUser), events handlers di mouse events. 

Tra le stringhe estraibili vi sono due evidenze importanti: RemoteDesktop (per la fase di remote management e remote executions) ed il metodo set_UseSystemPasswordChar (per la gestione di credenziali di sistema), creazione di oggetti downloaders e la gestione di encryption tasks con un oggetto RC2CryptoServiceProvider

Tra i moduli utilizzati e richiamati vi è Ransomware, un plugin di cifratura di files incluso nel XWorm threat: 

Il coefficiente d’entropia della sezione .text è 7.86399, pertanto è in stato di packed. Questo a causa dell’offuscazione utilizzata per quanto concerne l’XWorm. 

A seguire le labels e gli altri elementi della GUI in forma offuscata e non intelligibile: 

Qui i riferimenti agli oggetti di download ed execution sopra menzionati: 

All’interno della classe GClass0 vi sono esecuzioni di connessioni TCP mediante oggetti TcpListener e TcpClient, all’interno del metodo di inizializzazione c’è un attributo di IPAddress.Any: 

A seguire un costrutto try-catch, in primo luogo, per lo stopping dell’esecuzione dell’oggetto tcpListener e, consequenzialmente, un ciclo while true per l’esecuzione della funzione di connessione TCP AcceptTcpClient(). 

La classe Client possiede il costruttore che richiede come argomento in input un oggetto Socket: 

La classe GeoIP contiene arrays di tipo string contenti i dettagli dei vari countries. 

A seguire i dettagli di alcuni metodi private void di event handling della classe HRDP che effettuano la comparazione di attributi .Text e vengono gestite le outcoming requests e l’aggiunta di oggetti di tipo requests nella lista delle richieste in pending.  

A seguire la classe IconInjector che permette di effettuare un’injection della directory iCONDIRENTRY mediante il metodo Buffer.BlockCopy: 

A seguire alcuni oggetti tooltips, timers e menustrips della classe Keylogger

La classe MIC permette di gestire le requests in event handling, come avviene per la classe HRDP

La classe Pending permette di inserire svuotare la List di Incoming_Requests all’interno di un costrutto try-catch innestato in un ciclo while(true), la medesima esecuzione viene fatta anche per la List outcoming_Requests: 

All’interno della classe Port vi sono tasks di encryption con metodo RijndaelManaged: 

Gli arrays di bytes vengono criptati con il Cipher ECB mediante oggetti RC2CryptoServiceProvider e MD5CryptoServiceProvider

All’interno della classe Proxy vi sono riferimenti all’aggiunta di items all’interno della lista Pending.Req_Out: 

La classe Registry viene utilizzata per l’enumerazione e la modifica di specifiche chiavi di registro con anche la possibilità di effettuare registry browsing. 

All’interno della classe Ransomware vi è un settaggio di tipo Image prendendo come input un file specifico con il metodo eseguito Image.FromFile: 

La classe RemoteDesktop classifica e individua i keycodes dagli eventi gestiti mediante i keystrokes registrati nella sessione in questione: 

Viene creata una folder specifica all’interno del path di esecuzione di XWorm: 

Vengono eseguiti metodo per la definizione di permessi di drag and drop e click listeners e permessi di copy and paste: 

La classe Server possiede un metodo public void che permette di impostare un oggetto creato di tipo Socket al fine di procedere con le funzioni di sending, binding e listening e BeginAccept

A seguire ulteriori checks dei keycodes degli eventi contestualmente al monitoraggio dei keystrokes. 

A seguire i dettagli della classe XWormTask: 

Lo script seguente esegue il comando lodctr /r, il quale permette di ripristinare le impostazioni del registro di sistema ed i files di prestazioni memorizzati nella cache. 

Verificando i moduli inclusi all’interno dell’eseguibile Crack.exe, contenuto nell’archivio SFX, possiamo notare numerosi attributi, come ad esempio Cryptowallets addresses, mutexes, Startup boolean attribute e cryptowallets addresses boolean attributes che indicano se sottrarre anche tale tipologia di dato. 

La classe Clipboard ottiene i dati della clipboard, il metodo statico di tipo void prende come argomento in input la variabile txt e provvede a creare un’esecuzione multi threading per gli attributi di una web request effettuata. 

All’interno dei NativeMethods possiamo notare riferimenti ai numeri interi costanti che sono relativi agli eventi di clipboard update e message handling, nella fattispecie WM_CLIPBOARDUPDATE e HWND_MESSAGE: 

Nella classe Program viene eseguito il task di persistenza droppando il file .exe all’interno della folder di Windows startup. 

A seguire il wallpaper impostato dal modulo Ransomware: 

La classe ClientSocket aggiunge nella lista Operators l’oggetto Clipboard: 

Nel metodo Send fa uso di un oggetto AES

Qui alcune evidenze del modulo Helper che, mediante i metodi statici di tipo byte [] che provvedono alla cifratura e decifratura dell’array di byte input: 

Al fine di gestire le sessioni RDP e remote management la classe Helper utilizza il modulo ngrok per effettuare secure ingress networking ed il RDP Wrapper. 

Il metodo HRDPFunc prende come argomenti in input User e Pass ed effettua la creazione di un oggetto Stream come WebClient per la lettura della URI localhost sulla porta 4040 /api/tunnels. 

Il metodo booleano UAC controlla se l’utenza corrente ha permessi amministrativi: 

Il plugin N contiene i riferimenti per l’enumerazione e la modifica delle chiavi di registro del sistema con i relativi permessi, per tale scopo viene impiegato un oggetto Microsoft.Win32.RegistryKey: 

Il plugin di VNC connections management HVNC fa uso della classe DLLBuffer per definire un array di bytes di 41984 celle denominato rawData, esso viene utilizzato all’interno del metodo statico di tipo Object Run all’interno della classe Plugin. L’array rawData viene impegato nel metodo Run nel richiamo del metodo RunPE.PERun con argomento in input riferibile a .NET Framework per la compilazione .NET. 

Il modulo Keylogger viene inizializzato contestualmente a quello di Clipboard notifications management nel momento in cui viene eseguito il metodo ClientSocket.Send

Qui alcuni riferimenti dell’hooking degli eventi di keylogging: 

Il modulo di microphone ed audio logging fa uso dell’ALawEncoder e la compress table per la compressione dell’audio monitorato mediante l’array readonly di bytes ALawCompressTable di 128 celle. 

Con il fine di inizializzare la sessione di microphone logging viene effettuata l’esecuzione del comando relativo all’operator MICGET

Qui un’enumerazione dei dispositivi per il monitoraggio del microfono tramite un ciclo for

All’interno della classe Ransomware possiamo notare riferimenti ad oggetti di tipo FileStream, arrays di bytes per gli oggetti chiave bytKey e bytIV, la folder Desktop per il dropping del wallpaper in HTML. A seguire i dettagli dei metodi DEC, EncryptOrDecryptFile, CreateKey e CreateIV. Questi ultimi utilizzano esecuzioni di hashing SHA512 delle variabili array2

I metodi enc1 ed enc2 permettono di effettuare filesystem queries per ricercare files criptati all’interno di tutte le folders o all’interno di una folder specifica passata come argomento in input: 

Nel modulo Messages vi è la gestione di closing ed opening del proxy settando gli attributi Proxy.ServerPort e Proxy.ClientHost rispettivamente con i valori array[1] e array[2]: 

All’interno del modulo RunPE per l’esecuzione di Portable Executables esterni vengono definite le informazioni del processo e di startup: 

A seguire alcuni dettagli di services management (CloseServiceManager, GetService e RunService) contenente un costrutto switch per quanto riguarda l’attributo array[0]: 

A seguire i tre metodi utilizzati con il fine di gestire gli OS Autostart items, nella fattispecie i files nelle cartelle di autostart, chiavi di registro di autostart e scheduled tasks: 

Per quanto riguarda le connessioni TCP vi sono funzionalità di chiusura, killing connections ed enumerations. 

All’interno di un ciclo for vengono aggiunte items all’interno della lista mIB_TCPROW_OWNER_PID: 

Il malware fa uso del processo cmstp.exe (Microsoft Connection Manager Profile Installer) al fine di bypassare lo User Access Control di Windows:  

[0] 

All’interno del metodo booleano statico Execute() esegue un processo esterno CorpVPN che includono anche comandi di pre-execution. 

Il modulo Webcam provvede ad effettuare un monitoraggio a scopo malevolo delle immagini riprese a video e viene effettuato un processing delle immagini mediante un oggetto Bitmap, il quale viene definito con il richiamo del metodo Helper.webcam.GetCurrentImage(). All’interno del primo if innestato nel costrutto switch viene eseguito un Thread.Sleep di mezzo secondo e viene cambiata la sorgente. L’oggetto Bitmap viene codificato e salvato con l’oggetto encoderParameters

I dati poi ottenuti, prima di essere inviati tramite Socket, vengono criptati: 

A seguire ulteriori dettagli del codice esadecimale del PE ove si evince l’offuscazione tramite .NET Reactor del medesimo: 

IOCs XWorm: 

  • 37a9fdc56e605d2342da88a6e6182b4b 
  • 20bc3df33bbbb676d2a3c572cff4c1d58c79055d 
  • 422ba689937e3748a4b6bd3c5af2dce0211e8a48eb25767e6d1d2192d27f1f58 
  • GETPASSWORD1 
  • blackhatrussia[.]com 
  • 44X9i4c6YhQcfLiSCrbNH25yrRfkrhrz 

XWorm regola YARA: 

rule XWormRule 

    strings: 

        $xwormStr = “44X9i4c6YhQcfLiSCrbNH25yrRfkrhrz” 

        $xwormStr1= “blackhatrussia” 

    condition: 

        $xwormStr or $xwormStr1 

CONCLUSIONI: 

Il threat preso in considerazione nella presente Darknet investigation è distribuito tramite Darkweb nel momento in cui viene effettuata una reaction del post principale da parte dell’utente collegato. XWorm è personalizzabile e può permettere l’aggiunta di nuove features e malicious tasks di remote access e stealing. In un’ottica di future threat landscape è possibile che il malware sottoposto a disamina effettui anche distribuzioni di ulteriori minacce, come ad esempio ransomware avanzati e complessi con furto di dati e, qualora il riscatto non dovesse essere pagato, si procederà con una pubblicazione di questi ultimi. È importante sottolineare come sia facile e versatile la distribuzione dell’intero progetto di malware development ed il corrispondente codice sorgente. Ovviamente questa è solo la punta di un enorme iceberg che nasconde una quantità immensa di forums Darkweb che distribuiscono interi progetti dell’IDE dello sviluppo di varie tipologie di threats. Questo può comportare la possibilità di forking e personalizzazione che potenzialmente avrebbero infinite possibilità di sviluppo. Consequenzialmente tale metodologia di malware deployment può comportare il propagarsi di numerose varianti e ciò può intaccare negativamente i motori di malware signatures statici e basati su firme antivirali, in quanto esse presenterebbero differenze nei patterns e nel codice esadecimale, rendendo pertanto vane alcune firme e regole YARA di malware hunting create precedentemente. È altresì importante sottolineare il fatto che vi siano numerosi tentativi di persistenza, anti-analysis, anti-sandboxing ed evasion (tramite l’exploit del processo cmstp.exe). 

Con tutta probabilità la distribuzione tramite Darknet di stealers e RAT sarà sempre più frequente. Seguendo la metodologia riscontrata in tale casistica specifica, i forums sopra citati verranno impiegati per la vendita sul mercato nero di tali pacchetti di software malevolo, permettendo a svariati threat actors di modificare gli indirizzi Bitcoin od eventuali mails di contatto dopo la cifratura di files, al fine di estorcere denaro alle vittime. Nel caso in esame è stato molto interessante la presenza di un modulo Ransomware all’interno di threats RAT rendendo de facto l’infection kill chain sempre più completa ed invasiva da un’ottica dell’attaccante. 

Riferimenti: 

[0]: UAC Bypass Using CMSTP (quickheal.com) 

Terza Edizione Corso OSINT & Social Engineering
VenomRAT Darknet: analisi malware 

Pronto intervento Cyber Swascan

Contattaci per un supporto immediato

Il sottoscritto, in qualità di interessato DICHIARA di aver letto e compreso il contenuto della privacy policy ai sensi dell’articolo 13, GDPR. ACCONSENTE al trattamento dei Dati in relazione all’invio da parte del Titolare di comunicazioni afferenti alla gestione di eventuali misure precontrattuali, preordinate alla stipulazione e/o esecuzione del contratto con il Cliente nonché all'adempimento dei relativi obblighi.
Il consenso prestato potrà essere revocato in qualsiasi momento contattando il Titolare ai recapiti presenti nella citata privacy policy.