Το Blurry ξεκινά με καταμέτρηση subdomains που αποκαλύπτει μια πλατφόρμα MLOps ClearML στο app.blurry.htb. Μετά την εγγραφή και τη ρύθμιση του SDK, εκμεταλλευόμαστε το CVE-2024-24590 (unsafe pickle deserialization στο φόρτωμα artifact) για ένα foothold σαν jippity. Το root επιτυγχάνεται φτιάχνοντας ένα κακόβουλο μοντέλο PyTorch (.pth) που εκμεταλλεύεται έναν λάθος ρυθμισμένο κανόνα sudo — το evaluate_model καλεί torch.load(), πυροδοτώντας ένα δεύτερο deserialization σαν root.
Το αρχικό scan βρίσκει SSH και έναν web server nginx που ανακατευθύνει αμέσως στο app.blurry.htb.
nmap — initial scan
SP1R4@kali)-[~/HTB/blurry]└$ nmap -sV -sC -oN nmap.txt 10.10.11.19PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
80/tcp open http nginx 1.18.0
|_http-title: Did not follow redirect to http://app.blurry.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
hosts — add entries
echo "10.10.11.19 app.blurry.htb files.blurry.htb chat.blurry.htb api.blurry.htb blurry.htb" | sudo tee -a /etc/hosts
Καταμέτρηση Subdomains
gobuster dns
SP1R4@kali)-[~/HTB/blurry]└$ gobuster dns -d "blurry.htb" -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txtFound: files.blurry.htbFound: app.blurry.htbFound: chat.blurry.htb
chat.blurry.htb — Rocket.Chat
Η περιήγηση στο instance Rocket.Chat μετά την εγγραφή αποκαλύπτει συζητήσεις της ομάδας.
Ο χρήστης admin είναι ο jippity και η ομάδα χτίζει AI tooling — χρήσιμο context για το τι τρέχει στο app.blurry.htb.
app.blurry.htb — ClearML
Το ClearML είναι μια πλατφόρμα MLOps ανοιχτού κώδικα για tracking πειραμάτων AI/ML. Η υποβολή οποιουδήποτε ονόματος δίνει πρόσβαση developer και παρέχει credentials API. Χρειάζεται να προσθέσουμε το api.blurry.htb στο hosts πριν τρέξουμε το SDK init.
clearml — setup
pip install virtualenv && python3 -m venv .env && source .env/bin/activatepip install clearmlclearml-init# paste the config from the web UI settings page when prompted
Η αναζήτηση για γνωστά CVEs του ClearML αναδεικνύει μια δέσμη disclosures από τις αρχές του 2024. Αυτό που έχει σημασία για εμάς:
CVE
Περιγραφη
Χρησιμοποιηθηκε
CVE-2024-24590
Pickle Load στο Artifact Get — unsafe deserialization
✓ foothold
CVE-2024-24591
Path Traversal στο File Download
—
CVE-2024-24592
Improper Auth → Arbitrary Read-Write
—
CVE-2024-24593
CSRF στον ClearML Server
—
CVE-2024-24594
XSS μέσω HTML rendering
—
CVE-2024-24595
Plaintext creds στη MongoDB
—
Όταν ένας agent ClearML επεξεργάζεται ένα task, κατεβάζει το artifact και καλεί pickle.load() χωρίς validation. Φτιάχνοντας ένα αντικείμενο με κακόβουλη μέθοδο __reduce__, εκτελούμε αυθαίρετο κώδικα τη στιγμή που ο agent πιάνει το task μας.
Foothold
CVE-2024-24590 — Pickle Deserialization
Δημιουργούμε μια κλάση της οποίας το __reduce__ επιστρέφει μια εντολή reverse shell, την ανεβάζουμε σαν artifact ClearML με tag review, και την βάζουμε σε queue. Ο agent admin την εκτελεί αυτόματα.
# Ξεκίνα listener πριν τρέξεις το exploitnc -lvnp 4444# Μόλις συνδεθείς — σταθεροποίησεpython3 -c 'import pty;pty.spawn("/bin/bash")'export TERM=xterm# Ctrl+Zstty raw -echo; fgjippity@blurry:~$
🚩 Shell σαν jippity. User flag πιάστηκε.
Privilege Escalation
sudo -l
sudo permissions
jippity@blurry:~$ sudo -lUser jippity may run the following commands on blurry:
(root) NOPASSWD: /usr/bin/evaluate_model /models/*.pth
Το script evaluate_model φορτώνει αρχεία μοντέλου με torch.load() — που εσωτερικά καλεί pickle.load(). Έχουμε επίσης πρόσβαση εγγραφής στο /models/:
check /models permissions
jippity@blurry:~$ ls -la / | grep modelsdrwxrwxr-x 2 root jippity 4096 Jun 13 13:32 models
ⓘ torch.load() == pickle.load() — τα αρχεία .pth του PyTorch είναι pickle-serialized αντικείμενα. Κάθε κλάση με προσαρμοσμένο __reduce__ θα εκτελέσει αυθαίρετο κώδικα στο φόρτωμα.
Κακόβουλο Μοντέλο PyTorch
Φτιάχνουμε μια κλάση μοντέλου που παρακάμπτει το __reduce__ με ένα reverse shell, το αποθηκεύουμε σαν αρχείο .pth, και το ρίχνουμε στο /models/.