From f6e694256b75d4eea91269a0d6ff364793bbd77a Mon Sep 17 00:00:00 2001 From: Oxbian Date: Tue, 26 Nov 2024 11:11:24 -0500 Subject: [PATCH] feat: dockerfile web --- Demo/Dockerfiles/Dockerfile.attaquant | 2 +- Demo/Dockerfiles/Dockerfile.web | 5 +++ Demo/deploy.sh | 2 +- Demo/docker-compose.yml | 14 ++++++++ README.md | 11 +++--- idees.txt | 3 -- idps/rules/TCP/Data/dataExfiltration.py | 45 +++++++----------------- idps/rules/TCP/Data/lateCommunication.py | 25 +++++-------- web/php/constants.php | 4 +-- 9 files changed, 50 insertions(+), 61 deletions(-) create mode 100644 Demo/Dockerfiles/Dockerfile.web delete mode 100644 idees.txt diff --git a/Demo/Dockerfiles/Dockerfile.attaquant b/Demo/Dockerfiles/Dockerfile.attaquant index 8c52ada..4ea25d0 100644 --- a/Demo/Dockerfiles/Dockerfile.attaquant +++ b/Demo/Dockerfiles/Dockerfile.attaquant @@ -2,7 +2,7 @@ FROM python:alpine3.20 # Installation des paquets nécessaires pour scapy RUN apk -U upgrade && \ - apk add --no-cache nmap iproute2 + apk add --no-cache nmap iproute2 curl RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories RUN apk -U add --no-cache hping3 diff --git a/Demo/Dockerfiles/Dockerfile.web b/Demo/Dockerfiles/Dockerfile.web new file mode 100644 index 0000000..ebc8d49 --- /dev/null +++ b/Demo/Dockerfiles/Dockerfile.web @@ -0,0 +1,5 @@ +FROM eriksoderblom/alpine-apache-php:latest + +# Copie des fichiers du projet +COPY web/ /htdocs/ + diff --git a/Demo/deploy.sh b/Demo/deploy.sh index 969b744..00ef072 100755 --- a/Demo/deploy.sh +++ b/Demo/deploy.sh @@ -2,5 +2,5 @@ docker compose build docker compose stop #docker rm ids idps -docker rm attaquant1 attaquant2 ids idps cible alert_db +docker rm attaquant1 attaquant2 ids idps cible alert_db web docker compose up -d diff --git a/Demo/docker-compose.yml b/Demo/docker-compose.yml index 0811914..9734e0b 100644 --- a/Demo/docker-compose.yml +++ b/Demo/docker-compose.yml @@ -90,6 +90,20 @@ services: ipv4_address: 172.20.3.10 restart: unless-stopped + # Interface d'affichage des alertes + web_ui: + build: + context: .. + dockerfile: Demo/Dockerfiles/Dockerfile.web + container_name: web + ports: + - "500:80" + networks: + net_data: + ipv4_address: 172.20.3.3 + restart: unless-stopped + + networks: net_public: driver: bridge diff --git a/README.md b/README.md index 28207bb..b020ed3 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,12 @@ cd Demo/ La cible (172.20.2.3) héberge un serveur web apache avec la page par défaut sur son port 80. Les conteneurs attaquants disposent tous les deux de nmap et de hping3 pour réaliser des scan et des floods / DOS. +Des attaques peuvent être réalisés depuis l'attaquant1 ou l'attaquant2 en se connectant au shell des ces 2 conteneurs. Ces conteneurs disposent de nmap et de hping3 par défaut. + +```bash +docker exec -it attaquant1 sh +``` + Rappel des commandes pour flood avec et sans charge utile avec hping3: ```bash @@ -68,7 +74,4 @@ hping3 -S --flood IP hping3 -S --flood -d TAILLE IP ``` -## TODO: - -- Moteur de corrélation des alertes (récupération + renvoi dans MySQL). -- Moteur de détection par comportement +Les alertes sont visibles sur l'interface web qui se trouve à l'adresse `http://172.20.3.3:500`. diff --git a/idees.txt b/idees.txt deleted file mode 100644 index ecb896b..0000000 --- a/idees.txt +++ /dev/null @@ -1,3 +0,0 @@ -script ajax pour reload la page tte les Xs ? -adresse de destination -bouton visualiser \ No newline at end of file diff --git a/idps/rules/TCP/Data/dataExfiltration.py b/idps/rules/TCP/Data/dataExfiltration.py index 10b285d..3565eb5 100644 --- a/idps/rules/TCP/Data/dataExfiltration.py +++ b/idps/rules/TCP/Data/dataExfiltration.py @@ -4,8 +4,12 @@ import time from datetime import datetime data_transfer = defaultdict(lambda: {"current": 0, "daily": 0, "last_reset": time.time()}) +reset_time = 24 * 3600 # 24 heures en secondes +seuil_session = 0.5 * 1024 * 1024 * 1024 # 500 Mo en octets +seuil_journalier = 50 * 1024 * 1024 * 1024 # 50 Go en octets -def rule(packet, _, db): + +def rule(packet, objets): """ Règle pour détecter une exfiltration de données importantes. Actuellement, ne fonctionne pas pour un débit supérieur à 4Mo @@ -19,7 +23,7 @@ def rule(packet, _, db): # Mettre à jour le volume de données transférées current_time = time.time() - if current_time - data_transfer[src_ip]["last_reset"] > rule.reset_time: + if current_time - data_transfer[src_ip]["last_reset"] > reset_time: data_transfer[src_ip]["daily"] = 0 data_transfer[src_ip]["last_reset"] = current_time @@ -27,37 +31,12 @@ def rule(packet, _, db): data_transfer[src_ip]["daily"] += payload_size # Exfiltration de données instantané - if data_transfer[src_ip]["current"] > rule.seuil_session: - db.send_alert( - datetime.now(), - 5, - None, - "Exfiltration de données détectée (instantané)", - src_ip, - dst_ip, - proto = "TCP", - reason="Exfiltration de données détectée (instantané)", - act="Alerte" - ) + if data_transfer[src_ip]["current"] > seuil_session: + objets["database"].send_alert(datetime.now(), 5, None, "Exfiltration de données détectée (instantané)", src_ip, dst_ip, proto = "TCP", reason="Exfiltration de données détectée (instantané)", act="Alerte") data_transfer[src_ip]["current"] = 0 # Réinitialiser pour les prochaines sessions - print(f"Alerte, data transfer, transfert instantané important") + print("Alerte, data transfer, transfert instantané important") # Exfiltration de données journalière - if data_transfer[src_ip]["daily"] > rule.seuil_journalier: - db.send_alert( - datetime.now(), - 5, - None, - "Exfiltration de données détectée (journalière)", - src_ip, - dst_ip, - proto = "TCP", - reason="Exfiltration de données détectée (journalière)", - act="Alerte" - ) - print(f"Alerte, data transfer, transfert journalier important") - - -rule.reset_time = 24 * 3600 # 24 heures en secondes -rule.seuil_session = 0.5 * 1024 * 1024 * 1024 # 500 Mo en octets -rule.seuil_journalier = 50 * 1024 * 1024 * 1024 # 50 Go en octets \ No newline at end of file + if data_transfer[src_ip]["daily"] > seuil_journalier: + objets["database"].send_alert(datetime.now(), 5, None, "Exfiltration de données détectée (journalière)", src_ip, dst_ip, proto = "TCP", reason="Exfiltration de données détectée (journalière)", act="Alerte") + print("Alerte, data transfer, transfert journalier important") diff --git a/idps/rules/TCP/Data/lateCommunication.py b/idps/rules/TCP/Data/lateCommunication.py index 5645449..d20dbb9 100644 --- a/idps/rules/TCP/Data/lateCommunication.py +++ b/idps/rules/TCP/Data/lateCommunication.py @@ -4,7 +4,12 @@ from scapy.all import IP # Dictionnaire pour stocker les dernières alertes envoyées pour chaque IP last_alert_time = {} -def rule(packet, _, db): +# Définir la plage horaire +start_time = time(21, 0) +end_time = time(6, 0) + + +def rule(packet, objets): """ Règle pour détecter l'activité réseau entre une plage horaire donnée. """ @@ -19,7 +24,7 @@ def rule(packet, _, db): current_time = datetime.now() # Vérifier si l'heure est dans la plage - if rule.start_time <= current_time.time() or current_time.time() <= rule.end_time: + if rule.start_time <= current_time.time() or current_time.time() <= end_time: # Vérifier si une alerte a déjà été envoyée récemment pour cette IP if src_ip in last_alert_time: time_since_last_alert = current_time - last_alert_time[src_ip] @@ -27,22 +32,8 @@ def rule(packet, _, db): return # Ne pas envoyer une nouvelle alerte # Envoyer une alerte - db.send_alert( - current_time, - 5, - None, - f"Activité réseau détectée entre {rule.start_time} et {rule.end_time}", - src_ip, - dst_ip, - proto="TCP", - reason=f"Activité réseau à {current_time.time()}", - act="Alerte" - ) + objets["database"].send_alert(current_time, 5, None, f"Activité réseau détectée entre {start_time} et {end_time}", src_ip, dst_ip, proto="TCP", reason=f"Activité réseau à {current_time.time()}",act="Alerte") print(f"Alerte : activité réseau détectée à {current_time.time()} entre {src_ip} et {dst_ip}") # Mettre à jour le temps de la dernière alerte pour cette IP last_alert_time[src_ip] = current_time - -# Définir la plage horaire -rule.start_time = time(21, 0) -rule.end_time = time(6, 0) diff --git a/web/php/constants.php b/web/php/constants.php index 01c9577..e10253a 100644 --- a/web/php/constants.php +++ b/web/php/constants.php @@ -1,7 +1,7 @@