Le banner grabbing est une technique de reconnaissance qui consiste à récupérer la bannière renvoyée par un service réseau pour identifier le logiciel et sa version. Une connexion sur le port 22 révèle par exemple SSH-2.0-OpenSSH_9.6, et un en-tête HTTP affiche Server: nginx/1.25.3. Pour un attaquant, cette information mène droit aux CVE connues de cette version ; pour un défenseur, elle indique ce qu'il expose sans le vouloir. Ce guide montre comment récupérer une bannière avec nc, curl et nmap, quels services en exposent une, et comment les masquer.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Ce qu'est le banner grabbing et son rôle dans la reconnaissance.
- La différence entre approche active et passive.
- Récupérer une bannière avec
nc,curletnmap. - Quels services exposent une bannière (et lesquels résistent).
- Masquer ou réduire les bannières côté serveur.
Qu'est-ce que le banner grabbing ?
Section intitulée « Qu'est-ce que le banner grabbing ? »Quand vous vous connectez à un service réseau, beaucoup se présentent en envoyant une bannière : une chaîne de texte qui annonce le logiciel et souvent sa version. Le banner grabbing consiste à provoquer et lire cette bannière.
C'est une forme de fingerprinting (empreinte) : à partir de Apache 2.4.7, on identifie précisément la version, donc les vulnérabilités connues associées. C'est la phase de reconnaissance du cycle d'une attaque, avant toute exploitation.
L'information est à double tranchant :
- côté offensif, elle oriente vers les CVE exploitables de la version détectée ;
- côté défensif (blue team), elle révèle ce que votre infrastructure divulgue à n'importe quel visiteur.
Actif ou passif ?
Section intitulée « Actif ou passif ? »| Actif | Passif | |
|---|---|---|
| Principe | on se connecte au service | on observe le trafic |
| Outils | nc, curl, nmap | sniffing, Shodan |
| Discrétion | laisse une trace (logs) | indétectable côté cible |
Le banner grabbing actif établit une connexion et déclenche la réponse du service : c'est direct, mais cela apparaît dans les logs de la cible. L'approche passive se contente d'observer le trafic déjà capturé, sans toucher la cible (par exemple via un moteur comme Shodan qui a déjà scanné Internet).
Récupérer une bannière en pratique
Section intitulée « Récupérer une bannière en pratique »Trois outils couvrent l'essentiel. Les sorties ci-dessous proviennent d'un lab réel sur scanme.nmap.org.
Pour les services qui parlent en premier (SSH, FTP, SMTP), une simple connexion suffit :
# Le service envoie sa banniere des la connexionnc scanme.nmap.org 22# SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
echo "" | nc -w3 scanme.nmap.org 22 # -w3 : timeout 3 secondesLe HTTP ne parle pas en premier : il faut une requête. curl -I envoie un HEAD et affiche les en-têtes :
curl -I http://www.kernel.org# server: nginxL'en-tête Server: révèle le serveur web, avec sa version s'il n'est pas durci.
nmap -sV est l'outil de référence : il sonde les ports et déduit la version par signatures, ce qui va au-delà du texte de bannière brut.
nmap -sV scanme.nmap.org# 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (protocol 2.0)# 80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
# Afficher la banniere brute (script NSE banner)nmap -sV --script=banner scanme.nmap.org# |_banner: SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13Quels services exposent une bannière ?
Section intitulée « Quels services exposent une bannière ? »Tous ne se comportent pas pareil. Certains se présentent spontanément, d'autres exigent une requête :
| Service | Port | Bannière |
|---|---|---|
| SSH | 22 | spontanée (SSH-2.0-...) |
| FTP | 21 | spontanée (220 ...) |
| SMTP | 25 / 587 | spontanée (220 ... ESMTP) |
| MySQL | 3306 | handshake avec version |
| HTTP/HTTPS | 80 / 443 | sur requête (en-tête Server:) |
| RDP | 3389 | pas de bannière texte |
Deux cas à retenir :
- Le HTTP ne renvoie rien tant que vous n'envoyez pas une requête : d'où
curl -Iou unHEAD / HTTP/1.0en telnet. - Le RDP ne donne pas de bannière texte lisible : c'est un handshake binaire. On l'énumère avec
nmap -sVet ses scripts NSE, pas avecnc.
Se protéger : masquer les bannières
Section intitulée « Se protéger : masquer les bannières »Côté blue team, on réduit l'information exposée. Voici les réglages courants :
Dans /etc/ssh/sshd_config (Debian/Ubuntu) :
DebianBanner noCela retire le suffixe distribution : SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.4 devient SSH-2.0-OpenSSH_9.6p1. Rechargez avec sudo systemctl reload ssh.
Limite : on ne peut pas masquer le numéro de version OpenSSH lui-même sans recompiler ; le protocole (RFC 4253) impose d'annoncer une partie de la version.
Dans la configuration (nginx) :
server_tokens off;L'en-tête passe de Server: nginx/1.25.3 à Server: nginx (sans version). Masquer totalement le mot « nginx » exige un module tiers (headers-more).
Dans la configuration :
ServerTokens Prod # "Server: Apache" sans version ni OSServerSignature Off # supprime la signature des pages d'erreurAvec mod_headers, on peut même retirer l'en-tête : Header always unset Server.
À retenir
Section intitulée « À retenir »- Le banner grabbing lit la bannière d'un service pour identifier son logiciel et sa version, c'est une phase de reconnaissance.
- Actif = on se connecte (visible dans les logs) ; passif = on observe le trafic.
- Outils :
nc(SSH/FTP/SMTP parlent en premier),curl -I(en-têteServer:HTTP),nmap -sVet--script=banner. nmap -sVdéduit la version par signatures, plus fiable que la bannière brute.- Le HTTP exige une requête, le RDP n'a pas de bannière texte.
- Se durcir :
server_tokens off(nginx),ServerTokens Prod(Apache),DebianBanner no(SSH). Mais c'est de l'obscurité : patcher reste le vrai correctif. - Le banner grabbing actif sans autorisation est illégal ; entraînez-vous sur
scanme.nmap.org.
FAQ : questions fréquentes sur le banner grabbing
Section intitulée « FAQ : questions fréquentes sur le banner grabbing »Lire la signature d'un service
Le banner grabbing est une technique de reconnaissance : on récupère la bannière qu'un service réseau renvoie pour identifier son logiciel et sa version.Exemples réels :- une connexion au port 22 affiche
SSH-2.0-OpenSSH_9.6; - un en-tête HTTP indique
Server: nginx/1.25.3.
nc, curl et nmap
# Services qui parlent en premier (SSH, FTP, SMTP)
nc scanme.nmap.org 22
# SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
# Web : lire l'en-tete Server
curl -I http://www.kernel.org # -> server: nginx
# nmap : detection de version (le standard)
nmap -sV scanme.nmap.org
nmap -sV --script=banner scanme.nmap.org # banniere brute
nc suffit pour SSH, FTP, SMTP qui envoient leur bannière à la connexion. Le web exige une requête, d'où curl -I. nmap -sV est le plus fiable : il déduit la version par signatures, au-delà du texte brut.Se connecter ou observer
| Actif | Passif | |
|---|---|---|
| Principe | on se connecte au service | on observe le trafic |
| Outils | nc, curl, nmap |
sniffing, Shodan |
| Trace | visible dans les logs | indétectable |
Réduire l'information exposée
# nginx : masque la version
server_tokens off;
# Apache
ServerTokens Prod # "Server: Apache" sans version
ServerSignature Off
# SSH (/etc/ssh/sshd_config), Debian/Ubuntu
DebianBanner no # retire le suffixe distribution
Limites : server_tokens off masque la version nginx mais pas le mot « nginx » (besoin du module headers-more) ; la version OpenSSH n'est pas masquable sans recompiler.Surtout : masquer une bannière est de la security through obscurity. Cela ralentit la reconnaissance mais ne corrige rien : le vrai correctif est de patcher.Seulement avec autorisation
Le banner grabbing actif se connecte à un service. Sur un système tiers sans accord, cela peut constituer un accès ou maintien frauduleux dans un système de traitement automatisé de données (article 323-1 du Code pénal en France).Restez dans le cadre légal :- vos propres systèmes ;
- une autorisation écrite (mission de pentest) ;
- la cible de test officielle
scanme.nmap.org, fournie par le projet Nmap pour s'entraîner (dans la limite de quelques scans).