Post

TryHackMe — Vulnversity : Writeup

Résolution de la room RootMe sur TryHackMe : contournement de blacklist d'upload, reverse shell et privilège escalation via un binaire SUID systemctl.

TryHackMe — Vulnversity : Writeup

TryHackMe — Vulnversity

Informations sur la machine

Cible : 10.128.153.32


1. Connexion à la machine

La première étape consiste à identifier les services accessibles sur la machine cible et à déterminer les différentes surfaces d’attaque disponibles.


2. Reconnaissance avec Nmap

Comme toujours lors d’un pentest, je commence par effectuer une reconnaissance des ports et des services exposés.

J’utilise Nmap avec les options -sC et -sV afin d’exécuter les scripts de reconnaissance par défaut et d’identifier les versions des services.

1
nmap -sC -sV 10.128.153.32

Résultat :

nmap result

Le scan révèle 6 ports ouverts :

PortService
21FTP
22SSH
139NetBIOS
445NetBIOS/SMB
3128HTTP Proxy
3333HTTP

Ces informations constituent notre première cartographie de la surface d’attaque.

Réponses aux questions

How many ports are open?

1
6

What version of the Squid proxy is running on the machine?

1
3.5.12

What is the most likely operating system this machine is running?

1
Ubuntu

What port is the web server running on?

1
3333

3. Découverte de contenu avec Gobuster

Le port 3333 héberge un serveur web. Je commence donc par consulter directement la page d’accueil :

1
http://10.128.153.32:3333/

home page

La page d’accueil ne révèle rien d’intéressant dans un premier temps. Je passe donc à une phase de content discovery afin de rechercher des répertoires et fichiers cachés.

Pour cela, j’utilise Gobuster :

1
2
3
4
gobuster dir -u http://10.128.153.32:3333/ \
-w /usr/share/wordlists/dirb/common.txt \
-x php,txt,html,js \
2>/dev/null

Résultat :

gobuster result

Le scan permet notamment de découvrir le répertoire :

1
/internal/

Ce répertoire semble particulièrement intéressant puisqu’il peut contenir des fonctionnalités qui ne sont pas accessibles depuis la page principale.

Question TryHackMe

What is the directory that has an upload form page?

1
/internal/

4. Compromission du serveur

4.1 Découverte du formulaire d’upload

Je me rends sur :

1
http://10.128.153.32:3333/internal/

J’y découvre un formulaire permettant d’uploader un fichier.

upload page

Un formulaire d’upload représente une surface d’attaque intéressante, notamment lorsqu’il est possible d’envoyer un fichier contenant du code exécutable.

Je tente donc dans un premier temps d’uploader un payload PHP.

Cependant, l’upload échoue.

Cela laisse penser que l’application applique un filtrage sur les extensions de fichiers autorisées.


4.2 Contournement du filtrage d’extension

Plutôt que de tester manuellement toutes les extensions possibles, j’utilise Burp Suite Intruder afin d’automatiser le test.

Je commence par créer une liste contenant différentes extensions susceptibles d’être acceptées par le serveur.

create list

Je démarre ensuite Burp Suite et capture la requête d’upload à l’aide du module Proxy.

proxy

La requête est ensuite envoyée vers Intruder.

intruder

Je configure Intruder afin de tester les différentes extensions présentes dans ma liste.

list

attack result

Après avoir lancé l’attaque, je remarque notamment une réponse différente pour l’extension phtml.

La réponse correspondante possède une longueur de 759 octets, ce qui indique que le serveur a probablement accepté cette extension alors que l’extension .php était filtrée.

Je peux donc utiliser .phtml pour contourner le filtre.


5. Obtention d’un Reverse Shell

Je modifie localement l’extension de mon payload PHP afin d’utiliser l’extension :

1
.phtml

Avant d’uploader le fichier, je lance un listener Netcat sur ma machine :

1
nc -lnvp 4444

listener

J’upload ensuite le fichier .phtml.

Le fichier passe correctement le filtre.

success

Je peux alors accéder au répertoire dans lequel les fichiers uploadés sont stockés :

1
http://10.128.153.32:3333/internal/uploads/

uploads

En cliquant sur le fichier uploadé, le serveur exécute le payload et celui-ci déclenche une connexion vers mon listener.

J’obtiens alors un reverse shell sur ma machine.

reverse shell


6. Stabilisation du shell et récupération du flag utilisateur

Une fois le reverse shell obtenu, je le stabilise afin de pouvoir travailler plus confortablement. Je peux ensuite explorer le système et me rendre dans le répertoire personnel de l’utilisateur :

1
cd /home/bill

Je découvre notamment le fichier :

1
user.txt

Ce fichier contient le premier flag.

Question TryHackMe

What is the name of the user who manages the webserver?

1
bill

What is the user flag?

1
8bd**************************edb

7. Escalade de privilèges

Après avoir obtenu un accès utilisateur, l’objectif suivant est de devenir root.

Je commence par rechercher les fichiers possédant le bit SUID.

Pour cela, j’utilise :

1
find / -perm -4000 -type f 2>/dev/null

Cette commande permet de rechercher les fichiers exécutables disposant de la permission SUID.

Parmi les résultats, un binaire attire immédiatement mon attention :

1
/bin/systemctl

result SUID

Le fait que systemctl possède le bit SUID est particulièrement intéressant car il peut permettre une élévation de privilèges.

Question TryHackMe

On the system, search for all SUID files. What file stands out?

1
/bin/systemctl

8. Exploitation de systemctl

Afin de déterminer comment exploiter ce binaire, je recherche une méthode d’exploitation connue sur GTFOBins.

Je trouve une technique permettant d’utiliser systemctl afin de créer et démarrer un service.

La méthode trouvée est la suivante :

1
2
3
4
5
6
7
8
9
echo '[Service]
Type=oneshot
ExecStart=/path/to/command
[Install]
WantedBy=multi-user.target' >/path/to/temp-file.service

systemctl link /path/to/temp-file.service

systemctl enable --now /path/to/temp-file.service

L’idée est de créer un fichier de service temporaire contenant la commande que l’on souhaite exécuter, puis de demander à systemctl de l’activer.

J’utilise donc un fichier temporaire correspondant à la variable $TF.

La commande suivante permet d’activer le service :

1
/bin/systemctl enable --now $TF

Le système confirme alors que le service a été créé et lié à la cible multi-user.target :

1
Created symlink /etc/systemd/system/multi-user.target.wants/tmp.xn9ps63VM9.service → /tmp/tmp.xn9ps63VM9.service.

process


9. Récupération du flag root

Après l’exécution du service, je retourne dans /tmp afin de vérifier les fichiers générés :

1
2
cd /tmp/
ls

Je trouve notamment :

1
2
3
4
5
output
root.service
root_proof.txt
tmp.xn9ps63VM9
tmp.xn9ps63VM9.service

Le fichier output semble particulièrement intéressant. Je l’affiche avec cat :

1
cat output

Le contenu du fichier est :

1
a58**************************fd5

J’ai ainsi récupéré le root flag.

Question TryHackMe

Become root and get the last flag (/root/root.txt)

1
a58**************************fd5

10. Chaîne d’exploitation

La compromission de la machine peut être résumée ainsi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Nmap
  │
  ▼
Port 3333
  │
  ▼
Gobuster
  │
  ▼
/internal/
  │
  ▼
Formulaire d'upload
  │
  ▼
Filtrage de .php
  │
  ▼
Burp Suite Intruder
  │
  ▼
Découverte de .phtml
  │
  ▼
Upload du payload
  │
  ▼
Reverse Shell
  │
  ▼
Utilisateur www-data
  │
  ▼
/home/bill
  │
  ▼
user.txt
  │
  ▼
Recherche des fichiers SUID
  │
  ▼
/bin/systemctl
  │
  ▼
Création / activation d'un service
  │
  ▼
Exécution avec privilèges élevés
  │
  ▼
/tmp/output
  │
  ▼
Root Flag

11. Ce que j’ai appris

Cette room m’a principalement permis de renforcer plusieurs notions :

  • Utilisation de Nmap pour la reconnaissance des services et des versions.

  • Utilisation de Gobuster pour la découverte de contenu web.

  • Identification et exploitation d’un formulaire d’upload vulnérable.

  • Utilisation de Burp Suite Intruder pour tester automatiquement différentes extensions.

  • Compréhension du contournement d’un filtre d’extension avec .phtml.

  • Obtention d’un reverse shell.

  • Stabilisation d’un shell distant.

  • Recherche de fichiers possédant le bit SUID avec find.

  • Identification de /bin/systemctl comme vecteur d’escalade de privilèges.

  • Utilisation de GTFOBins pour rechercher des techniques d’exploitation de binaires Linux.

Cette machine m’a surtout permis de comprendre comment plusieurs petites étapes d’énumération et d’exploitation peuvent être enchaînées pour passer progressivement de l’accès au serveur web → reverse shell → utilisateur → root.

This post is licensed under CC BY 4.0 by the author.