Niveau :
Résumé : perl, libipq, IN PTR
Le problème
Les firewall ne proposent jamais de faire une règle qui couperait la connexion en fonction du domaine de l'appelant. C'est gênant car on aimerait bien pouvoir devenir indépendant de l'ip de notre partenaire.
Si on ouvre un accès à un ami, pourquoi devrait-il nous avertir lorsqu'il change d'ip alors qu'il a fait correctement son travail en mettant à jour son DNS.
En réalité il y a de bonnes raisons à cela, en effet le domaine ne se trouve pas dans le paquet il faut donc aller le chercher quelque part. Et cela implique :
- qu'on base une règle sur quelque chose qu'on ne maîtrise pas, voire pire, qu'un attaquant pourrait maîtriser : la base dns de la source
- qu'on devient dépendant du résolveur dns et donc de ses failles
- qu'il est possible que le firewall empêche le firewall d'aller chercher l'info sur le serveur dns
- qu'il faut attendre que le dns réponde et donc les performances d'un tel firewall risquent d'être catastrophiques
Les deux derniers problèmes sont purement techniques et ont donc une solution technique acceptable moyennant quelques compromis. Par contre les deux premiers problèmes concernent la sécurité et il faut donc garder en tête que si on met en place une telle règle, elle est là pour nettoyer les flux qui traversent notre firewall, mais qu'elle n'apporte que peu de sécurité par rapport à l'absence de règle.
La solution
Maintenant que nous savons qu'il ne faut pas le faire, voyons comment faire :-)
Tout d'abord il y a deux possibilités, se baser sur le forward DNS (IN A et IN AAAA) ou sur le reverse dns (IN PTR). Aujourd'hui je vous propose le pire des cas, le reverse DNS, puisque votre configuration est directement tributaire de la volonté de l'attaquant.
Commençons par un prototype, donc en perl, parce que je le veux bien.
Le point important ici est de faire la résolution dns en espace utilisateur. Pour cela il faut d'utiliser libipq, la bibliothèque permettant de communiquer entre l'espace utilisateur et netfilter la partie noyau du firewall linux.
Il nous faut donc :
- libipq : IPTables::IPv4::IPQueue
- parser les paquets ip : NetPacket::IP
- faire des requêtes dns : Net::DNS
Et voici le script tout simple, le reste de l'article est en commentaire dans le script.
continue reading...