vendredi 27 août 2010

Rechercher une adresse IP au travers de plusieurs DNS

Récemment a eu lieu le premier filtrage d'un site Web par un FAI français , celui-ci à choisi de bloquer l'accès à ce site en modifiant ses serveurs DNS.

Pour rappel un DNS (Domain Name Service ) est un serveur qui fait correspondre une adresse internet (www.site_bidule.fr) à une adresse IP (99.99.99.99 ).

Les adresses IP sont indispensables aux ordinateurs pour pourvoir communiquer entre eux.


Que faire pour obtenir une adresse IP quand on soupçonne que son DNS nous "ment" en nous fournissant une mauvaise adresse IP ?


La recherche manuelle:

Sous Linux , il existe la fameuse commande "dig" qui permet de consulter un DNS bien précis pour obtenir une adresse IP.

Exemple en tapant dans un terminal :  

dig @8.8.8.8 www.stanjames.com
( @8.8.8.8 : consultation d'un DNS public de Google )

Vous obtiendrez la réponse suivante:

; <<>> DiG 9.7.0-P1 <<>> @8.8.8.8 www.stanjames.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42365
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.stanjames.com.        IN    A

;; ANSWER SECTION:
www.stanjames.com.    53    IN    CNAME    sb129.www.stanjames.com.
sb129.www.stanjames.com. 53    IN    A    91.199.56.80

;; Query time: 53 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Aug 27 18:15:27 2010
;; MSG SIZE  rcvd: 71

Une fois obtenue cette adresse IP , on se pose tout de suite la question existentielle suivante : "Mais qui me prouve que cette IP est bien la bonne, que le DNS n'est pas lui aussi un menteur ?"

Aïe ! Une des façons de procéder est de considérer que Tous les DNS ne sont pas "menteurs" car tous ne sont pas soumis aux mêmes contraintes régionales (politique, judiciaire etc ... ) et que tous ne sont pas remis à jour dans la même période de temps, etc ...

L'idée sera donc de consulter un "grand" nombre de DNS pour pouvoir comparer les IP obtenues.

Le site www.dnsserverlist.org mettant à disposition un listing de près de 900 DNS publiques qui sont mis à jour toutes les heures , il ne restait plus qu'à associer ces DNS et la commande "dig" dans un script.

Le script: 
(Nota : comme d'habitude c'est brut de fonderie mais si quelqu'un veut l'améliorer , LIBRE à lui de le faire )

Quelques explications au préalable:


Le script va demander:
L'adresse internet du site dont on veut connaitre l'adresse IP,
Puis le nombre d'adresse IP que l'on veut récupérer (la consultation des DNS peut prendre pas mal de temps alors mieux vaut limiter ce nombre) ,
Puis la localisation des serveurs DNS pour pouvoir comparer les réponses données par des serveurs d'un pays par rapport à un autre pays (par exemple pour consulter des DNS français il suffit de taper FR ou FRANCE pour ne consulter que des serveurs localisés en France)

Et enfin la recherche commence.

Les réponses obtenues apparaissent à l'écran au fur et à mesure des requêtes et le résultat final de la recherche: toutes les IP obtenues sont enregistrées dans un fichier adr_site.txt .

Il suffit de consulter les IP dans le fichier pour trouver son bonheur.

A titre d'exemple le site www.stanjames.com avec 100 IPs demandées à des DNS sans contingence de pays m'a donné 100 fois la même adresse qui s'est révélée être la bonne ...

Alors que la consultation de DNS français m'a parfois fourni l''IP : 89.202.162.236 qui aboutit sur une page indiquant que:
"Nous sommes désolés, mais en raison de la réglementation française vous n'êtes pas autorisé à consulter ce site.
Nous nous excusons pour la gêne occasionnée."
.... =:((


Installation:

Il vous suffit de copier le code suivant et de l'enregistrer (check_IP_DNS.sh par exemple),
puis dans un terminal ouvert dans le répertoire du fichier créé, il reste à taper chmod +x  check_IP_DNS.sh pour le rendre exécutable.

Vous pourrez alors le lancer dans un terminal



Le code:

#!/bin/bash

# RAZ
if [ -f adr_site.txt ]
then
rm adr_site.txt
fi
if [ -f serveurs_dns.txt ]
then
rm serveurs_dns.txt
fi
if [ -f serveurs_dns_choix.txt ]
then
rm serveurs_dns_choix.txt
fi
compteur=0
site_check=""

#
echo "Entrer le nom du site : (exemple www.stanjames.com)"
read site_check
echo ""
echo " Combien de réponses maxi (adresse IP) voulez vous ? (max = 899)"
read nb_reponse
echo ""
echo " Un peu de patience .... Please Wait ....constitution de la liste des serveurs DNS"
echo ""
echo " ** localisation des serveurs DNS ** "
wget http://www.dnsserverlist.org/ -O - -o /dev/null | grep -e "ip_dns" | cut -d">" -f6-20 | sed s/'<..*>'//g | sort -u >> serveurs_dns.txt
cat serveurs_dns.txt | cut -d" " -f2-5 | sort -u | grep -v [0-9]
echo ""
echo "quel pays voulez vous garder ? 'Entrée' pour tous "
read pays
cat serveurs_dns.txt | grep -e "$pays" | cut -d" " -f1 >> serveurs_dns_choix.txt
echo ""
echo " Encore Un peu de patience .... Please Wait ....Consultation des DNS"
echo ""
for i in `cat serveurs_dns_choix.txt`
do
adr_site=$( dig @$i $site_check +short | grep -v ";" | grep -e [0-9] | grep -v [a-z] )
echo "$i => $adr_site"
if [ "$adr_site" != "" ]
then
    echo "$adr_site" >> adr_site.txt
    compteur=$(wc -l adr_site.txt | cut -d" " -f1)
    if [ "$compteur" -ge "$nb_reponse" ]
    then
        echo ""       
        echo " ** Résulats : IP obtenues pour le site $site_check ** "
        cat adr_site.txt | sort
        echo "****  fin ****"
        echo ""
        echo " Les résultats sont enregistrés dans le fichier adr_site.txt "
        echo " Taper sur 'Entrée' pour Quitter"
        read mot
        exit
    fi
fi

done
echo "****  fin ****"
echo " Les résultats sont enregistrés dans le fichier adr_site.txt "
echo " Taper une lettre pour Quitter"
read mot

exit


NB : N'étant pas un partisan des jeux d'argent (en ligne ou non) que je considère comme de grands "pièges à cons" , je n'ai pris l'exemple du site de jeu en ligne en question qu'à cause de l'actualité récente qui le concernait !
Comme ça les choses sont dites !

3 commentaires:

  1. Hello papillon!
    Une autre méthode est de supposer que ce sont tous des menteurs et de ne faire confiance qu'aux serveurs root DNS.
    Si on ne peut pas faire confiance a root alors on ne peut faire confiance a personne ^^
    Pour cela il suffit de monter son propre serveur DNS (sudo apt-get install bind9) d'editer son sudo nano /etc/resolv.conf
    de mettre nameserver 127.0.0.1
    et de le "locker"
    sudo chattr +i /etc/resolv.conf

    Aucun serveur Fake parmis la liste ne loguera votre recherche et en plus vous aurez un cache qui accelera un petit chouilla votre connexion.
    Attention a 8.8.8.8... on sais tous que google utilise les informations a des fin publicitaires meme sur vos DNS ;)

    RépondreSupprimer
  2. @Mastergb
    Tu as tout à fait raison ! un DNS racine ne peut "mentir" et pouvoir disposer de son propre serveur DNS représente LA solution !
    Mais j'ai trouvé que l'exercice était tellement amusant de pouvoir comparer les résultats de différents DNS publiques et de montrer par la même occasion que certains étaient de gros "menteurs" =;))

    Pour ce qui est du 8.8.8.8, c'est vraiment par fainéantise que je l'emploie : il est vraiment trop facile à retenir ! Grr !! Honte à moi !

    RépondreSupprimer
  3. Bonjour,

    J'utilise des DNS locaux sur differentes machines et ca n'est pas suffisant :

    Je recupere quand même 89.202.162.236

    En fait c'est stanjames qui bloque les utilisateurs francais et non le FAI.

    C'est le DNS de Stanjames qui ment aux requetes effectuées depuis un DNS francais et non le DNS du FAI

    RépondreSupprimer