Le DNS permet à un
domaine d'avoir des
jokers, des enregistrements qui feront que le
serveur DNS répondra systématiquement à tous les noms de domaine,
qu'ils « existent » ou pas. Comment tester, sans accès aux données
entrées, si un domaine a de tels jokers ?
Les jokers (wildcards) sont un des points les plus contestés du DNS. Certains
TLD les utilisent de façon à rabattre du trafic
(essentiellement des fautes de frappe) vers un serveur de publicité
(c'est ce que fait aujourd'hui .tk ou ce qu'à
fait, avec beaucoup plus de publicité, .com,
dans l'affaire connue - bien à tort - sous le nom de Sitefinder ; le registre
de .fr, s'est par contre engagé
à ne pas le faire).
Pire, certains FAI peu scrupuleux utilisent
une technique similaire sur les résolveurs DNS qu'ils mettent à la
disposition de leurs clients, malgré l'avertissement du (voir aussi le
communiqué de l'AFNIC).
Comment détecter qu'il y a des jokers ? En lisant le , cela semble simple. Les jokers sont
représentés par le caractère * et, si on veut
tester example.org, on fait une requête DNS pour
*.example.org et on voit si le domaine existe ou
pas (attention à échapper le caractère * pour le shell Unix) :
>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 48646
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
]]>
Le NXDOMAIN (No Such Domain)
indique que le domaine n'existe pas et qu'il n'y a donc pas de
jokers. Avec .tk, par contre :
>HEADER<<- opcode: QUERY, status: NOERROR, id: 63123
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 7, ADDITIONAL: 1
...
;; ANSWER SECTION:
*.tk. 86400 IN MX 20 MX-HOST.DOT.tk.
]]>
Ici, le domaine existe : .tk a bien des
jokers.
Mais le monde est plus compliqué que cela : on trouve des domaines
qui ne répondent pas pour * mais qui ont quand même des jokers, et
aussi le contraire. Il faut donc utiliser un algorithme plus
perfectionné. Voici celui que j'ai développé (avec l'aide de Joe
Abley et de plusieurs autres) :
Envoyer une requête pour *.DOMAINE.example,Envoyer trois requêtes pour des noms choisis aléatoirement dans
DOMAINE.example,Vérifier que les réponses coïncident.
Notez qu'aucun algorithme de recherche de jokers n'est
parfait. Celui-ci a des faux négatifs (par exemple si la malchance
fait que les noms choisis au hasard existent réellement) et des faux
positifs (par exemple si les serveurs DNS ont des réponses variées - plusieurs serveurs avec des adresses IP différentes à chaque
requête).
Le code de mise en œuvre en Python, utilisant dnspython, est
disponible. Voici quelques tests :
, ])
]]>
Et, si on indique explicitement le résolveur (ici, celui d'OpenDNS, un service de résolution qui renvoie de fausses réponses avec de la publicité) :