mirror of
https://github.com/Oxbian/SIDPS.git
synced 2025-05-17 22:18:13 +02:00
feat: adding other TCP scan rules
This commit is contained in:
parent
3e75cb8927
commit
09abb7e20f
28
idps/rules/TCP/Scan/ackscan.py
Normal file
28
idps/rules/TCP/Scan/ackscan.py
Normal file
@ -0,0 +1,28 @@
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
|
||||
def rule(packet, tcp_packets, db):
|
||||
"""Règle ACK Scan:
|
||||
Un ACK Scan va envoyer des requêtes TCP avec le flag ACK
|
||||
Si le firewall ne bloque pas, alors il répond avec le flag Reset
|
||||
Sinon il répond rien
|
||||
"""
|
||||
if (rule.cooldown + rule.time_window > time.time()):
|
||||
return
|
||||
|
||||
# Vérification si nécessaire de récupérer les variables depuis la config
|
||||
if (rule.seuil == 0 and rule.time_window == 0):
|
||||
rule.time_window = db.get_key("ackscan_time", 180)
|
||||
rule.seuil = db.get_key("ackscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type(["A", "R"], rule.time_window, True) + tcp_packets.count_packet_of_type(["A"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "ACK scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Ack->Reset et Ack pas de réponse", act="Alerte")
|
||||
print(f"Alerte, seuil dépassés, risque d'Ack scan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
||||
# Variables statiques
|
||||
rule.cooldown = 0
|
||||
rule.time_window = 0
|
||||
rule.seuil = 0
|
28
idps/rules/TCP/Scan/finscan.py
Normal file
28
idps/rules/TCP/Scan/finscan.py
Normal file
@ -0,0 +1,28 @@
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
|
||||
def rule(packet, tcp_packets, db):
|
||||
"""Règle Fin Scan:
|
||||
Un Fin Scan va envoyer des requêtes TCP avec le flag Fin
|
||||
Si le port est ouvert alors le serveur répondra pas
|
||||
Sinon le port est fermé et le serveur répondra: Reset ACK
|
||||
"""
|
||||
if (rule.cooldown + rule.time_window > time.time()):
|
||||
return
|
||||
|
||||
# Vérification si nécessaire de récupérer les variables depuis la config
|
||||
if (rule.seuil == 0 and rule.time_window == 0):
|
||||
rule.time_window = db.get_key("finscan_time", 180)
|
||||
rule.seuil = db.get_key("finscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type(["F", "RA"], rule.time_window, True) + tcp_packets.count_packet_of_type(["F"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "Fin scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Fin->Reset Ack et Fin->rien", act="Alerte")
|
||||
print(f"Alerte, seuil dépassés, risque de Fin Scan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
||||
# Variables statiques
|
||||
rule.cooldown = 0
|
||||
rule.time_window = 0
|
||||
rule.seuil = 0
|
28
idps/rules/TCP/Scan/nullscan.py
Normal file
28
idps/rules/TCP/Scan/nullscan.py
Normal file
@ -0,0 +1,28 @@
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
|
||||
def rule(packet, tcp_packets, db):
|
||||
"""Règle Null Scan:
|
||||
Un Null Scan va envoyer des requêtes TCP avec aucun flag d'actif
|
||||
Si le port est ouvert alors le serveur ne répondra pas
|
||||
Sinon le port est fermé et le serveur répondra: Reset ACK
|
||||
"""
|
||||
if (rule.cooldown + rule.time_window > time.time()):
|
||||
return
|
||||
|
||||
# Vérification si nécessaire de récupérer les variables depuis la config
|
||||
if (rule.seuil == 0 and rule.time_window == 0):
|
||||
rule.time_window = db.get_key("nullscan_time", 180)
|
||||
rule.seuil = db.get_key("nullscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type([""], rule.time_window, True) + tcp_packets.count_packet_of_type(["", "RA"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "Null scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de None->Reset Ack et None -> rien", act="Alerte")
|
||||
print(f"Alerte, seuil dépassés, risque de Null Scan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
||||
# Variables statiques
|
||||
rule.cooldown = 0
|
||||
rule.time_window = 0
|
||||
rule.seuil = 0
|
@ -6,7 +6,7 @@ def rule(packet, tcp_packets, db):
|
||||
"""Règle SYNScan:
|
||||
Un SYNScan va envoyer des requêtes TCP avec le flag SYN
|
||||
Si le port est ouvert alors le serveur répondra: Syn ACK, puis le client Reset la connexion
|
||||
Sinon le port est fermé et le serveur répondera: Reset ACK
|
||||
Sinon le port est fermé et le serveur répondra: Reset ACK
|
||||
"""
|
||||
if (rule.cooldown + rule.time_window > time.time()):
|
||||
return
|
||||
@ -16,8 +16,8 @@ def rule(packet, tcp_packets, db):
|
||||
rule.time_window = db.get_key("synscan_time", 180)
|
||||
rule.seuil = db.get_key("synscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type(["S", "RA"], rule.time_window, True) + tcp_packets.count_packet_of_type(["S", "SA", "RA"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "Syn scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Syn->SynACK->Reset ACK et Syn->Reset ACK", act="Alerte")
|
||||
if tcp_packets.count_packet_of_type(["S", "RA"], rule.time_window, True) + tcp_packets.count_packet_of_type(["S", "SA", "R"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "Syn scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Syn->SynACK->Reset et Syn->Reset ACK", act="Alerte")
|
||||
print(f"Alerte, seuil dépassés, risque de SynScan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
@ -5,7 +5,7 @@ import time
|
||||
def rule(packet, tcp_packets, db):
|
||||
"""Règle TCPConnect Scan:
|
||||
Un scan TCP connect va effectuer une connexion TCP en entier sur chaque port scanné.
|
||||
Si le port est ouvert le serveur acceptera la connexion SYN -> SYN ACK -> ACK -> Reset -> ACK
|
||||
Si le port est ouvert le serveur acceptera la connexion SYN -> SYN ACK -> ACK -> Reset ACK
|
||||
Sinon le port est fermé et le serveur refusera la connexion SYN -> Reset ACK
|
||||
"""
|
||||
|
||||
@ -18,7 +18,7 @@ def rule(packet, tcp_packets, db):
|
||||
rule.seuil = db.get_key("tcpconnectscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type(["S", "SA", "A", "RA"], rule.time_window, True) + tcp_packets.count_packet_of_type(["S", "RA"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "TCPConnect Scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Syn->SynACK->ACK->Reset->ACK et Syn->Reset ACK", act="Alerte")
|
||||
db.send_alert(datetime.now(), 5, None, "TCPConnect Scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Syn->SynACK->ACK->Reset ACK et Syn->Reset ACK", act="Alerte")
|
||||
print(f"Alerte, seuils dépassés, risque de TCPConnectScan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
28
idps/rules/TCP/Scan/xmasscan.py
Normal file
28
idps/rules/TCP/Scan/xmasscan.py
Normal file
@ -0,0 +1,28 @@
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
|
||||
def rule(packet, tcp_packets, db):
|
||||
"""Règle XMAS Scan:
|
||||
Un XMAS Scan va envoyer des requêtes TCP avec le flag Fin, Push, Urg
|
||||
Si le port est ouvert alors le serveur répondra pas
|
||||
Sinon le port est fermé et le serveur répondra: Reset ACK
|
||||
"""
|
||||
if (rule.cooldown + rule.time_window > time.time()):
|
||||
return
|
||||
|
||||
# Vérification si nécessaire de récupérer les variables depuis la config
|
||||
if (rule.seuil == 0 and rule.time_window == 0):
|
||||
rule.time_window = db.get_key("xmasscan_time", 180)
|
||||
rule.seuil = db.get_key("xmasscan_count", 5)
|
||||
|
||||
if tcp_packets.count_packet_of_type(["FPU", "RA"], rule.time_window, True) + tcp_packets.count_packet_of_type(["FPU"], rule.time_window, True) >= rule.seuil:
|
||||
db.send_alert(datetime.now(), 5, None, "XMAS scan", packet['IP'].src, packet['IP'].dst, proto="TCP", reason="Détection de nombreux patterns de Fin Push Urg -> rien et Fin Push Urg->Reset ACK", act="Alerte")
|
||||
print(f"Alerte, seuil dépassés, risque de XMAS Scan")
|
||||
rule.cooldown = time.time()
|
||||
|
||||
|
||||
# Variables statiques
|
||||
rule.cooldown = 0
|
||||
rule.time_window = 0
|
||||
rule.seuil = 0
|
22
idps/tcp.py
22
idps/tcp.py
@ -22,6 +22,14 @@ class TCP:
|
||||
self.packets[ip_src].append([port_src, ip_dst, port_dst, ["S"], timestamp])
|
||||
return
|
||||
|
||||
elif flags is None:
|
||||
self.packets[ip_src].append([port_src, ip_dst, port_dst, [""], timestamp])
|
||||
return
|
||||
|
||||
elif flags == "FPU":
|
||||
self.packets[ip_src].append([port_src, ip_dst, port_dst, ["FPU"], timestamp])
|
||||
return
|
||||
|
||||
elif flags == "SA":
|
||||
i, ip = self.find_packet_to_replace(ip_src, port_src, ip_dst, port_dst, "S")
|
||||
|
||||
@ -78,6 +86,20 @@ class TCP:
|
||||
self.packets[ip_src].append([port_src, ip_dst, port_dst, ["R"], timestamp])
|
||||
return
|
||||
|
||||
elif flags == "F":
|
||||
i, ip = self.find_packet_to_replace(ip_src, port_src, ip_dst, port_dst, "A")
|
||||
|
||||
if i is not None:
|
||||
print(f"i: {i}, {ip_src}:{port_src}->{ip_dst}:{port_dst}, paquets: \n{self.packets}")
|
||||
self.packets[ip][i][3].append("F")
|
||||
self.packets[ip][i][4] = timestamp
|
||||
return
|
||||
else:
|
||||
self.packets[ip_src].append([port_src, ip_dst, port_dst, ["F"], timestamp])
|
||||
return
|
||||
|
||||
# TODO: ajout flag fin, none, fin urg push
|
||||
|
||||
def find_packet_to_replace(self, ip_src, port_src, ip_dst, port_dst, flags):
|
||||
"""Cherche l'indice et le port de source du paquet dont le flag doit être remplacé"""
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user