Comment lister les ports d’écoute avec Netstat et PowerShell ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment utiliser Netstat et PowerShell pour lister les ports d'écoute actifs sur une machine Windows, ce qui permet de voir les ports ouverts sur une machine.
En plus des ports sur lesquels écoute notre machine Windows, nous verrons également comment voir les connexions actives et établies entre notre machine locale et un hôte distant.
Pour rappel, un port d'écoute correspond à un port sur lequel un serveur (ou un poste de travail) est en attente de connexion de la part d'un hôte distant. Par exemple, un serveur DNS sera en écoute sur le port 53, car il attend que les clients lui envoient des requêtes DNS sur ce port, ce dernier étant associé au protocole DNS. Le port d'écoute représente un point d'entrée, un moyen d'établir un point de connexion avec l'hôte en écoute.
II. Lister les ports d'écoute avec Netstat
Pour commencer, je vais vous parler de l'outil Netstat, ce dernier étant présent depuis très longtemps sur Windows, il reste aujourd'hui incontournable lorsqu'il s'agit de regarder les connexions TCP actives d'une machine Windows ou de voir les ports d'écoute.
Tout d'abord, à partir d'une console PowerShell ou d'une console Invite de commande, exécutez la commande suivante :
netstat -a
L'option "-a" permet d'afficher toutes les connexions et tous les ports d'écoute comme le spécifie l'aide Netstat. Sans cette option, la commande retourne seulement les connexions actives. D'ailleurs, vous pouvez consulter l'aide de Netstat avec la commande suivante :
netstat /?
Voici un extrait de ce que j'obtiens sur mon serveur contrôleur de domaine :
Cette commande retourne plusieurs colonnes : Proto, Adresse locale, Adresse distante et Etat. Quelques précisions sur la signification de ces quatre colonnes.
- Proto
Spécifie le type de protocole utilisé entre TCP et UDP.
- Adresse locale
Spécifie l'adresse locale utilisée pour écouter ou pour établir la connexion. Lorsque c'est précisé "0.0.0.0" cela signifie que c'est toutes les adresses IP du serveur local, donc autrement dit il écoute sur toutes ces interfaces pour le port spécifié après "0.0.0.0". Si l'adresse IP est spécifiée, comme par exemple "192.168.100.11:53" cela signifie que le serveur DNS (= port 53) de mon serveur est en écoute sur cette adresse IP.
- Adresse distante
Spécifie l'adresse IP de l'hôte distant avec lequel notre serveur local a établi la connexion. Lorsqu'il s'agit d'une ligne avec un port d'écoute, l'adresse distante sera le nom du serveur local. C'est pour cette raison que l'on retrouve "SRV-ADDS-01" sur les premières lignes. Dans le cas où une connexion est établie, l'adresse IP de l'hôte distant est indiquée, ou alors le nom d'hôte s'il s'agit d'un hôte connu.
- Etat
Spécifie l'état de la connexion. Lorsque c'est précisé "LISTENING" cela signifie que le serveur écoute sur le port spécifié au sein du champ "Adresse locale". Lorsque ce champ prend la valeur "ESTABLISHED", cela signifie que la connexion est établie. D'autres valeurs sont possibles, car il y a de nombreux états possibles sur une connexion TCP.
Par exemple, la ligne ci-dessous me permet de savoir que mon serveur écoute sur le port 3389/TCP. Puisque ce port correspond au protocole RDP pour le Bureau à distance, on peut en déduire que cet hôte est accessible via RDP.
TCP 0.0.0.0:3389 SRV-ADDS-01:0 LISTENING
Si vous avez été suffisamment attentif sur la première sortie de la commande, vous pouvez voir que certains numéros de port sont remplacés par des noms de protocoles. Par exemple, pour le port "443" c'est indiqué directement "https". Il en est de même dans certains cas par l'adresse IP remplacée par le nom d'hôte.
TCP 192.168.100.11:59548 65.52.250.250:https ESTABLISHED
Si vous préférez afficher que des informations numériques (numéro de port et adresse IP), il suffit d'ajouter l'option "-n", comme ceci lorsque c'est combiné avec une autre option comme "-a" :
netstat -an
Voici un exemple où vous pouvez constater que des valeurs numériques pour les colonnes "Adresse locale" et "Adresse distante".
Avec Netstat, on ne peut pas filtrer directement sur l'état de la connexion ; c'est dommage. Si l'on veut seulement voir les ports d'écoute, c'est-à-dire les lignes avec l'état "LISTENING", il faut que l'on filtre la sortie avec findstr pour rechercher le mot clé "LISTENING".
Ainsi, pour afficher tous les ports d'écoute via Netstat, on utilisera la commande suivante :
netstat -a | findstr LISTENING
Voilà pour cette introduction à Netstat, désormais passons à PowerShell.
III. Lister les ports d'écoute avec PowerShell (Get-NetTCPConnection)
Depuis quelques années, Netstat a un concurrent de poids : PowerShell. En effet, le langage PowerShell dispose de cmdlet capable de lister les connexions actives et les ports d'écoute, alors forcément, je devais vous en parler.
Le cmdlet qui nous intéresse tout particulièrement se nomme "Get-NetTCPConnection". Ce qui est cool, c'est que l'on peut tirer profit de la puissance pour PowerShell pour filtrer les résultats retournés par la commande.
Il faut savoir que même si ce cmdlet se nomme "Get-NetTCPConnection", il retourne à la fois informations pour les protocoles TCP et UDP, comme Netstat.
Commencez par exécuter cette commande sans paramètre :
Get-NetTCPConnection
Même si les noms de colonnes sont différents, on retrouve globalement les mêmes informations qu'avec Netstat. Contrairement à Netstat, les adresses IP et les numéros de ports sont associés à des colonnes distinctes : une bonne nouvelle pour appliquer des filtres.
La colonne "OwningProcess" indique l'ID du processus qui est à l'origine de cette connexion, ce qui est une information intéressante. Cette information, on aurait pu l'obtenir également avec l'option "-b" de Netstat.
Par contre, la colonne "AppliedSetting" est propre à cette commande PowerShell. On remarque la valeur "Datacenter" sur l'exemple ci-dessus, mais il y a d'autres valeurs possibles : Internet, Compat, etc... (voir la commande "Get-NetTCPSetting"). En fonction de certains critères, cela permet d'associer la connexion à un profil de paramètres.
Pour obtenir la liste de toutes les propriétés disponibles, vous pouvez utiliser Get-Member ou afficher directement toutes les propriétés :
Get-NetTCPConnection | Select-Object -Property *
Il y a une propriété nommée "CreationTime" qui permet de connaître la date de création de cette connexion, ou depuis quand le serveur est en écoute sur le port en question (selon le type de connexion).
Je vous rappelle tout de même que l'objectif initial c'est d'obtenir la liste des ports d'écoute sur notre serveur. Fort heureusement, on peut appliquer un filtre via le paramètre "-State" pour sélectionner uniquement les connexions avec l'état "Listen", c'est-à-dire en écoute.
La commande PowerShell à utiliser est :
Get-NetTCPConnection -State Listen
Comme vous pouvez le voir sur l'image ci-dessous, on obtient la liste des ports d'écoute à partir de cette commande. Il suffit de se référer à la colonne "LocalPort" de chaque ligne.
Si on se demande "Est-ce que mon serveur DNS est bien en écoute sur le port 53 ?", on peut affiner encore un peu plus la commande avec le paramètre "-LocalPort", comme ceci :
Get-NetTCPConnection -State Listen -LocalPort 53
On peut voir que plusieurs lignes sont retournées (et c'est tant mieux pour le bon fonctionnement de mon serveur DNS). Avec cette commande et cette syntaxe, on peut regarder rapidement si un serveur écoute sur un port spécifique ou non.
Si l'on veut savoir quel est le processus à l'origine de cette connexion, on peut récupérer l'information à partir de l'ID, ici "2076". Grâce à Get-Process et cet ID, on peut obtenir le nom du processus :
Get-Process -Id 2076
On peut voir que c'est le processus "dns" qui est à l'origine de la création de ce port d'écoute.
Personnellement, ce que j'aimerais bien c'est avoir le nom du processus qui s'affiche directement au niveau de la commande Get-NetTCPConnection, car cela évite de faire la correspondance en deux temps avec Get-Process. La bonne nouvelle, c'est que c'est possible en créant une propriété calculée, c'est-à-dire une propriété personnalisée on va dire.
En fait, pour chaque ligne on va exécuter automatiquement un Get-Process avec le nom de l'ID, de façon dynamique, pour récupérer le nom du processus. En complément, on va afficher l'adresse IP locale et le numéro de port.
Ce qui donne :
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress,LocalPort,@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}}
Sur mon serveur, j'obtiens un joli tableau avec la liste des ports d'écoute et le processus associé. Une sortie synthétique et parlante.
Voilà, vous savez comment récupérer la liste des ports d'écoute (et des connexions actives) sur Windows avec Netstat et PowerShell.
Bonjour,
Je rajouterais l’option -b à netstat (par exemple « netstat -anb »), avec les droits administrateur, afin de connaitre le binaire qui est à l’origine du port en écoute de la connexion.
Eric
Bonjour,
Si on compare les résultats des commandes Netstat et PowerShell on se rend compte que Netstat affiche la ligne :
« TCP 0.0.0.0:445 SRV-ADDS-01:0 LISTENING » alors que la commande PowerShell ne l’affiche pas. J’ai le même effet sur mon ordinateur.
Comment cela s’explique-t-il?
Bonjour,
Lorsque je fait un Get-NetTCPConnection, il me manque la colonne « OwningProcess ».
il y a t’il un paramètre a rajouté ?
Merci d’avance
@BIGMO
Get-NetTCPConnection de base donne:
LocalAddress , LocalPort, RemoteAddress, RemotePort State, AppliedSetting, OwningProcess