La máquina UnderPass es una máquina fácil de HTB.

Resumen de conceptos trabajados:

• Enumerate ports/services (TCP/UDP)
• Directory and Subdomain listing via Brute Forcing
• Hash Cracking
• Privilege Escalation using Mosh for Shell Access

Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.

A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn NOMBRE_VPN.ovpn».

ENUMERACIÓN -> ESCANEO DE PUERTOS

Nos aseguramos que la máquina de HTB se ha desplegado correctamente y está activa mediante el comando PING y NMAP:

ping -c 1 10.10.11.48 -R
nmap -sn 10.10.11.48

Explicación de los comandos:

ping: para verificar la conectividad entre la máquina víctima y la atacante enviando paquetes ICMP para medir la latencia y comprobar si el host (víctima) está activo.

-c 1: este argumento indica que solo se enviará 1 paquete ICMP en lugar de los envíos continuos predeterminados.

-R: Registro de rutas (Record Route) permite rastrear la ruta completa de ida y vuelta del paquete. Vemos un nodo intermediario que hace que el ttl se reduzca en una unidad, adivinando así el SO de la máquina.

-sn (Ping Scan): Realiza un escaneo simple para determinar si el host está activo, pero sin escanear puertos.

Estamos por tanto ante una máquina Linux con su TTL de 64.

ESCANEO DE PUERTOS PARA LA IP VÍCTIMA

Conociendo la IP víctima, vamos ahora a analizar cuáles son los puertos abiertos (no cerrados ni con estado filtered (tráfico bloqueado por un firewall antes de llegar al puerto).

Para ello utilizaremos nmap con los siguientes comandos:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.48 -oG Escaneo

Se reportan dos puertos abiertos: 80 web y 22 ssh autenticación.

El paso siguiente es conocer cuáles son los servicios y versiones que corren para esos puertos abiertos, de esta forma podremos ver si alguno de ellos presenta una vulnerabilidad ya conocida a explotar.

Aplicamos la siguiente secuencia de comandos con nmap:

nmap -sCV -p22,80 10.10.11.48

Para la versión OpenSSH 8.9p1 no existe ningún exploit, y al ser superior a la 7.7 (vulnerable a enumeración de usuarios) parece que por ahora no podemos continuar por este puerto.

Pasamos por tanto a analizar el puerto 80 web donde corre un Apache2 versión 2.4.52 en Ubuntu. Para esa versión de Apache2 no se detecta ningún exploit.

Si accedemos a la IP desde el navegador, solo se muestra una página por defecto del servidor de Apache2, nada más relevante analizando la página.

En este punto vamos a analizar posibles directorios y archivos que puedan estar expuestos públicamente.

Para ello vamos a hacer diferentes ataques de fuerza bruta de directorios usando wfuzz y gobuster para analizar carpetas y archivos potenciales.

Análisis de archivos con Gobuster:

gobuster dir -u http://10.10.11.48 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,txt

Análisis de carpetas y subdominios con Wfuzz:

wfuzz -c --hc 404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.10.11.48/FUZZ
wfuzz -c --hc 404,400 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.10.11.48 -H "Host: FUZZ.10.10.11.48"

Parece que por aquí no encuentro nada relevante. Dando vueltas, y viendo otras formas de detectar vectores de entrada, me doy cuenta que en la fase de escaneo, lo hicimos mediante TCP y no por UDP.

Diferencias clave entre escaneo TCP y UDP

AspectoTCP (Transmission Control Protocol)UDP (User Datagram Protocol)
ProtocoloOrientado a conexión. Requiere un proceso de «handshake» de tres pasos (SYN, SYN-ACK, ACK).Sin conexión. No hay handshake; los paquetes se envían sin confirmar la entrega.
VelocidadMás rápido debido a la respuesta más clara de los puertos (SYN-ACK o RST).Más lento porque es necesario esperar a ver si hay respuesta o si expira un timeout.
Respuestas esperadasRespuestas claras:
SYN-ACK: Puerto abierto.
RST: Puerto cerrado.
– Sin respuesta: Filtrado.
Respuestas ambiguas:
– Respuesta específica: Puerto abierto.
– ICMP «port unreachable»: Puerto cerrado.
– Sin respuesta: Puede estar filtrado o abierto.
Casos de usoDetectar servicios como HTTP, SSH, FTP, etc., que funcionan sobre TCP.Identificar servicios como DNS, SNMP, TFTP, VoIP, que usan UDP.
Consumo de recursosConsume más recursos en el objetivo debido a la necesidad de establecer conexiones (handshake).Consume menos recursos en el objetivo porque no requiere conexiones establecidas.
Detección en firewallsMás fácil de detectar porque los paquetes SYN suelen ser monitoreados por sistemas de seguridad.Más difícil de detectar porque los paquetes UDP no requieren conexión y son más difíciles de rastrear.

Por tanto vamos a realizar un escaneo con nmap por UDP y analizamos los 100 top puertos abiertos

nmap -sU --top-ports 100 -T5 10.10.11.48

Encontramos en este punto abierto el puerto 161 snmp.

Qué es SNMP (Puerto 161/UDP)

El protocolo SNMP se utiliza para la administración y monitoreo de dispositivos en red, como routers, switches, servidores, y otros dispositivos de infraestructura. Puede proporcionar información sensible, como:

  • Configuración del sistema.
  • Información sobre usuarios.
  • Estado de interfaces de red.

Enumeración de SNMP

Usamos la herramienta de snmpwalk para obtener información del sistema:

snmpwalk -v2c -c public 10.10.11.48
  • v2c: Especifica la versión del protocolo. Este parámetro indica la versión del protocolo SNMP que estamos utilizando. Hay tres versiones principales:

SNMPv1: La más antigua, con autenticación básica y muy insegura.

SNMPv2c: Mejora el rendimiento y la seguridad, pero sigue usando cadenas de comunidad (sin cifrado).

SNMPv3: Más segura, utiliza cifrado y autenticación robusta.

En este caso, usamos SNMPv2c, que es común en dispositivos antiguos o mal configurados.

  • -c public: Es la cadena de comunidad por defecto. Intenta también con otras comunes como private, admin, etc.

Este es el parámetro de la cadena de comunidad. Las cadenas de comunidad actúan como contraseñas para acceder a la información del dispositivo. Hay tres tipos de cadenas principales:

public: Permite acceso solo de lectura.

private: Permite acceso de lectura y escritura.

Cadenas personalizadas: Algunas organizaciones configuran cadenas únicas.

public es la cadena por defecto, lo que la hace vulnerable si no se ha cambiado.

  • 10.10.11.48: Es la IP de la máquina víctima.

¿Qué es snmpwalk?

snmpwalk es una herramienta que permite realizar consultas masivas al servicio SNMP de un dispositivo. snmpwalk recorre todos los objetos disponibles y los devuelve en un formato legible.

Es muy útil para descubrir información sensible, como usuarios, configuraciones, rutas de red, y servicios expuestos.

Encontramos un subdominio interesante (underpass.htb), un usuario potencial (steve) y un mensaje que dice «»UnderPass.htb is the only daloradius server in the basin!»».

Qué es Daloradius

Daloradius es una interfaz de gestión web utilizada para el servidor RADIUS (Remote Authentication Dial-In User Service). Este software se emplea para administrar usuarios y configuraciones relacionadas con la autenticación y contabilidad de redes. Su relevancia puede radicar en los siguientes puntos:

  • Explotación web: Si el servidor Daloradius está accesible desde el puerto 80 (HTTP), podrías intentar interactuar con él.
  • Riesgo de credenciales: Los sistemas RADIUS suelen tener configuraciones por defecto o vulnerabilidades si no están bien protegidos.

Este servicio suele instalarse bajo un directorio dentro del puerto 80, por lo que analizamos con fuzzing si existen diferentes directorios internos relevantes:

wfuzz -c --hc 404,403 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://underpass.htb/daloradius/FUZZ

En este primer fuzzing encontramos varias carpetas interesantes, entre ellas, «app», que parece ser la más interesante, por lo que continuamos con un fuzz a «app»:

wfuzz -c --hc 404,403 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://underpass.htb/daloradius/app/FUZZ

Encontramos estas subcarpetas, y al probar /operators , nos devuelve una redirección a un panel de login:

http://underpass.htb/daloradius/app/operators/login.php

Probamos credenciales por defecto encontradas en internet para acceder y es que Daloradius tiene credenciales predeterminadas muy conocidas como:

Usuario: administrator
Contraseña: password

Usuario: administrator
Contraseña: radius

Usuario: admin
Contraseña: admin

Accedemos usando la primera opción y estamos en el escritorio de daloradius:

accedemos al listado de usuarios y vemos usuario y contraseña hasheada que tenemos que romper:

Para ello usaremos hashcat mediante ataques de diccionario con rockyou:

hashcat -m 0 -a 0 -o hash.txt /usr/share/wordlists/rockyou.txt

*Creamos el archivo hash.txt con nano introduciendo la password anterior.

Y tenemos la contraseña: underwaterfriends

NOTA: Otra opción para crackear el hash es a través de la web crackstation.net.

Ahora probamos a autenticarnos por ssh y acceder al servidor:

ssh svcMosh@10.10.11.48

si listamos ficheros encontramos la user flag:

Ahora pasamos a hacer la escalada de privilegios a root:

Probamos con el siguiente comando para comprobar los permisos del usuario «sudo -l»:

La salida indica que el usuario svcMosh puede ejecutar el comando /usr/bin/mosh-server con privilegios de sudo sin necesidad de contraseña.

Esto significa que podemos ejecutar mosh-server como cualquier usuario, incluido root. El próximo paso será investigar si este binario puede ser abusado para obtener acceso privilegiado.

¿Qué es mosh-server?

Mosh (Mobile Shell) es una herramienta utilizada para conexiones remotas que mantiene sesiones activas incluso cuando hay interrupciones en la red. El binario mosh-server inicia un servidor de Mosh y puede aceptar parámetros que podrían ser explotados.

En este caso, usaremos la posibilidad de ejecutarlo como sudo para ganar acceso privilegiado.

Abusar de mosh-server para escalada de privilegios

Aplicamos los siguientes comandos:

sudo /usr/bin/mosh-server new -- /bin/bash

Explicación:

  • sudo: Ejecuta el comando con privilegios de superusuario.
  • /usr/bin/mosh-server: El binario que tiene permisos NOPASSWD según el resultado de sudo -l. Esto permite ejecutarlo sin contraseña.
  • new: Le dice a mosh-server que inicie una nueva sesión.
  • -- /bin/bash: Especifica que se quiere abrir un intérprete de comandos (shell) /bin/bash.

Resultado:

  • Este comando inicia una nueva instancia de mosh-server, que en este caso ejecuta un shell interactivo (/bin/bash) como superusuario (root) debido a los permisos de sudo asignados al binario.

El servidor genera una clave (MOSH_KEY) y asigna un puerto para la sesión de conexión 60002.

Conexión al servidor con mosh-client:

Aplicamos en el comando la key, la ip local host y el puerto:

MOSH_KEY=2+yP9Ymca0tW5WO7SLz+UQ mosh-client 127.0.0.1 60002

Explicación:

  • MOSH_KEY=...: Exporta la clave de conexión generada por el servidor para que el cliente pueda autenticar la sesión.
  • mosh-client: Cliente de Mosh que se conecta al servidor.
  • 127.0.0.1: Es la dirección del localhost, ya que el servidor y cliente están en la misma máquina.
  • 60002: Es el puerto asignado al servidor mosh-server.

Resultado: Este comando establece una conexión entre el cliente y el servidor de Mosh, iniciando una sesión interactiva con permisos de root.

A partir de aquí listamos y accedemos a la root flag.

RESUMEN

Para resolver la máquina «UnderPass», comenzamos con un escaneo de puertos TCP que reveló los servicios SSH (22) y HTTP (80). No descubrimos nada relevante, por lo que pasamos a hacer el escaneo de puertos por UDP y nos encontramos con el puerto SNMP (161) abierto.

Al analizar el servicio web con herramientas como Gobuster y Wfuzz, descubrimos un directorio relacionado con Daloradius (/daloradius/app) que nos llevó a un panel de login.

Probamos credenciales comunes y conseguimos acceso al dashboard. Una vez dentro, identificamos un usuario (svcMosh) y una contraseña hasheada. Usamos Hashcat con el diccionario rockyou.txt para descifrar el hash, obteniendo la contraseña underwaterfriends, que utilizamos para acceder al sistema a través de SSH como svcMosh.

Una vez dentro, ejecutamos sudo -l y descubrimos que el binario /usr/bin/mosh-server podía ejecutarse con privilegios sudo sin necesidad de contraseña. Abusamos de este permiso ejecutando sudo /usr/bin/mosh-server new -- /bin/bash para iniciar una shell como root.

Luego, utilizamos el cliente de Mosh (mosh-client) para conectar al servidor con la clave y puerto generados, logrando acceso interactivo como superusuario y acceder a la root flag.

Otros posts relacionados