Trouver le process à partir de son port TCP
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é est un ficheir.