bonjour

j'ai un sujet a traiter et je n'arrive pas a faire la fin

"réaliser un script en PERL permettant de parcourir régulièrement un fichier de log au format syslog et de détecter un scan de port, ainsi que des requêtes qui seront écrite dans un fichier de configuration et basé sur les expressions régulières.
En fonction de l'attaque, le script devra être en mesure de bloquer l'attaque au niveau du pare-feu"

Nous avons mis en place des VM (Virtualbox) un client (sous Ubuntu) un WEB-server (Ubuntu) ou j'ai mis le script et parfeu (IPtable)

Enfin pour le dernier TP nous avons mis en place "metasploit" sur le client et nous avons fait un scan de port vers le serveur

et je dois scripter la détection d'une expression régulière de scan de port et là je ne sais pas le faire

je vous mets le script :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/perl -w
use Time::Local;
#Tableau de date
my %Tdate=("Jan"=>0,"Feb"=>1,"Mar"=>2,"Apr"=>3,"May"=>4,"Jun"=>5,   "Jul"=>6,"Aug"=>7,"Sep"=>8,"Oct"=>9,"Nov"=>10,"Dec"=>11);
 
############################  DECLARATION DES VARIABLES   ###########################
 
$compt_ligne_second=0; #déclaration variable Cmpt ligne second
$num_ligne=0;#déclaration variable num_ligne
@liste_ip_bloquee=(); #déclaration tableau vide (@)
$date_new=0; ##déclaration date new
$date_old=0; #déclaration date old
$seuil_log_alert=200; #déclaration d'un Seuil d'alerte du log à partir de 200 lignes
$seuil_log_defense=200; #déclaration d'une reaction du log à partir de 200 lignes
$resultat=""; #déclaration variable scalaire et affectation à vide
@interdit_jours=(0,6); #jours où il ne doit pas y avoir de l'activité
@interdit_heures=(21,22,23,0,1,2,3,4,5,6); # heures où il ne doit pas y avoir de l'activité
 
 
############################    DECLARATION DES FONCTIONS   ############################
 
 
sub DateLogToTimestamp{ #FONCTION qui recupere la date et l'affiche
	my ($Sdate)=@_; # crée une variable de type tableau
	my $M=substr($Sdate,0,3);
	my $D=substr($Sdate,4,2);
	my $h=substr($Sdate,7,2);
	my $m=substr($Sdate,10,2);
	my $s=substr($Sdate,13,2);
	$date_new=timelocal($s,$m,$h,$D,$Tdate{$M},2012); #formate la date sous la forme seconde/minutes/Heures/...
}
 
sub VerifOrderDate{ #verifie que la date new est plus recente que la date old
	if($date_new<$date_old){# si date_new inférieur à date_old, on affiche : erreur
	  $resultat.="\n!!erreur chronologie date ligne ".$num_ligne;
	}
}
 
sub BloquerSrcAttaque{ #Blocage d'une attaque
 
	if($ligne=~ /SRC=(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/){ #Recherche de l'adresse IP SRC
 
	  my $ip=$1.".".$2.".".$3.".".$4; #Recuperer les blocs de adresse
	  if(!grep {$ip} @liste_ip_bloquee)#Verifie si l'IP a deja ete bloque
	  {
	    unshift(@liste_ip_bloquee,$ip);
	    $resultat.= "\nIP DROPEE:".$ip; 
	    system "iptables -A INPUT -s ".$ip." -j DROP";  #Ajout d'une ligne au parefeu
	  }
	}
}
#compte le nombre log par second et suivant 1 seuil, alerte d'un problème et d'un autre, bloque l'adresse IP SRC
sub VerifierMoyenneLog{
	if($date_new==$date_old){
	  $compt_ligne_second++;#on incrémente le compteur de lignes
	}else{
	  $compt_ligne_second=0;
	}
	if($compt_ligne_second>$seuil_log_alert){
	  $resultat.="!!genration de log important ".$compt_ligne_second." la second a: ".$num_ligne."\n";
	  if($compt_ligne_second>$seuil_log_defense){
	    BloquerSrcAttaque(); #on appelle la fonction de blocage d'attaque.
	  }
	}
}
#alerte en cas de connexion à des heures interdites
sub VerifierPlageConnexion{
	my ($s,$m,$h,$j,$M,$A,$j_se,$j_an,$h_hiver)=localtime($date_new); #Verification des jours de connexion
	if(grep {$j_se} @interdit_jours){
	  $resultat.="\nconnexion jour interdit ligne: ".$num_ligne;
	}
	if(grep {$h} @interdit_heures){#Verification des heures de connexion
	  $resultat.="\nconnexion heure ligne: ".$num_ligne;
	}
}
 
 
#########################################- Début du script principal -########################################
 
#ouverture du fichier de log
open(file_log,"/var/log/syslog") or die ("impossible d'ouvrir le fichier");
#parcour du fichier
while(defined($ligne=<file_log>)){
	$num_ligne++;
	#supprimer le retour à la ligne en fin de ligne
	chomp $ligne;
	DateLogToTimestamp($ligne);#recuperation de la date en timestamp
 
	my @mots=split(/ /,$ligne);#decoupage de ligne 
	VerifOrderDate($ligne);#Verifie que le evenement sont bien dans l'ordre chonologique
	VerifierMoyenneLog();#alerte si le nombre de log genere ne depasse pas une limite
	VerifierPlageConnexion();#repère les connexion hors plage horaire/journalière
	$date_old=$date_new;#à la fin de la ligne, affecte à $date_old la valeur de $date_new
}
 
#########################################- Affichage du résultat -#########################################
 
print $resultat;
merci d'avance