🎯 Objectif de la semaine
Maîtriser les fondements de Python et écrire vos premiers scripts d'automatisation pour l'analyse de données de sécurité. Transformer des tâches manuelles fastidieuses en processus automatisés fiables.
Pourquoi Python en cybersécurité : 70% des outils de pentesting sont écrits en Python. Savoir programmer, c'est passer de consommateur d'outils à créateur d'outils.
Logs, captures, fichiers] --> B{Analyse Python} B --> C[🔍 Parsing
Lecture & extraction] B --> D[⚙️ Traitement
Filtrage, comptage] B --> E[🎯 Décision
Conditions & règles] C --> F[📊 Résultats
Stats, rapports] D --> F E --> F F --> G[🚀 Automatisation
Script réutilisable] G --> H[⚡ Gain de temps
Réduction d'erreurs] style A fill:#0a0e17,stroke:#00d4ff,stroke-width:2px style G fill:#11151f,stroke:#9d4edd,stroke-width:2px style H fill:#00f5a0,stroke:#000,stroke-width:2px
📚 Sujet – Théorie (1 heure)
Pourquoi Python est l'arme absolue du hacker
🚀 Les 7 super-pouvoirs de Python en sécurité :
- Simplicité lisible : Code presque comme du pseudo-code
- Écosystème gigantesque : 300,000+ packages PyPI
- Cross-platform : Même code sur Linux, Windows, macOS
- Scripting puissant : Automatisation réseau, fichiers, processus
- Librairies dédiées : Scapy (réseau), Requests (HTTP), Cryptography
- Intégration système : Appelle des commandes shell, APIs système
- Rapide prototypage : Testez des idées en minutes, pas en jours
L'anatomie d'un script Python de sécurité
#!/usr/bin/env python3
# ============================================
# PCTAMALOU - Script d'analyse de sécurité
# Auteur : [Votre Nom]
# Objectif : Analyser des logs pour détecter des menaces
# ============================================
import sys # Arguments et sortie
import re # Expressions régulières
import json # Formatage JSON
from datetime import datetime # Gestion temps
# ----------------------------------------------------
# CONSTANTES GLOBALES
# ----------------------------------------------------
LOG_FILE = "/var/log/auth.log"
THRESHOLD_FAILED = 5 # Seuil d'alerte
# ----------------------------------------------------
# FONCTIONS PRINCIPALES
# ----------------------------------------------------
def analyse_failed_logins(log_path):
"""Compte les échecs d'authentification"""
# Implémentation...
pass
def generate_report(results):
"""Génère un rapport structuré"""
# Implémentation...
pass
# ----------------------------------------------------
# POINT D'ENTRÉE
# ----------------------------------------------------
if __name__ == "__main__":
print("[*] Démarrage de l'analyse...")
# Logique principale
print("[+] Analyse terminée")
Les concepts Python essentiels pour la sécurité
| Concept | Exemple | Utilisation en sécurité | Analogie |
|---|---|---|---|
| Variables | ip = "192.168.1.1" |
Stockage d'adresses IP, ports, données sensibles | 📦 Boîte étiquetée |
| Listes/Dictionnaires | ports = [22, 80, 443] |
Collections d'éléments à scanner/analyser | 🗃️ Collection organisée |
| Boucles for | for line in log_file: |
Parcourir des logs ligne par ligne | 🔁 Répétition précise |
| Conditions if/else | if "FAILED" in line: |
Détection de patterns dans les données | ❓ Prise de décision |
| Fonctions | def scan_port(ip, port): |
Modules réutilisables pour différentes tâches | 🛠️ Outil spécialisé |
| Gestion d'erreurs | try: ... except: |
Robustesse face aux fichiers manquants, erreurs réseau | 🛡️ Protection anticasse |
L'indentation : la philosophie Python
⚠️ Attention : L'indentation est syntaxique en Python
Contrairement à la plupart des langages qui utilisent des accolades {}, Python utilise l'indentation pour délimiter les blocs.
# ❌ FAUX (erreur d'indentation)
if True:
print("Ceci échouera") # Pas d'indentation
# ✅ CORRECT
if True:
print("Ceci fonctionne") # 4 espaces d'indentation
Convention professionnelle : 4 espaces (jamais de tabulations). Configurez votre éditeur en conséquence.
💡 Philosophie du scripteur :
"Si vous devez faire une tâche plus de deux fois, automatisez-la."
Un Gardien numérique ne perd pas son temps à des tâches répétitives. Il écrit un script qui le fait pour lui, plus vite et sans erreur.
🔬 Mission pratique – Laboratoire (2 heures)
Scénario : Création d'un analyseur de logs de sécurité
Vous êtes responsable de la surveillance d'un serveur. Vous devez créer un outil qui analyse automatiquement les logs à la recherche d'activités suspectes.
📝 Avant de commencer : Python3 est préinstallé sur Kali. Vérifiez avec python3 --version.
Étapes détaillées : De zéro à script fonctionnel
-
Configuration de l'environnement
Organisation professionnelle des dossiers :# Structure de projet professionnelle cd ~/mon_lab mkdir -p semaine4_python/{scripts,logs,tests,output} cd semaine4_python # Vérification Python python3 --version which python3 # Création d'un environnement virtuel (bonne pratique) python3 -m venv venv # Optionnel mais recommandé # source venv/bin/activate # Pour activer -
Création de logs réalistes
Générons des logs simulés mais réalistes pour notre analyse :# Fichier de logs d'authentification simulé cat > logs/auth.log << 'EOF' Jan 10 08:30:15 server sshd[1234]: Accepted password for kali from 192.168.1.100 port 54322 Jan 10 08:31:22 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323 Jan 10 08:31:25 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323 Jan 10 08:31:28 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323 Jan 10 08:32:10 server sshd[1236]: Accepted publickey for root from 10.0.0.5 port 54324 Jan 10 08:33:45 server sshd[1237]: Failed password for kali from 192.168.1.150 port 54325 Jan 10 08:34:20 server sudo: kali : TTY=pts/0 ; PWD=/home/kali ; USER=root ; COMMAND=/bin/ls Jan 10 08:35:00 server sshd[1238]: Accepted password for www-data from 172.16.0.10 port 54326 Jan 10 08:36:15 server sshd[1239]: Invalid user hacker from 203.0.113.5 port 54327 Jan 10 08:36:18 server sshd[1239]: Failed password for invalid user hacker from 203.0.113.5 port 54327 Jan 10 08:40:00 server CRON[1240]: (root) CMD (/usr/bin/updatedb) EOF # Fichier de logs système cat > logs/system.log << 'EOF' INFO: Service ssh started successfully ERROR: Disk usage at 95% on /dev/sda1 WARNING: High memory usage detected (85%) INFO: Backup completed successfully ERROR: Could not connect to database server WARNING: CPU temperature above threshold INFO: Security scan started ERROR: Firewall rule failed to apply WARNING: Unusual network activity from 192.168.1.200 INFO: System updated to latest version EOF -
Écriture du script d'analyse basique
Créez votre premier script avec un éditeur (nano, vim, ou code) :#!/usr/bin/env python3 """ PCTAMALOU - Semaine 4 : Analyseur de logs de sécurité Script d'analyse de logs SSH pour détecter des tentatives de bruteforce """ import sys import os from datetime import datetime from collections import defaultdict # ============================================================================ # CONFIGURATION # ============================================================================ LOG_FILE = "logs/auth.log" OUTPUT_FILE = "output/security_report.txt" FAILED_THRESHOLD = 3 # Nombre d'échecs avant alerte # ============================================================================ # FONCTIONS D'ANALYSE # ============================================================================ def analyse_ssh_logs(log_path): """ Analyse les logs SSH pour détecter des patterns suspects Retourne un dictionnaire avec les statistiques """ stats = { 'total_lines': 0, 'accepted_logins': 0, 'failed_logins': 0, 'invalid_users': 0, 'suspicious_ips': defaultdict(int), 'failed_by_user': defaultdict(int) } try: with open(log_path, 'r') as file: for line in file: stats['total_lines'] += 1 # Détection des connexions acceptées if "Accepted" in line and "sshd" in line: stats['accepted_logins'] += 1 # Détection des échecs de connexion if "Failed password" in line: stats['failed_logins'] += 1 # Extraction de l'IP source import re ip_match = re.search(r'from (\d+\.\d+\.\d+\.\d+)', line) if ip_match: ip = ip_match.group(1) stats['suspicious_ips'][ip] += 1 # Extraction du nom d'utilisateur user_match = re.search(r'for (\w+) from', line) if user_match: user = user_match.group(1) stats['failed_by_user'][user] += 1 # Détection des utilisateurs invalides if "Invalid user" in line: stats['invalid_users'] += 1 except FileNotFoundError: print(f"[ERREUR] Fichier {log_path} non trouvé") return None except Exception as e: print(f"[ERREUR] Problème de lecture: {e}") return None return stats def generate_report(stats, output_path): """Génère un rapport d'analyse formaté""" if not stats: return False try: with open(output_path, 'w') as report: report.write("=" * 60 + "\n") report.write("RAPPORT D'ANALYSE DE SÉCURITÉ\n") report.write(f"Généré le: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") report.write("=" * 60 + "\n\n") # Statistiques générales report.write("📊 STATISTIQUES GÉNÉRALES\n") report.write(f" • Lignes analysées: {stats['total_lines']}\n") report.write(f" • Connexions acceptées: {stats['accepted_logins']}\n") report.write(f" • Échecs de connexion: {stats['failed_logins']}\n") report.write(f" • Utilisateurs invalides: {stats['invalid_users']}\n\n") # IPs suspectes report.write("🔍 IPS SUSPECTES (plus de 2 échecs)\n") suspicious_count = 0 for ip, count in stats['suspicious_ips'].items(): if count >= 2: report.write(f" • {ip}: {count} échecs\n") suspicious_count += 1 if suspicious_count == 0: report.write(" Aucune IP suspecte détectée\n") report.write("\n") # Utilisateurs avec échecs report.write("👤 UTILISATEURS AVEC ÉCHECS\n") for user, count in stats['failed_by_user'].items(): report.write(f" • {user}: {count} échecs\n") # Recommandations report.write("\n💡 RECOMMANDATIONS\n") if stats['failed_logins'] > 10: report.write(" ⚠️ Nombre élevé d'échecs - Vérifier les règles firewall\n") if stats['invalid_users'] > 5: report.write(" ⚠️ Nombre élevé d'utilisateurs invalides - Possible scan\n") if suspicious_count > 0: report.write(f" ⚠️ {suspicious_count} IP(s) suspectes détectées\n") report.write("\n" + "=" * 60 + "\n") return True except Exception as e: print(f"[ERREUR] Échec génération rapport: {e}") return False # ============================================================================ # FONCTION PRINCIPALE # ============================================================================ def main(): print("[*] PCTAMALOU - Analyseur de logs de sécurité") print(f"[*] Analyse du fichier: {LOG_FILE}") # Analyse des logs stats = analyse_ssh_logs(LOG_FILE) if not stats: print("[!] Échec de l'analyse") sys.exit(1) # Génération du rapport print(f"[*] Génération du rapport: {OUTPUT_FILE}") if generate_report(stats, OUTPUT_FILE): print("[+] Rapport généré avec succès") # Affichage des points clés print(f"\n📋 RÉSUMÉ:") print(f" • Échecs de connexion: {stats['failed_logins']}") print(f" • IPs uniques avec échecs: {len(stats['suspicious_ips'])}") # Détection d'IPs très suspectes high_risk_ips = [ip for ip, count in stats['suspicious_ips'].items() if count >= FAILED_THRESHOLD] if high_risk_ips: print(f" ⚠️ IPs à haut risque: {', '.join(high_risk_ips)}") else: print("[!] Échec génération rapport") sys.exit(1) # ============================================================================ # POINT D'ENTRÉE # ============================================================================ if __name__ == "__main__": main() -
Exécution et test du script
Testez votre création :# Rendre le script exécutable chmod +x scripts/log_analyzer.py # Exécution python3 scripts/log_analyzer.py # Vérification du rapport cat output/security_report.txt # Test avec un fichier manquant (gestion d'erreur) mv logs/auth.log logs/auth.log.backup python3 scripts/log_analyzer.py # Doit afficher une erreur mv logs/auth.log.backup logs/auth.log -
Améliorations et extensions
Ajoutez des fonctionnalités avancées :# Extension 1: Ajout d'arguments en ligne de commande import argparse parser = argparse.ArgumentParser(description="Analyseur de logs de sécurité") parser.add_argument("-f", "--file", help="Fichier log à analyser", default="logs/auth.log") parser.add_argument("-o", "--output", help="Fichier de sortie", default="output/report.txt") parser.add_argument("-t", "--threshold", type=int, help="Seuil d'alerte", default=3) args = parser.parse_args() # Extension 2: Export JSON pour intégration avec d'autres outils import json def export_json(stats, filename): with open(filename, 'w') as f: json.dump(stats, f, indent=2) # Extension 3: Envoi d'alertes par email (simulé) def send_alert(ip, count): print(f"[ALERTE] IP {ip} a {count} échecs de connexion") -
Création d'un deuxième script : analyseur de logs système
Pour pratiquer, créez un script complémentaire :#!/usr/bin/env python3 """ Analyseur de logs système - Détection de problèmes """ def analyse_system_logs(log_file): errors = [] warnings = [] with open(log_file, 'r') as f: for line in f: if "ERROR" in line: errors.append(line.strip()) elif "WARNING" in line: warnings.append(line.strip()) return { 'errors': errors, 'warnings': warnings, 'total_errors': len(errors), 'total_warnings': len(warnings) } # Testez ce script sur logs/system.log
🎯 Défi de programmation avancé
Créez un script qui :
- Lit plusieurs fichiers logs dans un dossier
- Détecte les IPs qui apparaissent dans plusieurs fichiers
- Génère un rapport avec les timelines d'attaque
- Exporte les résultats en CSV pour analyse dans un tableur
Indice : Utilisez os.listdir(), datetime.strptime(), et le module csv.
📋 Objectif de la semaine – Checklist de validation
✅ Compétences techniques acquises
- Créer et exécuter un script Python avec shebang correct
- Lire et écrire des fichiers avec gestion d'erreurs
- Utiliser des boucles et conditions pour analyser des données
- Extraire des informations avec des expressions régulières simples
- Structurer un script avec fonctions et documentation
- Générer des rapports formatés automatiquement
🧠 Changement mental accompli
- Penser en termes d'automatisation : "Comment scriptifier cette tâche ?"
- Voir les logs comme des données structurées, pas du texte opaque
- Comprendre qu'un bon script est un multiplicateur de force
- Adopter la philosophie DRY (Don't Repeat Yourself)
🐍 Bonne pratique Python à adopter :
Toujours utiliser python3 et non python (Python 2 est obsolète depuis 2020).
Utilisez des docstrings (triples guillemets) pour documenter vos fonctions.
📚 Ressources gratuites recommandées
Pour approfondir Python en sécurité :
- Python pour la cybersécurité : GitHub Python Security
- Automate the Boring Stuff : Livre gratuit en ligne
- Real Python : Tutoriels professionnels
⚠️ Pièges courants à éviter
- Oublier le shebang
#!/usr/bin/env python3 - Ne pas gérer les exceptions (fichier manquant, permissions)
- Écrire des scripts sans documentation ni commentaires
- Utiliser Python 2 (obsolète et non sécurisé)
- Ne pas valider les entrées utilisateur (injection de commandes)
🔮 Frère d'armes,
Tu viens d'acquérir l'arme la plus puissante du Gardien numérique : le pouvoir de l'automatisation.
Jusqu'à présent, tu as appris à :
• Communiquer avec la machine (terminal - S01)
• Contrôler l'accès (permissions - S02)
• Observer ce qui se passe (processus - S03)
• Automatiser l'analyse (Python - S04)
Cette semaine marque un tournant. Tu n'es plus seulement un opérateur qui utilise des outils. Tu deviens un créateur d'outils.
Ton script d'analyse de logs n'est qu'un début. Bientôt, tu pourras :
- Scanner automatiquement des réseaux
- Analyser des captures réseau
- Détecter des vulnérabilités
- Répondre à des incidents
- Créer tes propres outils de pentest
Python est le multiplicateur de force qui transforme un bon analyste en excellent analyste.
Dans la semaine 5, nous combinerons tout ce que nous avons appris pour aborder le monde des réseaux. Nous verrons comment les machines communiquent, comment capturer ce trafic, et comment l'analyser pour y détecter des menaces.
Pratique. Code. Améliore. Chaque script que tu écris est une compétence qui te rapproche de la maîtrise.
Tu n'es plus un simple utilisateur. Tu es devenu un artisan du code.
— Platon-Y