Corso di Basi di Dati Prof.ssa Anna Maria Carminelli Gregori Università degli Studi di Trieste Anno Accademico 2003-2004 REALIZZAZIONE DI UN DATABASE PER L’ANALISI DEI VIRUS di Martino Jerian Michele Crevatin Massimiliano Miani Roberto Rodaro Mitja Giaconi SOMMARIO 1. Introduzione 2. I monitor di sistema 3. Utilizzo dei monitor 4. I convertitori 5. Realizzazione dei database 5.1 Le macro 5.3 Le query 6. Analisi dei virus 6.1 Il virus ColdApe 6.2 Il virus Msblast 6.3 Il virus Nimda 6.4 Un virus di tipo trojan 6.5 Un virus sconosciuto (“mah”) 7. Conclusioni e riferimenti Appendice: Codice C dei convertitori handle_converter.cpp listdlls_converter.cpp mon_converter.cpp 2 1. INTRODUZIONE La diffusione dei virus è probabilmente uno dei problemi più gravi della sicurezza informatica odierna; basta connettersi a un server amministrato con poca cautela, o scaricare un messaggio di posta elettronica senza effettuare controlli accurati con un antivirus costantemente aggiornato, per essere soggetti all’infezione di un virus sul proprio calcolatore. Nel presente progetto si sono presi in esame cinque diversi virus, alcuni dei quali, come MSblast, hanno recentemente creato problemi consistenti alla rete informatica mondiale; si è condotta l’analisi osservando il comportamento del sistema infetto sia dal punto di vista macroscopico, cioè prendendo nota degli effettivi problemi che un utente comune può riscontrare, sia da un punto di vista più tecnico, monitorando con gli strumenti software appropriati quali siano le parti del sistema che vengono intaccate. A tale scopo si è utilizzato il software Vmware, che permette di lavorare con delle macchine virtuali, evitando così di infettare il sistema reale e quindi di dover conseguentemente reinstallare il sistema operativo dopo ogni prova. Lo stato della macchina e delle operazioni effettuate sulle sue risorse prima e dopo l’inoculazione dei virus è stata effettuata tramite dei monitor freeware creati dalla SysInternals. Sono stati quindi creati dei semplici programmi in linguaggio C per convertire l’output di tali monitor in file facilmente importabili da Microsoft Access 2002 in modo tale da poter creare vari database contenenti le informazioni relative agli effetti che ciascun virus provoca sul sistema. 3 Sono di seguito riportati due diagrammi indicanti in maniera riassuntiva tutto il lavoro svolto. Il primo diagramma, molto semplice, riassume il lavoro preparatorio allo sviluppo del progetto vero e proprio, ossia capire quali monitor siano risultati effettivamente utili ed utilizzabili e quali no. monitor Sysinternals: Diskmon Filemon Regmon Portmon TDImon TCPview ListDLLs Handle Netstat ProcessExplorer analisi: quali sono davvero utili? Handle ListDLLs Filemon Regmon Il progetto vero e proprio è riassunto nel secondo diagramma; esso riassume infatti tutte le operazioni fatte per analizzare l’influenza di un singolo virus sul sistema. Si intende quindi che il grafico riguarda le operazioni fatte per analizzare un solo virus, tutto il procedimento è stati infatti svolto per 5 volte, una per ogni virus inoculato nel sistema. 4 analisi "UMANA" dei risultati importazione in Access: macro dlls_tables macro handle_tables macro filemon_tables macro regmon_tables esecuzione convertitori: handle_converter.exe handlelog_clean.txt handlelog_clean.log listdlls_converter.exe dllslog_clean.txt dllslog_clean.log mon_converter.exe filemon_clean.txt filemon_clean.log mon_converter.exe regmon_clean.txt regmon_clean.log esecuzione convertitori: handle_converter.exe handlelog_virus.txt handlelog_virus.log listdlls_converter.exe dllslog_virus.txt dllslog_virus.log mon_converter.exe filemon_virus.txt filemon_virus.log mon_converter.exe regmon_virus.txt regmon_virus.log esecuzione monitor: Handle ListDLLS Filemon Regmon esecuzione monitor: Handle ListDLLS Filemon Regmon sistema "PULITO" inoculazione del virus tabelle in Access: dllslog_clean handlelog_clean filemon_clean regmon_clean 5 sistema "INFETTO" handlelog_clean.log listdllslog_clean.log filemon_clean.log regmon_clean.log handlelog_virus.log listdllslog_virus.log filemon_virus.log regmon_virus.log handlelog_clean.txt listdllslog_clean.txt filemon_clean.txt regmon_clean.txt handlelog_virus.txt listdllslog_virus.txt filemon_virus.txt regmon_virus.txt tabelle in Access: dllslog_virus handlelog_virus filemon_virus regmon_virus analisi delle differenze con le query: dlls_in_clean_not_virus dlls_in_virus_not_clean handle_in_clean_not_virus handle_in_virus_not_clean filemon_virus_events regmon_virus_events GOAL! Informazioni sugli effetti provocati dal virus 2. I MONITOR DI SISTEMA Gli strumenti software che sono stati utilizzati sono disponibili gratuitamente sul sito del produttore, www.sysinternals.com. Viene riportata la lista dei monitor di cui si è sperimentato l’utilizzo e le funzionalità. • • • • • • • • • • Diskmon: visualizza l’attività del sistema sull’hard disk; Filemon: visualizza l’attività del sistema sui file; Regmon: visualizza l’attività del sistema sui registri; Portmon: visualizza l’attività del sistema sulle porte seriali e parallele; TDImon: visualizza l’attività UDP e TCP del sistema (a livello di trasporto); TCPview: visualizza l’attività sulle porte aperte e i relativi processi che si appoggiano a TCP e UDP; ListDLLs: visualizza le librerie di sistema utilizzate (programma DOS); Handle: visualizza tutti i puntatori ai file utilizzati dal sistema (programma DOS); Netstat: visualizza lo stato delle porte di sistema (programma DOS); ProcessExplorer: visualizza tutti i processi attivi del sistema e i dettagli sulla loro esecuzione. Non tutti i risultati forniti dai monitor sono pronti per un’analisi diretta o per l’inserimento in un database; infatti, mentre i software in DOS visualizzano lo stato del sistema in un determinato momento generando risultati pronti per essere confrontati (i record sono contemporanei), i software che sono provvisti di un’interfaccia grafica mostrano sequenzialmente le operazioni fatte dal sistema sulla risorsa monitorata e non sono quindi confrontabili in maniera immediata. Per fare un esempio, da Diskmon non si raccoglierà materiale facilmente interpretabile: questo perchè le attività sull’hard disk sono non deterministiche e non ripetibili, quindi, monitorando gli eventi che avvengono in due istanti differenti, nonostante lo stato del sistema sembri essere lo stesso, si avranno sempre e comunque esiti differenti (ad esempio a causa della scrittura su disco della memoria virtuale). Sebbene tutti i monitor siano stati testati a fondo per verificarne l’effettiva utilità, la maggior parte del lavoro è stata delegata a ListDLLs e Handle per quanto riguarda il monitoraggio dello stato del sistema e a Filemon e Regmon per visualizzare le operazioni effettuate dai virus sulle risorse del sistema. 6 Per quanto concerne gli altri monitor essi non sono stati utili per vari motivi: • • • • Diskmon, per quanto detto sopra, fornisce informazioni non facilmente interpretabili; ProcessExplorer raccoglie per lo più informazioni sui processi che possono essere rilevate anche dagli altri programmi; utilizza però una propria interfaccia e non un output testuale, pertanto le informazioni da esso fornite non sono facilmente integrabili in un database; Portmon visualizza l’attività sulle porte seriali e parallele, che normalmente non vengono utilizzate dai virus (sarebbe tuttavia interessante avere a che fare con un virus che si serva della stampante invece che del monitor come output); Netstat, TDImon e TCPview sarebbero potuti essere veramente molto interessanti per il nostro lavoro, in quanto visualizzano informazioni riguardanti la comunicazione del sistema con l’esterno, gli IP address contattati, le porte locali e remote a cui si è connessi, e così via. Tuttavia, per ovvi motivi di sicurezza, il calcolatore su cui sono state eseguite le prove di inoculazione è stato mantenuto isolato dalla rete dell’università rendendo impossibile rilevare attività di questo tipo; è stata così penalizzata gravemente l’analisi dell’infezione di alcuni virus, specialmente quelli di tipo worm e trojan che fanno mass mailing o si collegano a determinati indirizzi IP. Ricordiamo che per ragioni di sicurezza si è utilizzato l’applicativo VMware, che permette di lavorare in un sistema operativo virtuale: in tale maniera anche in caso di problemi il sistema reale non viene compromesso; tale operazione non crea alcun tipo di restrizione nell’analisi: il sistema virtuale si comporta esattamente come quello reale (eccetto per la velocità, ovviamente penalizzata). Il sistema operativo installato sulla macchina reale è Microsoft Windows XP, mentre quello della macchina virtuale è Microsoft Windows 2000. Non potendo disporre di un accesso alla rete, si è tentato di ricreare anche un ambiente virtuale per la posta elettronica, eseguendo sulla stessa macchina (virtuale) il programma client per la posta (Outlook Express) e un programma che facesse fare al nostro computer anche la funzione di mail server (ArGoSoft Mail Server). Il server fittizio (prova1.com) è stato testato con degli utenti virtuali ([email protected], [email protected], ...). I monitor Netstat, TDImon e TCPview sono stati utilizzati per rilevare l’attività del sistema non infetto nell’invio e ricezione di mail e le prove hanno dato tutte esito positivo. Purtroppo tale esito non si è ripetuto nell’inoculazione dei virus; non è stato possibile ingannare alcun virus sull’esistenza di una rete e i monitor non hanno rilevato alcuna attività sulle porte di comunicazione da parte di applicazioni sospette. Per visualizzare la completa attività dei virus servirebbe avere una connessione a Internet completa e reale; i virus più potenti non si accontentano più della posta elettronica ma sfruttano i bachi dei programmi di gestione dei server web per diffondersi o direttamente tramite lan. 7 3. UTILIZZO DEI MONITOR DI SISTEMA Verranno ora analizzati più in dettaglio i monitor che si sono dimostrati effettivamente utili al fine dell’analisi. Handle e ListDLLs sono dei programmi sviluppati per DOS che visualizzano in uscita rispettivamente i puntatori ai file e le librerie utilizzate dal sistema nel momento in cui vengono avviati. Il loro output può essere facilmente rediretto dallo schermo alla scrittura su file. Sono stati creati dei semplici script con il linguaggio batch di MS-DOS per automatizzare l’avvio di tali monitor, la redirezione del loro output dallo schermo a un file e la successiva conversione in un formato facilmente importabile da Microsoft Access 2002 tramite dei programmi scritti in linguaggio C. La procedura seguita è l’avvio di questi monitor prima e dopo l’inserimento di un virus per visualizzare le differenze che questo apporta al sistema. Si è cercato di lasciare lo condizioni di background del sistema quanto più simili possibile fra il primo e il secondo lancio in modo da potersi rendere effettivamente conto di quali parametri mutino in relazione alla presenza del virus e non a causa di un ambiente di lavoro differente. Filemon e Regmon sono invece dei programmi sviluppati per ambiente Windows e dotati quindi di interfaccia grafica; come già accennato essi non visualizzano lo stato del sistema in un determinato momento ma una lista sequenziale delle operazioni eseguite sui file (Filemon) o sui registri di sistema (Regmon) dall’istante di avvio del programma fino a che non si interrompe il monitoraggio. A questo punto l’output può essere salvato in un file, sempre tramite interfaccia grafica. Vista la natura dei programmi non è stato possibile implementare in maniera immediata un’automatizzazione di questa procedura, peraltro molto semplice, che è stata quindi effettuata manualmente. Non vengono analizzati in questa sede i dati forniti in output dai monitor. Essi sono infatti consistenti (anche se in formato diverso) con quelli che verranno poi importati nei database. Questi ultimi verranno analizzati a fondo successivamente. 8 4. I CONVERTITORI Come già accennato, si è rivelato necessario scrivere dei semplici programmi in C atti a convertire i file di log generati dai monitor in un formato che potesse essere facilmente importabile in Access. Sono stati creati tre programmi: • • • handle_converter.exe: relativo all’uscita del monitor Handle, funzionante in ambiente DOS; listdlls_converter.exe: relativo all’uscita del monitor ListDLLs, funzionante in ambiente DOS; mon_converter.exe: relativo all’uscita dei due monitor regmon e filemon, entrambi sviluppati per ambiente Windows. Per automatizzare il lavoro di conversione sono stati generati dei file batch per DOS tali da eseguire i monitor (almeno quelli sotto DOS) e convertirne direttamente il risultato. Si veda la fine del paragrafo per il loro listato. I programmi handle_converter.exe e listdlls_converter.exe funzionano in modo molto simile: di seguito sono riportate da esempio alcune linee del file generato dal monitor Handle e le stesse dopo l’applicazione di handle_converter.exe. Handle v2.10 Copyright (C) 1997-2003 Mark Russinovich Sysinternals - www.sysinternals.com -----------------------------------------------------------------------------System pid: 4 NT AUTHORITY\SYSTEM 2e8: File C:\WINDOWS\CSC\00000001 5b8: File C:\pagefile.sys 5bc: File C:\Documents and Settings\LocalService\NTUSER.DAT 5c8: File C:\Documents and Settings\NetworkService\NTUSER.DAT 5d0: File C:\WINDOWS\system32\config\SECURITY 5d4: File C:\WINDOWS\system32\config\SECURITY.LOG 5dc: File C:\WINDOWS\system32\config\software 5e0: File C:\WINDOWS\system32\config\software.LOG 5e4: File C:\hiberfil.sys 9 System|4|NT AUTHORITY\SYSTEM| 2e8|File|C:\WINDOWS\CSC\00000001 System|4|NT AUTHORITY\SYSTEM| 5b8|File|C:\pagefile.sys System|4|NT AUTHORITY\SYSTEM| 5bc|File|C:\Documents and Settings\LocalService\NTUSER.DAT System|4|NT AUTHORITY\SYSTEM| 5c8|File|C:\Documents and Settings\NetworkService\NTUSER.DAT System|4|NT AUTHORITY\SYSTEM| 5d0|File|C:\WINDOWS\system32\config\SECURITY System|4|NT AUTHORITY\SYSTEM| 5d4|File|C:\WINDOWS\system32\config\SECURITY.LOG System|4|NT AUTHORITY\SYSTEM| 5dc|File|C:\WINDOWS\system32\config\software System|4|NT AUTHORITY\SYSTEM| 5e0|File|C:\WINDOWS\system32\config\software.LOG System|4|NT AUTHORITY\SYSTEM| 5e4|File|C:\hiberfil.sys Fondamentalmente il lavoro compiuto dagli script consiste nel copiare ogni gruppo di dati (ossia il processo a cui essi si riferiscono, il process id e il proprietario del processo) all’inizio di ogni linea. Ogni linea, dopo l’importazione in Access, costituirà un record. I vari campi di ogni record sono separati dal simbolo di pipe (“ | ”). Il mon_converter.exe è utilizzato da entrambi i monitor Regmon e Filemon ed è notevolmente più semplice. I due programmi forniscono dei file di log in cui i vari campi sono separati dal carattere tab. L’unico problema è che il nome dei processi è separato dal rispettivo process id dal carattere due punti (“ : “) invece che da tab. Tutto ciò che fa mon_converter.exe è sostituire il primo carattere “:“ di ogni linea con il carattere TAB. L’utilizzo dei tre convertitori è molto semplice, essi vengono lanciati da DOS chiamando il loro nome seguito dal file che si vuole generare in uscita come primo parametro e dal file in ingresso come secondo parametro. In pratica, dal prompt di DOS: • • • handle_converter fileoutput.txt fileinput.txt listdlls_converter fileoutput.txt fileinput.txt mon_converter fileoutput.txt fileinput.txt Per chi fosse interessato in appendice sono riportati i listati dei tre programmi. Segue ora il listato del file batch innesco.bat relativo all’avvio e conversione dei dati dei monitor Handle e ListDLLs: handle > c:\risulatati\handle.log listdlls > c:\risulati\dlls.log handle_converter c:\risultati\handlelog.txt c:\risultati\handle.log listdlls_converter c:\risultati\dllslog.txt c:\risultati\dlls.log 10 Per quanto riguarda i monitor in ambiente Windows non è stato realizzato alcun file batch, in quanto il loro avvio è stato seguito manualmente e separatamente e quindi anche la loro conversione è stata effettuata separatamente e direttamente da linea di comando: • • • • per Filemon, dopo aver salvato il file di log c:\risulati\filemon.log mon_converter c:\risulatati\filemon.txt c:\risultati\filemon.log per Regmon, dopo aver salvato il file di log c:\risulati\regmon.log mon_converter c:\risulatati\regmon.txt c:\risultati\regmon.log Vengono generate molte versioni di questi file, relative al sistema pulito e a quello che si ottiene dopo l’innesco di ogni virus. Quindi sarà opprtuno rinominare i file e porre ognuno nella directory in cui risiede il database relativo al virus preso in esame di volta in volta. In particolare si è adottata la convenzione di aggiungere a ogni file di tipo txt il suffisso _clean o _virus a seconda che sia relativo a un sistema pulito o infetto; ad esempio, i file handlelog.txt generati prima e dopo l’inoculazione dei virus sono stati rinominati rispettivamente handlelog_clean.txt e handlelog_virus.txt 11 5. REALIZZAZIONE DEI DATABASE 5.1 Organizzazione dei dati I dati da importare in Access per l’analisi sono stati situati in cinque distinte directory, una per ogni virus che è stato inoculato nel sistema. A ogni directory corrisponde un virus e conseguentemente è stato realizzato un database diverso per ognuno dei virus. Le directory presenti sono: • • • • • msblast: relativa al virus conosciuto come Msblast, W32/blast, Blasterworm o Lovsan; nimda: relativa al virus Nimda; coldape: relativa al virus ColdApe; trojan: relativa a un virus di tipo trojan non meglio identificato; mah: relativa a 4 file contenenti un virus non meglio identificato; In ogni directory sono presenti i file: • • • • • general.mdb: il database di Access; in origine il file è identico in ogni directory: esso contiene quattro macro e sei query; quando le macro vengono avviate esse importano nel database i file di testo presenti nella directory corrente, contenenti le informazioni fornite dai monitor; dllslog_clean.txt e dllslog_virus.txt: file di testo relativi al monitor ListDLLs contenenti rispettivamente i dati prima e dopo l’inoculazione del virus; handlelog_clean.txt e handlelog_ virus.txt: file di testo relativi al monitor Handle contenenti rispettivamente dati prima e dopo l’inoculazione del virus; filemon_clean.txt e filemon_virus.txt: file di testo relativi al monitor Filemon contenenti rispettivamente dati prima e durante l’inoculazione del virus; regmon_clean.txt e regmon_virus.txt: file di testo relativi al monitor Regmon contenenti rispettivamente dati prima e durante l’inoculazione del virus. A partire dai file txt presenti nella directory verranno generate, tramite le macro, le tabelle il cui contenuto sarà poi confrontato dalle query. 12 5.2 Le macro Cliccando sulle varie macro i file di testo creati possono essere importati in Access. Se le operazioni effettuate dalle macro sono andate a buon fine cliccando sul menù Tables si possono vedere le seguenti tabelle. A volte possono comparire (come in questo caso) delle tabelle relative a errori di importazione: ciò succede perchè l’importatore è soggetto ad alcuni limiti, ad esempio la lunghezza di qualche campo di un record è più lunga del limite massimo di caratteri accettato, tuttavia l’analisi successiva dei dati può essere fatta comunque senza alcun problema. Segue un’analisi dettagliata di tutte le macro. 13 La macro dlls_tables Genera due tabelle dllslog_clean e dlls_virus, importando rispettivamente i file dllslog_clean.txt e dllslog_virus.txt che si trovano nella stessa directory del file general.mdb corrente. I dettagli dell’importazione vengono definiti tramite il dllslog Import Specification secondo le specifiche seguenti: a ogni riga del file di testo importato corrisponde un record nella rispettiva tabella, mentre la separazione dei campi in ogni riga del file di testo è marcata dal carattere “|” (pipe). La tabelle create in Access saranno del tipo: Descrizione dei campi: file: nome del file che utilizza almeno una libreria pid: Process ID che identifica il processo legato al file command_line: linea di comando tramite cui il file viene caricato in memoria base: indirizzo base di memoria in cui viene caricata la libreria size: spazio in memoria allocato dalla libreria version: versione della libreria path: percorso in cui risiede la libreria 14 La macro dlls_tables è costituita da due comandi Transfer Text atti a importare i file di testo secondo le specifiche previste: Le specifiche di importazione dllslog Import Specification sono state create da un tool accessibile cliccando sul menù File -> Get External Data e quindi Import. A questo punto è possibile scegliere il file da importare; nel nostro caso non è necessario importare alcun file per il momento ma sceglierne uno è indispensabile per andare alla finestra di dialogo successiva. Scegliere quindi un file e procedere: a questo punto si è nell’Import Text Wizard: cliccando su Advanced si giunge finalmente al punto in cui è posssibile definire le specifiche di importazione, salvarle (con Save As...) o aprire le preesistenti per apporre eventuali modifiche. 15 La dllslog Import Specification ha le caratteristiche riportate nello screenshot seguente: Come si può vedere il Field Delimiter impostato è il simbolo di pipe mentre i nomi dei campi e il formato dei loro dati (tutti testo) sono definiti campo per campo nella tabella in basso. 16 La macro handle_tables Genera due tabelle handlelog_clean e handlelog_virus, importando rispettivamente i file handlelog_clean.txt e handlelog_virus.txt che si trovano nella stessa directory del file general.mdb corrente. I dettagli dell’importazione vengono definiti tramite il handlelog Import Specification secondo le specifiche seguenti: a ogni riga del file di testo importato corrisponde un record nella rispettiva tabella, mentre la separazione dei campi in ogni riga del file di testo è marcata dal carattere ‘|’ (pipe). La tabelle create in Access saranno del tipo: Descrizione dei campi: file: nome del file relativo allo handle pid: Process ID che identifica il processo legato al file owner: proprietario del processo address: indirizzo di memoria dell’handle type: indica il tipo di handle (file o section di memoria) path: percorso relativo all’handle 17 Il formato della macro e delle specifiche di importazione sono riportati negli screenshot seguenti: 18 La macro filemon_tables Genera due tabelle filemon_clean e filemon_virus, importando rispettivamente i file filemon_clean.txt e filemon_virus.txt che si trovano nella stessa directory del file general.mdb corrente. I dettagli dell’importazione vengono definiti tramite il filemon Import Specification secondo le specifiche seguenti: a ogni riga del file di testo importato corrisponde un record nella rispettiva tabella, mentre la separazione dei campi in ogni riga del file di testo è marcata da tab. La tabelle create in Access saranno del tipo: Descrizione dei campi: op_id: indica l’ordine temporale di esecuzione dell’operazione time: ora:minuti:secondi in cui è avvenuta l’operazione process: processo che ha richiesto l’operazione pid: Process ID che identifica il processo legato che ha richiesto l’operazione operation: tipo di operazione (open, close, directory, read…) path: percorso del file legato al processo risultato: esito dell’operazione (success, file not found, …) notes: informazioni addizionali sull’operazione 19 Il formato della macro e delle specifiche di importazione sono riportati negli screenshot seguenti: 20 La macro regmon_tables Genera due tabelle regmon_clean e regmon_virus, importando rispettivamente i file regmon_clean.txt e regmon_virus.txt che si trovano nella stessa directory del file general.mdb corrente. I dettagli dell’importazione vengono definiti tramite il regmon Import Specification secondo le specifiche seguenti: a ogni riga del file di testo importato corrisponde un record nella rispettiva tabella, mentre la separazione dei campi in ogni riga del file di testo è marcata da tab. Le tabelle create in Access saranno del tipo: Descrizione dei campi: op_id: indica l’ordine temporale di esecuzione dell’operazione sul registro time: momento in cui è avvenuta l’operazione (espresso in secondi con 8 cifre decimali) process: processo che ha richiesto l’operazione pid: Process ID che identifica il processo legato che ha richiesto l’operazione request: operazione richiesta (query key, create key, …) path: percorso in cui viene effettuata l’operazione risultato: esito dell’operazione (success, notfound) other: informazioni addizionali sull’operazione 21 22 5.3 Le query Come già detto, i monitor ListDLLs e Handle visualizzano lo stato del sistema nel particolare momento in cui vengono eseguiti, pertanto le informazioni raccolte costituiscono una sorta di fotografia del sistema in un particolare istante. Viceversa i monitor Filemon e Regmon visualizzano dettagli su operazioni eseguite in ordine sequenziale, quindi non si visualizza lo stato del sistema, ma si prende in considerazione il suo comportamento in un certo intervallo di tempo. Proprio in virtù di questa diversità l’analisi dei risultati sarà differente: per ListDLLs e Handle il confronto fra le tabelle generate prima e dopo l’inoculazione del virus verrà effettuato record per record. Nel caso di Filemon e Regmon le query visualizzano le operazioni eseguite dal sistema a partire dal momento dell’inoculazione del virus escludendo le operazioni generate da processi presenti nel sistema anche prima dell’inoculazione del virus. Le query visualizzano il risultato sotto forma di tabelle aventi i medesimi campi delle tabelle prese in esame, quindi per il formato e la descrizione dei campi si veda la sezione relativa alle macro che generano le tabelle. Sono riportate tutte le query con il proprio codice SQL e una spiegazione della loro funzione. 23 La query dlls_in_clean_not_virus SELECT dllslog_clean.file, dllslog_clean.pid, dllslog_clean.command_line, dllslog_clean.base, dllslog_clean.size, dllslog_clean.version, dllslog_clean.path FROM dllslog_clean LEFT JOIN dllslog_virus ON (dllslog_clean.file=dllslog_virus.file) AND (dllslog_clean.command_line=dllslog_virus.command_line) AND (dllslog_clean.size=dllslog_virus.size) AND (dllslog_clean.path=dllslog_virus.path) WHERE (((dllslog_virus.file) Is Null)); Confronta tutti i record della tabella dllslog_clean con quelli della tabella dllslog_virus e visualizza i record che sono presenti nella dllslog_clean, ma non nella dllslog_virus. Due record vengono considerati uguali se i campi file, command_line, size, path sono uguali. I campi pid, base e version vengono trascurati (un pid diverso o una locazione in memoria differente non caratterizzano la diversità di due processi). La query dlls_in_virus_not_clean SELECT dllslog_virus.file, dllslog_virus.pid, dllslog_virus.command_line, dllslog_virus.base, dllslog_virus.size, dllslog_virus.version, dllslog_virus.path FROM dllslog_virus LEFT JOIN dllslog_clean ON (dllslog_virus.file=dllslog_clean.file) AND (dllslog_virus.command_line=dllslog_clean.command_line) AND (dllslog_virus.size=dllslog_clean.size) AND (dllslog_virus.path=dllslog_clean.path) WHERE (((dllslog_clean.file) Is Null)); Confronta tutti i record della tabella dllslog_clean con quelli della tabella dllslog_virus e visualizza i record che sono presenti nella dllslog_virus, ma non nella dllslog_clean. Due record vengono considerati uguali se i campi file, command_line, size, path sono uguali. Come nel caso precedente i campi pid, base e version vengono trascurati. La query handle_in_clean_not_virus SELECT handlelog_clean.file, handlelog_clean.pid, handlelog_clean.owner, handlelog_clean.address, handlelog_clean.type, handlelog_clean.path FROM handlelog_clean LEFT JOIN handlelog_virus ON (handlelog_clean.file=handlelog_virus.file) AND (handlelog_clean.owner=handlelog_virus.owner) AND (handlelog_clean.type=handlelog_virus.type) AND (handlelog_clean.path=handlelog_virus.path) WHERE (((handlelog_virus.file) Is Null)); Confronta tutti i record della tabella handlelog_clean con quelli della tabella handlelog_virus e visualizza i record che sono presenti nella handlelog_clean, ma non nella handlelog_virus. Due record vengono considerati uguali se i campi file, owner, type, path sono uguali. Gli altri campi non sono significativi per il confronto. 24 La query handle_in_virus_not_clean SELECT handlelog_virus.file, handlelog_virus.pid, handlelog_virus.owner, handlelog_virus.address, handlelog_virus.type, handlelog_virus.path FROM handlelog_virus LEFT JOIN handlelog_clean ON (handlelog_virus.file=handlelog_clean.file) AND (handlelog_virus.owner=handlelog_clean.owner) AND (handlelog_virus.type=handlelog_clean.type) AND (handlelog_virus.path=handlelog_clean.path) WHERE (((handlelog_clean.file) Is Null)); Confronta tutti i record della tabella handlelog_clean con quelli della tabella handlelog_virus e visualizza i record che sono presenti nella handlelog_virus, ma non nella handlelog_clean. Due record vengono considerati uguali se i campi file, owner, type, path sono uguali. Gli altri campi non sono significativi per il confronto. La query filemon_ virus_events SELECT filemon_virus.op_id, filemon_virus.time, filemon_virus.process, filemon_virus.pid, filemon_virus.operation, filemon_virus.path, filemon_virus.result, filemon_virus.notes FROM filemon_virus LEFT JOIN filemon_clean ON filemon_virus.process=filemon_clean.process WHERE (((filemon_clean.process) Is Null)); La query visualizza la tabella filemon_virus escludendo i record in cui il campo process corrisponda a quello di almeno un record della tabella filemon_clean. In questo modo vengono visualizzate solamente le operazioni relative a processi solitamente non riscontrati prima dell’inoculazione del virus. La query regmon_ virus_events SELECT regmon_virus.op_id, regmon_virus.time, regmon_virus.process, regmon_virus.pid, regmon_virus.request, regmon_virus.path, regmon_virus.result, regmon_virus.other FROM regmon_virus LEFT JOIN regmon_clean ON regmon_virus.process=regmon_clean.process WHERE (((regmon_clean.process) Is Null)); La query visualizza la tabella regmon_virus escludendo i record in cui il campo process corrisponda a quello di almeno un record della tabella regmon_clean. In questo modo vengono visualizzate solamente le operazioni relative a processi solitamente non riscontrati prima dell’inoculazione del virus. 25 6. ANALISI DEI VIRUS 6.1 Il virus ColdApe Informazioni sul virus Coldape è un virus scritto nel linguaggio delle macro di Microsoft Word 97 che avvia un Windows script virus e intacca i documenti mentre sono ancora chiusi. Coldape usa un nuovo metodo per replicarsi: invece di utilizzare il metodo tradizionale e copiare le proprie macro in varie locazioni, si serve di una tecnica chiamata AddFromString che rende il virus irriconoscibile a molti scanners. Se Coldape viene lanciato in Windows 98, Windows 2000 o qualsiasi altro Windows che supporti il WSH (Windows Scripting Host), il virus crea i seguenti file di script: • • • A4.VBS nella root Happy.VBS nella root AVM.VBS nella directory di Windows A4.VBS non è un virus vero e proprio, se lo script viene eseguito esso invia un messaggio di email utilizzando Microsoft Outlook (se presente), diretto a un personaggio molto conosciuto nell’industria degli antivirus. Happy.VBS e AVM.VBS contengono lo script del virus. L’appending script virus infetta tutti i file .VBS nelle directory di sistema e nella directory My Documents Il virus script è indipendente dal Word Macro virus e continua a diffondersi anche se il macro virus viene disinfettato. 26 Analisi del database Una volta adoperate le macro per l’importazione dei dati nelle tabelle, si noti che, oltre a quelle previste, vengono generate due ulteriori tabelle contenenti gli errori di importazione di dllslog_clean e dllslog_virus; ciò accade perchè nell’importer di Access esiste un limite alla lunghezza dei campi che viene talvolta superato dal campo command_line delle tabelle. Segue un’analisi dei risultati relativamente a ciascuna query. Dlls_in_clean_not_virus Non vengono riscontrate differenze. Dlls_in_virus_not_clean Nella tabella dllslog_virus (596 record) compaiono due record non presenti nella dllslog_clean (594 record). Entrambi si riferiscono a librerie di sistema utilizzate dal file explorer.exe. Intuitivamente le due librerie sono utilizzate per la gestione degli script che il virus va a modificare. Handle_in_clean_not_virus Non vengono riscontrate differenze. Handle_in_virus_not_clean Non vengono riscontrate differenze. Filemon_virus_events Per un limite legato alla funzione di import di Access, la tabella generata non contiene tutti i record presenti nel file di testo a essa associata. Tuttavia la quantità di dati importati sembra sufficiente per l’analisi dei risultati. Come ci si aspettava, tutti i file si tipo VBS presenti nelle directory del sistema operativo vengono modificati; in particolar modo i file presenti nella C:\WINNT e C:\WINNT\System32. Inoltre il virus tenta di accedere a numerosi file eseguibili e di libreria presenti in tali directory. Si noti che il processo che richiede le operazioni è sempre legato all’esecuzione del file wscript.exe che si occupa della gestione degli script in Windows. Regmon_virus_events Come ci si aspettava, il virus compie un gran numero di operazioni sui registri di sistema (3807 record) non solo tramite wscript.exe, ma anche attraverso processi legati ai tool di videoscrittura quali notepad.exe e wordpad.exe. 27 6.2 Il virus MSblast Informazioni sul virus 6.2 Il virus MSblast Informazioni sul virus MSblast è uno dei vari nomi che possono identificare il virus Lovsan, conosciuto anche come Blaster, W32/Msblast, Lovesun e Poza, presenti in varie verisoni. Si tratta di un network worm che si diffonde tramite una vulnerabilità di Windows di tipo Buffer Overrun in RPC Interface, conosciuta anche come DCOM/RPC o MS03-026, identificata il 16 Luglio del 2003. In realtà le vulnerabilità del sistema prese di mira sono tre, due di tipo Buffer Overrun e una di tipo Denial of Service. Le prime due vengono sfruttate per sovrascrivere con del codice eseguibile arbitrario il codice presente nei buffer non controllati (unchecked) di un programma. Ciò permette a un codice maligno di agire incontrastato all’interno del calcolatore, persino creando un Denial of Service, ossia impedendo l’uso delle risorse del sistema. Tutto ciò è possibile in ragione del fatto che WinRPCSS service, il quale gestisce le RPC (Remote Procedure Call), non controlla adeguatamente gli input in determinate circostanze; così, all’apertura di una connessione, l’attaccante può mandare uno speciale messaggio RPC per provocare l’underlying dell’infrastruttura di attivazione del DCOM (Distributed Component Object Model) sul sistema remoto e permettere così l’esecuzione del proprio codice. Questa versione del worm si diffonde solo su macchine con sistema operativo Windows 2000 e Windows XP; versioni più vecchie del sistema operativo non vengono intaccate. Su macchine che utilizzano Windows XP il worm causa in molti casi il riavvio periodico del sistema con il messaggio di errore: This system is being shut down in 60 seconds by NT Autority/System due to an interrupted Remote Procedure Call (RPC). Appare poi un’altra finestra con il countdown che precede il riavvio della macchina e un altro messaggio di errore. Le finestre di dialogo vengono da Windows stesso, e mostrano il messaggio di errore nella lingua del sistema operativo. In alcuni casi può succedere che il messaggio di errore venga visualizzato anche dopo aver applicato la patch corretta per correggere la vulnerabilità del sistema; tuttavia ciò non significa che la macchina è stata infettata ma solo riavviata. In ogni caso il timer di spegnimento non può essere fermato. In Windows 2000 gli utenti non vedranno il timer ma possono essere notati altri problemi nel creare messaggi in Outlook, funzioni base del sistema come il copia/incolla o il drag’n’drop non più operative, problemi con il pannello di controllo o con javascript, e l’impossibilità di effettuare il salvataggio di file da alcuni programmi. Per diffondersi nella rete MSblast utilizza un algoritmo di scanning degli host vulnerabili utilizzando come punto di partenza un indirizzo IP base che può essere casuale o simile a quello dell’host su cui risiede. Per capire meglio come funziona l’algoritmo di scanning, si consideri la generica struttura di un indirizzo IP: A . B . C . D. Come prima cosa il worm genera un numero tra 1 e 20. Se il numero è ≥ 12: prende l’IP dell’host e, se Chost > 20, l’IP base avrà Cbase = Chost – 20 e Dbase = 0; se C ≤ 20 parte proprio dall’indirizzo IP dell’host, quindi IPbase = IPhost. 28 Se il numero è < 12: si avrà come IP base un “totally random IP”; l’algoritmo sceglie A nell’intervallo [1, 254]; B e C nell’intervallo [0, 253]; D = 0. A partire dall’indirizzo IP base, l’algoritmo sonda 20 host alla volta; cerca di connettersi alla porta 135 su tutti i 20 host e controlla se la connessione ha avuto successo. In caso affermativo MSblast sfrutta le vulnerabilità conosciute per infiltrarsi, altrimenti prova con un altro host. Una volta infiltratosi, sulla macchina remota viene aperta una shell tramite cui il worm copia se stesso sull’host utilizzando il TFTP (Trivial File Transfer Protocol). Il TFTP client è integrato nel sistema operativo Windows 2000/XP mentre il TFTP server è implementato nel worm. Dopo che il worm è stato copiato nell’host remoto, viene fatto partire tramite la shell. Quando MSblast penetra all’interno di un sistema vulnerabile, è chiamato ‘msblast.exe’ e aggiunge al registro di Windows la seguente linea: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\windows auto update Così facendo il worm verrà fatto partire ad ogni avvio della macchina. Il worm è stato progettato in modo che dal 16 agosto alla fine di ogni anno, le macchine infette inviino sulla porta 80 un pacchetto di 40 byte ogni 20 millisecondi a windowsupdate.com allo scopo di creare un attacco di tipo denial-of-service distribuito a questo sito. Si noti che i pacchetti inviati a windowsupdate.com per attacco sono difficilmente filtrabili dal traffico normale. 29 Analisi del database Una volta adoperate le macro per l’importazione dei dati nelle tabelle, si noti che, oltre a quelle previste, vengono generate due ulteriori tabelle contenenti gli errori di importazione di dllslog_clean e dllslog_virus; ciò accade perchè nell’importer di Access esiste un limite alla lunghezza dei campi che viene talvolta superato dal campo command_line delle tabelle. Segue un’analisi dei risultati relativamente a ciascuna query. Dlls_in_clean_not_virus Non vengono riscontrate differenze. Dlls_in_virus_not_clean Nella tabella dllslog_virus (616 record) compaiono 23 record non presenti nella dllslog_clean (593 record). Tre record sono relativi a librerie utilizzate da explorer.exe; tutti gli altri sono utilizzati da msblast.exe. Handle_in_clean_not_virus Non vengono riscontrate differenze. Handle_in_virus_not_clean Sono presenti 8 record tutti relativi a msblast.exe. È interessante notare che tutti i file e le sezioni a cui msblast.exe accede sono relative a informazioni sulla cronologia, sui cookies, sulla cache e sui contenuti delle pagine internet visitate dall’utente corrente (in questo caso l’amministratore del sistema). Filemon_virus_events Nei 134 record visualizzati notiamo nuovamente l’accesso di msblast.exe alle librerie di sistema e alle seguenti directory relative al funzionamento del browser: • • • • C:\Documents and Settings\Administrator\Impostazioni locali\Cronologia C:\Documents and Settings\Administrator\Impostazioni locali\Temporary Internet Files\Content.IE5 C:\Documents and Settings\Administrator\Cookies C:\Documents and Settings\Administrator\Impostazioni locali\History.IE5 Si noti che il file winlogon.exe richiama il file ding.wav, forse per generare il tipico suono che avverte di un errore. Regmon_virus_events Sono presenti 36 record, tutti relativi alle azioni compiute da msblast.exe, che va a insinuarsi all’interno dei registri di sistema. In particolare HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\windows auto update farà partire il worm a ogni riavvio della macchina. 30 6.3 Il virus Nimda Informazioni sul virus Il Nimda è un virus di tipo worm. Esso può essere nascosto in file dai nomi diversi, nel nostro caso è all’interno di un file Readme.exe che può trarre facilmente in inganno. Infatti, nelle impostazioni di default di Windows la visualizzazione delle estensioni dei file è disabilitata e inoltre gli sviluppatori del virus hanno associato al file Readme.exe l’icona di una pagina visualizzabile con Internet Explorer; in tale maniera l’utente crede intuitivamente che si tratti di una pagina web e se cerca di visualizzarla provoca l’innesco del virus. Il Nimda è stato trovato per la prima volta il 18 Settembre 2001 e si è diffuso rapidamente in tutto il mondo. Esso è stato il primo worm in grado di infettare non solo i singoli utenti colpiti, ma anche file presenti su server web e disponibili per il download; come il Blast, inoltre, è capace di usare le macchine di utenti comuni per scannare host vulnerabili. Infine, un' altra caratteristica che lo presenta come uno dei più raffinati virus di sempre, è la capacità di infettare le reti locali LAN, andando a cercare e successivamente ad infettare i file condivisi. Per fare tutto ciò Nimda approfitta di due bachi nei moduli di Windows: uno presente nei Web Server IIS e uno nell’implementazione del MIME (protocollo aggiuntivo di posta elettronica che permette di allegare file); essi possono essere comunque corretti con le opportune patch. Il ciclo di vita attuale del Nimda può essere diviso in quattro parti. • Infezione dei file: Nimda cerca file di tipo EXE, HTML, ASP sulla macchina locale e li infetta assimilandoli al proprio interno e trattandoli come delle risorse. Questi file diffondono quindi l’infezione quando la gente scambia tali programmi. • Mass mailing: Nimda cerca indirizzi e-mail tramite il MAPI del mail client e nei file HTML locali per eventuali indirizzi aggiuntivi, quindi spedisce delle mail a ogni indirizzo. Ogni mail contiene in attachment il file README.EXE, che può essere eseguito automaticamente in alcuni sistemi. • Web worm: Nimda scanna internet cercando di trovare server web. Una volta che viene trovato un server cerca di infettarlo utilizzando vari bachi della sicurezza già conosciuti. Se ciò succede il worm cerca di modificare pagine web e file presenti sul sito aggiungendo poche righe in coda ai file HTML che costituiscono uno script Java che carica il file infetto README.EXE. Il risultato finale è che i navigatori web verranno automaticamente infettati navigando sul sito colpito. • Propagazione su LAN: il worm cerca i file condivisi sulla network locale, sia dai file servers che dagli utenti finali. Una volta trovati tali file inserisce dei file nascosti nelle directory che causeranno infezione negli altri PC. 31 Analisi del database Ci si accorge immediatamente della presenza del virus nel sistema perché vengono generati degli errori nell’ explorer.exe rendendo necessario riavviare il sistema. Una volta adoperate le macro per l’importazione dei dati nelle tabelle, si noti che, oltre a quelle previste, vengono generate due ulteriori tabelle contenenti gli errori di importazione di dllslog_clean e dllslog_virus; ciò accade perché nell’importer di Access esiste un limite alla lunghezza dei campi che viene talvolta superato dal campo command_line delle tabelle. Segue un’analisi dei risultati relativamente a ciascuna query. Dlls_in_clean_not_virus È presente un record relativo alla libreria actxprxy.dll. Dlls_in_virus_not_clean Sono presenti due record relativi a due librerie utilizzate da explorer.exe: jscript.dll e cfgmgr32.dll. L’ accesso alla libreria jscript.dll, che è la libreria degli java scripts, può essere un indizio dell’ opera di Nimda che, come già sappiamo, attacca i file web aggiungendoci uno script java. Handle_in_clean_not_virus Non vengono riscontrate differenze. Handle_in_virus_not_clean Il numero dei record e quindi degli handle infettati sembra variare con il tempo: al primo monitoraggio sono stati riscontrati 84 record, mentre al secondo monitoraggio (quello che si andrà ad analizzare) sono presenti 120 record. A parte quattro record relativi a informazioni sulla cronologia, sui collegamenti preferiti e al file mshtml.tlb (libreria degli oggetti Microsoft Html), tutti gli altri record sono identici fatta eccezione per il campo address; infatti la section \BaseNameObjects\d1kuikh viene ripetutamente caricata in diverse locazioni di memoria dal file explorer.exe. Filemon_virus_events Nei 3623 record visualizzati notiamo che la maggior parte ha a che fare con il processo drwtsn.exe relativo al Dr. Watson, un tool per il monitoraggio del sistema integrato in Windows 2000, che viene attivato automaticamente qualora sia riscontrata qualche anomalia. La maggior parte dei record descrive le operazioni effettuate e la scrittura del file di log a esse correlato. Questo evento non è stato attribuito direttamente all’ opera di Nimda, ma è stato interpretato come un’ azione di riflesso del sistema che si accorge di continui errori che sono un effetto secondario del virus. D’ altra parte, Dr. Watson si accorge degli errori ma non è in grado di individuare il virus. I record rimanenti sono più interessanti e soprattutto legabili al “lavoro” di Nimda. Molti record sono impegnati dal processo csrss.exe che utilizza driver e librerie di sistema. Questo processo è un modulo di Windows dedicato alla comunicazione nelle LAN e rispecchia bene l’ intenzione del virus di propagarsi attraverso questo mezzo. Informazioni interessanti provengono anche da winlogon.exe che va a leggere le impostazioni locali dell’utente corrente e il file autoexec.bat. Attraverso questo file molti virus configurano il sistema in modo da poter essere lanciati ad ogni riavvio della macchina. 32 Regmon_virus_events Sono presenti 1982 record: la metà relativi alle azioni compiute dal Dr. Watson (drwtsn.exe); è poi presente una serie di record relativa al processo internat.exe ( international ) che agisce sulle impostazioni della lingua presenti nel pannello di controllo; circa 900 record registrano le azioni del processo mep3.tmp.exe che è una traccia tipica del virus Nimda. Infatti nei sistemi infetti è sempre presente un processo, creato dal virus stesso, del tipo mep*.tmp.exe, dove al posto dell’ asterisco c’è di volta in volta un numero diverso. Infine, alcuni record sono associati al processo readme.exe, che è proprio quello del virus. 33 6.4 Un virus di tipo trojan Informazioni sul virus Il così detto trojan o cavallo di troia, non è propriamente un virus, è piuttosto un programma, uno spezzone di codice subdolo che, all’ insaputa dell’ utente e spesso automaticamente, si insinua nella macchina fungendo da Server. Se in remoto qualche malintenzionato sta facendo girare un programma che si comporta da Client, egli è in grado di comunicare e soprattutto di eseguire codice a piacimento sulla macchina nella quale è presente il trojan Server. Il file da cui si avvia il nostro trojan è m3tsp8.exe. Sul web non si sono trovate informazioni interessanti relative a un virus con questo eseguibile, ma si è trovato traccia in vari Thread di discussione del fatto che questo trojan ha comunque colpito ignari utenti. Per sua natura il virus è progettato per lavorare sulle comunicazioni relative ad una rete di calcolatori, pertanto, non disponendo di una rete per monitorare il comportamento del virus, i risultati ottenuti non tengono conto della parte probabilmente più consistente delle operazioni svolte dal trojan. Analisi del database Una volta adoperate le macro per l’importazione dei dati nelle tabelle, si noti che, oltre a quelle previste, vengono generate due ulteriori tabelle contenenti gli errori di importazione di dllslog_clean e dllslog_virus; ciò accade perchè nell’importer di Access esiste un limite alla lunghezza dei campi che viene talvolta superato dal campo command_line delle tabelle. Segue un’analisi dei risultati relativamente a ciascuna query. Dlls_in_clean_not_virus Non vengono riscontrate differenze. Dlls_in_virus_not_clean È presente un solo record relativo a un’operazione svolta da explorer.exe sulla libreria thumbvw.dll. Questa azione non è probabilmente opera del trojan, visto che la libreria thumbvw.dll è dedicata alle thumbnails multiple e difficilmente può interessare a questo tipo di virus. Handle_in_clean_not_virus Non vengono riscontrate differenze. Handle_in_virus_not_clean Sono presenti due record relativi alla cronologia di Internet Explorer. Filemon_virus_events Nei 170 record presenti, ce ne sono alcuni davvero interessanti. Poco più della metà delle operazioni è svolta dal file del virus m3tsp8.exe, che agisce sulle librerie di sistema e in particolare crea una nuova libreria m3tsp8.dll nella directory C:\WINNT\System32 a cui poi accede più volte. Il trojan, come si vede, carica poi il processo regsvr32.exe che in Windows è il modulo che permette di “registrare” una libreria, cioè aggiunge le appropriate chiavi nel file di configurazione permettendo così a tutti i processi di utilizzare i dati che si trovano in quella libreria. 34 Regmon_virus_events Sono presenti 1654 record legati in parte al processo m3tsp8_exe.tro, che agisce sui registri relativi alla comunicazione e ai suoi protocolli, in parte al processo notepad.exe e al processo regsvr32.exe che agiscono su impostazioni per la gestione dei collegamenti di rete. 35 6.5 Un virus sconosciuto (“mah”) Informazioni sul virus Per l’inoculazione si sono eseguiti i seguenti file: vir Upgrade62.exe vir 2Patch77.exe vir3 pack.exe vir4 Update79.exe Si noti che dopo l’inoculazione è stato visualizzato dal sistema l’errore “mapi32 exception: default mail account has a damaged table of contents”, come se il virus avesse tentato di accedere alle impostazioni locali per la posta. Poichè probabilmente anche in questo caso i nomi sono stati generati casualmente, non è stato possibile trovare documentazione ad essi relativa. Inoltre è possibile che i vari file contengano versioni diverse dello stesso virus. Comunque, esso è stato battezzato da noi come “mah” e pertanto il database a esso relativo risiede nell’omonima directory. Il fatto di non conoscere nulla di questo virus, soprattutto il fatto di non trovare descrizioni del suo comportamento in rete, ci permette di mettere per così dire alla prova il nostro metodo di analisi. Vedremo che questa prova avrà successo poichè troveremo azioni del virus che ci porteranno ad accostarlo al recentemente famoso virus Sasser, permettendoci così di descrivere con sufficiente sicurezza il nostro “mah” come un worm Sasser-like. Analisi del database Segue un’analisi dei risultati relativamente a ciascuna query. Dlls_in_clean_not_virus Si è verificato un evento insolito: gli otto record riportati dalla query sono presenti in entrambe le tabelle. L’unica differenza consiste nel formato del path, nella dllslog_clean è di tipo Windows, mentre nella dllslog_virus è di tipo DOS (8+3 caratteri): il campo cmd /c ""C:\virus\syssinternals.com\INNESCO\AttivaMonitorsShell.bat" " è diventato infatti cmd /c ""C:\virus\SYSSIN~1.COM\INNESCO\ATTIVA~1.BAT" " Non è stato per noi possibile dare significato a questo cambiamento, ne abbiamo comunque con successo rilevato l’ accadimento. Dlls_in_virus_not_clean Vedi le considerazioni fatte in Dlls_in_virus_not_clean. Dall’analisi dei restanti record sembra che il virus stia operando con WinZip su un file giabzqj.zip, dal nome criptico e quindi sospetto, presumibilmente creato dal virus stesso. Sembra poi che il file virUpgrade62.exe venga eseguito con il nome di virade62.exe per poi accedere a librerie di sistema. Il fatto di nascondersi dietro nomi diversi, vedremo anche poi, sarà una costante del nostro “mah”. 36 Handle_in_clean_not_virus Non vengono riscontrate differenze. Handle_in_virus_not_clean Sono presenti cinque record sempre relativi all’utilizzo di Winzip e del file virde62.exe. Si noti come il virus compaia con nomi diversi a seconda del contesto. Filemon_virus_events E’ grazie ai risultati provenienti da questo monitor che possiamo catalogare il “mah” come un virus Sasser-like. Infatti il database ci comunica che il virus lavora in gran parte sul processo lsass.exe. Il Local Security Authority Service è un processo che può essere usato da un codice malizioso per generare un errore di tipo buffer overflow e conseguentemente per far eseguire alla macchina colpita codice arbitrario. Il Sasser si è diffuso in maniera così repentina e massiccia sfruttando proprio questa falla, ora riparabile grazie alle opportune patch create “tempestivamente” da Microsoft. Sono presenti 106 record relativi al processo lsass.exe che modifica soprattutto le impostazioni per la sicurezza in: C:\WINNT\System32\config\SECURITY C:\WINNT\System32\config\SECURITY.LOG A parte il lsass.exe, sono presenti il processo vnck.exe (probabilmente creato dal virus, poiché non è un modulo di Windows) che accede alle librerie psapi.dll e hook.dll, e i processi mstask.exe e winlogon.exe. Regmon_virus_events Sono presenti 3064 record. Anche qui il processo sjgp.exe è probabilmente creato da “mah” e va a modificare i registri relativi ai protocolli internet e altri parametri di sistema. Vir 2Patch77.exe, vir3 pa~1.exe, vir4up~1.exe compiono operazioni analoghe modificando i registri. Infine compare nuovamente un cospicuo numero di operazioni svolte dal processo relativo a winzip32.exe. 37 7. CONCLUSIONI E RIFERIMENTI Al di là dell’utilizzo di Microsoft Acces e della progettazione di un database, questa analisi ha permesso di intravedere la complessità di un sistema operativo, la quantità di processi e di operazioni in corso in ogni istante di tempo. Ha fatto inoltre capire quanto fragile possa essere il sistema di fronte ad attacchi provenienti dall’esterno (ma anche dall’interno), e quanti parametri sia possibile modificare a nostra insaputa. Il lavoro è stato impegnativo, non tanto nella progettazione e realizzazione delle singole parti, quanto nella definizione di un percorso che portasse a risultati concreti e quindi nell’interconnessione dei vari passi che ci hanno portato dalla semplice inoculazione dei virus all’analisi di ciò che essi realmente fanno nel sistema; ogni stadio del progetto è stato esaminato con la massima cautela: dal capire quali monitor potevano essere utili e quali no, al riuscire a confrontare e visualizzare in un database informazioni veramente rilevanti e non un semplice insieme di dati. Una volta creata la struttura base del procedimento (un lavoro più di logica che di realizzazione concreta su calcolatore), gran parte del tempo è stata impiegata per l’inoculazione dei virus, l’esecuzione di un monitor alla volta (in caso contrario i vari monitor avrebbero potuto interferire l’uno con l’altro, eccetto Handle e ListDLLs) e il ripristino del sistema non infettato da virus; tale lentezza è di certo imputabile alla non eccezionale potenza della macchina da noi utilizzata e all’appesantimento causato dal lavoro in un ambiente virtuale. Pur sentendo la profonda mancanza, come già detto, di un supporto di rete vero e proprio che ci avrebbe consentito di allargare la prospettiva di lavoro, siamo riusciti ad ottenere un gran numero di informazioni sull’operato dei virus presi in considerazione. Per quanto riguarda il software utilizzato, esso è, come già detto: • Microsoft Access 2002 per la realizzazione dei database; • monitor prodotti dalla SysInternals e scaricabili gratuitamente dal sito www.sysinternals.com; • Microsoft Visual C++ per la programmazione dei convertitori; • VMware per l’esecuzione di macchine virtuali; • Microsoft Outlook Express e ArGO Soft Mail Server per la simulazione del meccanismo client/server della posta elettronica (che tuttavia non ha dato i risultati sperati). Le informazioni sui singoli virus sono reperibili sul sito www.f-secure.com. 38 APPENDICE handle_converter.cpp #include #include #include #include #include "stdafx.h" <conio.h> <iostream.h> <fstream.h> <string.h> #define byte unsigned char bool DEBUG=0; //Carica l'uscita del monitor Handle e la converte per essere salvata in un file che Access //interpretera' int find_str_in_text(char str[] , byte* buf, int bufDim); //trova la prima ricorrenza della //stringa str nel buffer di dimensione bufDim //se non lo trova ritorna -1 int main(int argc, char* argv[]) { const char* strIn="handlelog.txt"; const char* strOut="prova.txt"; if(argc!=3) { printf("\n NO PARAMETRI? USO QUELLI DI DEFAULT!"); printf("\n Uso: handle_converter.exe out in"); } else { strOut=argv[1]; strIn=argv[2]; printf("\nLeggo da %s",strIn); printf("\nScrivo su %s",strOut); } if(DEBUG)getch(); printf("\nBenvenuto!"); ifstream f; ofstream ouf; char fff[1000]; char orgLine[2000]; f.open(strIn,ios::in); ouf.open(strOut,ios::out); //************************************* //ELABORAZIONE PER EXPORTER IN ACCESS char line[2048],newLine[2048]; for(int m=0;m<1000;m++){line[m]=' ';newLine[m]=' '; } line[1000]=newLine[1000]='\0'; for(int i=0;i<5;i++)f.getline(line,1000); int headerLenght=0; while(!f.eof()) { bool isHeader=0; f.getline(line,1000); //leggi una riga dal file memcpy(orgLine,line,1000); //salva una copia dell'originale static char headerRow[810]; 39 //ELABORAZIONE RIGA if(line[0]=='-')continue; isHeader= (line[0]!=' '); if(isHeader) { //se la riga non inizia con lo spazio //se la riga e' un HEADER //is//Header=1; //azzerra header for( i=0;i<80;i++)headerRow[i]=' '; memcpy(headerRow,line,80); headerLenght=-1; for(int y=0;y<80;y++) { if((int)headerRow[y]==0||headerRow[y]=='\n'){headerLenght=y;break;} }//end for y if(headerLenght==-1) { printf("\nERRORE NON TROVO IL CARATTERE DI FINE RIGA nell' HEADER ROW!!!!!!!!"); getch();return 1; } //trova la lunghezza dello header //modifica header: se trovi spazio metti la pipe int primoSpazio=-1,secondoSpazio=-1; for(int l=0;l<80;l++) { if(headerRow[l]==' ') { if(primoSpazio==-1)primoSpazio=l; else secondoSpazio=l;} }//end for int l if(primoSpazio==-1) { printf("\nERRORE: NON TROVO LO SPAZIO NELL0 HEADEROW!!!!");getch();return 1; } //metti la pipe headerRow[primoSpazio]='|'; for (int v=primoSpazio+1;v<80-5;v++) headerRow[v]= headerRow[v+5]; headerLenght-=5; //accorcia if(headerLenght<0)headerLenght=0; if(headerLenght<0) { printf("\nDimensione negativa!!");getch(); } //riempi gli ultimi 5 con spazio for(int i=80-5;i<80;i++)headerRow[i]=' '; //trova il primo spazio e sostituiscilo con la pipe: for(int u=0;u<80;u++) if(headerRow[u]==' ') {headerRow[u]='|';break;} }//end riga non inizia con spazio (e' un header) memcpy(newLine,headerRow,headerLenght); //i primi 80 sono header if(!isHeader) { line[0]='|'; 40 //ELABORA LINE: line[5]='|'; memcpy(&line[6],&line[7],1000); memcpy(&newLine[headerLenght],&line[0],1000); //cerca il primo spazio... for(int ps=headerLenght+7;ps<1000;ps++) if(newLine[ps]==' ')break; if(ps==999){printf("\nNon trovo ps!!");getch();} newLine[ps]='|'; memcpy(&newLine[ps+1], &orgLine[21],1000); //FINE ELABORAZIONE RIGA if(DEBUG)cout<<newLine<<"\n"; ouf<<newLine<<"\n"; }//end non e' un header else newLine[headerLenght]='\0'; //se e' un header } if(f.bad()){printf("\nErrore in lettura!!");return 1;} f.close(); ouf.close(); if(DEBUG)getch(); return 0; } // end main int find_str_in_text(char* str, byte* buf, int bufDim) { //trova la prima ricorrenza della stringa int strDim=0; //calcola la lunghezza della stringa: while(str[strDim]!='\0')strDim++; int p=0; while(p<bufDim) { int q=0; while(q<strDim)//cerca la stringa in buf[p] { if(buf[p+q]!=str[q])goto NIENTE_DA_FARE; //niente da fare!! q++; }//end while(q<strDim) //ha trovato la prima ricorrenza!!!! return p; NIENTE_DA_FARE: p++; }//end while return -1; }//end find char in text 41 listdlls_converter.cpp #include #include #include #include #include #include "stdafx.h" <iostream.h> <fstream.h> <stdlib.h> <string.h> <conio.h> bool DEBUG=0; //e' in fase di debug??? int main(int argc, char* argv[]) { //USAGE: listdlls_converter fileout filein int i; const char* strIn="listdllsOut.txt"; const char* strOut="lprova.txt"; printf("\nBenvenuto in listdlls_converter"); if(argc!=3) { printf("\nNO PARAMETRI?"); printf("\nUSAGE: listdlls_converter [uscita] printf("\nUsero' i parametri di default..."); } else { strOut= argv[1]; strIn= argv[2]; } [ingresso]"); if(DEBUG){ printf("\nLeggero' dal %s",strIn); printf("\nE scrivero' su %s",strOut); getch(); } ifstream f; ofstream ouf; char line[2048],newLine[2048]; char headerRow[1024],headerRow2[1024]; f.open(strIn,ios::in); ouf.open(strOut,ios::out); //salta le prime 5 righe for( i=0;i<5;i++) f.getline(line,1000); int nonHeaderRow=0; while(!f.eof()) { bool isHeader; static int headerLenght=-1; //DEVE ESSERE STATICO!!! static int header2Lenght=-3; int lineLenght=-2; f.getline(line,1000); if(line[0]=='-')continue; isHeader= (line[0]!=' '); //trova lunghezza linea for(i=0;i<1000;i++)if(line[i]=='\0'){lineLenght=i;break;} if(isHeader) { headerLenght=lineLenght; memcpy(headerRow,line,800); //tira via il carattere di fine riga dall'header ROW!!! //cerca il primo spazio: int primospazio=0; for(int i=0;i<80;i++) if(headerRow[i]==' '){primospazio=i;break;} headerRow[primospazio]='|'; //tronca i successivi 4 caratteri 42 for(int v=primospazio+1;v<80-4;v++) headerRow[v]=headerRow[v+4]; headerLenght-=4; //leggi la seconda: f.getline(line,1000); for(i=0;i<1000;i++)if(line[i]=='\0'){lineLenght=i;break;} memcpy(headerRow2,line,800); header2Lenght=lineLenght; //tronca le header ROw (tira via i primi 14: for(i=0;i<header2Lenght-13;i++) headerRow2[i]=headerRow2[i+13]; header2Lenght-=13; headerRow2[0]='|'; //salta le altre 2 linee se in questo campo ci sono dati f.getline(line,1000); //se questo carattere NON e' '-' allora salta la successiva, altrimenti torna indietro if(line[0]=='-'){}//no! bisogna tornare indietro else {f.getline(line,1000);} }//end if is header else { for(i=0;i<headerLenght;i++) newLine[i]=headerRow[i]; newLine[headerLenght]='|'; for(i=0;i<header2Lenght;i++) newLine[headerLenght+i]=headerRow2[i]; newLine[headerLenght+header2Lenght]='|'; //ELABORA LA LINEA: cerca lo spazio e sostituiscilo con pipe e shifta int lastFound=0; for(int k=0;k<3;k++) for(i=lastFound+4;i<lineLenght;i++) if(line[i]==' ') { line[i]='|'; lastFound=i; { //shifta a sinistra for(int j=i+1;j<lineLenght-1;j++) { line[j]=line[j+1]; //shifta } lineLenght--; }//end shifta a sinistra break; } //attacca il resto della linea for(i=0;i<lineLenght;i++) newLine[headerLenght+header2Lenght+i]=line[i]; newLine[headerLenght + header2Lenght+lineLenght]='\0'; //metti una pipe alla fine del secondo header... newLine[headerLenght+ header2Lenght]='|'; //sostituisci gli spazi alle pipes if(DEBUG)printf("\n%s",newLine); ouf<<newLine<<'\n'; }//end else NON e’ uno header }//end while(!f.eof f.close(); ouf.close(); if(DEBUG)getch(); return 0; } 43 mon_converter.cpp #include "stdafx.h" #include <fstream.h> #include <conio.h> bool DEBUG =1; int main(int argc, char* argv[]) { printf("\nhello W\torld!\n"); const char* strIn="monitor.log"; const char* strOut="monitor.txt"; if(argc!=3) { printf("\n NO PARAMETRI? USO QUELLI DI DEFAULT!"); printf("\n Uso: mon_converter.exe out in"); } else { strOut=argv[1]; strIn=argv[2]; } printf("\nLeggo da %s",strIn); printf("\nScrivo su %s",strOut); if(DEBUG)getch(); printf("\nBenvenuto!"); ifstream f; ofstream ouf; f.open(strIn,ios::in); //apri il file per leggere ouf.open(strOut,ios::out);//apri il file su cui scriverai char newLine[2000]; if(f.bad()) { printf("\n ERRORE IN LETTURA!!"); getch(); } while(!f.eof()) { int lineLenght; f.getline(newLine,200); //leggi linea dal file printf("%s",newLine); //stampala (giusto per assicurarci che funziona) //cerca la fine linea int i; for( i=0;i<200;i++) if(newLine[i]=='\0')break; lineLenght=i; if(DEBUG) printf("\nlunghezza %i",lineLenght); //trova il carattere ":" bool firstFound=0; for(int j=0;j<lineLenght;j++) if(newLine[j]==':'&&!firstFound){newLine[j]='\t';firstFound=1;} ouf<<newLine; //stampa la stringa sul file ouf<<'\n'; //aggiungi il carattere di fine riga } printf("\nFine elaborazione!"); getch(); return 0; } 44