Nmap (Network Mapper) est un outil de découverte et d'audit de réseau open source développé par Gordon Lyon (alias Fyodor). Il permet de scanner des réseaux informatiques, découvrir des dispositifs, des services et des vulnérabilités potentielles.
Principales fonctionnalités :
Pour spécifier les ports à scanner :
Option | Description |
---|---|
-p <ports> |
Scan des ports spécifiques (ex: -p 80,443,8080 ) |
-p- <plage de ports> |
Scan d'une plage de ports (ex: -p 1-1000 ) |
-top-ports <nombre> |
Scan des N ports les plus courants (ex: -top-ports 100 ) |
Option | Description |
---|---|
-A |
Active la détection d'OS et des versions de services |
-O |
Active uniquement la détection d'OS |
-sV |
Active la détection des versions de services |
Option | Description |
---|---|
-v / -vv |
Active le mode verbeux (affiche des informations détaillées) |
-oN <fichier> |
Enregistre les résultats dans un fichier spécifié |
-iL <fichier> |
Lit une liste d'adresses IP ou d'hôtes à partir d'un fichier |
--script <scripts> |
Spécifie un ou plusieurs scripts NSE à exécuter |
-sP |
Effectue un balayage de ping sans balayage de ports |
Option | Description | Caractéristiques |
---|---|---|
-sS |
Balayage SYN (Half-open) | Envoie des paquets SYN sans établir de connexion complète, moins détectable |
-sT |
Balayage TCP connect | Effectue une connexion TCP complète, laisse plus de traces dans les journaux |
-sI |
Balayage Idle (ZOMBIE) | Utilise un hôte tiers (zombie) avec IPID incrémentiel comme intermédiaire |
Option | Description |
---|---|
-T0 |
Mode furtif (très lent) |
-T1 |
Mode lent |
-T2 |
Mode par défaut |
-T3 |
Mode agressif |
-T4 |
Mode insolent |
-T5 |
Mode insane (très rapide) |
--scan-delay <temps> |
Spécifie un délai entre les paquets envoyés |
Le Nmap Scripting Engine (NSE) est un composant puissant de Nmap qui permet d'étendre ses fonctionnalités via des scripts écrits en Lua. NSE permet d'automatiser des tâches comme la découverte de services, la détection de vulnérabilités, et la collecte d'informations système.
Pour exécuter un script NSE :
nmap -p 22 --script ssh-brute nom_de_l_hote
Un script NSE est un fichier Lua qui suit une structure spécifique :
-- Description du script
description = "Mon script NSE"
-- Catégories du script
categories = {"default", "discovery"}
-- Règle d'exécution pour un hôte spécifique
hostrule = function(host)
-- Conditions pour exécuter le script sur cet hôte
return true -- ou false selon les conditions
end
-- Règle d'exécution pour un port spécifique
portrule = function(host, port)
-- Conditions pour exécuter le script sur ce port
return port.number == 80 and port.state == "open"
end
-- Fonction principale du script
function action(host, port)
-- Code du script ici
return "Résultat du script"
end
Pour exécuter des scripts NSE avec Nmap :
# Exécuter un script spécifique
nmap --script nom_du_script.lua nom_de_l_hote
# Exécuter tous les scripts d'une catégorie
nmap --script discovery nom_de_l_hote
# Exécuter plusieurs scripts
nmap --script "http-*,ssl-*" nom_de_l_hote
Les scripts NSE sont stockés dans le répertoire nmap/scripts
de l'installation Nmap.
Exemple d'un script NSE simple :
description = "Script NSE simple"
categories = {"default"}
function action()
-- Affiche un message dans la console
print("Mon premier script NSE")
return "Script exécuté avec succès"
end
Les scripts NSE peuvent collecter des données réseau en utilisant les fonctions hostrule()
et portrule()
:
description = "Collecte d'informations sur les hôtes avec le port 80 ouvert"
categories = {"discovery"}
-- Exécution du script uniquement si le port 80 est ouvert
portrule = function(host, port)
return port.number == 80 and port.state == "open"
end
function action(host, port)
-- Code pour collecter des informations sur l'hôte
local result = "Informations sur l'hôte " .. host.ip
return result
end
Exemple de script NSE avancé pour la collecte d'informations :
description = "Script NSE avancé pour collecter des informations"
categories = {"discovery"}
function action(host, port)
local result = {}
-- Ajoute l'adresse IP de l'hôte au résultat
table.insert(result, "Adresse IP : " .. host.ip)
-- Vérifie si un serveur web est détecté
if port.service == "http" then
table.insert(result, "Serveur web détecté sur le port " .. port.number)
-- Tente d'obtenir le titre de la page d'accueil
local response = http.get(host, port, "/")
if response and response.body then
local title = response.body:match("<title>(.-)</title>")
if title then
table.insert(result, "Titre de la page : " .. title)
end
end
end
return table.concat(result, "\n")
end
Pour développer des scripts NSE efficaces :
Documentation complète
Structure du code
Tests et débogage
Scan des 1000 premiers ports d'un hôte :
nmap -p 1-1000 exemple.com
Détection des services et des versions :
nmap -sV -p 1-1000 exemple.com
Scan complet avec détection d'OS et scripts de vulnérabilité :
nmap -A --script vuln exemple.com
Voici un exemple de script NSE pour scanner des réseaux IP avec des ports spécifiques :
description = "Script NSE de scan de réseaux IP avec ports spécifiques"
categories = {"discovery"}
-- Arguments acceptés par le script
args = {
{name = "ip", desc = "Plages d'adresses IP à scanner"},
{name = "ports", desc = "Ports à scanner"}
}
function action()
-- Lire les arguments pour les plages d'adresses IP et les ports
local target_ips = stdnse.get_script_args('ip')
local target_ports = stdnse.get_script_args('ports')
-- Vérifier que des plages d'adresses IP ont été spécifiées
if not target_ips then
return "Erreur: Veuillez spécifier au moins une adresse IP avec --script-args='ip=192.168.1.0/24'"
end
-- Vérifier que des ports ont été spécifiés
if not target_ports then
return "Erreur: Veuillez spécifier au moins un port avec --script-args='ports=80,443'"
end
-- Préparer la commande Nmap
local command = string.format("nmap -p %s %s", target_ports, target_ips)
-- Exécuter la commande
local handle = io.popen(command)
local result = handle:read("*a")
handle:close()
return result
end
Pour utiliser ce script :
nmap --script scan_custom.lua --script-args='ip=192.168.1.0/24,ports=22,80,443'