|
Script qui test si vos serveurs DNS sont sujet à la faille mondiale
Bonjour,
Michael a écrit un petit script Perl permettant de tester si un serveur DNS était sujet ou pas à la faille mondiale récemment découverte dans le protocole DNS.
L'attaque se basant sur du DNS poisoning, seul les DNS "Cache" sont potentiellement attaquable (via cette faille). Ne testez donc pas sur des serveurs de zones, car le test ne fonctionnera pas.
La détection et le contrôle du serveur DNS s'effectue par la comparaison des ports sources. Ainsi, si votre serveur utilise toujours les mêmes ports sources à chaque requête alors il sera considéré comme potentiellement sujet à la faille. Pour cela, l script envoi 4 requêtes DNS pour le nom d'hôte de type A : aleatoire.toorrr.com (aleatoire étant un nom aléatoire pour que chaque test soit séparé). Puis, le script va récupérer les résultats en HTTP sur un serveur hébergé via la page portant le nom "aleatoire). Ces résultats indiqueront si votre DNS, pour résoudre les 4 demandes initialent, a utilisé ou pas 4 fois le même port source.
Installation
Pour installer le script, vous devez disposer des librairies :
apt-get install libnet-dns-perl
apt-get install libwww-Perl
Utilisation
Pour utiliser le script, n'oubliez pas pas le CHMOD pour lui donner les droits d'executions)
./noclicky-1.00.pl x.x.x.x
Résultats
Patientez quelques secondes et vous devriez obtenir l'un des deux messages suivants :
- Your nameserver appears vulnerable; all requests came from the same port.
- Your nameserver appears to be safe
Code source
Voici le code du script :
-----------------------------------------------------
#!/usr/bin/perl
# vim:set ts=4 sw=4 ai et:
#
# noclicky.pl, version 1.00
#
# A command line ("non-clicky") client to query the toorrr.com service to
# determine if a given nameserver is vulnerable to CERT Vulnerability Note
# VU#800113 DNS Cache Poisoning attacks. Based entirely on Dan Kaminsky's
# JavaScript client, at <http://www.doxpara.com/>. Updates are available
# from <http://michael.toren.net/code/noclicky/>.
#
# -- Michael C. Toren <mct@toren.net>
# Tue Jul 8 21:59:10 PDT 2008
#
use Net::DNS;
use LWP::UserAgent;
use strict;
use warnings;
my $nameserver = shift or die "Usage: $0 <nameserver>\n";
my @char = ("a" .. "z", 0 .. 9);
my $session = join "", map { $char[rand @char] } (1 .. 12);
my $domain = "$session.toorrr.com";
sub lookup
{
my $nameserver = shift;
my $res = new Net::DNS::Resolver (nameservers => [$nameserver], recurse => 1)
or die "Net::DNS::Resolver constructor failed?";
my $query = $res->search($domain)
or die "DNS lookup failed: ", $res->errorstring, "\n";
for my $rr ($query->answer)
{
return $rr->address if $rr->type eq "A";
}
die "DNS lookup failed: $domain has no 'A' record?\n";
}
print "Looking up $domain against $nameserver\n";
my $ip = lookup $nameserver;
print "Fetching http://$ip/fprint/$session\n";
my $agent = new LWP::UserAgent;
my $response = $agent->get("http://$ip/fprint/$session",
Host => $domain, "Content-Type" => "application/x-javascript");
die "Failed: ", $response->status_line, "\n" unless $response->is_success;
my @data = split ",", $response->content;
die "Oops, I was expecting more comma separated data than I found\n"
unless @data >= 5;
my $first = shift @data;
die "Oops, fetched data was for session '$first', not $domain?\n"
unless $first eq $domain;
print "Requests seen for $domain:\n";
my %ports;
for my $data (@data)
{
chomp($data);
my ($ip, $port, $txid) = split "-", $data;
print " $ip:$port TXID=$txid\n";
$ports{$port} = 1;
}
if (keys %ports == 1) {
print "Your nameserver appears vulnerable; all requests came from the same port.\n";
} else {
print "Your nameserver appears to be safe\n";
}
-----------------------------------------------------
Posté le 10 juillet 2008 par _SebF - Sébastien FONTAINE
Vous pouvez commenter cette nouvelle
en posant vos avis, questions et remarques
sur le forum actualité
|