Nytro Posted July 5, 2010 Report Posted July 5, 2010 #!/usr/bin/perl use Net::RawIP;use Socket;use Term::ANSIColor qw(:constants);use Getopt::Long;use strict;###### pour pcapinit ######my $device = "eth0";my $filter = "";my $size = 1500;my $timeout = 0;#### ligne de commande ####my $temps = 100; # option par défault il est conseillé de la changé avec -dmy $limite = 100; # option par défaut il est conseillé de la changé avec -nmy $dump = undef;###########################my $d = 1;my ( %ip, %tcp ) = undef;my @last = undef;my $a = undef;my $pcap = undef;my $i = undef;my $ptr_ip = undef;my $msg = undef;my $scan_type = undef;my $date = undef;###########################GetOptions("interface=s" => \$device, "help" => \&infos, "sniff" => \$dump, "delai=s"=>\$temps,"nbr_ports=s",\$limite);###########################print "____________________________\n";print BOLD,"[ Detecteur de scan de THJ ]\n", RESET;print "\\___________.oOo.__________/\n\n";###########################$a = new Net::RawIP();$pcap = $a -> pcapinit($device,$filter,$size,$timeout);loop $pcap,-1,\&main,\[]; sub main{ my ($vide, $pkthdr, $paquet) = @_; $a -> bset(substr($paquet,linkoffset($pcap))); &ip_struct($a->get({ip=>[qw(saddr daddr)]})); &tcp_struct($a->get({tcp=>[qw(source dest ack rst syn data)]})); # possibilité d'implémenter d'autres protocoles , udp , icmp , .... # On affiche les résultats à l'écran si l'on a spécifier l'option --sniff &affiche_result() if($dump); if($ip{"saddr"} ne &my_ip($device)) { &verif_time() if($#last>0); &is_nmap(); } $d++; # Compte le nombre de paquets reçut}### Création des structures IP et TCP ###sub ip_struct{ # inet_ntoa() va nous permettre de remettre en forme l'adresse ip. # network to ascii $ip{"saddr"} = inet_ntoa(pack("N",shift(@_))); $ip{"daddr"} = inet_ntoa(pack("N",shift(@_)));}sub tcp_struct{ $tcp{"source"} = shift(@_); $tcp{"dest"} = shift(@_); $tcp{"ack"} = shift(@_); $tcp{"rst"} = shift(@_); $tcp{"syn"} = shift(@_); $tcp{"data"} = shift(@_); # suppression des caractères suceptibles de faire planter le term $tcp{"data"} =~ s/[^\w:\.\(\)\[\]]//g; }###sub is_nmap{ if($tcp{"syn"} == 1 && $tcp{"ack"} == 0 && $tcp{"rst"} == 0) { # on regarde si l'ip source nous a deja scanné if(&compare_ip($ip{"saddr"})==0) { $last[$ptr_ip+1]++; # On incrémente le compteur de ports } else { # Nouvelle ip if($#last==0) { $last[0] = $ip{"saddr"}; $last[1] = 1; # compte les ports scannés $last[2] = 1; # permet de differencier les scans $last[3] = time; } else { $last[$#last+1] = $ip{"saddr"}; $last[$#last+1] = 1; $last[$#last+1] = 1; # 1 == tcp_connect() $last[$#last+1] = time; } } } elsif($tcp{"syn"} == 0 &&$tcp{"ack"} == 0 && $tcp{"rst"} == 1 && &compare_ip($ip{"saddr"})== 0 ) { # On est dans un syn stealth scan $last[$ptr_ip+2] = 0; }}###sub compare_ip{ $ptr_ip = 0; for($i=0;$i<$#last+1;$i+=4) { if($last[$i] eq $_[0]) { # on renvoit la position de l'ip qui nous # scan pour incrémenter les valeurs correspondantes. $ptr_ip = $i; return 0; } } return 1;}###sub logscan # renvoit simplement les résultats vers un fichier { open(FILE,">>.scandetect"); print FILE @_; print @_; close(FILE);}###sub infos # --help{ printf("$0 : Détecteur de scan THJ\n\nsyntaxe : -i [--interface] : interface à ecouter -s [--sniff] : affiche les détails pour chaque paquets -d [--delai] : Durée de validité du scan -n [--nbr_ports] : Nbr de ports définissant le scan -h [--help] : print this help\n\n"); exit;}###sub affiche_result{ # à modifier selon ce que vous souhaitez afficher sur les l'écran ... print BOLD,$ip{"saddr"},RESET; print "["; print RED,$tcp{"source"},RESET; print "] -> "; print BOLD,$ip{"daddr"},RESET; print "["; print GREEN,$tcp{"dest"},RESET; print "]\t"; print RED,"SYN\t",RESET if($tcp{"syn"}==1); print RED,"ACK\t",RESET if($tcp{"ack"}==1); print RED,"RST\t",RESET if($tcp{"rst"}==1); print "\n";}###sub verif_time{ # fonction qui permet de vérifier que les ip # du tableau @last sont dans les délais d'un scan for($i=0;$i<$#last;$i+=4) { if((time - $last[$i+3])>$temps) { # Le temps d'inactivité est supérieur au délai # alors on vérifie si le nombres de ports scannés # est supérieur à la limite puis on sauve les résultats. if($last[$i+2]==0) { $scan_type = "syn stealth (-sS)"; } else { $scan_type = "tcp_connect (-sT)"; } $date = &heure_du_scan(); $msg = "Scan '$scan_type' effectué à '$date' par $last[$i]\n" ; #nombre de ports scanés &logscan($msg) if($last[$i+1]>$limite); # On efface les informations relatives à cette ip splice(@last,$i,4,()); } }}###sub heure_du_scan{ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $date = "$hour h $min min $sec sec"; return $date;}###sub my_ip # important pour ne pas prendre loggué nos propres scans { for(qx/ifconfig $ARGV[0]/) { if (/(?:adr|addr)?:\d{1,3}\.){3}\d{1,3})/) { # on renvoit notre adresse ip return $1; } }}### EOF ### Quote