DNS poisoning

Qui siam tutti onesti, lo dice il cartello!Leggo che il tema del DNS poisoning è ancora attuale, circa tre anni dopo la sua esplosione.

Prima di tutto, un’introduzione per chi non conosce il funzionamento del DNS.

Ogni macchina su Internet è identificata da un indirizzo numerico (per ora, principalmente nella forma a.b.c.d dove le lettere rappresentano dei numeri da 0 a 255 decimale), ma è un dato difficile da ricordare e su uno stesso IP possono vivere più server virtuali, nel caso di httpd. È stato quindi creato un sistema che associa delle sequenze più facili da ricordare ad un indirizzo numerico: è più facile ricordare siamogeek.com piuttosto che 84.19.182.37. Il sistema per passare dal nome usato dagli umani all’indirizzo numerico utilizzato dalle macchine è detto risoluzione del nome, il quale si basa sul sistema dei nomi a dominio (DNS).

Quando voglio risolvere siamogeek.com, il mio computer genera un numero di sicurezza a caso tra 0 e 65.535 e lo scrive in una richiesta che invia al server DNS di riferimento (quello definito nelle impostazioni del TCP/IP del computer). Il server DNS, elabora la richiesta e risponde allegando quel numero nella risposta per fare in modo che io abbia la (relativa) sicurezza che mi ha risposto il server legittimo e non un malintenzionato. Prima del 1995 i numeri erano scelti in sequenza e, quindi, facilmente indovinabili; ora tutti i computer li scelgono a caso, ma la bontà della casualità della scelta dipende dalla piattaforma che la esegue e, quindi, potrebbe essere facilmente indovinabile.

Ma cosa potrebbe fare un malintenzionato? Essenzialmente due cose: (1) rispondere che l’IP di siamogeek.com è 66.6.0.47 e farmi andare su un server trappola oppure (2) rispondermi che la fonte che ha autorità per risolvere i nomi (authoritave DNS server) di siamogeek.com non è quella vera (domaincontrol.com) bensì un server trappola che, a questo punto, è in grado di falsificare tutti gli indirizzi di siamogeek.com.

A peggiorare le cose c’è una caratteristica del DNS tale per cui ogni informazione acquisita ha una scadenza prima della quale non bisognerebbe richiedere la medesima informazione alla fonte che ha autorità. Nell’esempio di cui sopra, quando chiedo a domaincontrol.com l’indirizzo di siamogeek.com, mi viene risposto che quell’informazione vale per i prossimi 3600 secondi. Un attaccante può quindi falsificare le informazioni per il tempo che lui stesso imposta: anche dopo la conclusione dell’attacco, le informazioni rimarranno nella memoria del computer finché non si riavvia il sistema o non scade la validità dell’informazione.

Lo schema di un attacco basato sul DNS poisoning è a grandi linee questo:

  1. Un malintenzionato bombarda il server DNS a cui voi fate riferimento (immaginiamo quello del vostro provider) con richieste che si sa a priori che hanno come risposta “nessun indirizzo associato a quel nome”; le richieste possono essere la risoluzione di nomi tipo aaa123.siamogeek.com, aaa124.siamogeek.com, aaa125.siamogeek.com, aaa126.siamogeek.com e così via.
  2. Ovviamente a ciascuna di queste richieste il server DNS del provider continua a rispondere “nessun indirizzo associato a quel nome”. Ma l’attaccante prosegue imperterrito.
  3. Per come funziona il sistema, ogni volta il DNS server del provider deve contattare domaincontrol.com per verificare se effettivamente esista o no il nome richiesto ed attendere una risposta; ogni richiesta conterrà un numero casuale tra 0 e 65.535 come spiegato sopra.
  4. L’attaccante tenta di intromettersi e falsificare la risposta di domaincontrol.com tentando di indovinare il numero casuale. Data la velocità delle connessioni attuali, il numero di tentativi che si possono fare è veramente elevato e le probabilità di indovinare il numero giusto sono più alte di quello che si pensa.
  5. Dopo un po’, ipotizziamo quando ha inviato la richiesta di risolvere lr47666.siamogeek.com, l’attaccante riesce nel suo intento: il provider riceve una risposta dall’attaccante che riconosce come valida e, per come è strutturato il pacchetto di risposta, l’attaccante non solo fa credere al server che lr47666.siamogeek.com esista davvero ma anche che www.siamogeek.com e siamogeek.com abbiano come indirizzo 66.6.0.47; ovviamente la risposta contiene una scadenza relativamente alta, in modo tale che la contaminazione di siamogeek.com duri il più a lungo possibile. Il gioco è fatto e nemmeno il titolare di siamogeek.com può farci nulla perché il problema non dipende da lui, ma da voi (o dal vostro provider) e dalla cache del vostro resolver locale.

La soluzione a questo problema passa sicuramente per un aggiornamento costante dei sistemi, con particolare riferimento alla parte DNS.

Inoltre è bene abilitare la ricorsione sui server DNS solamente per gli IP autorizzati (tipicamente gli IP della rete interna). La ricorsione permette di utilizzare un DNS per risolvere qualsiasi nome di Internet e non solamente i domi di cui il server è l’autorità.

Da ultimo, i SysAdmin potrebbero considerare l’uso di DNSSEC.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

3 pensieri riguardo “DNS poisoning”

    1. Appartiene ad un blocco assegnato a ITC, una compagnia telefonica del South Dakota e Minnesota.

      Di piu’ non posso dirti senza poi doverti neuralizzare 🙂

Spazio per un commento