feat: dockerfile web

This commit is contained in:
Oxbian 2024-11-26 11:11:24 -05:00
parent 52a7581fc4
commit f6e694256b
Signed by: Oxbian
GPG Key ID: 0E8F319FD43747E5
9 changed files with 50 additions and 61 deletions

View File

@ -2,7 +2,7 @@ FROM python:alpine3.20
# Installation des paquets nécessaires pour scapy # Installation des paquets nécessaires pour scapy
RUN apk -U upgrade && \ 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 echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk -U add --no-cache hping3 RUN apk -U add --no-cache hping3

View File

@ -0,0 +1,5 @@
FROM eriksoderblom/alpine-apache-php:latest
# Copie des fichiers du projet
COPY web/ /htdocs/

View File

@ -2,5 +2,5 @@
docker compose build docker compose build
docker compose stop docker compose stop
#docker rm ids idps #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 docker compose up -d

View File

@ -90,6 +90,20 @@ services:
ipv4_address: 172.20.3.10 ipv4_address: 172.20.3.10
restart: unless-stopped 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: networks:
net_public: net_public:
driver: bridge driver: bridge

View File

@ -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. 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. 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: Rappel des commandes pour flood avec et sans charge utile avec hping3:
```bash ```bash
@ -68,7 +74,4 @@ hping3 -S --flood IP
hping3 -S --flood -d TAILLE IP hping3 -S --flood -d TAILLE IP
``` ```
## TODO: Les alertes sont visibles sur l'interface web qui se trouve à l'adresse `http://172.20.3.3:500`.
- Moteur de corrélation des alertes (récupération + renvoi dans MySQL).
- Moteur de détection par comportement

View File

@ -1,3 +0,0 @@
script ajax pour reload la page tte les Xs ?
adresse de destination
bouton visualiser

View File

@ -4,8 +4,12 @@ import time
from datetime import datetime from datetime import datetime
data_transfer = defaultdict(lambda: {"current": 0, "daily": 0, "last_reset": time.time()}) 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. Règle pour détecter une exfiltration de données importantes.
Actuellement, ne fonctionne pas pour un débit supérieur à 4Mo 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 # Mettre à jour le volume de données transférées
current_time = time.time() 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]["daily"] = 0
data_transfer[src_ip]["last_reset"] = current_time data_transfer[src_ip]["last_reset"] = current_time
@ -27,37 +31,12 @@ def rule(packet, _, db):
data_transfer[src_ip]["daily"] += payload_size data_transfer[src_ip]["daily"] += payload_size
# Exfiltration de données instantané # Exfiltration de données instantané
if data_transfer[src_ip]["current"] > rule.seuil_session: if data_transfer[src_ip]["current"] > seuil_session:
db.send_alert( 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")
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 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 # Exfiltration de données journalière
if data_transfer[src_ip]["daily"] > rule.seuil_journalier: if data_transfer[src_ip]["daily"] > seuil_journalier:
db.send_alert( 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")
datetime.now(), print("Alerte, data transfer, transfert journalier important")
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

View File

@ -4,7 +4,12 @@ from scapy.all import IP
# Dictionnaire pour stocker les dernières alertes envoyées pour chaque IP # Dictionnaire pour stocker les dernières alertes envoyées pour chaque IP
last_alert_time = {} 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. 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() current_time = datetime.now()
# Vérifier si l'heure est dans la plage # 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 # Vérifier si une alerte a déjà été envoyée récemment pour cette IP
if src_ip in last_alert_time: if src_ip in last_alert_time:
time_since_last_alert = current_time - last_alert_time[src_ip] 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 return # Ne pas envoyer une nouvelle alerte
# Envoyer une alerte # Envoyer une alerte
db.send_alert( 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")
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"
)
print(f"Alerte : activité réseau détectée à {current_time.time()} entre {src_ip} et {dst_ip}") 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 # Mettre à jour le temps de la dernière alerte pour cette IP
last_alert_time[src_ip] = current_time last_alert_time[src_ip] = current_time
# Définir la plage horaire
rule.start_time = time(21, 0)
rule.end_time = time(6, 0)

View File

@ -1,7 +1,7 @@
<?php <?php
// Database constants. // Database constants.
define('DB_USER', 'sidps'); define('DB_USER', 'sidps');
define('DB_PASSWORD', 'sidps'); define('DB_PASSWORD', 'SUPERPASSWORD');
define('DB_NAME', 'sidps'); define('DB_NAME', 'sidps');
define('DB_SERVER', 'localhost'); define('DB_SERVER', '172.20.3.10');
?> ?>