Comment détecter la présence d'un firewall avec Nmap ?

Réponses rédigées par Antoine
Dernière mise à jour : 2018-08-26 11:18:41
Thèmes : linux - reseau - securite - firewall - nmap
Question

Comment faire pour détecter la présence d'un firewall avec Nmap et Linux ?

Réponse

Nmap permet en effet d'obtenir des renseignement sur la présence d'un firewall et beaucoup d'expert en sécurité s'en servent en permanence. Lorsque Nmap scanne un hôte, il ne se contente pas de vous signaler les ports ouverts ou fermés. Il vous indique également les ports qui sont bloqués. La quantité de renseignements produite par un balayage de ports peut en dire très long sur la configuration du firewall.

Un port filtré dans Nmap permet en général de déduire l'une des trois conclusion suivantes :

  • Aucun paquet SYN/ACK n'a été reçu.
  • Aucun paquet RST/ACK n'a été reçu.
  • Un message ICMP de type 3 (destination inaccessible) avec un code 13 (communication interdite par l'administrateur) a été reçu.

Nmap va rassembler ces trois conditions et signaler ce port comme étant "filtré". Par exemple, en balayant un hote vous pourriez recevoir deux paquets ICMP vous signalant que le firewall bloque les ports 23 et 111.

[root@collaborativejob/ opt] # nmap -p20,21,23,53,80,111 -PO -vv
www.exemple.com
Starting nmap V. 7.08 
Initiating TCP connect () scan against (172.32.xxx.xxx)
Adding TCP port 53 (state Open).
Adding TCP port 111 (state firewalled).
Adding TCP port 80 (state open).
Adding TCP port 23 (state firewalled).
Interesting ports on (172.17.xxx.xxx) :

Port State Protocol Service
23 filtered tcp telnet
53 open tcp domain
80 open tcp http
111 filtered tcp sunrpc

Remarque : L'état "firewalled" dans la sortie ci-dessus provient de la réception d'un message ICMP de type 3, code 13 comme l'indique la sortie tcpdump ci-dessous :

172.29.xxx.xxx : icmp : host 172.32.xxx.xxx
nreachable - admin prohibited filter

Comment Nmap s'y prend pour associer ces paquets aux paquets d'origine, notamment s'ils ne représentent qu'un petit nombre de paquets dans un océan de paquets qui transitent sur le réseau ?

En fait, le paquet ICMP renvoyé par l'ordinateur contient toutes les informations nécessaires pour comprendre ce qui ce passe. Le port bloqué est la portion un-octet de l'en-tête ICMP à l'octet 0x41 (1octet), et le firewall de filtrage envoyant le message se trouve dans la portion IP du paquet à l'octet 0x1b (4octets).

Enfin, un port Nmap "non filtré" apparaît uniquement lorsque vous balayez un certain nombre de ports et recevez en retour un paquet RST/ACK. Dans l'état "non filtré", soit le balayage passe par le firewall et le système cible signale alors qu'il n'écoute pas ce port, soit le firewall répond à la place de la cible et mystifie son adresse IP avec la balise RST/ACK.

Par exemple, un balayage d'un système local révèle deux ports non filtrés lorsqu'il reçoit deux paquets RST/ACK du même hôte. Cet événement peut également se produire avec un firewall du type Check Point (avec la règle REJECT) lorsqu'il répond à la place de la cible en renvoyant un paquet RST/ACK et en mystifiant l'adresse IP source de la cible.

[root@collaborativejob sniffers]# nmap -sS -pl-300 172.18.xxx.xxx
Starting nmap V. 7.08 
Interesting ports on (172.18.xxx.xxx) :
(Not showing ports in state : filtered)

Port State Protocol Service
7 unfiltered tcp echo
53 unfiltered tcp domain
256 open tcp rap
257 open tcp set
258 open tcp yak-chat

Nmap run completed -- 1 IP address (1 host up)
scanned in 15 seconds

La trace de paquet tcpdump associée montre les paquets RST/ACK reçus.

Quelles parades ?

Vous pouvez utiliser le code NFR suivant pour détecter les balayages systématiques de ports. Il vous suffit de modifier sa sensibilité à l'aide des variables maxcount (nombre maximum) et maxtime (durée maximale) et de modifier l'enregistreur si nécessaire.

#
# Detect a port scan
#
port_schema = library_schema:new( 1, [ "time", "ip",
"ip", "int" ], scope () ) ;
time = 0 ;
count = 0 ;
maxcount = 2 ;
maxtime = 5 ;
port = 0 ;
target = 0 ;

filter porscan ip ( )
{
if (tcp.is)
{
if (byte(ip.blob, 13) == 20 )
{
count = count +1 ;
source = ip.dest ;
target = ip.source ;
port = tcp.sport ;
time = system.time ;
}
}
on tick = timeout (sec : mawtime, repeat ) call checkcount ;
}
func checkcount
{
if (count >= maxcount)
{
echo ("port scan occuring, time : ", time, "\n" ) ;
record system.time, source, target, port to the_recorder_portscan ;
count = 0 ;
}
else
count = 0 ;
}
the_recorder_portscan = recorder ( "bin/histogram^packages/sandbox/portscan.cfg",
"port_schema" ) ;

Pour empêcher des hackers de recenser les listes ACL de routeur et de firewall, vous pouvez désactiver la capacité de votre routeur à répondre avec un paquet ICMP de type 13 avec la commande suivante :

no ip unreachables