La vulnerabilità di Zeus

Secondo Websense, le vulnerabilità presenti nei malware potrebbero essere utilizzate per frenare gli attacchi e incrementare l'efficacia delle indagini. Una prova con Zeus.

Avatar di Gaetano Di Blasio

a cura di Gaetano Di Blasio

Zeus è un Trojan bancario, pensato per rubare le credenziali di login e altre informazioni di identificazione personale (PII). In questa analisi, dimostreremo che gli autori di malware fanno numerosi errori così come i normali ingegneri software e mostreremo come una particolare vulnerabilità, pubblicamente nota, presente nei server C&C di Zeus consente di accedere al Pannello di controllo della botnet o compromettere l’intero sistema del server.

Abbiamo impostato il C&C e il bot di Zeus nella nostra rete interna di ricerca, dove possiamo simulare questo attacco ed evidenziarne le implicazioni.

Per capire il motivo dell’esistenza della vulnerabilità, dobbiamo prima studiare il funzionamento di base di Zeus. I bot Zeus operano seguendo questo schema:

  • 1) infettare il sistema
  • 2) raccogliere le credenziali e PII
  • 3) caricare i dati rubati sottoforma di report al Server C&C

Il punto cruciale è che la macchina compromessa carica alcuni file sul server remoto. E se potessimo sfruttare questo meccanismo per imitare un bot e caricare il nostro file sul server? Supponiamo che sia un file eseguibile, con cui possiamo lanciare comandi sul sistema.

Sfortunatamente, non possiamo semplicemente caricare un file. Zeus utilizza l’algoritmo RC4 per crittografare tutte le comunicazioni tra bot e server, in questo modo accetta solo i file che sono stati crittografati con la stessa chiave usata dal server. Per fortuna, RC4 è un algoritmo simmetrico, questo significa che entrambe le parti (in questo caso bot e C&C) usano la stessa chiave pre-condivisa.

Questo implica che la chiave sia integrata da qualche parte nel bot. Dobbiamo quindi catturare il codice binario di Zeus e trovare le chiavi per riuscire a comunicare con C&C. Possiamo ottenere questo risultato utilizzando il tool di analisi della memoria Volatility per scaricare il keystream RC4 dalla memoria di una macchina infetta.

Dopo aver ottenuto la chiave, possiamo usarla per crittografare il file che vogliamo caricare, imitando così un bot che cerca di caricare un report. Visto che vorremmo eseguire qualcosa sul server, dobbiamo caricare un file in un formato che il server sappia eseguire. Sappiamo che il C&C sta usando file php, quindi cercheremo di caricare quel tipo di file, che sarà eseguito dal server grazie al linguaggio PHP.

Anche se il server non permette di caricare file .php, è possibile sfruttare una vulnerabilità nel codice di C&C e una tecnica ben conosciuta per superare i controlli effettuati sui file caricati. Di seguito il codice per verificare quali sono le estensioni autorizzate dei file.

È semplice verificare che il sistema non permette di caricare nessun file PHP o file .htaccess, oltre a molti altri file eventualmente eseguibili.

Il problema sta nel fatto che questo tipo di controllo molto semplice può essere aggirato senza difficoltà. Uno dei metodi più diffusi è quello di inserire un punto dopo l’estensione del file, invece di ‘nome file.php’ possiamo usare ‘nome file.php.’ (notate l’aggiunta del punto dopo php). Il linguaggio PHP è abbastanza tollerante e lo interpreterà come un file php valido.

Grazie a PHP, possiamo eseguire diversi comandi sul server, ma nel nostro caso vogliamo ottenere l’accesso al pannello di controllo. Per poterlo fare utilizziamo una web-shell PHP (abbiamo parlato di web-shell in un blog precedente), che ci permetterà di navigare all’interno del file system, interagire con il database di back-end e (a seconda della configurazione del server) eseguire comandi di sistema.

Fingendosi un pc compromesso e sfruttando la sua vulnerabilità si mette fine al controllo di Zeus

Ora abbiamo tutto quello che serve per compromettere un server C&C: la chiave RC4, il file che vogliamo caricare (web-shell) e un metodo per superare i controlli. Come impostazione predefinita, Zeus C&C usa il gate .php per ricevere i report e li memorizza nella directory di C&C IP/_reports/files/BOTNET_ID/BOTID/

Dal momento che stiamo fingendo di essere un computer compromesso, controlliamo i valori di BOTNET_ID e BOTID, in modo da poter prevedere dove finirà il nostro file. Tutto quello che dobbiamo fare, dopo aver fatto l’upload del nostro file, è navigare su questa location ed il file verrà eseguito. In pochi passaggi otteniamo una shell dopo aver caricato il file.

La shell ci permetterà di navigare tra i file che contengono informazioni importanti sul sistema di Comando e Controllo di Zeus e di interagire con il database SQL di back-end.

Vale la pena sottolineare che per il nostro ambiente di test abbiamo installato Zeus su una macchina con Windows XP, mentre solitamente Zeus C&C viene eseguito su server Linux. Inoltre, il set up dei nostri server è stato fatto con file senza restrizioni e raramente questo succede con Zeus, anche se in questo caso è irrilevante, perché l’obiettivo era ottenere l’accesso al Pannello di Controllo. Sarebbe stato rilevante solo se avessimo cercato di ottenere il controllo del server, ottenendo una remote shell e facendo privilege escalation fino all’accesso a Root o NTAUTHORITYSYSTEM (a seconda del sistema operativo).

Per poter accedere al Pannello di Controllo è necessario conoscerne la password che viene memorizzata nel database MYSQL che a sua volta è protetto da password. Dal momento che il bot ha bisogno di interagire con il database, le credenziali sono archiviate in uno dei file di configurazione del bot, nello specifico in config.php sotto la directory /system/.

Anche se contiene altre informazioni interessanti (come la chiave di crittografia del bot), nell’immagine viene mostrata solo la parte principale del file config. Normalmente per mysql_user viene utilizzato un utente diverso da root e la password mysql_pass è decisamente più complessa. Nell’esempio è stata volutamente lasciata come “password” perché il tutto risultasse più chiaro. Grazie a queste credenziali, possiamo ottenere l’accesso al database backend.

Il database memorizza le informazioni sul sistema compromesso nella botnet, segnala i computer zombie caricati e utilizza una tabella per archiviare le informazione sul Control Panel, come il nome utente, l’hash della password e altre informazioni.

Le password vengono memorizzate da Zeus attraverso un semplice hash MD5 senza nessun salting, quindi sono relativamente facili da decifrare. Un’altra opzione potrebbe essere creare una propria password, generare l’hash MD5 e inserirla nel database al posto di quella attuale. Avendo accesso in lettura e scrittura al database anche quest’ultima opzione sarebbe molto facile. Ora cercheremo di scoprire la password, sperando che non sia una di quelle troppo complesse. Se non funzionasse questo approccio potremmo sempre ripiegare sul secondo metodo per accedervi.

Come potete notare, la password era molto debole e semplice da decifrare ("123456"). A questo punto abbiamo tutte le informazioni di cui abbiamo bisogno per accedere al Pannello di Controllo Zeus C&C. Per farlo è sufficiente accedere a ./cp.php ed effettuare il login con le nostre nuove credenziali.

Ora abbiamo l’accesso completo al Pannello di Controllo Zeus C&C, proprio come se fossimo i proprietari della botnet.