
Un scanner SCADA/ICS asynchrone et haute performance
Un scanner SCADA/ICS asynchrone et haute performance pour identifier et prendre l'empreinte des systèmes de contrôle industriels sur les réseaux. Il détecte les vulnérabilités, identifie les fournisseurs/produits et génère des rapports de risque complets.
AVERTISSEMENT : Réservé aux évaluations de sécurité autorisées. L'analyse non autorisée peut enfreindre les lois et réglementations.
# Clone the repository
git clone https://github.com/geeknik/scada-scanner.git
cd scada-scanner
# Install dependencies
pip install -r requirements.txt
# Single target scan
python scada_scanner.py -t 192.168.1.100 -o results.json
# CIDR range scan
python scada_scanner.py -c 192.168.1.0/24 -o results.json
# Multiple CIDR ranges from file
python scada_scanner.py -f networks.txt -o results.json
# Export CSV instead of JSON
python scada_scanner.py -t 192.168.1.100 --format csv -o results.csv
# Respect an exclude list
python scada_scanner.py -c 10.0.0.0/24 --exclude exclude.txt
# Highlight unexpected protocol/port combos (logged and in findings)
python scada_scanner.py -t 203.0.113.10 -o results.json
# Enable live vuln enrichment via ProjectDiscovery vulnx (requires vulnx + PDCP API key)
vulnx auth
python scada_scanner.py -t 192.168.1.100 --vulnx --vulnx-limit 3
Required arguments (one of):
-t, --target Single target IP address
-c, --cidr CIDR range to scan (e.g., 192.168.1.0/24)
-f, --cidr-file File containing CIDR ranges (one per line)
Optional arguments:
-o, --output Output file (default: scan_results.json)
-r, --rate Max requests per second (default: 10.0)
--timeout Connection timeout in seconds (default: 5)
--max-concurrent Maximum concurrent connections (default: 50)
--safe-mode Enable safe mode (non-intrusive scans only)
--exclude File containing IPs to exclude from scan
-v, --verbosity Verbosity level: 0=quiet, 1=normal, 2=debug
--format Output format: json or csv (default: json)
--safe-mode{
"scan_summary": {
"timestamp": "2025-02-27T14:02:33.456789",
"total_hosts_scanned": 256,
"hosts_with_scada": 12,
"total_vulnerabilities": 37,
"high_risk_hosts": 5
},
"hosts": [
{
"ip": "192.168.1.100",
"ports": [
{
"port": 502,
"protocol": "MODBUS",
"fingerprint": {
"vendor": "Schneider",
"product": "M340",
"version": "2.6.0",
"risk_score": 0.75,
"evidence": [
"response:00010000000101",
"port_hint:502"
],
"findings": [
"Detected MODBUS protocol (confidence: 0.55)",
"Identified vendor: SCHNEIDER, product: M340",
"Overall risk assessment: High (score: 0.75)"
],
"unexpected_port": false
}
}
],
"vulnerabilities": [
{
"cve_id": "CVE-2025-55221",
"description": "Socomec DIRIS Digiware M-70 DoS via crafted Modbus TCP/RTU over TCP packets",
"severity": "high",
"source": "local_db"
}
]
}
]
}
Cet outil est destiné uniquement aux évaluations de sécurité autorisées. L'analyse non autorisée peut enfreindre :
Le scanner est livré avec une petite base de données de vulnérabilités intégrée pour les protocoles de base (voir VULNERABILITY_DATABASE). Pour obtenir des informations plus récentes, vous pouvez activer l'intégration optionnelle ProjectDiscovery vulnx :
vulnx et configurez votre clé API PDCP (vulnx auth).--vulnx (réglez éventuellement --vulnx-limit et --vulnx-timeout).source: "vulnx".Si vulnx est absent ou inaccessible, le scanner revient silencieusement à la base de données locale.
Les entrées de la base de données locale sont périodiquement actualisées à partir des recherches vulnx pour les protocoles de base (capturées dans cet instantané du dépôt) et sont étiquetées avec source: "local_db".
Exécutez la suite de tests unitaires :
pytest
Le scanner est conçu de manière modulaire, ce qui facilite l'ajout de la prise en charge de nouveaux protocoles :
SCADA_PORTSPROTOCOL_SIGNATURESVULNERABILITY_DATABASELes contributions sont les bienvenues ! Veuillez suivre ces étapes :
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Ce projet est sous licence MIT - consultez le fichier LICENSE pour plus de détails.
LE LOGICIEL EST FOURNI « EN L'ÉTAT », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE. LES AUTEURS DÉCLINENT TOUTE RESPONSABILITÉ EN CAS DE DOMMAGE OU DE PERTE RÉSULTANT DE L'UTILISATION DE CE LOGICIEL.