[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