length-extension-attack
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| length-extension-attack [2023/11/29 09:26] – lss | length-extension-attack [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====Length extension attack==== | ||
| + | |||
| Hashevi koji koriste Merkle-Damgård konstrukciju (npr. [[MD5]], [[SHA|SHA1]] i [[SHA|SHA2]]) imaju sljedeće svojstvo: | Hashevi koji koriste Merkle-Damgård konstrukciju (npr. [[MD5]], [[SHA|SHA1]] i [[SHA|SHA2]]) imaju sljedeće svojstvo: | ||
| ako nam je poznat // | ako nam je poznat // | ||
| Line 5: | Line 7: | ||
| To je moguće zato što Merkle-Damgård konstrukcija pri hashiranju dijeli sadržaj u blokove. Zato je moguće iz hasha rekonstruirati interno stanje hash funkcije i jednostavno nadodati sadržaj //M2// (i nadopunu) kao sljedeći blok. | To je moguće zato što Merkle-Damgård konstrukcija pri hashiranju dijeli sadržaj u blokove. Zato je moguće iz hasha rekonstruirati interno stanje hash funkcije i jednostavno nadodati sadržaj //M2// (i nadopunu) kao sljedeći blok. | ||
| - | To svojstvo može predstavljati ranjivost, ako se taj hash koristi kao MAC [link]. | + | To svojstvo može predstavljati ranjivost, ako se taj hash koristi kao [[MAC]]. |
| Zamislimo aplikaciju koja poslužuje datoteke koje korisnik zatraži, ali kako bi autentificirao korisnika prvo validira MAC. MAC kod bi se mogao izračunati na sljedeći način: | Zamislimo aplikaciju koja poslužuje datoteke koje korisnik zatraži, ali kako bi autentificirao korisnika prvo validira MAC. MAC kod bi se mogao izračunati na sljedeći način: | ||
| - | MD5(tajna_vrijednost + ime_datoteke) | + | //MD5(tajna_vrijednost + ime_datoteke)// |
| - | Ako je napadaču poznat jedan takav MAC, npr. MD5(tajna_vrijednost + datoteka1) i ako zna (ili može pogoditi) koliko je dug string tajna + datoteka1, tada | + | Ako je napadaču poznat jedan takav MAC, npr. //MD5(tajna_vrijednost + datoteka1)// i ako zna (ili može pogoditi) koliko je dug string |
| - | može generirati validnu MAC vrijednost MD5(tajna_vrijednost + datoteka1 + proizvoljni_sufiks), | + | može generirati validnu MAC vrijednost |
| tajna_vrijednost nije poznata! | tajna_vrijednost nije poznata! | ||
| - | Jedan od alata kojim se može izvesti ovakav napad je hash_extender [1] (https:// | + | Jedan od alata kojim se može izvesti ovakav napad je **hash_extender** [1]. |
| - | + | ||
| - | Primjer - hacknite digitalni potpis | + | |
| + | __**PRIMJER**__ - **Zadatak s Hacknite platforme - Digitalni potpis** | ||
| < | < | ||
| - | Stjepan je osmislio inovativan način autentifikacije. Umjesto lozinke, korisnici moraju učitati digitalno potpisanu datoteku koja dokazuje njihov identitet. Je li autentifikacija implementirana na siguran način? | + | Stjepan je osmislio inovativan način autentifikacije. Umjesto lozinke, korisnici moraju učitati digitalno |
| + | potpisanu datoteku koja dokazuje njihov identitet. Je li autentifikacija implementirana na siguran način? | ||
| - | Dostupna Vam je python skripta za generiranje datoteka i digitalno potpisana datoteka niskoprivilegiranog korisnika, ali ne i tajna lozinka koja se koristi za digitalno potpisivanje. | + | Dostupna Vam je python skripta za generiranje datoteka i digitalno potpisana datoteka niskoprivilegiranog |
| + | korisnika, ali ne i tajna lozinka koja se koristi za digitalno potpisivanje. | ||
| Hint: length extension attack | Hint: length extension attack | ||
| Line 35: | Line 38: | ||
| Proučimo skriptu gen_signed_dokument.py | Proučimo skriptu gen_signed_dokument.py | ||
| - | < | + | < |
| import sys | import sys | ||
| import hashlib | import hashlib | ||
| Line 61: | Line 64: | ||
| </ | </ | ||
| - | Iz koda vidimo da se MAC generira algoritmom MD5(secret+data), | + | Iz koda vidimo da se MAC generira algoritmom |
| - | Podaci za koje se generira MAC su ime korisnika i opcionalno tekst "can_read_flag" | + | Podaci za koje se generira MAC su ime korisnika i opcionalno tekst //can_read_flag// |
| - | Također nam je dostupan dokument niskoprivilegiranog korisnika test_dokument.txt. Na prvoj liniji se nalazi MAC, a na drugoj korisničko ime. | + | Također nam je dostupan dokument niskoprivilegiranog korisnika |
| Kada učitamo dokument, dobijemo poruku da trenutno nemamo nikakve privilegije u sustavu. | Kada učitamo dokument, dobijemo poruku da trenutno nemamo nikakve privilegije u sustavu. | ||
| - | *slika ovdje* | + | {{length_extension_1.png}} |
| - | Kada pokušamo jednostavno dodati tekst "can_read_flag" | + | Kada pokušamo jednostavno dodati tekst //can_read_flag// na kraj dokumenta dobijemo poruku |
| - | *slika ovdje* | + | {{length_extension_2.png}} |
| - | To se dogodilo zato što je u tom dokumentu valjani MAC za tekst "testni_korisnik", | + | To se dogodilo zato što je u tom dokumentu valjani MAC za tekst < |
| - | "testni_korisnik | + | < |
| - | | + | can_read_flag</ |
| - | Možemo zaključiti da trebamo generirati dokument koji ima u sebi ime korisnika, tekst "can_read_flag" | + | Možemo zaključiti da trebamo generirati dokument koji ima u sebi ime korisnika, tekst //can_read_flag// i validni MAC. |
| - | Budući da ne znamo tajnu vrijednost, ne možemo jednostavno izračunati valjani MAC, a budući da je tajna duga 32 znaka ne | + | Budući da ne znamo tajnu vrijednost, ne možemo jednostavno izračunati valjani MAC, a, budući da je tajna duga 32 znaka, ne možemo ju ni pogoditi. Međutim, imamo valjani MAC za tekst //testni_korisnik//, a poznata nam je i duljina tajne, pa možemo izvesti napad produljenjem. |
| - | možemo ju ni pogoditi. Međutim, imamo valjani MAC za tekst "testni_korisnik", a poznata nam je i duljina tajne, pa možemo izvesti | + | Koristimo alat //hash_extender// |
| - | napad produljenjem. | + | |
| - | + | ||
| - | Koristimo alat "hash_extender" | + | |
| < | < | ||
| can_read_flag" | can_read_flag" | ||
| - | U argument | + | U argument |
| - | , u argument append dodajemo tekst koji želimo nadodati na kraj datoteke (paziti da se treba dodati i newline!) te kao veličinu tajne stavljamo 32 (što smo isčitali iz koda). | + | , u argument append dodajemo tekst koji želimo nadodati na kraj datoteke (paziti da se treba dodati i newline!) te kao veličinu tajne stavljamo 32 (što smo iščitali iz koda). |
| - | Kao ispis programa dobili smo novogenerirani validni MAC te "hexdump" | + | Kao ispis programa dobili smo novogenerirani validni MAC te //hexdump// novog dokumenta. Osim teksta |
| - | < | + | {{hash_extender.png}} |
| - | S hex editorom kao što su HxD ili xxd tako možemo konstruirati novu datoteku s validnim MAC-om kao prvom linijom. | ||
| - | < | + | S hex editorom kao što su HxD ili xxd tako možemo konstruirati novu datoteku s validnim MAC-om kao prvom linijom. Slika prikazuje //hexdump// finalne datoteke. |
| + | |||
| + | {{length_extension_3.png}} | ||
| Kad učitamo datoteku dobijemo flag. | Kad učitamo datoteku dobijemo flag. | ||
| - | < | ||
| + | ===Izvori=== | ||
| + | |||
| + | [1] https:// | ||
length-extension-attack.1701250001.txt.gz · Last modified: 2025/12/01 11:40 (external edit)