Commandes GNU/Linux pour détecter une intrusion

Bonjour à tous ! Après un petit moment d'absence nous allons voir aujourd'hui comment essayer de détecter une intrusion sur un système GNU/Linux.

Introduction

Aujourd'hui nous sommes beaucoup à rencontrer des tentatives d'intrusion sur nos SI, et ça peu importe le cœur de métier. Les intérêts peuvent être nombreux pour les attaquants, par exemple le vol de données, récupérer de la puissance de calcul, etc.

Il est important d'avoir une procédure pour décrire comment détecter et vérifier si la machine est intègre, au moins au niveau du système et des actions des utilisateurs.

De mon côté, j'ai pu utiliser les commandes suivantes, la liste n'est pas exhaustive et les différentes commandes sont sûrement améliorables avec des paramètres d'ailleurs.

Les commandes et actions

Sauf indication contraire les commandes sont lancées avec un utilisateur ayant des droits super utilisateur.

w & who

Les commandes w et who vont permettre dans un premier temps de voir si quelqu'un est connecté à la machine. Selon la commande lancée les informations sont différentes :

Ici les IPs ne remontent pas car je suis en local sur ma machine.

last & lastb

Les systèmes GNU/Linux gardent également des traces des connexions. Cela peut aller de l'utilisateur, l'IP et même la durée de la connexion.

Vous pouvez récupérer ces informations avec la commande last :

Comme pour w & who les IPs ne remontent pas car je suis en local sur ma machine, mais en cas de connexion distante l'IP est affichée.

La commande lastb affiche de son côté les tentatives de connexion erronées avec les mêmes informations. Pour que cela soit plus exhaustif j'ai lancé la commande lastb sur le VPS hébergeant l'instance Mattermost de Net-Security :

Les utilisateurs et shells

history

Si un attaquant arrive à prendre la main sur un utilisateur de votre machine il a de grande chance qu'il laisse des traces.

Vous pouvez vérifier les commandes lancées par un utilisateur en utilisant la commande history depuis l'utilisateur en question.

Exemple avec mon utilisateur :

Pour le faire pour un utilisateur différent il suffit de se connecter en son nom et de lancer la même commande :

1su user1
2history

L'ensemble des commandes sont tracées dans un fichier qui se nomme .bash_history et qui se trouve à la racine du dossier de l'utilisateur. Vous pouvez également le consulter de la façon suivante :

1cat /home/user/.bash_history

/etc/passwd & /etc/shells

Si un attaquant dispose de droit élevé il sera en capacité de créer son propre utilisateur. Nous allons donc vérifier les utilisateurs du système avec les commandes suivantes :

1less /etc/passwd
2cat /etc/passwd

Vous pouvez également filtrer seulement le nom des utilisateurs avec la commande suivante :

1awk -F':' '{ print $1}' /etc/passwd

Ou bien afficher seulement les utilisateurs pouvant utiliser un shell :

1cat /etc/passwd | grep /bin/bash (ou zsh, sh, etc.)

Vous pouvez récupérer la liste des shells disponibles sur votre machine de la façon suivante :

1cat /etc/shells

Les processus

Lorsqu'un attaquant prend la main sur votre machine son but va être de la garder ou bien d'installer un programme malveillant comme un mineur, un botnet, etc.

Pour vérifier cela vous pouvez utiliser les commandes permettant de lister les processus.

Comme la commande ps (process status) qui va permettre de lister l'ensemble des processus de la machine :

1ps
2ps aux

Vous pouvez également utiliser la commande top qui grâce à son interface permettre également de surveiller les consommations de la machine et d'afficher les processus les plus gourmands en ressources.

1top

Pour finir vous pouvez également lancer la commande lsof. Cette dernière permet grâce à ses options de retrouver des informations sur les processus.

Afficher les connexions ouvertes par un processus :

1lsof -i
2lsof -i -p <pid-proc>

Afficher les fichiers ouverts par un processus :

1lsof -l
2lsof -p <pid-proc>

ss & netstat

L'utilitaire netstat est présent sur presque toutes les distributions mais il est aujourd'hui déprécié. Il va permettre de vérifier des informations comme les ports exposés, les routes, etc.

Un attaquant pour garder accès à votre machine est capable d'exposer un port TCP ou UDP afin d'avoir un autre moyen de se connecter à la machine.

1netstat -lntup (liste les ports TCP/UDP exposés avec les services)
2netstat -r (liste les routes)
3netstat -s (affiche les stats des cartes)

L'utilitaire ss de son côté reste très proche de netstat au niveau des fonctionnalités. Il est présent nativement sur les dernières distributions et est le remplaçant de netstat.

Il reste possible de récupérer les ports exposés avec cet outil :

1ss -lntup
2ss -s (affiche les stats de la carte)

Les cartes réseau et les routes

Au niveau du réseau, le trafic peut être redirigé par l'attaquant et les cartes réseaux modifiées (ajout, suppression, etc.).

Vous pouvez vérifier les informations au niveau des cartes avec la commande ip :

1ip address
2ip a

Les routes peuvent également être affichées grâce à la même commande :

1ip route

crontab

L'utilisation de la fonctionnalité crontab est fréquente dans le cas d'une intrusion. Personnellement j'ai déjà vu plusieurs serveurs utilisant un crontab pour relancer leurs mineurs ou leurs scanners.

Il faut donc vérifier les différents utilisateurs pour être sûr qu'aucune tâche malicieuse ne se relance automatiquement.

Pour cela il suffit d'utiliser la commande crontab avec les différentes options proposées.

Vérification de l'utilisateur courant :

1crontab -l

Vérification d'un autre utilisateur :

1crontab -u user -l

Il est aussi possible de voir les tâches planifiées par heure, jour ou semaine :

1ls -la /etc/cron.daily
2ls -la /etc/cron.hourly
3ls -la /etc/cron.weekly

Les fichiers modifiés

Si vous êtes victimes d'une intrusion des fichiers seront probablement modifiés sur votre système. Il est possible de les lister avec l'outil très puissant find.

Voici deux exemples à adapter selon vos besoins.

Retrouver tous les fichiers créés/modifiés les 5 derniers jours :

1find / -mtime -5 -ctime -5

Retrouver les fichiers modifiés dans la dernière minute :

1find / -mmin -1

La commande find permet également de récupérer les fichiers en fonction des UID des utilisateurs mais je ne maîtrise pas encore toutes ses subtilités.

Vous trouverez plus d'informations ici.

Les logs

Même si cela paraît évident, les logs doivent être analysées en cas d'intrusion ou de tentative d'intrusion.

Sauf indication contraire elles sont présentes dans /var/log et vous pouvez les analyser avec différents outils comme : tail, cat, less, grep

L'analyse des logs dépendra forcément de votre système et de vos applicatifs mais voici quelques exemples :

1cat /var/log/syslog
2cat /var/log/syslog | less
3tail -f -n 5 /var/log/syslog
4cat /var/log/syslog | grep fail
5tail -f /var/log/syslog

Edit

Suite à un retour d'un ancien collègue Amine @_1mean les éléments suivants peuvent également être effectués.

Vérifier les clés SSH

Un attaquant pourra également ajouter sa clé SSH au niveau des utilisateurs de la machine histoire de garder un accès permanent.

Il faut donc vérifier .ssh/authorized_keys des utilisateurs ! Par exemple :

1cat /root/.ssh/authorized_keys
2cat /home/debian/.ssh/authorized_keys
3cat /home/user1/.ssh/authorized_keys

Vérifier le contenu de /tmp

Une autre remarque pertinente est de vérifier le contenu du dossier /tmp car si un attaquant arrive à récupérer un shell ou un accès à la machine c'est le seul endroit ou il pourra uploader ses fichiers !

Pour vérifier son contenu il faut utiliser les commandes classiques :

1ls /tmp
2ls -la /tmp
3ls -la /tmp | more
4less /tmp
5ls -la /tmp | grep xxx

Les IPs publiques

Pour terminer avec cet article vous pouvez également analyser les IPs remontées dans vos systèmes ainsi que votre IP pour savoir si elles sont considérées comme malveillante.

Si une de vos machines est utilisée pour scanner internet ou émettre du spam cela peut être le cas et il faudra engager des changements et des démarches.

Voici quelques sites qui permettent de trouver ce genre d'information :

Sources

Conclusion

Voilà c'est la fin de cet article dédié à la détection d'intrusion sur les systèmes GNU/Linux ! Si ça vous intéresse tous les tests ont été réalisés sur ma machine ArchLinux ainsi que sur un VPS utilisant Debian 10 !

J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ou en commentaire ! N’hésitez pas à me dire également si ce genre d’article vous plaît !

Merci pour votre lecture et à bientôt !