Skip to content

Professional network vulnerability scanner in Python

Notifications You must be signed in to change notification settings

napsterlab/VulnScanner

Repository files navigation

🔒 VulnScanner - Network Vulnerability Scanner

Un scanner de vulnérabilités réseau professionnel avec interface web et API REST


⚡ Démarrage Rapide (3 min)

# 1. Cloner et accéder au projet
cd "d:\Etude\Python Projs\Scanner Net"

# 2. Créer l'environnement virtuel
python -m venv .venv
.venv\Scripts\Activate.ps1

# 3. Installer les dépendances
pip install -r requirements.txt

# 4. Lancer Docker
docker compose up -d

# 5. Accéder au dashboard
# Naviguer à: http://localhost:5000

📋 Fonctionnalités Principales

Scan de Réseau Complet

  • Découverte d'hôtes (résolution de noms)
  • Scan de ports TCP/UDP
  • Détection de services
  • Extraction de banners

Analyse de Vulnérabilités

  • Vérification CVE en base de données (11 CVEs)
  • Calcul de score de risque CVSS
  • Test SSL/TLS
  • Test de mots de passe faibles

Web Dashboard Professionnel

  • Interface responsive en temps réel
  • Graphiques "Vulnerability Distribution" et "Risk Assessment"
  • Historique des scans
  • Export multi-format (HTML, PDF, JSON)

API REST Complète

  • 8 endpoints pour automatisation
  • WebSocket pour mises à jour en temps réel
  • Récupération des statistiques

Docker Intégré

  • Conteneur DVWA pour tester
  • Base de données MySQL
  • Scanner isolé en conteneur

🚀 Modes d'Utilisation

Mode 1: CLI (Ligne de Commande)

# Scan simple
python scanner.py scan 192.168.1.1 --ports 80,443

# Scan avec rapport HTML
python scanner.py scan vulnerable-web --ports 80 --report scan.html

# Voir l'aide
python scanner.py --help

Mode 2: Web Dashboard

URL: http://localhost:5000

  1. Remplir le formulaire:

    • Target: IP ou hostname (ex: vulnerable-web)
    • Ports: 80 ou 80,443 ou 1-1000
    • Scan Type: Quick/Full/Custom
  2. Lancer le scan

    • Barre de progression en temps réel
    • Graphiques mis à jour automatiquement
    • Résultats sauvegardés en base
  3. Exporter les résultats:

    • HTML (rapport complet)
    • PDF (version imprimable)
    • JSON (données brutes)

Mode 3: API REST

# Démarrer un scan
$body = @{
    target = "192.168.1.1"
    ports = "80"
    scan_type = "standard"
} | ConvertTo-Json

Invoke-RestMethod -Uri "http://localhost:5000/api/scan/start" `
    -Method POST -ContentType "application/json" -Body $body

# Voir les statistiques
Invoke-RestMethod -Uri "http://localhost:5000/api/stats"

# Lister les scans
Invoke-RestMethod -Uri "http://localhost:5000/api/scans"

🏗️ Architecture

VulnScanner/
├── scanner.py              # Entrée principale (CLI)
├── requirements.txt        # Dépendances Python
├── docker-compose.yml      # Configuration Docker
├── Dockerfile              # Image du scanner
│
├── src/                    # Code source principal
│   ├── scanning/          # Modules de scan
│   │   ├── host_discovery.py
│   │   ├── port_scanner.py
│   │   ├── service_detector.py
│   │   └── banner_grabber.py
│   ├── analysis/          # Modules d'analyse
│   │   ├── cve_checker.py
│   │   ├── risk_calculator.py
│   │   ├── ssl_tester.py
│   │   └── password_tester.py
│   └── reporting/         # Modules de rapport
│       ├── html_reporter.py
│       └── pdf_reporter.py
│
├── web/                    # Interface web
│   ├── app.py             # Flask + WebSocket
│   ├── templates/
│   │   └── dashboard.html # UI responsive
│   ├── static/
│   │   ├── css/style.css  # Tailwind CSS
│   │   └── js/dashboard.js # Socket.IO client
│   └── config.py
│
├── scripts/               # Scripts utilitaires
│   ├── build_cve_db.py   # Créer la base CVE
│   └── populate_cve_database.py
│
└── data/                  # Données persistantes
    ├── cve_database.db   # CVEs de référence
    └── scans.db          # Historique des scans

📊 Services Docker

Service Port Rôle Status
vulnerable-web (DVWA) 8080 Cible de test http://localhost:8080
vulnerable-mysql 3306 BD test Interne
vuln-scanner 5000 Dashboard web http://localhost:5000

Vérifier le statut:

docker compose ps

🔧 Configuration

Variables d'Environnement

# Database
$env:DB_PATH = "data/cve_database.db"
$env:SCANS_DB_PATH = "data/scans.db"

# Flask
$env:FLASK_ENV = "production"
$env:FLASK_DEBUG = 0

# Scanner
$env:MAX_WORKERS = 50
$env:PORT_TIMEOUT = 3

Personnaliser les CVEs

Éditez populate_cve_database.py puis:

python populate_cve_database.py
docker compose down
docker compose build --no-cache
docker compose up -d

📈 Résultats Attendus

Scan de DVWA (vulnerable-web:80)

✅ Hôtes découverts: 1 (172.18.0.2)
✅ Ports ouverts: 80 (HTTP)
✅ Services: Apache 2.4
✅ Vulnérabilités trouvées: 6
   - CVE-2021-41773 (Apache Path Traversal) - CRITICAL
   - CVE-2024-DVWA-01 (Multiple DVWA Vulns) - CRITICAL
   - CVE-2024-HTTP-XSS (XSS) - MEDIUM
   - CVE-2024-HTTP-SQLI (SQL Injection) - CRITICAL
   - ...

🐛 Troubleshooting

Problème: "0 hosts, 0 vulnerabilities"

Solution: La base CVE n'était pas correctement liée. Cela a été fixé en v2.0.

# Reconstruire:
docker compose down -v
docker rmi scannernet-vuln-scanner -f
docker compose build --no-cache
docker compose up -d

Problème: Docker ne démarre pas

# Lancer Docker Desktop manuellement:
# Windows + R → taper "Docker Desktop"

# Ou attendre que le service démarre:
Start-Sleep -Seconds 60
docker compose up -d

Problème: "Connection refused" sur port 5000

# Vérifier que Flask tourne:
docker compose logs vuln-scanner | Select-Object -Last 10

# Si erreur, relancer:
docker compose restart vuln-scanner

📚 Documentation Complète


🎯 Cas d'Usage

1️⃣ Scan Unique

python scanner.py scan 192.168.1.1 --ports 80

2️⃣ Scan Récurrent (Tâche planifiée)

# Créer une tâche Windows pour scanner chaque jour
schtasks /create /tn "VulnScan" /tr "python scanner.py scan 192.168.1.0/24" /sc daily /st 02:00

3️⃣ Automatisation API

import requests

# Démarrer un scan
response = requests.post('http://localhost:5000/api/scan/start', json={
    'target': '192.168.1.1',
    'ports': '80,443',
    'scan_type': 'standard'
})

scan_id = response.json()['scan_id']

# Récupérer les résultats
results = requests.get(f'http://localhost:5000/api/scan/{scan_id}/results').json()
print(f"Vulnérabilités trouvées: {len(results['vulnerabilities'])}")

🔐 Sécurité

⚠️ Important:

  • Ne pas scanner des réseaux que vous ne possédez pas
  • Utiliser uniquement DVWA pour tester
  • Le projet contient des intentionnelles pour l'éducation

📦 Dépendances Principales

  • Python 3.10+ - Langage
  • Flask 2.3 - Web framework
  • Scapy 2.5 - Scanning réseau
  • Paramiko 3.2 - SSH
  • ReportLab 4.0 - PDF generation
  • Docker - Conteneurs

Voir requirements.txt pour la liste complète.


📝 Licence

Projet éducatif - Usage personnel autorisé.


🤝 Support

Pour des problèmes:

  1. Vérifier les logs: docker compose logs
  2. Reconstruire l'image: docker compose build --no-cache
  3. Réinitialiser complètement: docker compose down -v && docker compose up -d

Version: 2.0.0
Dernière mise à jour: Janvier 2026
Statut: ✅ Production Ready

🚀 Prêt à scanner!

About

Professional network vulnerability scanner in Python

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published