HSC
Cabinet de consultants en sécurité informatique depuis 1989 - Spécialisé sur Unix, Windows, TCP/IP et Internet
Mode texte : accès au contenu de la page
Hervé Schauer Consultants
Vous êtes ici : Accueil > Ressources > Brèves > lister les ports ouverts sous Unix
Accéder au : Site HSC des formations
Télécharger le catalogue des formations
Recherche :  
English version
   Services   
o Domaines de compétences
o Conseil & Expertise
o Prestations ISO 27001
o Audit & Évaluation
o Tests d'intrusion
o Tests de vulnérabilités (TSAR)
o Analyse Forensique
o Certification ARJEL
o Formations
o E-learning
   Conférences   
o Agenda
o Interventions passées
o Tutoriels
   Ressources   
o Index thématique
o Brèves
o Présentations
o Cours
o Articles
o Outils (téléchargement)
o Veille en vulnérabilité
   Société   
o Hervé Schauer
o Equipe
o Offres d'emploi
o Références
o Historique
o Partenariats
o Associations
   Presse et
 communication
 
 
o Newsletter HSC
o Bulletin juridique HSC
o Revue de presse
o Communiqués de presse
o Publications
   Contacts   
o Coordonnées
o Requêtes particulières
o Accès à nos locaux
o Hôtels proches de nos locaux
|>|lister les ports ouverts sous Unix  

par Denis Ducamp (23/04/2001)



Cet article a pour but de montrer comment sur un système Unix déterminer
quels sont les ports ouverts ainsi que le processus lié à chacun d'eux.

Les deux commandes à connaître sont netstat et lsof. netstat est une
commande standard sous Unix alors que lsof est un programme complémentaire à
récupérer sur ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/

De façon standard la commande netstat permet d'obtenir de nombreux
paramètres à propos des connexions réseau, des tables de routage, des
statistiques des interfaces, etc. Le paramètre -a affiche la liste complète
des sockets dont les sockets en écoute par les serveurs. Pour se limiter aux
sockets TCP et UDP, il est possible de rajouter respectivement les
paramètres -t ou -u . Il faut maintenant savoir comment interpréter la
sortie de la commande netstat, en voici un exemple :

$ netstat -antu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 192.168.66.66:22        192.168.66.66:3812      ESTABLISHED 
tcp        0      0 192.168.66.66:3812      192.168.66.66:22        ESTABLISHED 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      
udp        0      0 192.168.66.66:123       0.0.0.0:*                           
udp        0      0 127.0.0.1:123           0.0.0.0:*                           
udp        0      0 0.0.0.0:123             0.0.0.0:*                           

Cette exemple montre des ports ouverts en TCP et UDP (première colonne).
Pour les ports TCP, un port ouvert est montré par une valeur "0.0.0.0:*"
dans la colonne "Foreign Address" et une valeur "LISTEN" dans la colonne
State. Pour les ports UDP, un port ouvert est montré par une valeur
"0.0.0.0:*" dans la colonne "Foreign Address".

Ainsi sur ce système, les ports 22 et 25 sont ouverts en TCP et seul le port
123 l'est en UDP. Il est à remarquer ici que sur le port 123 en UDP,
l'écoute est limitée aux adresses 192.168.66.66 et 127.0.0.1 . Au contraire
pour le port 22 en TCP, l'écoute est effectuée sur toutes les adresses du
système (0.0.0.0) ce qui signifie que si des adresses sont ajoutées au
système alors elles répondront également sur ce port.

Pour un port donné, il est possible que ce soit deux processus différents ou
un même processus qui écoutent sur des adresses différentes. Il n'est bien
sûr pas possible que deux processus écoutent sur la même adresse et le même
port.

La sortie de netstat montre également les connexions en cours : aussi bien
pour les connexions TCP et UDP, la colonne "State" a pour valeur ESTABLISHED
et la colonne "Foreign Address" l'adresse et le port de la machine distante.
Malheureusement il n'est pas évident de déterminer le sens de la connexion,
c'est à dire de dire de façon certaine qui est le client et qui est le
serveur.

Certaines connexions peuvent être dans des modes différents tel que
CLOSE_WAIT et TIME_WAIT pour les connexions en cours de fermeture et
SYN_SENT pour les connexions en cours d'ouverture. Il existe bien d'autres
états, un pour chaque état TCP.

Avec certaines versions de netstat, l'option -p permet d'obtenir le numéro
et le nom du processus auquel l'adresse locale est associée :

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      142/sshd
tcp        0      0 192.168.66.66:22        192.168.66.66:3812      ESTABLISHED 3481/sshd
tcp        0      0 192.168.66.66:3812      192.168.66.66:22        ESTABLISHED 3480/ssh

Dans l'exemple ci dessus, le programme nommé sshd et de pid 142 écoute sur
le port 22 de toutes les adresses du système.

Le programme nommé sshd et de pid 3481 possède du côté local de sa connexion
le port 22 alors que la partie distante a pour adresse IP 192.168.66.66 et
pour port 3812. Le programme nommé ssh et de pid 3480 possède du côté local
de sa connexion le port 3812 alors que la partie distante a pour adresse IP
192.168.66.66 et pour port 22.

La commande lsof, capable de lister tous les fichiers ouverts par tous les
processus, peut être utilisée pour connaître les ports ouverts et identifier
leurs propriétaires. L'option nécessaire est -i qui permet de n'afficher que
les fichiers de type Internet :

# lsof -ni
COMMAND   PID   USER   FD   TYPE DEVICE SIZE NODE NAME
sshd      142   root    3u  IPv4    110       TCP *:ssh (LISTEN)
master    227   root    9u  IPv4    199       TCP *:smtp (LISTEN)
xntpd    3726   root    4u  IPv4  94391       UDP *:ntp
xntpd    3726   root    5u  IPv4  94392       UDP 127.0.0.1:ntp
xntpd    3726   root    6u  IPv4  94393       UDP 192.168.66.66:ntp
ssh      3480 ducamp    3u  IPv4  94139       TCP 192.168.66.66:3812->192.168.66.66:ssh (ESTABLISHED)
sshd     3481   root    4u  IPv4  94140       TCP 192.168.66.66:ssh->192.168.66.66:3812 (ESTABLISHED)

Ici également il est possible de voir les types de sockets, TCP ou UDP, dans
la colonne NODE puis l'adresse et le port d'écoute dans la colonne NAME. Les
lignes correspondant à des connexions en cours sont affichées avec une
flèche "->" séparant les adresses et ports sources et destinations. Les
ports en écoute n'ont pas de flèche et ne comportent qu'une adresse et un
port. Dans ce dernier cas, l'adresse peut être une étoile si le processus
écoute sur toutes les adresses simultanément.

Il est possible de demander à lsof de n'afficher qu'un port donné, par
exemple :

# lsof -ni tcp:22
COMMAND  PID   USER   FD   TYPE DEVICE SIZE NODE NAME
sshd     142   root    3u  IPv4    110       TCP *:ssh (LISTEN)
ssh     3480 ducamp    3u  IPv4  94139       TCP 192.168.66.66:3812->192.168.66.66:ssh (ESTABLISHED)
sshd    3481   root    4u  IPv4  94140       TCP 192.168.66.66:ssh->192.168.66.66:3812 (ESTABLISHED)

ainsi que de spécifier une adresse IP :

# lsof -ni 'udp@192.168.66.66:123'
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
xntpd   3726 root    6u  IPv4  94393       UDP 192.168.66.66:ntp

Il existe également d'autres commandes permettant d'obtenir les mêmes
résultats comme fstat et sockstat sous FreeBSD et fuser sous Linux, mais
lsof par ses capacités entendues reste l'outil de choix pour effectuer ce
genre de travail, d'autant plus qu'il fonctionne sur de très nombreux
systèmes.



Dernière modification le 12 novembre 2003 à 13:55:00 CET - webmaster@hsc.fr
Mentions légales - Informations sur ce serveur - © 1989-2013 Hervé Schauer Consultants