Techniques de scan de ports
Comme un débutant tâchant d'effectuer une réparation automobile, je peux me battre pendant des heures en essayant d'utiliser convenablement mes rudimentaires outils (marteau, clefs, etc.) pour la tâche à laquelle je me suis attablé. Une fois que j'ai lamentablement échoué et que j'ai fait remorquer ma guimbarde par un vrai mécanicien, à chaque fois il farfouille dans sa grosse caisse à outils pour y trouver le parfait bidule qui, d'un coup de cuillère à pot, répare le truc. L'art du scan de port, c'est la même chose. Les experts connaissent des douzaines de techniques de scan et choisissent la bonne (ou une combinaison) pour une tâche donnée. D'un autre côté, les utilisateurs inexpérimentés et les script kiddies essaient de tout résoudre avec le scan SYN par défaut. Comme Nmap est gratuit, la seule barrière à franchir pour atteindre la maîtrise du scan est la connaissance. C'est bien mieux que l'automobile, où il faut une grande expérience pour déterminer que vous avez besoin d'une plieuse à tablier hydraulique, mais où quand bien même il faut encore payer des centaines d'euros pour en disposer.
La plupart des types de scans ne sont disponibles que pour les utilisateurs privilégiés. Ceci est dû au fait qu'ils émettent et reçoivent des paquets bruts (raw), qui nécessitent les droits root sur les systèmes UNIX. L'utilisation d'un compte administrateur est conseillé sous Windows, bien que Nmap puisse fonctionner avec des utilisateurs non-privilégiés si WinPcap est déjà chargé avec l'OS. Ce besoin des droits root était une sérieuse restriction quand Nmap a été diffusé en 1997, car beaucoup d'utilisateurs avaient seulement accès à des comptes Internet partagés. Maintenant, le monde est différent. Les ordinateurs sont moins chers, bien plus de gens disposent d'un accès 24/24 direct à Internet et les systèmes UNIX de bureau (comme Linux et Mac OS X) sont répandus. Une version Windows de Nmap est désormais disponible, permettant ainsi de le lancer sur encore plus de machines. Pour toutes ces raisons, les utilisateurs ont bien moins besoin de lancer Nmap depuis des comptes Internet limités. Ceci est heureux, car les options privilégiés rendent Nmap bien plus puissant et flexible.
Si Nmap essaie de produire des résultats précis, il faut garder à l'esprit que toute sa perspicacité est basée sur les paquets renvoyés par les machines cibles (ou les pare-feux qui les protègent). De tels hôtes ne sont pas toujours dignes de confiance et peuvent répondre dans le but de d'induire Nmap en erreur. Les hôtes qui ne respectent pas les RFCs et ne répondent pas comme ils devraient sont encore plus courants. Les scans FIN, Null et Xmas sont les plus sensibles à ce problème. Ces points sont spécifiques à certains types de scan et sont donc abordés dans leur section propre de la documentation.
Cette section documente la douzaine de techniques de scan de ports gérées par Nmap. Les méthodes ne peuvent pas être utilisés simultanément, excepté le scan UDP (-sU
) qui peut être combiné avec chacun des types de scan TCP. A titre d'aide mémoire, les options de type de scan sont de la forme -s
, où <C>
<C>
est un caractère prépondérant dans le nom du scan, souvent le premier. La seule exception est le désuet scan par rebond FTP (-b
). Par défaut, Nmap effectue un scan SYN, bien qu'il y substitue un scan connect() si l'utilisateur ne dispose pas des droits suffisants pour envoyer des paquets bruts (qui requièrent les droits root sous UNIX) ou si des cibles IPv6 sont spécifiées. Des scans listés dans cette section, les utilisateurs non-privilégiés peuvent seulement exécuter les scans connect() et le scan par rebond FTP.
-
-sS
(Scan TCP SYN) Le scan SYN est celui par défaut et le plus populaire pour de bonnes raisons. Il peut être exécuté rapidement et scanner des milliers de ports par seconde sur un réseau rapide lorsqu'il n'est pas entravé par des pare-feux. Le scan SYN est relativement discret et furtif, vu qu'il ne termine jamais les connexions TCP. Il marche également contre toute pile respectant TCP, au lieu de dépendre des particularités environnementales spécifiques comme les scans Fin/Null/Xmas, Maimon ou Idle le sont. Il permet de plus une différentiation fiable entre les états
ouvert
,fermé
etfiltré
.Cette technique est souvent appelée le scan demi-ouvert (half-open scanning), car il n'établi pas pleinement la connexion TCP. Il envoie un paquet SYN et attend sa réponse, comme s'il voulait vraiment ouvrir une connexion. Une réponse SYN/ACK indique que le port est en écoute (ouvert), tandis qu'une RST (reset) indique le contraire. Si aucune réponse n'est reçue après plusieurs essais, le port est considéré comme étant filtré. Le port l'est également si un message d'erreur « unreachable ICMP (type 3, code 1,2, 3, 9, 10 ou 13) » est reçu.
-
-sT
(Scan TCP connect()) Le scan TCP connect() est le type de scan par défaut quand le SYN n'est pas utilisable. Tel est le cas lorsque l'utilisateur n'a pas les privilèges pour les paquets bruts (raw packets) ou lors d'un scan de réseaux IPv6. Plutôt que d'écrire des paquets bruts comme le font la plupart des autres types de scan, Nmap demande au système d'exploitation qui l'exécute d'établir une connexion au port de la machine cible grâce à l'appel système
connect()
. C'est le même appel système haut-niveau qui est appelé par les navigateurs Web, les clients P2P et la plupart des applications réseaux qui veulent établir une connexion. Cet appel fait partie de l'interface d'application connue sous le nom de « Berkeley Sockets API ». Au lieu de lire les réponses brutes sur le support physique, Nmap utilise cette application API pour obtenir l'état de chaque tentative de connexion.Si le scan SYN est disponible, il vaut mieux l'utiliser. Nmap a bien moins de contrôles sur l'appel système haut niveau
connect()
que sur les paquets bruts, ce qui le rend moins efficace. L'appel système complète les connexions ouvertes sur les ports cibles au lieu de les annuler lorsque la connexion est à demie ouverte, comme le fait le scan SYN. Non seulement c'est plus long et demande plus de paquets pour obtenir la même information, mais de plus la probabilité que les cibles activent la connexion est plus grande. Un IDS décent le fera, mais la plupart des machines ne disposent pas de ce système d'alarme. De nombreux services sur les systèmes UNIX standards noteront cette connexion dans le journal, accompagné d'un message d'erreur sibyllin si Nmap ouvre puis referme la connexion sans n'envoyer aucune donnée. Les services réseaux les plus piteux risquent même de tomber en panne, mais c'est assez rare. Un administrateur qui verrait un tas de tentatives de connexions dans ses journaux en provenance d'une seule machine devrait se rendre compte qu'il a été scanné.-
-sU
(Scan UDP) Même si les services les plus connus d'Internet son basés sur le protocole TCP, les services UDP sont aussi largement utilisés. DNS, SNMP ou DHCP (ports 53, 161/162 et 67/68) sont les trois exemples les plus courants. Comme le scan UDP est généralement plus lent et plus difficile que TCP, certains auditeurs de sécurité les ignorent. C'est une erreur, car les services UDP exploitables sont courants et les attaquants eux ne les ignoreront pas. Par chance, Nmap peut aider à répertorier les ports UDP.
Le scan UDP est activé avec l'option
-sU
. Il peut être combiné avec un scan TCP, comme le scan SYN (-sS
), pour vérifier les deux protocoles lors de la même exécution de Nmap.Le scan UDP envoie un en-tête UDP (sans données) à chaque port visé. Si un message ICMP « port unreachable (type 3, code 3) » est renvoyé, le port est alors
fermé
. Les autres messages d'erreur « unreachable ICMP (type 3, codes 1, 2, 9, 10, or 13) » rendront le portfiltré
. À l'occasion, il arrive qu'un service répond par un paquet UDP, prouvant que le port est dans l'étatouvert
. Si aucune réponse n'est renvoyée après plusieurs essais, le port est considéré comme étantouvert|filtré
. Cela signifie que le port peut être soit ouvert, soit qu'un dispositif de filtrage bloque les communications. Le scan de versions (-sV
) peut être utilisé pour différencier les ports ouverts de ceux filtrés.Une des grandes difficultés avec le scan UDP est de l'exécuter rapidement. Les ports ouverts et filtrés ne renvoient que rarement des réponses, laissant Nmap expirer son délai de retransmission au cas où les paquets se soient perdus. Les ports fermés posent encore un plus grand problème: ils renvoient normalement une erreur ICMP « port unreachable ». Mais à la différence des paquets RST renvoyés par les ports TCP fermés en réponse à un scan SYN ou à un connect(), de nombreux hôtes limitent par défaut la cadence d'émission de ces messages. Linux et Solaris étant particulièrement stricts à ce sujet. Par exemple, le kernel 2.4.20 limite cette cadence des destinations inaccessibles (« destination unreachable ») à un par seconde (cf.
net/ipv4/icmp.c
).Nmap détecte cette limitation de fréquence et s'y ralenti conformément afin d'éviter de saturer le réseau avec des paquets inutiles que la machine cible rejettera. Malheureusement, une limitation à la Linux d'un paquet par seconde fera qu'un scan des 65 536 ports prendra plus de 18 heures. Les idées pour accélérer les scans UDP incluent le scan des cibles en parallèle, ne scanner que les ports les plus courants en premier, scanner derrière le pare-feu et utiliser l'option
--host-timeout
pour éviter les hôtes les plus lents.-
-sN
;-sF
;-sX
(Scans TCP Null, FIN et Xmas) Ces trois types de scans (d'autres sont possibles en utilisant l'option
--scanflags
décrite dans la section suivante) exploitent une subtile faille de la RFC TCP pour différencier les ports entreouverts
etfermés
. La page 65 indique que « si le port [de destination] est dans l'état fermé... un segment ne contenant pas le drapeau RST provoque l'émission d'un paquet RST comme réponse. ». La page suivante indique que pour les paquets envoyés à des ports sans aucun des drapeaux SYN, RST ou ACK activés: « il est peut vraisemblable que cela arrive, mais si cela est le cas, il faut rejeter le segment. »Pour les systèmes respectant ce texte de la RFC, chaque paquet ne contenant ni SYN, ni RST, ni ACK se voit renvoyé un RST si le port est fermé et aucune réponse si le port est ouvert. Tant qu'aucun de ces drapeaux n'est utilisé, toute combinaison des trois autres (FIN, PSH et URG) son valides. Nmap exploite cela avec les trois types de scans:
- Scan Null (
-sN
) N'active aucun des bits (les drapeaux de l'en-tête TCP vaut 0).
- Scan FIN (
-sF
) N'active que le bit FIN.
- Scan Xmas (
-sX
) Active les drapeaux FIN, PSH et URG, illuminant le paquet comme un arbre de Noël (NDT: la fracture cognitive entre la culture anglo-saxonne et française se ressent fortement dans cette traduction...).
Ces trois types de scan ont exactement le même comportement, sauf pour les drapeaux TCP utilisés dans des paquets de tests (probes packets). Si un RST est reçu, le port est considéré comme étant
fermé
, tandis qu'une absence de réponse signifiera qu'il est dans l'étatouvert|filtré
. Le port est marqué commefiltré
si un message d'erreur ICMP « unreachable (type 3, code 1, 2, 3, 9, 10 ou 13) » est reçu.L'avantage principal de ces types de scans est qu'ils peuvent furtivement traverser certains pare-feux ou routeurs filtrants sans état de connexion (non-statefull). Un autre avantage est qu'ils sont même un peu plus furtifs que le scan SYN. N'y comptez pas trop dessus cependant -- la plupart des IDS modernes sont configurés pour les détecter. L'inconvénient majeur est que tous les systèmes ne respectent pas la RFC 793 à la lettre. Plusieurs systèmes renvoient des RST aux paquets quelque soit l'état du port de destination, qu'il soit ouvert ou pas. Ceci fait que tous les ports sont considérés comme
fermé
. Les plus connus des systèmes qui ont ce comportement sont Microsoft Windows, plusieurs équipements Cisco, BSDI et IBM OS/400. Ce type de scan fonctionne cependant très bien contre la plupart des systèmes basés sur UNIX. Un autre désagrément de ce type de scan et qu'ils ne peuvent pas distinguer les portsouverts
de certains autres qui sontfiltrés
, vous laissant face à un laconiqueouvert|filtré
.- Scan Null (
-
-sA
(Scan TCP ACK) Ce type de scan est différent des autres abordés jusqu'ici, dans le sens où ils ne peuvent pas déterminer si un port est
ouvert
(ni mêmeouvert|filtré
). Il est utilisé pour établir les règles des pare-feux, déterminant s'ils sont avec ou sans états (statefull/stateless) et quels ports sont filtrés.Le scan ACK n'active que le drapeau ACK des paquets (à moins que vous n'utilisiez l'option
--scanflags
). Les systèmes non-filtrés réagissent en retournant un paquet RST. Nmap considère alors le port commenon-filtré
, signifiant qu'il est accessible avec un paquet ACK, mais sans savoir s'il est réellementouvert
oufermé
. Les ports qui ne répondent pas ou renvoient certains messages d'erreur ICMP (type 3, code 1, 2, 3, 9, 10, ou 13), sont considérés commefiltrés
.-
-sW
(Scan de fenêtre TCP) Le scan de fenêtre TCP est exactement le même que le scan ACK à la différence près qu'il exploite un détail de l'implémentation de certains systèmes pour identifier les ports fermés des autres, au lieu de toujours afficher
non-filtré
lorsqu'un RST est renvoyé. Sur certains systèmes, les ports ouverts utilisent une taille de fenêtre TCP positive (même pour les paquets RST), tandis que les ports fermés ont une fenêtre de taille nulle. Ainsi, au lieu de toujours affichernon-filtré
lorsqu'un RST est reçu, le scan de fenêtre indique que le port estouvert
oufermé
selon que la taille de fenêtre TCP de ce paquet RST est respectivement positive ou nulle.Ce scan repose sur un détail d'implémentation d'une minorité de systèmes Internet, vous ne pouvez donc pas toujours vous y fier. Les systèmes qui ne le supportent pas vont certainement se voir considérés leurs ports comme
fermés
. Bien sûr, il se peut que la machine n'ait effectivement aucun port ouvert. Si la plupart des ports scannés sontfermés
mais que quelques-uns courants, comme le 22, 25 ou le 53, sontfiltrés
, le système est vraisemblablement prédisposé à ce type de scan. Quelquefois, les systèmes ont le comportement exactement inverse. Si votre scan indique que 1 000 ports sont ouverts et que 3 seulement sont fermés ou filtrés, ces trois derniers sont certainement ceux qui sont ouverts.-
-sM
(Scan TCP Maimon) Le scan Maimon est nommé ainsi d'après celui qui l'a découvert, Uriel Maimon. Il a décrit cette technique dans le numéro 49 de Phrack Magazine (Novembre 1996). Nmap, qui inclut cette technique, a été publié deux numéros plus tard. Cette technique est la même que les scans NUll, FIN et Xmas, à la différence près que le paquet de test est ici un FIN/ACK. Conformément à la RFC 793 (TCP), un paquet RST devrait être renvoyé comme réponse à un tel paquet, et ce, que le port soit ouvert ou non. Uriel a cependant remarqué que de nombreux systèmes basés sur BSD rejettent tout bonnement le paquet si le port est ouvert.
-
--scanflags
(Scan TCP personnalisé) Les utilisateurs réellement experts de Nmap ne veulent pas se limiter aux seuls types de scans proposés. L'option
--scanflags
vous permet de créer votre propre type de scan en spécifiant vos propres combinaisons de drapeaux TCP. Laisser courir votre imagination, tout en contournant les systèmes de détection d'intrusion dont les vendeurs n'ont fait qu'ajouter des règles spécifiques d'après la documentation Nmap!L'argument de l'option
--scanflags
peut être soit un nombre comme 9 (PSH et FIN), mais l'utilisation des noms symboliques est plus facile. Mélanger simplement les drapeauxURG
,ACK
,PSH
,RST
,SYN
etFIN
. Par exemple,--scanflags URGACKPSHRSTSYNFIN
les activent tous, bien que cela ne soit pas très utile pour effectuer un scan. L'ordre dans lequel les drapeaux sont spécifiés n'a pas d'importance.En sus de la spécification des drapeaux désirés, vous pouvez spécifier également un type de scan TCP (comme
-sA
ou-sF
). Ce type de scan de base indique à Nmap comment interpréter les réponses. Par exemple, un scan SYN considère que l'absence de réponse indique qu'un port estfiltré
, tandis qu'un scan FIN considèrera la même absence comme un portouvert|filtré
. Nmap se comportera de la même façon que le type de scan de base, à la différence près qu'il utilisera les drapeaux TCP que vous avez spécifié à la place. Si vous n'en spécifiez pas, le type de scan SYN par défaut sera utilisé.-
-sI <zombie host[:probeport]>
(Scan passif -- idlescan) Cette méthode de scan avancé permet de faire un véritable scan de port TCP en aveugle, (dans le sens où aucun paquet n'est envoyé directement à la cible depuis votre vraie adresse IP). En effet, la technique employée consiste à récolter des informations sur les ports ouverts de la cible en utilisant un exploit basé sur la prédictibilité de la génération des identifiants de fragmentation IP de l'hôte relais (le zombie). Les systèmes IDS considéreront que le scan provient de la machine zombie que vous avez spécifié (qui doit remplir certains critères). Le mécanisme de cette incroyable technique est trop complexe pour être expliqué en détail dans ce guide; un papier informel a été posté pour rendre compte de tous ces détails:
https://nmap.org/book/idlescan.html
.En plus de son incroyable furtivité (en raison du caractère aveugle de la technique), ce type de scan permet de déterminer les relations de confiance entre les machines. La liste des ports ouverts est établie du point de vue de l'hôte zombie. Ainsi, vous pouvez essayer de scanner une cible en utilisant différents zombies pour lesquels vous pensez qu'il existe une relation de confiance entre eux et la cible (d'après les règles des dispositifs de filtrage).
Vous pouvez ajouter les deux points (:) suivis d'un numéro de port de l'hôte zombie si vous souhaitez tester les changements d'identifiants IP sur un port particulier du zombie. Par défaut, Nmap utilisera le port utilisé pour les pings tcp (le port 80).
-
-sO
(Scan du protocole IP) Le scan du protocole IP permet de déterminer quels protocoles IP (TCP, ICMP, IGMP, etc.) sont supportés par les cibles. Ce n'est donc pas techniquement un scan de ports, car Nmap essaie les différents numéros de protocoles IP à la place des numéros de ports TCP ou UDP. Ce scan permet néanmoins d'utiliser l'option
-p
pour sélectionner les numéros de protocoles à scanner -- le rapport de Nmap étant toujours dans le style habituel des tables de ports -- et utilise le même moteur de scan utilisé pour le scan de ports. Ainsi, cette technique est suffisamment proche du scan de port pour être présenté ici.Au delà de son intérêt propre, le scan de protocoles illustre la puissance des logiciels en libre accès. L'idée de base est assez simple: je n'avais même pas particulièrement pensé à l'ajouter ni reçu de requête me demandant une telle fonctionnalité. En fait, à l'été 2000, Gerhard Rieger a eu cette idée et a écrit un excellent programme de correction pour l'implanter; il l'a ensuite envoyé à la liste de distribution nmap-hackers. Je l'ai par la suite ajouté à l'arbre de développement de Nmap et j'ai publié la nouvelle version le lendemain même. Très peu de logiciels commerciaux peuvent se targuer d'avoir des utilisateurs si enthousiastes concevant et proposant leur propres améliorations!
Le scan de protocole fonctionne d'une façon similaire du scan UDP. Au lieu de parcourir les champs de numéro de port des paquets UDP, il envoie des paquets d'en-têtes IP et parcours les 8 bits du champ protocole IP. Les en-têtes son généralement vides, ne contenant pas de données ni même l'en-tête du protocole sollicité. Les trois seules exceptions étant TCP, UDP et ICMP. Un en-tête exact de ces protocoles est inclus, sinon certains systèmes refusent de les émettre et Nmap dispose déjà des fonctions permettant de construire ces en-têtes. Au lieu de scruter les messages ICMP « port unreachable », comme pour le scan UDP, le scan de protocole attend de recevoir les messages ICMP «protocolunreachable ». Dès que Nmap reçoit une réponse d'un protocole en provenance de la cible, Nmap considère ce protocole comme
ouvert
. Une erreur ICMP « protocol unreachable » (type 3, code 2) fait en sorte que le port est considéré comme étantfermé
. Les autres messages d'erreur ICMP « unreachable (type 3, code 1, 3, 9, 10, or 13) » font en sorte que le port est considéré comme étantfiltré
(tout en prouvant que le protocole ICMP est quant à luiouvert
). Si aucune réponse n'est reçue après plusieurs transmissions, le protocole est considéré comme étantouvert|filtré
.-
-b <ftp relay host>
(Scan par rebond FTP) Une caractéristique intéressante du protocole FTP (RFC 959) est qu'il supporte les connexions par proxy ftp (proxy ftp connections, ainsi nommées dans la RFC). Ceci permet à un utilisateur de se connecter à un serveur FTP, puis de demander qu'un fichier soit envoyé à un tiers serveur FTP. Une telle fonctionnalité est propre à être détournée à tous les niveaux, c'est pourquoi la plupart des serveurs ont cessé de la supporter. Un des détournements possible de cette caractéristique conduit le serveur FTP à scanner les ports d'autres hôtes. Demandez simplement au serveur FTP d'envoyer un fichier à chaque port intéressant de votre cible, et il se chargera d'effectuer le scan. Le message d'erreur permettra de savoir si le port est ouvert ou non. C'est un très bon moyen de contourner les pare-feux car les serveurs FTP des organisations sont souvent situés de telle façon à avoir plus d'accès aux hôtes du réseau internes que toute autre machine Internet. Nmap supporte le scan par rebond FTP avec l'option
-b
. Cette option prend un argument du type<username>
:<password>
@<server>
:<port>
.<Server>
est le nom ou l'adresse IP d'un serveur FTP vulnérable. Comme pour une adresse URL traditionnelle, vous pouvez omettre<username>
:<password>
, (user:anonymous
, password:-wwwuser@
) pour accéder de manière anonyme. Le numéro de port (et les deux points) peuvent être également omis si le port FTP par défaut (21) est utilisé par le serveur<server>
.Cette vulnérabilité était très répandue en 1997 quand Nmap a été publié mais a largement été corrigée depuis. Il existe encore quelques serveurs vulnérables qui traînent, autant les essayer si rien d'autre ne marche (!!!). Si votre but est de contourner un pare-feu, scannez le réseau cible pour trouver un port 21 ouvert (ou un serveur FTP sur tout autre port en activant la détection de version), essayez ensuite pour chacun d'entre eux le scan par rebond FTP. Nmap vous indiquera si chaque hôte y est vulnérable ou pas. Si vous voulez juste essayer de masquer vos attaques, vous n'avez pas besoin (et même en fait, vous ne devriez pas) vous limiter aux hôtes du réseau cible. Avant de vous lancer dans un scan sur des adresses Internet au hasard, à la recherche de serveurs FTP vulnérables, pensez bien que les gestionnaires des systèmes n'apprécieront pas trop que vous détourniez leurs serveurs à cet effet.