Attaque par amplification DNS

Dans l'article sur la "Mise en place d'un cache DNS" je vous avais dit qu'il était important de spécifier l'option "allow-query" de cette manière:

allow-query { 127.0.0.1; };

J'ai justifié ce choix en vous expliquant brièvement que cela pourrait être dangereux de ne pas le faire. Dans cet article je vais vous expliquer pourquoi.

Quand vous spécifiez l'option "recursion" à bind9 vous l'autorisez en fait à répondre à des requêtes DNS visant des zones sur lesquelles il n'a pas le contrôle. Pour qu'il puisse vous répondre, votre serveur va  du coup devoir requêter d'autres serveurs qui eux même vont en requêter d'autres jusqu'à tomber sur le serveur qui gère la zone DNS et qui pourra répondre à la requête. C'est ce qu'on appelle la récursion DNS.

Alors pourquoi c'est dangereux ? Eh bien si vous ne spécifiez pas l'option:

allow-query { 127.0.0.1; };

Toute personne sur le même réseau que vous pourra requêter votre serveur DNS or comme les réponses sont cachées, un attaquant pourrait bruteforcer votre serveur DNS pour déterminer sur quel site vous vous rendez. Démonstration. Depuis mon serveur DNS j'effectue une requête DNS vers le domaine youtube.com:

dig youtube.com 

J'obtiens une réponse en 44 msec et cette dernière est cachée. Maintenant depuis ma raspberry pi je vais effectuer la même requête en indiquant à dig qu'il doit intéroger mon serveur DNS:

dig youtube.com @192.168.0.31

J'obtiens la réponse en 0 msec. En tant qu'attaquant j'en déduis donc que ma cible s'est déjà rendu sur le site youtube.com. Bon évidemment dans ce cas là on s'en fiche un peu mais l'idée est là. De toute manière ce n'est pas le manque de confidentialité qui pose problème ici, c'est surtout qu'une personne malintentionnée pourra exploiter une attaque par amplification DNS qui pourrait mener à un Dos le tout depuis l'IP de votre serveur DNS.

Voici comment se déroule une attaque par amplification DNS. Première l'attaquant forge une requête DNS en spoofant l'adresse IP de sa victime:

Ensuite il va émettre ce paquet en masse vers plusieurs DNS configurés pour répondre à n'importe quelle requête récursivement (dont potentiellement notre serveur DNS mal configuré).

Chacun des serveurs DNS va récupérer puis renvoyer la réponse. Or comme nous avons spoofé l'IP du serveur victime ce n'est pas l'attaquant qui va recevoir les réponses mais la cible:

Ce scénario dans le cas où il est utilisé via un botnet mènera tout simplement à un déni de service puisque la cible recevra des dizaines de milliers de réponses DNS.

En spécifiant dans notre fichier de configuration que seul notre machine peut émettre des requêtes en direction du serveur DNS:

allow-query { 127.0.0.1; };

Nous empêcherons totalement cette attaque.