User Tools

Site Tools


multistage

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
multistage [2025/02/10 15:39] kresimirmultistage [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 8: Line 8:
 Napomena 1: administrator na remote instanci ima jako dugu, nasumično generiranu lozinku Napomena 1: administrator na remote instanci ima jako dugu, nasumično generiranu lozinku
 Napomena 2: lozinka administratora za lokalno testiranje je password123 Napomena 2: lozinka administratora za lokalno testiranje je password123
-Napomena 3: funkcionalnost registracije i password reseta je disableana+Napomena 3: funkcionalnost registracije i password reseta je onemogućena (disabled)
 Napomena: Zadatak se periodički resetira (svaka 4 sata). Ako je zadatak nedostupan pričekajte 1-2 minute. Napomena: Zadatak se periodički resetira (svaka 4 sata). Ako je zadatak nedostupan pričekajte 1-2 minute.
 Hint: Krivotvorite remember me cookie Hint: Krivotvorite remember me cookie
Line 18: Line 18:
 Pristupom na web stranicu, može se vidjeti forma za upload slike prikazana na slici 1. Pristupom na web stranicu, može se vidjeti forma za upload slike prikazana na slici 1.
  
-{{multistage:slika1.png}}+{{  multistage:slika1.png  }}
  
-Ostali resursi stranice su nedostupni, jer je potrebno ulogirati se prvo kako bi im se pristupilo.+Ostali resursi stranice su nedostupni, jer se prvo treba prijaviti (login) kako bi im se pristupilo.
  
 U dostupnom izvornom kodu, pod resources/views/upload.blade.php dostupan je izvorni kod stranice na slici 1. Izvorni kod prikazan je na slici 2. U dostupnom izvornom kodu, pod resources/views/upload.blade.php dostupan je izvorni kod stranice na slici 1. Izvorni kod prikazan je na slici 2.
  
  
-{{multistage:slika2.png}}+{{  multistage:slika2.png  }}
  
-Ovdje se vidi da se koristi funkcionalnost resize. Kako bi se pronašla implementacija ove funkcionalnosti, mogu se pretražiti svi fileovi sa stringom „resize“, što vraća file „imageController.php“, koji se nalazi na putanji ./app/http/Controllers. Prikazan je na slici 3.+Ovdje se vidi da se koristi funkcionalnost "resize". Kako bi se pronašla implementacija ove funkcionalnosti, može se potražiti stringom „resize“ u svim datotekamakoji će biti pronađen u datoteci „imageController.php“, koja se nalazi na putanji ./app/http/Controllers. Sadržaj datoteke je prikazan na slici 3.
  
-{{multistage:slika3.png}}+{{  multistage:slika3.png  }}
  
-Ovdje se može uočiti da se koristi alat imagemagick u PHP metodi process, koja pokreće i izvršava naredbe u novoj ljusci. Ovo izgleda kao komad koda koji bi potencijalno mogao biti ranjiv.+Ovdje se može uočiti da se koristi alat "imagemagicku PHP metodi "process", koja pokreće i izvršava naredbe u novoj ljusci. Ovo izgleda kao dio koda koji bi potencijalno mogao biti ranjiv.
  
-Kako bi se sakupilo više informacija o imagemagick alatu koji se koristi, može se pogledati Dockerfile prikazan na slici 4.+Kako bi se sakupilo više informacija o alatu imagemagick, može se pogledati Dockerfile prikazan na slici 4.
  
-{{multistage:slika4.png}}+{{  multistage:slika4.png  }}
  
-Ovdje je važno uočiti 6. liniju +Ovdje je važno uočiti 6. liniju:
 <code> <code>
 ENV IMAGEMAGICK_VERSION=7.1.0-49 ENV IMAGEMAGICK_VERSION=7.1.0-49
Line 43: Line 43:
 Koja označava da je verzija alata 7.1.0-49. Koja označava da je verzija alata 7.1.0-49.
  
-Pretraživanjem upita „ImageMagick 7.1 0 49 exploit“ putem interneta, može se pronaći da postoji CVE-2022-44268 ranjivost - Arbitrary File Read za ovu verziju alata. Za ovu ranjivost postoji već više gotovih Proof of Concept (PoC) materijala koji se mogu koristiti, u ovom primjeru će se koristiti sljedeći:+Pretraživanjem upita „ImageMagick 7.1 0 49 exploit“ putem Interneta, može se pronaći da postoji ranjivost "CVE-2022-44268 - Arbitrary File Read za ovu verziju alata". Za ovu ranjivost postoji već više gotovih Proof of Concept (PoC) materijala koji se mogu koristiti, u ovom primjeru će se koristiti sljedeći:
 <code> <code>
 https://github.com/Sybil-Scan/imagemagick-lfi-poc https://github.com/Sybil-Scan/imagemagick-lfi-poc
 </code> </code>
-Na stranici su dostupna uputstva za korištenje. Nakon preuzimanja projekta i instalacije svih potrebnih paketa, generiranje payload png slike koja čita file „/etc/passwd“ se može pokrenuti naredbom:+Na stranici su dostupna uputstva za korištenje. Nakon preuzimanja projekta i instalacije svih potrebnih paketa, generiranje payload PNG slike koja čita file „/etc/passwd“ se može pokrenuti naredbom:
 <code> <code>
 python3 generate.py -f "/etc/passwd" -o exploit.png python3 generate.py -f "/etc/passwd" -o exploit.png
Line 54: Line 54:
 Nakon uploada slike exploit.png, od stranice se dobiva odgovor na kojemu se navodi putanja do slike nad kojom se pokrenula naredba resize, prikazano na slici 5. Nakon uploada slike exploit.png, od stranice se dobiva odgovor na kojemu se navodi putanja do slike nad kojom se pokrenula naredba resize, prikazano na slici 5.
  
-{{multistage:slika5.png}}+{{  multistage:slika5.png  }}
  
 Pristupom putanji za sliku nad kojom se izvršila naredba resize alatom imagemagick, može se preuzeti prikazana slika. Pristupom putanji za sliku nad kojom se izvršila naredba resize alatom imagemagick, može se preuzeti prikazana slika.
-Nad preuzetom slikom se pokreće (Linux) naredba+Nad preuzetom slikom se pokreće (Linux) naredba:
 <code> <code>
 identify -verbose preuzetaSlika.png identify -verbose preuzetaSlika.png
Line 63: Line 63:
 Pokretanjem ove naredbe, u polju „Raw profile type“ bi se trebao nalaziti sadržaj ciljane datoteke payloada - /etc/passwd u heksadecimalnom zapisu. Ovo je prikazano na slici 6. Pokretanjem ove naredbe, u polju „Raw profile type“ bi se trebao nalaziti sadržaj ciljane datoteke payloada - /etc/passwd u heksadecimalnom zapisu. Ovo je prikazano na slici 6.
  
-{{multistage:slika6.png}}+{{  multistage:slika6.png  }}
  
-Kako bi dobili sadržaj datoteke u čitljivom obliku iz heksadecimalnog zapisa u polju, sadržaj se jednostavno može kopirati (počevši od 726f6… ) u CyberChef i dekodirati opcijom „From Hex“ ili se sadržaj može dekodirati u Pythonu korištenjem naredbe:+Kako bi dobili sadržaj datoteke u čitljivom obliku iz heksadecimalnog zapisa u polju, sadržaj se jednostavno može kopirati (počevši od 726f6… ) u CyberChef i dekodirati opcijom „From Hex“ ili se sadržaj može dekodirati u Pythonu korištenjem naredbe:
 <code> <code>
 print(bytes.fromhex("<hex sadržaj iz polja>").decode("utf-8")) print(bytes.fromhex("<hex sadržaj iz polja>").decode("utf-8"))
Line 72: Line 72:
 Nakon dekodiranja, dobiva se sadržaj datoteke /etc/passwd u čitljivom obliku, što je prikazano na slici 7. Nakon dekodiranja, dobiva se sadržaj datoteke /etc/passwd u čitljivom obliku, što je prikazano na slici 7.
  
-{{multistage:slika7.png}}+{{  multistage:slika7.png  }}
  
 Ovime je dokazano da ovaj napad radi i da se može uspješno iskoristiti za čitanje sadržaja različitih datoteka sa servera.  Ovime je dokazano da ovaj napad radi i da se može uspješno iskoristiti za čitanje sadržaja različitih datoteka sa servera. 
Line 78: Line 78:
 Pokušaj čitanja datoteke /flag.txt neće biti moguć – pojavit će se server error, jer u Dockerfileu flag.txt ima postavljene dozvole na read only samo za vlasnika datoteke, koji je „www-data“, a korisnik koji je pridružen procesu koji izvršava naredbe ImageMagick alata je „magick“. Relevantne naredbe u Dockerfileu su prikazane na slici 8. Pokušaj čitanja datoteke /flag.txt neće biti moguć – pojavit će se server error, jer u Dockerfileu flag.txt ima postavljene dozvole na read only samo za vlasnika datoteke, koji je „www-data“, a korisnik koji je pridružen procesu koji izvršava naredbe ImageMagick alata je „magick“. Relevantne naredbe u Dockerfileu su prikazane na slici 8.
  
 +{{  multistage:slika8.png  }}
  
 +Može se zaključiti da je potrebno pročitati neku drugu datoteku koja će sadržavati podatke koji će omogućiti pristup stranici. Pregledom daljnjih naredbi prikazanih na slici 9. može se vidjeti da se koristi datoteka "database.sql" za stvaranje druge datoteke "database.sqlite" u kojoj su vjerojatno definirani inicijalni korisnici sustava, kao npr. "admin".
  
-{{multistage:slika8.png}} +{{  multistage:slika9.png  }}
-Može se zaključiti da je potrebno pročitati neki drugi file koji će sadržavati podatke koji će omogućiti pristup stranici. Pregledom daljnjih naredbi prikazanih na slici 9. može se vidjeti da se koristi datoteka database.sql za stvaranje druge datoteke database.sqlite u kojoj su vjerojatno definirani inicijalni korisnici sustava, kao admin.+
  
 +Provjerom sadržaja datoteke "database.sql", ova pretpostavka se može i potvrditi, te se također može i uočiti da u bazi postoji i zapis „remember_token“, čija je vrijednost cenzurirana. Ovo je prikazano na slici 10.
  
  
-{{multistage:slika9.png}}+{{  multistage:slika10.png  }}
  
-Provjerom sadržaja datoteke database.sql, ova pretpostavka se može i potvrditi, te se također može i uočiti da u bazi postoji i zapis „remember_token“, čija je vrijednost cenzurirana. Ovo je prikazano na slici 10. +Kako bi se pročitao remember_token, potrebno je dohvatiti datoteku /var/www/database.sqlite, za koju se payload može generirati naredbom:
- +
- +
-{{multistage:slika10.png}} +
- +
-Kako bi se pročitao remember_token, potrebno je dohvatiti datoteku /var/www/database.sqlite, za koju se payload može generirati naredbom +
 <code> <code>
 python3 generate.py -f "/var/www/database.sqlite" -o exploit.png python3 generate.py -f "/var/www/database.sqlite" -o exploit.png
 </code> </code>
  
-Postupak se ponavlja kao pri dohvatu datoteke /etc/passwd, ali pošto je sadržaj datoteke database.sqlite znatno veći, on neće odmah biti prikazan korištenjem naredbe +Postupak se ponavlja kao pri dohvatu datoteke /etc/passwd, ali pošto je sadržaj datoteke database.sqlite znatno veći, on neće odmah biti prikazan korištenjem naredbe:
  
 <code> <code>
Line 104: Line 100:
 </code> </code>
  
-Nego je potrebno extractati sadržaj polja Raw Profile Type u drugu datoteku.  To se može napraviti korištenjem alata ExifTool pomoću naredbe:+Nego je potrebno izlučiti (engl. extract) sadržaj polja "Raw Profile Typeu drugu datoteku. To se može napraviti korištenjem alata ExifToolpomoću naredbe:
 <code> <code>
 exiftool -b -RawProfileTypeSqlite preuzetaSlika.png > extracted_profile.bin exiftool -b -RawProfileTypeSqlite preuzetaSlika.png > extracted_profile.bin
 </code> </code>
  
-Kako bi se extractani sadržaj uspješno konvertirao, potrebno je izbrisati početak zapisa u datoteci, što se može jednostavno napraviti alatom HxD Hex Editor. Dio početka datoteke koji treba izbrisati prikazan je na slici 11.+Kako bi se izlučeni sadržaj uspješno konvertirao, potrebno je izbrisati početak zapisa u datoteci, što se može jednostavno napraviti alatom HxD Hex Editor. Dio početka datoteke koji treba izbrisati prikazan je na slici 11.
  
  
-{{multistage:slika11.png}}+{{  multistage:slika11.png  }}
  
-Sad se ovaj uređeni file može uploadati na CyberChef, dekodirati opcijom „From Hex“ i onda se dekodirani ispis može preuzeti kao novi file koji se može pohraniti s nastavkom .sqlite. +Sad se ova uređena datoteka može uploadati na CyberChef, dekodirati opcijom „From Hex“ i onda se dekodirani ispis može preuzeti kao nova datoteka koja se može pohraniti s nastavkom .sqlite. 
-Ovaj dekodirani file se onda može ili lokalno analizirati nekim SQLite browserom / viewerom ili se može koristiti neka online verzija. Pri analizi ovog filea SQLite viewerom, može se uspješno identificirati remember_token od korisnika admin. Ovo je prikazano na slici 12.+Ova dekodirana datoteka se onda može ili lokalno analizirati nekim SQLite browserom / viewerom ili se može koristiti neka online verzija. Pri analizi ove datoteke SQLite viewerom, može se uspješno identificirati remember_token od korisnika admin. Ovo je prikazano na slici 12.
  
-{{multistage:slika12.png}}+{{  multistage:slika12.png  }}
  
 U Dockerfileu se nalazi još jedna važna naredba prikazana na slici 13. U Dockerfileu se nalazi još jedna važna naredba prikazana na slici 13.
  
-{{multistage:slika13.png}}+{{  multistage:slika13.png  }}
 Naredba  Naredba 
 <code> <code>
Line 127: Line 123:
 </code> </code>
  
-Je naredba Laravela za generiranje nasumičnog ključa aplikacije - APP_KEY. Taj ključ se koristi za korisničke sesije i pojedine enkripcije, čime bi mogao biti koristan za pristup sustavu. Nakon što je ključ nasumično generiran prethodno spomenutom naredbom, on se pohranjuje u .env datoteku u kojoj su pohranjene pojedine informacije, postavke i varijable pokrenute aplikacije. Puna putanja ove datoteke je :+je naredba Laravela za generiranje nasumičnog ključa aplikacije - APP_KEY. Taj ključ se koristi za korisničke sesije i pojedine enkripcije, čime bi mogao biti koristan za pristup sustavu. Nakon što je ključ nasumično generiran prethodno spomenutom naredbom, on se pohranjuje u ".envdatoteku u kojoj su pohranjene pojedine informacije, postavke i varijable pokrenute aplikacije. Puna putanja ove datoteke je:
 <code> <code>
 /var/www/html/.env /var/www/html/.env
 </code> </code>
-Još jednom se ponavlja postupak za čitanje ove datoteke, prvo generacijom payloada naredbom+Još jednom se ponavlja postupak za čitanje ove datoteke, prvo generacijom payloada naredbom:
 <code> <code>
 python3 generate.py -f "/var/www/html/.env" -o exploit.png python3 generate.py -f "/var/www/html/.env" -o exploit.png
 </code> </code>
-Nakon čega je dovoljno slijediti isti postupak koji se koristio i pri dohvatu datoteke /etc/passwd, pruzimanjem „resize-ane“ slike sa servera i ispisom hex vrijednosti korištenjem naredbe+Nakon čega je dovoljno slijediti isti postupak koji se koristio i pri dohvatu datoteke /etc/passwd, preuzimanjem „resize-ane“ slike sa servera i ispisom hex vrijednosti korištenjem naredbe:
  
 <code> <code>
Line 144: Line 140:
  
  
-{{multistage:slika14.png}}+{{  multistage:slika14.png  }}
 Vidi se da je APP_KEY u base64 zapisu, što se može jednostavno dešifrirati. Vidi se da je APP_KEY u base64 zapisu, što se može jednostavno dešifrirati.
  
Line 152: Line 148:
 </code> </code>
  
-Generiranje kolačića admina+===Generiranje kolačića admina===
  
 Za generiranje remember me kolačića admin korisnika, potrebni su APP_KEY aplikacije, radi enkripcije i remember_token korisnika admin. Obje vrijednosti su poznate iz preuzetih datoteka .env i database.sqlite. Sljedeći korak je samo generirati  remember me kolačića admin korisnika, postaviti ga pri pristupu aplikaciji i pročitati flag s dostupnim administratorskim pristupom stranici. Za generiranje remember me kolačića admin korisnika, potrebni su APP_KEY aplikacije, radi enkripcije i remember_token korisnika admin. Obje vrijednosti su poznate iz preuzetih datoteka .env i database.sqlite. Sljedeći korak je samo generirati  remember me kolačića admin korisnika, postaviti ga pri pristupu aplikaciji i pročitati flag s dostupnim administratorskim pristupom stranici.
Line 158: Line 154:
 Jedan jednostavan postupak kako generirati isti remember me kolačić, kao što je na instanci zadatka koja je na platformi, je da se lokalno pokrene cijeli sustav čiji source kod je dostupan, ali s istim vrijednostima APP_KEY I remember_token korisnika admin. Također može se i promijeniti lozinka korisnika admin, kako bi se moglo ulogirati u lokalnu instancu s tim korisnikom i dobiti kolačić. Sustav je najjednostavnije pokrenuti kao docker kontejner, korištenjem već dostupnog Dockerfilea. Jedan jednostavan postupak kako generirati isti remember me kolačić, kao što je na instanci zadatka koja je na platformi, je da se lokalno pokrene cijeli sustav čiji source kod je dostupan, ali s istim vrijednostima APP_KEY I remember_token korisnika admin. Također može se i promijeniti lozinka korisnika admin, kako bi se moglo ulogirati u lokalnu instancu s tim korisnikom i dobiti kolačić. Sustav je najjednostavnije pokrenuti kao docker kontejner, korištenjem već dostupnog Dockerfilea.
  
-Kako bi se namjestio APP_KEY na lokalnoj instanci da odgovara pročitanom APP_KEY-u s platforme, prvo se treba u Dockerfileu maknuti naredba +Kako bi se namjestio APP_KEY na lokalnoj instanci da odgovara pročitanom APP_KEY-u s platforme, prvo treba u Dockerfileu maknuti naredbu: 
  
 <code> <code>
Line 167: Line 163:
  
  
-{{multistage:slika15.png}}+{{  multistage:slika15.png  }}
  
 Nakon što su Dockerfile i .env file namješteni, potrebno je promijeniti database.sql file, te u njemu promijeniti remember_token u vrijednost pročitanu s platforme i promijeniti hash passworda, u hash passworda koji je poznat. Nakon što su Dockerfile i .env file namješteni, potrebno je promijeniti database.sql file, te u njemu promijeniti remember_token u vrijednost pročitanu s platforme i promijeniti hash passworda, u hash passworda koji je poznat.
-Trenutačno je vrijednost password neki bcrypt hash nepoznate vrijednosti, što se vidi po prefiksu $2y$. Može se napisati jednostavna PHP skripta koja će generirati bcrypt hash za lozinku admin, koja će se postavit u databse.sql korisniku admin. Primjer ovakve PHP skripte je:+Trenutačno je vrijednost password neki bcrypt hash nepoznate vrijednosti, što se vidi po prefiksu $2y$. Može se napisati jednostavna PHP skripta koja će generirati bcrypt hash za lozinku admin, koja će se postaviti u databse.sql korisniku admin. Primjer ovakve PHP skripte je:
 <code> <code>
 <?php <?php
Line 178: Line 174:
 </code> </code>
  
-Pokretanjem ove skripte naredbom +Pokretanjem ove skripte naredbom:
 <code> <code>
 php skripta.php php skripta.php
 </code> </code>
-Bit će ispisan bcrypt hash, koji se onda zajedno s pročitanom remember_token vrijednošću može upisati u database.sq, što je prikazano na slici 16.+bit će ispisan bcrypt hash, koji se onda zajedno s pročitanom remember_token vrijednošću može upisati u database.sq, što je prikazano na slici 16.
  
  
-{{multistage:slika16.png}}+{{  multistage:slika16.png  }}
  
-Sada je je potrebno sagraditi docker kontejner s promijenjenim izvornim kodom naredbom+Sada je je potrebno sagraditi docker kontejner s promijenjenim izvornim kodom naredbom:
 (ovo može potrajati duže) (ovo može potrajati duže)
 <code> <code>
Line 199: Line 195:
  
 Sada bi na putanji localhost:3000 trebala biti dostupna lokalna instanca projekta. Sada bi na putanji localhost:3000 trebala biti dostupna lokalna instanca projekta.
-Odlaskom na +Odlaskom na:
 <code> <code>
 Localhost:3000/login Localhost:3000/login
Line 205: Line 201:
 Može se ulogirati s e-mailom iz baze i postavljenom lozinkom. Potrebno je odabrati opciju „Remember me“ (slika 17). Može se ulogirati s e-mailom iz baze i postavljenom lozinkom. Potrebno je odabrati opciju „Remember me“ (slika 17).
  
-{{multistage:slika17.png}}+{{  multistage:slika17.png  }}
  
- Nakon uspješne prijave, bit će generiran remember me kolačić, kojemu se jednostavno može pristupiti koristeći Internet preglednik. +Nakon uspješne prijave, bit će generiran remember me kolačić, kojemu se jednostavno može pristupiti koristeći internetski preglednik. 
-Otvaranjem razvojnih alata internet preglednika (F12), dostupan je prozorčić „Application“ u kojemu je zapisana vrijednost remember me kolačića. Ovo je prikazano na slici 18.+Otvaranjem razvojnih alata internetskog preglednika (F12), dostupan je prozorčić „Application“ u kojemu je zapisana vrijednost remember me kolačića. Ovo je prikazano na slici 18.
  
  
-{{multistage:slika18.png}}+{{  multistage:slika18.png  }}
  
 Potrebno je samo prekopirati ime i vrijednost remember me kolačića (remember_web_59ba… označen plavom bojom na slici 18.) s lokalne instance na instancu zadatka na platformi. U implementaciji zadatka remember me kolačić ne sadržava hash lozinke, što se nekada zna koristiti, pa je zato ovaj pristup moguć, inače bi bilo potrebno još naknadno mijenjati kolačić. Potrebno je samo prekopirati ime i vrijednost remember me kolačića (remember_web_59ba… označen plavom bojom na slici 18.) s lokalne instance na instancu zadatka na platformi. U implementaciji zadatka remember me kolačić ne sadržava hash lozinke, što se nekada zna koristiti, pa je zato ovaj pristup moguć, inače bi bilo potrebno još naknadno mijenjati kolačić.
  
-Nakon što je kolačić dodan na instancu zadatka na platformi, odlaskom na putanju+Nakon što je kolačić dodan na instancu zadatka na platformi, odlaskom na putanju:
 <code> <code>
 http://chal.platforma.hacknite.hr:13008/home http://chal.platforma.hacknite.hr:13008/home
Line 222: Line 218:
 Bit će ispisano da je prijava uspješna kao korisnik admin. Prikazano na slici 19. Bit će ispisano da je prijava uspješna kao korisnik admin. Prikazano na slici 19.
  
-{{multistage:slika19.png}}+{{  multistage:slika19.png  }}
  
 Sada se flag može dohvatiti pristupom putanji Sada se flag može dohvatiti pristupom putanji
Line 231: Line 227:
  
  
-{{multistage:slika20.png}}+{{  multistage:slika20.png  }}
  
multistage.1739201948.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki