_________________________________________________________________________ PICCOLA INTRODUZIONE A NESSUS: cos'e', a cosa serve e come funzia by --[ fritz ]-- ________________________________________________________________________ -------[ Intro, Reperimento e installazione Nessus e', come lo definisce freshmeat, "a free, up-to-date, and full-featured remote security scanner for Linux, BSD, Solaris, and some other systems". Ma non intende un semplice scanner come potrebbe essere nmap (e gia' sul semplice qui c'e' da discutere) ma un analizzatore di vulnerabilita' di un sistema: con la sua architettura a plugin esegue una marea di exploit (360 nell'ultima release) e poi fornisce un report esauriente sul server testato, mettendone in luce eventuali hole o warning. Al momento in cui scrivo (Wed Apr 12 12:40:36 CEST 2000) l'ultima versione uscita e' la 1.0.0pre1, scaricata stamane da freshmeat (http://freshmeat.net) e rilasciata da pochi giorni, dopo la 0.99.10 che sembra essere la penultima. I file necessari per l'installazione sono: nessus-libraries-1.0.0pre1.tar.gz libnasl-1.0.0pre1.tar.gz nessus-core-1.0.0pre1.tar.gz nessus-plugins-1.0.0pre1.tar.gz e vanno installati in quest'ordine, causa precedenze verificate dai vari "./configure script" NB: nel mio sistema (slackware 7) la directory in cui installa le librerie ( /usr/local/lib ) non viene usata dal sistema, e quindi queste non venivano trovate. Quindi o si aggiunge la dir in questione al percorso standard, o, per i piu' pigri come me: cp -l /usr/local/lib/libn* /lib/ cp -l /usr/local/lib/libhosts_gatherer.* /lib/ cp -l /usr/local/lib/libpcap-nessus.* /lib/ cp -l /usr/local/lib/libpeks.* /lib/ (con l'opzione -l (link) creiamo solo un collegamento e non sprechiamo spazio con doppioni inutili). Ora siamo pronti per vedere cos'e' questo gioiellino. -------[ Preparazione: lato root Nessus, come recita la man page, e' uno scanner (o security auditing tool che fa piu' fico) che consiste in 2 parti: un server -nessusd(8)- e un client -nessus(1)- che gira sotto X con interfaccia Gtk, e comunicano di dafault in modo criptato. Questa divisione e' stata realizzata per motivi di sicurezza, cosi' solo l'amministratore, o chi ha la pass root del sistema, puo' decidere quali host possono essere scannati dai quali utenti. Ed e' per questo quindi che per configurare nessusd bisogna quindi assumere privilegi di root. La prima volta che viene eseguito, se e' stato compilato con crittografia mediante cipher layer (come di default) bisogna assegnare una password con la seguente sintassi: nessusd -P username,passwd e si assiste alla generazioni di chiavi per la codifica/decodifica della comunicazione con il cliente quindi: darkstar:~# nessusd -P root,admin_passwd Generating primes: ........................... A questo punto se si vuole verificare: darkstar:~# nessusd -L root - user password Ok, ora bisogna aggiungere l'utente che avra' il permesso di eseguire lo scan, tramite il comando nessus-adduser: darkstar:~# nessus-adduser Using /var/tmp as a temporary file holder Addition of a new nessusd user ------------------------------ Login : fritz Password : fritz_passwd Authentification type (cipher or plaintext) [cipher] : Now enter the rules for this user, and hit ctrl-D once you are done : (the user can have an empty rules set) accept 127.0.0.1 default deny Login : fritz Password : fritz_passwd Authentification : cipher Rules : accept 127.0.0.1 default deny Is that ok ? (y/n) [y] y user added. Le rules (regole) che ho impostato per l'utente fritz gli consentono di eseguire lo scan in locale, ma non altrove, quindi una regola del genere permette un'analisi del proprio sistema ma non fa fare danni outside. Dato che scrivo sempre in fretta e non controllo mai quello che digito, la prima volta avevo sbagliato a scrivere, allora per chi si trova nella stessa situazione, si puo' editare a mano il file /usr/local/etc/nessus/nessusd.users, leggermente diverso da quello ripostato nella man page, che non esiste) Per ultima cosa, mandiamo in esecuzione il server (daemon mode): darkstar:~# nessusd -D Ora che abbiamo impostato il tutto dal lato server, possiamo eseguire lo scan con il client. -------[ Preparazione: lato user Lanciamo X e eseguiamo "nessus", ci richiede una password che dovremmo digitare ogni volta per eseguire il client, ed ecco l'interfaccia. Cosi' com'e' non ci possiamo fare nulla, dobbiamo connetterci al server, e quindi premiamo "login" e immettiamo l'utente e password che abbiamo impostato prima da root con l'utility nessus-adduser. Ora siamo operativi. Nella sezione plugin compaiono ora tutte quelle che ha ottenuto dal server, divise per famiglie, disabilitabili singolarmente e con una descrizione accurata per ciascuna. Di default, come avvisa la finestrella che compare alla prima connessione, le plugin che possono provocare il crash di sistemi remoti sono disabilitate (ultima famiglia, col nome Denial of Service). Facciamo subito una prova: lasciamo le impostazioni cosi' come sono e mettiamo 127.0.0.1 nel target. Nel mio caso, ecco il risultato: Number of hosts which were alive during the test : 1 Number of security holes found : 0 ( tie'! hihi, mitika slack) Number of security warnings found : 8 (ops... ehmm... andiamo a vedere) Clicco sul nome dell'host a sinistra (127.0.0.1) ed ecco gli 8 warnings, non tutti sono ben documentati, ma non c'e' da lamentarsi. Ecco qualche esempio: 1) sendmail risponde ai comandi EXPN e/o VRFY, che possono essere usati rispettivamente per trovare il nome vero dell'alias o il nome intero del destinatario e la validita' dell'account, e mi consiglia quindi se uso sendmail di aggiungere l'opzione O PrivacyOptions=goaway in /etc/sendmail.cf Inoltre mi avvisa che e' vulnerabile alla redirezione: ovvero se mi viene inviata una mail a user@hostname1@victim, il server la spedira' ("allegramente") a user@hostname1. In questo modo il simpaticone puo' far sguisciare il mesaggio attraverso il firewall per giocare con altri smtp server che non sarebbero visibili e raggiungibili dall'esterno (ma guarda te quante cose si imparano eheh) Segue quindi la modifica al sendmail.cf R$*@$*@$* $#error $@ 5.7.1 $: '551 Sorry, no redirections.' E infine mi avvisa che il mio sendmail permette il relay (azz proprio messo male sto eheh!) 2) general tcp --> azz sono vulnerabile allo spoofing? e io che credevo che il mio bel kernelino 2.2.12 fosse a posto... Vediamo perche'. Predictable TCP sequence number (eh si, non si scappa, e' proprio quello) Insomma, i mie numeri non sono abbastanza random e sono vicini, incrementati dello stesso valore ogni volta. Segue la sequenza e il commentino, proprio per farmi vedere che non si scappa: SEQ: 3814839753 SEQ: 3814839753 relative size: 0 SEQ: 3816935659 relative size: 2095906 SEQ: 3816935659 relative size: 0 SEQ: 3868 relative size: 478035505 SEQ: 3868 relative size: 0 SEQ: 3975865765 relative size: 3975861897 SEQ: 3975865765 relative size: 0 SEQ: 3869 relative size: 319105400 SEQ: 3869 relative size: 0 Dopo un'analisi accurata i warning cmq si riducono a: tcp, sendmail e un altro (sul quale pero devo ancora indagare), quindi si sono piu' che dimezzati. Meglio comunque qualche falso allarme piuttosto che qualche insecurity hole non trovato :) Salvo il log in html e riprovo qualche altro scan, ma stavolta con l'ultima plugin che prima non era abilitata: DoS (speriamo bene, se crasha tutto devo ricominciare la registrazione che ho in background: mp3 --> minidisc :) ) [$%@#!!!] azz... non so se e' stata la mancanza di ram o nessus o cos'altro, ma qui si e' impastato tutto per qualche minuto, poi s'e' ripigliato (killando X e quindi anche lo scan in corso -e anche la registrazione ggggrrrrrr-) Riprovo con un sistema piu' libero e senza (o quasi) processi in background. Nulla di nuovo in piu', ancora gli 8 warnings di prima, ma ho avuto la macchina bloccata per un po', l'editor fermo, il cursore fisso immobile, la tastiera morta, ma il mio kernelino non e' stato sconfitto, ne' nessus mi ha riportato qualche warning in piu' riferito ai possibili DoS. Uhmm... e' tempo ora di fare un saltino fuori dalla mia linuxbox, siamo ora un po' piu' maliziosetti. Per prima cosa torniamo all'utente root e aggiungiamo un altro utente a nessusd, perche' il fritz creato prima con accept 127.0.0.1 default deny poteva solo effettuare scan in locale. Ora creiamo un utente all_scan con password all_scan e queste regole: deny 127.0.0.0/24 default accept ovvero puo' effettuare qualsiasi scan eccetto quelli che prevedono come target il suo sistema (il contrario di quello che poteva fare l'utente precedente). Abbandoniamo root e torniamo al semplice utente, cerchiamo qualche buon server sul quale testare nessus, l'ideale sarebbe un host coreano, noti non certo per la zelanza dei loro sysadmin, ma speriamo cmq che non se la prendano troppo. (Come dice mayhem, un conto e' bussare a tutte le porte di un palazzo, un altro e' cercare di forzarne la serratura di tutte, l'amministratore del condominio potrebbe menarsela un po') Per trovare un server qualsiasi coreano, --> Altavista ________________________________________________________________________ Ask AltaVista a question. Or enter a few words in [Korean______] *.kr______________________________________________ Search ________________________________________________________________________ e prendiamone uno a caso. Lo scan ora e' durato un'ora buona, ma e' stato molto redditizio. Esporto il risultato in latex (tra gli altri formati c'e' html, html con grafici e torte -fichissimo- e txt), poi dviizzo, postscriptizzo, stampo e vado a vedere. A parte il fatto che il report in formato ps e' veramente fico da vedere, sono piu' di 20 pagine e ha un aspetto veramente professionale, e' anche ben fatto. Dopo la copertina e l'indice, riassume la situazione in una introduzione: host scannati: 1, security warnings: 19, security holes: 4 (fuffffffio....). "Note that there is a big number of problems for a single network of this size. We strongly suggest that you correct them as soon as you can, although we know it is not always possible. [...] A script kid should be able to break into your network rather easily. [...] If you were considering hiring some security consultant to determine the security of your network, we strongly suggest you do so, because this should save your network". Il giudizio e' stato abbastanza severo, con i server coreani non si sbaglia quasi mai :)) Come gia' detto prima, la spiegazione dei vari problemi e' abbstanza esauriente, quindi una lettura anche delle sezioni che non interessano e' comunque consigliabile. Due sezioni particolarmente interessanti sono: -Sendmail --> ammette il relay (Warning) -Apache con count.cgi installata (Hole) Ultima nota riguardo al report scritto in latex: il sorgente e' snello e per nulla pesante, quindi facilemnte modificabile, e con pochi ritocchi, potrebbe tranquillamente sembrare un report fatto da noi a seguito di una prestazione di consulenza riguardo alla sicurezza di un server :)) -------[ Spippolamenti vari Ok, per ora e' stato illustrato il suntino di una semplice esecuzione di questo gioiellino, nulla di piu' di una semplice recensione. Andiamo a vedere ora qualche cosina di piu' approfondito. Nessus funziona a plugin, una per ogni insecurity, quindi queste sono il cuore del programma, che altrimenti si limiterebbe a poco piu' di uno scan. Queste si trovano in /usr/local/lib/nessus/plugins, scritte tutte in nasl, un linguaggio creato apposta (nella documentazione ne spiega i vantaggi rispetto al C, perl o altri), ma di non difficile comprensione. Per vedere come funziona purtroppo ci tocca andare a capire un linguaggio che per la maggior parte ignoriamo, quindi ne prendo una semplice, del tipo netbus.nasl, che bene o male possiamo intuire tutti di cosa parla :) Lo script inizia con la descrizione, in inglese e francese, e dei vari messaggi che poi andranno nel report in caso di backdoor rivelata, quindi questi li salto. La parte importante inizia senza dubbio qui: ------------------- [...] # # The script code starts here # port = get_kb_item("Services/netbus"); if(!port)port = 12345; if(get_port_state(port)) { soc = open_sock_tcp(port); if(soc) { # # Anti-deception toolkit check # r = recv(socket:soc, length:1024); close(soc); if("NetBus" >< r){ security_hole(port); } } } ------------------- Come si intuisce facilmente, le prime righe ricavano la porta sulla quale cercare la presenza di netbus, e poi si inizia una connessione, e se questa e' instaurata senza problemi ( if (soc) e' inequivocabile per chi conosce un po' di programmazione in generale) si mette a leggere cosa gli arriva, e se legge "NetBus", passa al programma principale il compito di scrivere il messaggio che e' abbinato alla porta 12345, e quindi nel report leggeremo la presenza di netbus e come disinstallarlo (per la cronaca: http://members.spree.com/NetBus/remove_1.html). Proviamo a prendere un'altra plugin, tipo per esempio il buffer overflow relativo al demone imap (root da remoto senza troppa difficolta' eheh!) Dopo le solite righe relative alla presentazione, troviamo: ------------------- [...] # # The script code starts here # port = get_kb_item("Services/imap"); if(!port)port = 143; if(get_port_state(port)) { data = string("1023 LOGIN ", crap(1023), "\r\n"); soc = open_sock_tcp(port); if(soc > 0) { buf = recv_line(socket:soc, length:1024); if(!buf) { set_kb_item(name:"imap/false_imap", value:TRUE); close(soc); exit(0); } send(socket:soc, data:data); buf = recv_line(socket:soc, length:1024); if(!buf){ security_hole(port); set_kb_item(name:"imap/overflow", value:TRUE); } close(soc); } } ------------------- Vediamo un po' cosa fa: ricava la porta sulla quale operare (143), instaura una connessione, verifica che non sia un falso, manda la stringa incrimata ("data") che dovrebbe causare l'overflow, e se non riceve risposta ( "if (!buf)" mi sa tanto di qualcosa tipo "if (buf==NULL)") allora dice al progr principale che e' stata trovata tale insecurity hole (anzi.. ole'! ok ok battuta pessima eheh!). Insomma, nulla di particolarmente difficile da comprendere, anzi, queste plugins possono rivelarsi anche un'ottima fonte di informazioni su come funzionano certi exploit. Ultimo esempio carino e' il file teardrop.nasl: ------------------- [...] # # The script code starts here # [...] qui costriusce i pacchetti udp spoofati # Send our UDP packets 500 times start_denial(); send_packet(udp1,udp2, pcap_active:FALSE) x 500; alive = end_denial(); if(!alive){ set_kb_item(name:"Host/dead", value:TRUE); security_hole(0); } ------------------- Simpatico il fatto che alla fine per capire se l'host e' vulnerabile controlla se e' vivo ( "if(!alive)" ), e in caso contrario allora riporta il rischio di tale vulnerabilita' :))) Una cosa che mi sembra di aver notato e' che appena trova una vulnerabilita' nei DoS finisce lo scan, dato che, secondo la sua logica, se un host si e' dimostrato debole e' perche' sembra morto, e quindi e' inutile ad andare avanti con gli altri test, dato che riporterebbero tutti risultati negativi (nel senso di nulla di trovato) poiche' tutte le connessioni non risulterebbero possibili a causa del crash appena provocato. Questo non mi e' risultato sempre vero, dato che ho trovato semplici PC che sembravano vulnerabili al teardrop, ma NON sono caduti, e ad ogni modo Nessus ha interrotto lo scan. In quel caso il test non ha riportato risultati corretti, anche dopo mia verifica manuale, teardrop.c e ip della vittima alla mano . -------[ Lamering Ultima considerazione che mi e' venuta in mente una sera quando su irc.tin.it con nome fasullo adescavo marpioni di ogni generazione che usavo come host su cui provare questa perla di programma (a prop: paola78 saluta tutti i frequentatori di #milano eheheh): se metto l'ip del casanova telematico, setto lo scan su una sola porta (magari 20034) e disabilito tutte le plugin tranne quelle relative alla famiglia dei Denial Of Service, Nessus si trasforma in un potente nukker, che prova ogni tipo di attacco fino a quando o rinuncia o sfonda :)) E le prove l'hanno confermato: il 50% delle vittime cadeva al volo, mentre l'altro 50%, anche con altri metodi, rimaneva up, quindi o era patchato alla morte o aveva un OS con le contropalle, ma cmq Nessus ha riportato ugualmente la vulnerabilita' senza accorgersi che era falsa (vedi qualche riga piu' in alto). Tutto cio' grazie a tin che non maschera l'ip dei suoi chatters :) NB: tra i vari DoS c'e' anche il mitico "+ + + ATH0 modem hangup" che mette a tacere sempre qualcuno. Be', prima di mandarlo, assicuratevi di patcharvi anche voi contro questo exploit, altrimenti mentre spedite questo ping, cadete per primi :) Io me ne sono accorto a mie spese. Per linux basta modificare il file /etc/ppp/pppscript mettendo come stringa di inizializzazione ATS2=255. Nel mio caso, cambiandolo un po' a "muzzo", il file e' diventato: TIMEOUT 60 ABORT ERROR ABORT BUSY ABORT "NO CARRIER" ABORT "NO DIALTONE" "" "ATS2=255" OK "atdtNUMERO_DI_TELEFONO_DEL_PROVIDER" TIMEOUT 75 CONNECT e cosi' funziona. -------[ Conclusioni E' un gioiellino, sise usato nel modo migliore, ovvero come analizzatore della propria rete, ma anche come scanner verso terzi ignari... Unica cosa da ricordare: non provate Nessus con tutti i server in tutta tranquillita' senza il minimo timore: per verificare se e' presente una vulnerabilita', la deve provare, e quindi risulta a tutti gli affetti che VOI abbiate eseguito quel particolare exploit. Quindi un sysadmin anche non troppo preparato potrebbe accorgersene del vostri vari tentativi, menarsela e rendervi la vita un po' piu' difficile di prima. that's all :) --[ fritz ]-- Club SpiPPoLaTorI www.spippolatori.com