rss feed articles activities all_comments

indeedgeek.de

Florian Eitel

DNS DDOS

Ich weiß schon was ich tue...

Ein DOS-Angriff ist eigentlich relativ trivial. Man fragt sehr viel Daten an. So viele, dass der Server überlastet ist. Entweder durch die Ressourcen die benötigt werden, um die Daten bereit zu stellen oder aber durch den dazu benötigten Traffic, um die Daten zu übertragen. Ziel ist es nun möglichst viel Last auf dem Ziel zu erzeugen und selbst möglichst wenig dafür zu tun. Wäre ja blöde wenn man ein System DOS’n will und man hat selbst mehr Arbeit als das Ziel. Dann überlastet man sich eher selbst als das Ziel. Ich will kurz zeigen wie man so etwas mit DNS erreicht.

Der Effekt, dass das Ziel mehr zu tun hat als wir selbst nennt sich Amplification. Wir senden zum Beispiel kleine Pakete hin und bekommen sehr große Pakete zurück. Somit haben wir wenig Aufwand mit Senden. Das Ziel muss aber sehr viele Daten erzeugen. Das Verhältnis kann man einfach in einem Faktor ausdrücken. Eine Amplification von 8 würde bedeuten der Server muss 8 mal mehr Daten senden/berechnen/bereitstellen/… als der Angreifer.

Dumm nur wenn der Server die Daten an uns sendet. Dann haben wir zwar erreicht wenig Daten zu senden bekommen aber dafür viel Daten zurück. Deshalb fälscht man einfach in der Anfrage die IP-Adresse. Somit bekommen nicht wir die Antwort sondern viel mehr die gefälschte IP-Adresse. Da DNS UDP verwendet und UDP keine Verbindung aufbaut wie TCP geht dies wunderbar. Genannt wird das IP-Spoofing. Und der Angreifer schadet somit nicht nur dem Ziel sondern auch noch dem Besitzer der gefälschten IP-Adresse, da dieser viele Daten zugeschickt bekommt die er eigentlich gar nicht möchte.

Gut damit fehlt nur noch ein kleiner Schritt: Wir müssen uns eine Methode suchen eine möglichst große Amplification zu erreichen. Dafür gibt es endlose Möglichkeiten. Viele Protokolle beachten diesen Fall nicht. So war es zum Beispiel eine Weile möglich einfach TCP zu nutzen, da das Ziel Speicher schon bereit gestellt hat obwohl die Verbindung noch gar nicht ganz aufgebaut wurde (SYN-Flood). Aber im konkreten Fall soll es ja um DNS gehen.

Dazu muss man wissen, dass DNS sozusagen zwei Modi kennt. Rekursive und nicht rekursiv. Frage ich nun zum Beispiel den DNS Server auf indeedgeek.de nach der IP-Adresse von google.de und er antwortet Anfragen rekursiv, dann löst indeedgeek.de auch google.de auf. Wenn er selbst nicht die IP weiß dann fragt er andere DNS Server, ob die denn vielleicht die Antwort kennen. Man erkennt schon: Man kann so viel Last erzeugen, wenn man einen rekursiven Server nach Daten fragt die er nicht kennt. Die Alternative ist nicht rekursiv bei dem der Server einfach sagt: “weiß ich nicht, frag mal hier nach…”.

Gut gehen wir vom schlechtesten Fall aus und wir haben einen DNS Server der Rekursion erlaubt. Dann reicht es aber nicht einfach immer eine Domain abzufragen da der Server die Ergebnisse zwischenspeichert und nicht jedes mal neu auflöst. Klar wir könnten verschiedene Domains abfragen aber es geht auch einfacher.

Wir fragen ihn nach Informationen, bei denen wir wissen es kommen viele Daten zurück. Das ANY Feld ist recht beliebt, da alle Angaben zurück gegeben werden, die so gefunden werden. Aber viele DNS Server blockieren ANY Anfragen da sie eigentlich nicht sonderlich Sinn machen (für normale Zwecke).

Nehmen wir an wir besitzen eine Domain wie fuckdos.ru dann können wir auch beliebige Felder im DNS eintragen. Unter anderem auch der TXT-Record. Nun definiert man einfach mehrere TXT-Records und schreibt Blödsinn rein – viel Blödsinn.

Und nun frage ich den TXT-Record ab. Das Ziel löst die Daten rekursiv auf und sendet mir den ganzen Blödsinn den ich in den TXT-Record geschrieben habe zurück. Somit habe ich eine kleine Anfrage und eine große Antwort. Im konkreten Fall waren es 87 Bytes Anfrage und 1115 Bytes Antwort. Das ist immerhin ein Faktor 12.

Nun gibt es noch einen kleinen Trick. Da DNS Pakete eigentlich nur 512 Byte groß werden können, haben wir ein Problem. Aber zum Glück gibts da ein Ausweg: Man kann – zum Beispiel für DNSSEC – angeben, dass man auch größere Pakete zurück geliefert bekommen möchte. Das nennt sich dann EDNS. So kann man ein Client sagen: Hey ich weiß das Pakte wird größer ich unterstütze aber Pakete bis zum Beispiel 9000 Byte Größe. Also nur her damit.

Und nun die Frage die sich alle stellen: Warum war ich so blöde und habe Rekursion aktiviert obwohl ich wusste, dass es gefährlich ist? Ich wollte bisschen bessere Performance da ich den DNS Server statt den DNS Server des ISP verwende. Ich hatte theoretisch Filter eingebaut die DOS erkennen und per iptables blockieren. Hatte aber natürlich weder an IP-Spoofing noch TXT-Records gedacht. Und nun habe ich den Ärger. Den Sender bekomme ich nicht raus da die IP gefälscht wird und das Opfer kann ich zwar blocken aber vielleicht schieße ich mir damit selbst in den Fuß.

Also lasst euch das eine Lehre sein: Rekursive DNS gehören deaktiviert! Um zu testen ob ein DNS Server Rekursion aktiviert hat einfach: dig google.de @SERVER | grep flags | grep ra. Sollte das ra Flag gesetzt sein, hoffe ich ihr wisst besser was ihr tut als ich.

Comments:

(howto comment?)