mirror of
https://github.com/Oxbian/SIDPS.git
synced 2025-05-17 14:08:14 +02:00
feat: dockerfile web
This commit is contained in:
parent
52a7581fc4
commit
f6e694256b
@ -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
|
||||||
|
|
||||||
|
5
Demo/Dockerfiles/Dockerfile.web
Normal file
5
Demo/Dockerfiles/Dockerfile.web
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM eriksoderblom/alpine-apache-php:latest
|
||||||
|
|
||||||
|
# Copie des fichiers du projet
|
||||||
|
COPY web/ /htdocs/
|
||||||
|
|
@ -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
|
||||||
|
@ -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
|
||||||
|
11
README.md
11
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.
|
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
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
script ajax pour reload la page tte les Xs ?
|
|
||||||
adresse de destination
|
|
||||||
bouton visualiser
|
|
@ -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
|
|
||||||
|
@ -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)
|
|
||||||
|
@ -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');
|
||||||
?>
|
?>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user