✍🏼Writeup – Easy Peasy room TryHackMe

Cette room se découpe en 2 phases :

  • Enumération
  • Compromission

Let’s start !

Task 1 – Enumeration through Nmap (5 min)

On lance un scan Nmap :

Q1 – How many ports are open?

Comme on peut le voir dans le résultat du scan :

3 ports sont ouverts !

Q2 – What is the version of nginx?

Toujours dans le retour du scan de port :

La version du serveur nginx est la 1.16.1.

Q3 – What is running on the highest port?

On ne change pas une équipe qui gagne, on trouve l’info … dans le scan Nmap !

Sur le plus haut port ouvert (65524), on trouve un serveur Apache en version 2.4.43.

Task 2 – Compromising the machine (1h30)

Q1 – Using GoBuster, find flag 1.

En tant que bon soldat, je m’exécute et lance un scan avec GoBuster.

Mon premier scan cible le serveur Nginx en écoute sur le port 80 :

On trouve un fichier robots.txt pas très intéressant, et un dossier qui semble juteux : /hidden

En visitant l’URL, on observe une page statique pas très utile, et une recherche web avec l’image ne donne rien non plus.

Le code source de la page ne révèle pas non plus de contenu intéressant.

Je décide de relancer un scan GoBuster, à partir du dossier /hidden cette fois-ci.

On trouve encore un répertoire caché nommé /whatever.

Une fois de plus la page ainsi que l’image ne sont pas d’une grande utilité …

… mais en regardant le source de près, on trouve une balise paragraphe avec du texte « caché » :

ZmxhZ3tmMXJzN19mbDRnfQ==

En allant faire un tour sur CyberChef, on décode le texte encodé en base64 et on obtient un flag tout neuf :

flag{f1rs7_fl4g}

Q2 – Further enumerate the machine, what is flag 2?

J’ai d’abord passé un peu de temps à chercher du côté du serveur Nginx pour être sûr de ne pas rater le second flag, mais rien de plus.

Je lance alors un scan GoBuster sur le serveur Apache cette fois.

Rien de croustillant, la page html et le robots.txt.

En regardant le contenu du fichier robots.txt, on tombe sur un User-Agent mystérieux qui a l’autorisation de scanner toutes les pages du site, avec un message qui laisse à penser que ce n’est pas un User-Agent comme les autres :

User-Agent:a18672860d0510e5ab6699730763b250
Allow:/
This Flag Can Enter But Only This Flag No More Exception

Fichier robots.txt

J’ai donc recherché quel pouvait être le format de ce qui semble être un hash :

Hash identifié comme du MD5 par hashes.com

Je décide d’utiliser un service en ligne (reversemd5.com) pour déchiffrer le hash.

Second flag récupéré !

flag{1m_s3c0nd_fl4g}

Q3 – Crack the hash with easypeasy.txt, What is the flag 3?

Alors cette question m’a laissé quelque peu … perplexe.
Déjà chronologiquement, ce flag est le 1er que j’ai trouvé du côté du serveur Apache, et ensuite on le trouve directement en clair, à aucun moment il est nécessaire d’utiliser la wordlist fournie pour avoir ce flag. Je pense qu’il s’agit d’un vestige datant de la création de la room.
Aparté terminée, voyons comment obtenir ce flag.

En scannant la page Apache, et plus particulièrement lorsque je scrutait le code source de la page, je suis littéralement « tombé » dessus :

Flag 3 sur la page d’accueil Apache
Avec le bon coup d’œil, on aperçoit rapidement le flag qu’on n’a plus qu’à cueillir tel le « Low Hanging Fruit » qu’il est !

flag{9fdafbd64c47471a8f54cd3fc64cd312}

Q4 – What is the hidden directory?

Aucun répertoire n’est ressorti de mon scan GoBuster (et pourtant j’ai pas utilisé une petite wordlist ^^), mais en regardant dans le code source de la page d’index, je suis tombé là-dessus :

Répertoire caché encodé ?

C’est du déjà-vu dans cette room, un paragraphe caché dans le source. Un indice nous est donné permettant de réaliser quelques tests avec CyberChef.

Dossier caché décodé en Base62
Après plusieurs tentatives, il s’avère que le nom du répertoire avait été encodé en Base62 :

/n0th1ng3ls3m4tt3r

Q5 – Using the wordlist that provided to you in this task crack the hash what is the password?

On nous demande (encore, mais ce coup si c’est le bon je le sens), d’utiliser la wordlist fournie pour casser un hash, mais quel hash me direz-vous ? J’y venais justement.

En regardant de plus près la page, on voit (difficilement) un texte situé en dessous de l’image représentant des 0 et des 1.
Je décide d’aller voir dans le source pour plus de lisibilité.

On a, a priori, trouvé le hash, reste maintenant à le casser !

J’ai pas mal tourné en rond à cette étape car je suis initialement parti sur la détection du type de hash fournie par hashes.com (SHA-256) afin de tenter de le casser avec Hashcat et John, mais sans succès.
J’ai alors tenté de lancer la détection du hash en mode « expert » et l’outil m’a alors affiché tous les types de hash probables et non plus un seul :

J’ai déjà essayé de le casser comme étant un hash SHA-256, je relance avec le second plus probable : gost.

Cassage du hash au format gost
Grâce à (beaucoup) de persévérance et un bon coup de main de notre ami John on retrouve le mot de passe :

mypasswordforthatjob

Q6 – What is the password to login to the machine via SSH?

Arrivé à ce stade, j’avoue que j’ai perdu (inutilement) beaucoup de temps, au moins 1h, à chercher des failles au niveau d’openSSH qui pourraient me permettre dans un premier temps d’énumérer les utilisateurs pour ensuite tenter un bruteforce avec Hydra, et au bout d’un moment je me suis recentré sur la room, son niveau de difficulté et le fait que l’on était assez bien guidé jusque là.

Je me suis repenché sur la page cachée trouvée précédemment, et j’ai fini par voir ce que j’avais ignoré jusque là : l’image représentant des 0 et des 1. C’est la seule image locale de la room, toutes les autres pointent vers des serveurs externes.

Image locale

J’ai donc téléchargé l’image et cherché des informations dans ses données EXIF mais sans succès, récupéré toutes les chaînes avec la commande strings, mais rien non plus, j’ai vérifié avec un éditeur hexadécimal si je trouvais des sections supplémentaires dans le jpeg, ou en fin d’image, et c’est là que j’ai pensé à la stéganographie.

Un petit coup de steghide, il nous demande une passphrase, je lui donne le mot de passe trouvé précédemment :

On récupère un nom d’utilisateur (en clair) et un mot de passe, encodé en binaire selon toute vraisemblance.
Je retourne sur CyberChef et vérifie si on peut récupérer le mot de passe.

On a alors récupéré un couple user / password, on va pouvoir se connecter au service SSH !
  • Nom d’utilisateur : boring
  • Mot de passe : iconvertedmypasswordtobinary

Q7 – What is the user flag?

Je me connecte avec succès au service SSH de la machine grâce aux identifiants obtenus à la question précédente.

Connexion au service SSH

Je liste alors mon répertoire utilisateur et trouve ce qui semble être le flag utilisateur :

Fichier user.txt

Le fichier user.txt contient ce qui semble être un flag accompagné d’un message qui me donne envie d’aller faire un tour de nouveau sur CyberChef.

Encore une fois avec l’aide de CyberChef, on trouve un nouveau flag !

flag{n0wits33msn0rm4l}

Q8 – What is the root flag?

Le moment semble venu d’élever ses privilèges !

Premier reflexe : vérifier les possibilités via sudo … chou blanc !
Je poursuis ma « visite manuelle » sans trouver grand chose d’exploitable, alors je sors l’artillerie lourde, j’ai nommé LinPEAS.
Je télécharge le script sur ma machine, puis je l’expose au travers un serveur web à l’aide de Python :

Démarrage serveur web Python

Du côté de la machine cible, je me rends dans le dossier /tmp et je télécharge, rend exécutable puis lance le script :

En examinant la sortie du script, j’ai remarqué une tâche CRON prometteuse se lançant en tant que root :

CRON suspect

Ce job commence par aller dans le dossier /var/www/ (dossier habituellement réservé aux contenus web), et exécute le script bash « caché » .mysecretcronjob.sh.

En regardant de plus près ce fichier, on se rend compte qu’il appartient à l’utilisateur et qu’il a les droits d’écriture (entre autres) dessus.

Droits script suspect

En éditant le fichier, je vois qu’il ne contient aucune instruction (le shebang + un commentaire), je décide alors d’y insérer un reverse shell de manière à obtenir un accès root.

Modification du script appelé par la tâche CRON en root

Je lance ensuite netcat en écoute sur ma machine afin d’attendre la connexion issue de la cible.

Listener ncat et connexion shell root

Le shell root est obtenu avec succès !

Flag root
En allant regarder le répertoire /root, on retrouve le flag dans le fichier « caché » .root.txt :

flag{63a9f0ea7bb98050796b649e85481845}

Retour d’expérience

Une salle classée au niveau easy par TryHackMe, ce que je confirme sur le plan technique, par contre bien plus « prise de tête » que la plupart des rooms de niveau équivalentes, ce qui m’a « contraint » à passer pratiquement 2h sur cette machine !

J’ai personnellement été agréablement surpris par cette room qui m’a pris plus de temps que je n’aurais cru sans m’en lasser une seule fois. Elle ne se focalise pas seulement sur un seule concept ce qui l’a rend d’autant plus intéressante, passer de l’énumération initiale jusqu’à l’obtention d’un shell root est très gratifiant.

Petite précision : j’ai utilisé l’outil GoBuster pour rester dans le chemin tracé par la room bien que j’ai une préférence pour ffuf, ou alors dirb qui scanne de manière récursive les répertoires trouvés et qui m’aurait éviter de relancer un second scan.

Conclusion

Une room plus longue que prévue et un agréable sentiment de progression tout au long de l’avancée.

Quelques « rabbit holes » m’ayant fait perdre du temps mais personnellement satisfait de l’avoir terminée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *