Trouver le process à partir de son port TCP

De knowledge
Aller à la navigation Aller à la recherche

La problématique

On a un petit travail de "reverse engineering" à réaliser. Sur un serveur on sait qu'un service est appelé par un appel TCP sur un port donné mais on ne sait pas QUI est appelé.

Comment savoir:

  • De quel process il s'agit
  • Quelle est la ligne de commande qui a été utilisée pour le lancer.

La solution

Les outils nécessaires

Pour faire cette analyse il faut plusieurs prérequis. Certes il faut l'acces root mais c'est logique. Ensuite il faut qu'un certain nombre d'outils soient installés :

  • ps : c'est la base il est TOUJOURS installé
  • netstat : En général c'est le cas sur un système standard
  • lsof : souvent installé mais ce n'est pas automatique
sudo yum install lsof # CentOS / RHEL / Fedora
sudo dnf install lsof # CentOS/RHEL 8

sudo apt install lsof # Prour les "vrai" linux.

La méthode

La seule chose que l'on sache c'est que le serveur fournit un service sur un port donné : disons 8284 par exemple.

Quel est le numéro du process ?

Pour cela on a deux méthodes.

netstat

La commande netstat donne plein d'informations sur la configuration et le fonctionnement du réseau sur une machine linux. (et Unix en général). On va utiliser sa capacité a avoir la liste des processus en lien avec des ports TCP ouverts.

netstat -ltnp | grep -w ':8284'

Attention a ne pas oublier le ":" (deux points) dans la chaine ':8284' (on changera le ports si besoin) On obtiens quelque-chose qui ressemble à :

tcp6       0      0 :::8284                 :::*                    LISTEN      4468/node /appli/pr

On obtiens l'id du processus (4468 ici) et le début de la ligne de commande. On sait déja que c'est un programme node.js qui fait le travail derrière le port 8284. Si on voit seulement :

tcp6       0      0 :::8284                 :::*                    LISTEN      -

Attention vous n'avez pas les droits root!

lsof

C'est un outil plus adapté a ce problème. Il donne la liste des fichiers ouverts et le processus qui leur est associé. Comme sous unix tout est fichier.... une socket sur un port donné c'est un fichier.

lsof -i :8284

Qui nous donne :

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    4468 webadm   19u  IPv6 987540      0t0  TCP *:8284 (LISTEN)

On en sait un peu plus :

  • le process est le 4468 ça on savait
  • la commande est node on savait aussi, On savait même que les paramètres commençait par "/appli/pr" mais ce n'etait pas d'une grande utilité
  • On sait que le process tourne avec les droits de "webadm" àa, pour le coup, c'est intéressant! C'est le seul intérêt de lsof / netstat mais c'est pas inutile.

Par quelle commande ce process a-t-il été lancé.

Avec ps

Lorsque le process identifié est un process spécifique (un exécutable spécifique par exemple) on a déjà toutes les infos. Pour le port 22 on voit que c'est sshd qui est derrière ça suffit. En revanche si le process est un programme générique (java, node, python) il sera nécessaire de savoir avec quels paramètres il a été lancé.

C'est là que la commande ps intervient.

ps -eo pid,cmd| grep node | grep 4468  # Ici 4468 est l'id de process trouvé ci-dessus

La réponse est :

 4468 node /var/node/monappli/server.js

On a donc un programme node.js lancé avec le configuration définie dans /var/node/monappli/server.js

Sans rien d'autre que cat et ls

On a une arborescence /proc sous linux. Elle donne toutes les infos sur les process qui tournent sur la machine.

Ici on veut tout savoir sur 4468:

  • son répertoire courant :
ls -l /proc/4468/cwd

nous réponds :

lrwxrwxrwx 1 webadm webgrp 0 Sep 21 11:49 /proc/4468/cwd -> /var/node/appl

Dans ce cas on sait ou travaille le process node.js.

  • Le chemin de l'exécutable (on pourrait avoir plusieurs versions de node.js
ls -l /proc/4468/exe

qui nous précise :

lrwxrwxrwx 1 webadm webgrp 0 Sep 21 11:49 /proc/4468/exe -> /usr/bin/node

Ok la version de node.js est bien celle qui est installée en /usr/bin On pout également passer par là pour avoir la commande:

cat /proc/4468/cmdline

Qui nous redonne:

node /var/node/monappli/server.js