24/04/2010

DNS menteur, une autre méthode anti-curieux

Cas n°1 Gentoo/Linux + Lighttpd

Notre premier cas s’applique actuellement à un réseau domestique/tpe sous ma responsabilité. L’environnement est hétérogène avec de l’environnement propre, terreux et sale, des téléphones et consoles sous environnement sale. Une fonera (double SSID) est présente. Les serveurs DNS et HTTP sont sur une machine en Gentoo/Linux.

Bind9

Il existe pléthore de cours sur le Ternet pour en monter un en 5 minutes douche comprise. Je vais considérer que vous avez déjà un daemon DNS interne fonctionnel.
À la fin de votre /etc/namedb/named.conf ajoutez ceci

include "antistats.conf";

Éditez ensuite /etc/namedb/antistats.conf

zone "addfreestats.com" { type master; notify no; file "null.zone.file"; };
zone "estats.com" { type master; notify no; file "null.zone.file"; };
zone "freestats.com" { type master; notify no; file "null.zone.file"; };
zone "goldstats.com" { type master; notify no; file "null.zone.file"; };
zone "google-analytics.com" { type master; notify no; file "null.zone.file"; };
zone "gostats.com" { type master; notify no; file "null.zone.file"; };
zone "hitometer.com" { type master; notify no; file "null.zone.file"; };
zone "indexstats.com" { type master; notify no; file "null.zone.file"; };
zone "masterstats.com" { type master; notify no; file "null.zone.file"; };
zone "megastats.com" { type master; notify no; file "null.zone.file"; };
zone "revstats.com" { type master; notify no; file "null.zone.file"; };
zone "rightstats.com" { type master; notify no; file "null.zone.file"; };
zone "sitemeter.com" { type master; notify no; file "null.zone.file"; };
zone "stats.blogger.com" { type master; notify no; file "null.zone.file"; };
zone "stats.wordpress.com" { type master; notify no; file "null.zone.file"; };
zone "stats4all.com" { type master; notify no; file "null.zone.file"; };
zone "superstats.com" { type master; notify no; file "null.zone.file"; };
zone "topstats.com" { type master; notify no; file "null.zone.file"; };
zone "topstats.net" { type master; notify no; file "null.zone.file"; };
zone "www-google-analytics.l.google.com" { type master; notify no; file "null.zone.file"; };
zone "xiti.com" { type master; notify no; file "null.zone.file"; };
zone "analytics.engagd.com" { type master; notify no; file "null.zone.file"; };
zone "histats.com" { type master; notify no; file "null.zone.file"; };

Éditez ensuite /etc/namedb/null.zone.file

$TTL 3600
@ IN SOA <votre SOA>. hostmaster.<votre SOA>. (
2010041800 3600 3600 3600000 3600 )
@ IN NS blackhole.
@ IN A 192.168.1.127
* IN A 192.168.1.127

Adaptez à votre environnement, notamment votre SOA, le TTL et les autres délais. Ne prêtez pas attention à loopback. et utilisez plutôt vos valeurs “normales”. En ce qui concerne blackhole il faut que ce nom pointe réellement vers l’ip choisie (ici 192.168.1.127) et vice versa : que l’ip choisie soit résolue en blackhole. Rien de bien extraordinaire dans une configuration de DNS local.

Il faut ensuite relancer Bind9 et normalement nous avons ceci :

$ host -v -t A xiti.com
Trying "xiti.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22544
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;xiti.com.          IN  A

;; ANSWER SECTION:
xiti.com.       60  IN  A   192.168.1.127

;; AUTHORITY SECTION:
xiti.com.       60  IN  NS  blackhole.

Received 65 bytes from 192.168.1.210#53 in 1 ms

Bingo ! Le domaine xiti.com est résolu en 192.168.1.127 comme prévu. Mais également :

$ host -v -t A er.erer.Erer.xiti.com
Trying "er.erer.Erer.xiti.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17999
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;er.erer.Erer.xiti.com.     IN  A

;; ANSWER SECTION:
er.erer.Erer.xiti.com.  60  IN  A   192.168.1.127

;; AUTHORITY SECTION:
xiti.com.       60  IN  NS  blackhole.

Received 78 bytes from 192.168.1.210#53 in 1 ms

Nous avons donc un filtre de type *.xiti.com !

Adresse IP locale

J’ai choisi 192.168.1.127 pour une raison arbitraire. Gentoo permet de l’assigner automatiquement dans /etc/conf.d/net

# cat /etc/conf.d/net
config_eth0=( "dhcp"
        "192.168.1.127" )

Ce qui me permet d’avoir eth0 par dhcp (il y a des raisons ;)) et créer eth0:1 avec pour IP 192.168.1.127 dès le boot de la machine.

# ifconfig
eth0      Lien encap:Ethernet  HWaddr 00:11:2f:00:00:00  
          inet adr:192.168.1.210  Bcast:192.168.1.255  Masque:255.255.255.0
(...)
eth0:1    Lien encap:Ethernet  HWaddr 00:11:2f:3e:e0:b8  
          inet adr:192.168.1.127  Bcast:192.168.1.255  Masque:255.255.255.0
(...)

Cette étape est purement optionnelle, vous avez le droit de pourrir les logs de votre serveur web avec des requêtes qui ne lui sont pas destinées.

Lighttpd

Ajouter ceci à votre /etc/lighttpd/lighttpd.conf

$SERVER["socket"] == "192.168.1.127:80" {
 server.name = "blackhole.<votre nom de domaine interne>"
 url.rewrite = ( ".*" => "/index.html" )
 server.document-root = "/var/www/localhost/blackhole/"
 accesslog.filename = var.logdir + "/blackhole-access.log"
}

Il faut bien entendu adapter a votre sauce, server.errorlog n’est a priori pas nécessaire.
Finalement on obtient ceci

192.168.1.16 www.google-analytics.com - [18/Apr/2010:19:29:51 +0200] "GET /ga.js HTTP/1.1" 200 14 "http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/3/" "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
  1. | #1

    Bel article ! Petite question, où as tu trouver ces jolies clipart, qui semble être vectoriel ? Ils sont magnifiques, ça produit d’excellent schéma !

  2. ckg
    | #2

    Merci 😉

    Ces illustrations ont été réalisées avec Cacoo, un flow-chart en ligne basé sur flash.

    Ce que l’on perd en souplesse par rapport à un Dia est compensé par la richesse des ‘cliparts’ (qui n’en sont pas en fait) et par la disponibilité d’un outil ‘in the cloud’. A tester sur un petit projet pour se faire un avis.

    La galerie originale est ici https://cacoo.com/diagrams/Z1pvc3fomB1cMnoi

  3. Grunt
    | #3

    Il manque juste un petit quelque chose: l’ajout des nouveaux domaines espions ou publicitaires, à la volée, par les utilisateurs.

    Comme ce que permet Ad-Block: hop ça me plait pas, hop je vire. Sauf que je ne vois pas comment on pourrait faire ça de façon pratique sur tous les navigateurs..

  4. ckg
    | #4

    Effectivement c’est encore une autre limite d’un système tel que décrit dans l’article.

    Mon petit doigt me dit que le prochain article traitera de l’import conditionnel de règles adblock 😉

  5. | #5

    bonjour.
    je tiens a préciser que le fichiers hosts existe également sur un windows !!!
    il est même ici : %windir%\system32\drivers\etc\hosts

    (remarquez l’extrême similitude entre le /etc/hosts d’un Linux et le \etc\hosts d’un Windows ^_^…même les commentaires sont quasi identiques…)

    (pas testé sur win7, désolé…)

  6. | #6

    jbdzdd

  7. | #7

    pmopp7

  1. | #1
  2. | #2