DNS pinning forklart
RSnake skrev for noen dager siden en artikkel om DNS rebinding i Firefox på ha.ckers.org. Dette vekket interessen min for et emne som er veldig vanskelig å forstå seg på, nemmelig DNS pinning.
For å forstå DNS pinning må men først forstå "same origin policy" i nettlesere. Kort fortalt er dette en mekanisme som gjør at en ressurs som kommer fra www.example.com ikke kan gjøre forespørsler til andre adresser enn www.example.com. Det vil si at et JavaScript kan ikke kjøre Ajax forespørsler til en annen server enn den det selv ligger på. Dette er en begrensing i alle moderne nettlesere for å beskytte brukere mot ondsinnet kode.
For å sikre at denne beskyttelsesmekanismen fungerer blir DNS oppslag mellomlagret i nettleseren helt til nettleseren lukkes uavhengig av TTL verdien på DNS oppslaget. Dette kalles altså DNS pinning.
Her er et eksempel på angrep dersom man ikke hadde hatt DNS pinning.
Vi har en god nettside www.example.com som peker til 111.111.111.111.
Vi har en slem nettside www.attacker.com som peker til 222.222.222.222.
Angriperen har full tilgang til DNS serveren til www.attacker.com og har satt TTL på sitt domene til 1 sekund.
Når noen besøker www.attacker.com kjøres et ondsinnet JavaScript som forteller nettleseren om å laste siden på nytt, om 2 sekunder og sende data den mottar til en annen server.
Brukeren sin nettleser kobler seg til www.example.com og og gjør et DNS oppslag og får til svar 222.222.222.222 med TTL på 1 sekund.
JavaScriptet gir nettleseren beskjed om å koble seg til www.attacker.com etter to sekunder, og siden DNS oppslaget ikke lenger er gyldig gjør den et nytt DNS oppslag. Denne gangen får den 111.111.111.111 til svar. Nettleseren kobler seg da til www.example.com og vi har akkurat lurt nettleseren sin "same origin policy".
Med DNS pinning aktivt ville ikke det andre DNS oppslaget blitt gjort, isteden ville nettleseren fortsette å bruke 222.222.222.222.
Det som er litt interessant er at dersom nettleseren på andre forsøk ikke klarer å koble til en port, så fjernes DNS pinningen og man kan deretter utføre et Anti DNS pinning angrep. Denne type angrep er spesielt aktuelt mot feks intranettsider som ikke er tilgjengelige fra internett. Man kan da bruke en uvitende bruker som "proxy".
Her er hvordan et slik angrep kan foregå.
1. Brukeren kobler seg til www.attacker.com, gjør et DNS oppslag og får 222.222.222.222 med TTL 1 sekund som svar.
2. Et JavaScript gir nettleseren beskjed om å gå tilbake til www.attacker.com om 2 sekunder, og deretter skrus en firewall regel på som blokkerer all trafikk til webserveren.
3. Nå droppes DNS pinningen. Siden nettleseren ikke når www.attacker.com på 222.222.222.222, gjør den et nytt DNS oppslag.
4. Denne gangen svarer DNS serveren at www.attacker.com finnes på 111.111.111.111 som peker til www.example.com
Siden IP adressen nå har endret seg, leser nå angriperen sin XMLHttpRequest www.example.com, selv om den tror han leser www.attacker.com.
Vi har igjenn lurt nettleseren sin "same origin policy", denne gangen med DNS pinning aktiv.
Det er en del ting man bør merke seg, når nettleseren sender forespørsler til www.example.com sendes de med Host: www.attacker.com, eventueller cookies som tidligere er satt på www.example.com vil heller ikke sendes med.
Man kan da spørre seg hvorfor man ikke bare forespurte www.example.com uten å omgå DNS pinningen.
Som nevnt tidligere gir ikke denne angrepsmetoden noen fordeler så lenge man ikke har sider som er blokkert tilgang utenfra i en brannmur som mål. Man bruke denne metoden til å å lese sider som var regnet som "skult" fra offentligheten, og i tillegg bruke denne informasjonen til å utføre CSRF angrep.
Et eksempel med litt mer detaljer og hvordan det kan gjøres i praksis finner du på sla.ckers.org sitt forum skrevet av Kanatako.
En demo av et angrepet beskrevet av Kanatako finner du her http://www.jumperz.net/index.php?i=2&a=1&b=7.
Mine eksempler og inspirasjon til artikkelen her jeg funnet her: http://christ1an.blogspot.com/2007/07/dns-pinning-explained.html
