Jump to content
Nytro

[Perl] ScanDetect

Recommended Posts

Posted
#!/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 -d
my $limite = 100; # option par défaut il est conseillé de la changé avec -n
my $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 ###

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...