[vienna.pm] Netzwerk-Sniffer
Alexander Hammer
alex at zit.at
Tue Mar 12 03:52:59 CST 2002
* * * vienna-pm-list * * *
Hi, Mongers!
Um einem laestigen DNS-Problem auf die Schliche zu kommen, habe
ich mit Net::Pcap einen kleinen Sniffer geschrieben, der auch in
die DNS-Pakete hineinschaut.
Dummerweise stuerzt das Programm nach einiger Zeit mit "Out of
memory" ab. Ausserdem sollte es die gecaptureden Pakete mit
Net::Pcap::dump binary in eine Datei schreiben, was es
anscheinend auch nicht macht.
Das DNS-Problem ist mittlerweile zwar geloest (alte bind-Version),
aber fuer zukuenftige Anwendungen haette ich die Fehler schon
ganz gerne beseitigt.
Any ideas, was man da machen koennte?
Alexander
Hier das Programm:
#!/usr/bin/perl -w
$|=1;
use Net::Pcap;
use Net::DNS::Packet;
use NetPacket::UDP;
use NetPacket::IP;
use NetPacket::Ethernet qw(:strip);
use NetAddr::IP;
$netrange = new NetAddr::IP "192.168.1.1/22";
$device = Net::Pcap::lookupdev(\$err);
die "can't find device" unless $device;
die ("can't find info for dev: $device\n")
if (Net::Pcap::lookupnet($device,\$netnum,\$netmask,\$err));
print "Sniffing on device $device\n";
$desc = Net::Pcap::open_live($device,8192,1,360000,\$err);
Net::Pcap::compile($desc, \$filter_t, "dst host 10.0.0.1 and src port 53",
1, $netmask);
Net::Pcap::setfilter($desc,$filter_t);
$dumper = Net::Pcap::dump_open($desc,"dnsniff.log");
die("Can't open logfile\n") unless $dumper;
Net::Pcap::loop($desc,-1,\&dns_filter,'');
Net::Pcap::dump_close($dumper);
Net::Pcap::close($desc);
sub dns_filter {
my ($user_data,$hdr,$pkt) = @_;
my $ip_obj = NetPacket::IP->decode(eth_strip($pkt));
my $udp_obj = NetPacket::UDP->decode($ip_obj->{data});
my $dns_data = $udp_obj->{data};
(my $dns_obj, my $err2) = new Net::DNS::Packet(\$dns_data);
if (defined $dns_obj) {
my @answer=$dns_obj->answer;
my $flag=0;
foreach $ans (@answer) {
if ($ans->type eq "A") {
my $ans_ip= new NetAddr::IP $ans->address;
if ($ans_ip->within($netrange)) {
$flag=1;
}
}
}
if ($flag == 1) {
Net::Pcap::dump($dumper, $hdr ,$pkt);
print ("$ip_obj->{src_ip}:$udp_obj->{src_port} ->
$ip_obj->{dest_ip}:$udp_obj->{dest_port}\n");
print $dns_obj->string."\n";
}
} else {
print ("$ip_obj->{src_ip}:$udp_obj->{src_port} ->
$ip_obj->{dest_ip}:$udp_obj->{dest_port}\n");
print "Unreadable Packet: $err2\n";
Net::Pcap::dump($dumper, $hdr, $pkt);
}
}
###
You are subscribed to vienna-pm-list as Alexander Hammer <alex at zit.at>
http://www.fff.at/fff/vienna.pm/
More information about the Vienna-pm
mailing list