| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| argument_injection [2025/02/10 15:42] – kresimir | argument_injection [2025/12/01 11:40] (current) – external edit 127.0.0.1 |
|---|
| ====Argument injection==== | ====Argument injection==== |
| |
| Argument injection je podtip command injection napada. Razlikuje se u tome što je u argument injectionu, injection dostupan u samo jedan argument naredbe, dok se u command injectionu kod može često ubacit usred naredbe. Dok se u klasičnom command injectionu često mogu dodavati i mijenjati argumenti naredbe ili čak dodavati potpuno nove naredbe vještim korištenjem komandnih operatora, prostor za „manevriranje“ u argument injectionu je znatno manji i više ovisi o kontekstu same naredbe u čiji se argument vrši argument injection. | "Argument injection" je podvrsta "command injection" napada. Razlikuje se u tome što se u argument injectionu, "napad" može ugraditi samo u jedan argument naredbe, dok se u command injectionu kôd može ubaciti i usred naredbe. Dok se u klasičnom command injectionu često mogu dodavati i mijenjati argumenti naredbe ili čak dodavati potpuno nove naredbe vještim korištenjem komandnih operatora, prostor za „manevriranje“ u argument injectionu je znatno manji i više ovisi o kontekstu same naredbe u čiji se argument vrši argument injection. |
| |
| ===PRIMJER -Zadatak s Hacknite platforme – Flask GCC=== | ===PRIMJER -Zadatak s Hacknite platforme – Flask GCC=== |
| |
| |
| Pregledom stranice i izvornog koda zadatka može se primijetiti da je namjena web aplikacije kompiliranje učitanog (eng. Uploaded) C koda u izvršnu datoteku korištenjem GCC kompajlera. Učitana datoteka se pohrani u direktorij na serverskoj strani, ime datoteke se zapamti, nakon čega server korištenjem subprocess modula pokreće naredbe za kompajliranje učitane datoteke u novom procesu korištenjem shella. Naredba koja se pokreće se sastoji od pozivanja GCC-a s argumentima i spremljenim imenom učitane datoteke. Nad imenom učitane datoteke se vrši provjera završava li s ekstenzijom c (.c). Prikazano na slici 1. | Pregledom stranice i izvornog kôda zadatka može se primijetiti da je namjena web aplikacije kompiliranje učitanog (eng. Uploaded) C koda u izvršnu datoteku korištenjem GCC kompajlera. Učitana datoteka se pohrani u direktorij na serverskoj strani, ime datoteke se zapamti, nakon čega server korištenjem subprocess modula pokreće naredbe za kompajliranje učitane datoteke u novom procesu korištenjem ljuske (eng. Shell). Naredba koja se pokreće se sastoji od pozivanja GCC-a s argumentima i spremljenim imenom učitane datoteke. Provjerava se završava li ime učitane datoteke s ekstenzijom ".c". Prikazano na slici 1. |
| |
| {{argumentinjectionv2:slika1.png}} | {{argumentinjectionv2:slika1.png}} |
| |
| |
| Nakon provjere, učitana datoteka se pohranjuje, a ime datoteke s putanjom se prvo razdjeljuje u listu i onda direktno šalje kao argument u pozivanje subprocess modula za izvršavanje naredbe kompilacije. Ovo se može vidjeti praćenjem korištenja varijable „sanitized“ prikazano na slici 2. | Nakon provjere, učitana datoteka se pohranjuje, a ime datoteke, koje uključuje cijelu putanju, se prvo razdjeljuje u listu i onda izravno šalje kao argument u pozivanje subprocess modula za izvršavanje naredbe kompilacije. Ovo se može vidjeti praćenjem korištenja varijable „sanitized“ prikazano na slici 2. |
| |
| {{argumentinjectionv2:slika2.png}} | {{argumentinjectionv2:slika2.png}} |
| |
| Ovime se efektivno ime učitane datoteke koristi kao dio naredbe, te se može iskoristiti za command injection. Ovaj command injection ima ograničenje, može samo promijeniti izvršavanje naredbe u kojoj je injekcija, naredba pozivanja GCC prevoditelja, ne može se ubaciti druga arbitrarna bash naredba korištenjem uobičajenih bash operatora kao što su ‘;’, ‘&’, ‘|’, .. | Ovaj command injection ima ograničenje. Ne može se, umjesto pozivanja GCC prevoditelja, ubaciti neka arbitrarna bash naredba korištenjem uobičajenih bash operatora kao što su ‘;’, ‘&’, ‘|’ …, nego će se uvijek pozivati GCC prevoditelj. Dakle, napadač može samo pokušati na lukav način u ime datoteke ugraditi naredbu koju želi da se izvrši (command injection). |
| Kako bi se uspješno poslala datoteka s injektiranom komandom, ime datoteke mora uspješno proći kroz filter koju funkcija „allowed_file“ implementira. Kako je provjera samo završava li ime datoteke s .c, ime naše datoteke treba nakon injektirane naredbe završavati s „.c“. | Kako bi se uspješno poslalo ime datoteke koje sadrži injektiranu naredbu, ime datoteke mora uspješno proći kroz filter koju implementira funkcija „allowed_file“. Kako se provjerava samo završava li ime datoteke s “.c”, ime naše datoteke treba nakon injektirane naredbe završavati s „.c“. Da bi se command injection u naredbi pozivanja GCC-a efektivno iskoristio, trebaju se istražiti funkcionalnosti i zastavice GCC-a, kako bi se pronašao način za iskorištavanje pronađene ranjivosti, tj. da se „nagovori“ GCC da izvrši naredbu koju napadač želi. GCC ima funkcionalnost pozivanja subkomandi unutar wrapper programa, korištenjem -wrapper zastavice. Ova funkcionalnost se može iskoristiti kako bi se pokrenuo bash process i dala mu se naredba koju napadač želi izvršiti. |
| Da bi se command injection u naredbi pozivanja GCC-a efektivno iskoristio, trebaju se istražiti funkcionalnosti i zastavice GCC-a, kako bi se pronašao način za iskorištavanje pronađene ranjivosti. GCC ima funkcionalnost pozivanja subkomandi unutar wrapper programa, korištenjem -wrapper zastavice. Ova funkcionalnost se može iskoristiti kako bi se pokrenuo bash process i dala mu se naredba koja se treba izvršiti. | |
| |
| Potrebno je i analizirati kod kako bi se pronašlo može li se nekako izvući rezultat pokretanja injektiranje naredbe preko sučelja aplikacije, ako ne onda može li se izvući preko weba ili može li se reverse shell pokrenuti, kako bi se znalo kako konstruirati injektiranu naredbu. Analizom izvornog koda prikazanom na slici 2. , može se uočiti da će se rezultat izvršavanje subprocess procesa ispisati kao paragraf na vraćenoj stranici. | Potrebno je i analizirati kôd kako bi se pronašlo može li napadač nekako dobiti rezultat pokretanja injektiranje naredbe preko sučelja aplikacije. Ako ne može, onda treba provjeriti može li se izvući preko weba ili može li se pokrenuti reverse shell, kako bi se ispravnoi oblikovala injektirana naredba. Analizom izvornog kôda prikazanom na slici 2. , može se uočiti da će se rezultat izvršavanja subprocessa ispisati kao paragraf na vraćenoj stranici. |
| |
| {{argumentinjectionv2:slika3.png}} | {{argumentinjectionv2:slika3.png}} |
| |
| |
| Kada je poznato da se command injection može izvršiti i vidjet rezultat izvođenja naredbe na sučelju aplikacije, može se prvo konstruirati payload za pokretanje naredbe „ls“. | Kada je poznato da se command injection može izvršiti i vidjeti rezultat izvođenja naredbe na sučelju aplikacije, može se prvo konstruirati tekst payloada za pokretanje naredbe „ls“. |
| Prvo se generira neka vrlo jednostavna .c datoteka čiji kod nije bitan, te joj se ime odmah promijeni u payload, ili se poslan zahtjev s normalnim imenom datoteke presretne burp suiteovim presretačem (eng. Proxy) i tamo promjeni. | Prvo se generira neka vrlo jednostavna .c datoteka čiji kod nije bitan, te joj se ime odmah promijeni u tekst payloada, ili se poslan zahtjev s normalnim imenom datoteke presretne burp suiteovim presretačem (eng. Proxy) i tamo promjeni. |
| |
| Payload ime datoteke za pokretanje ls naredbe, uz zaobilaženje filtera glasi: | Payload ime datoteke za pokretanje ls naredbe, uz zaobilaženje filtera glasi: |
| {{argumentinjectionv2:slika4.png}} | {{argumentinjectionv2:slika4.png}} |
| |
| Slanjem ovog zahtjeva, na stranici se ispisuju sve datoteke u trenutnom direktoriju, gdje se vidi da je prisutna i datoteka flag.txt. Prikazano na slici 5. | Slanjem ovog zahtjeva, na stranici se ispisuju sve datoteke u trenutnom direktoriju, gdje se vidi da je prisutna i datoteka koju napadač traži, npr. flag.txt. Prikazano na slici 5. |
| |
| {{argumentinjectionv2:slika5.png}} | {{argumentinjectionv2:slika5.png}} |
| |
| Kada je poznato da se flag.txt nalazi u trenutnom direktoriju, potrebno je samo dohvatiti sadržaj flag.txt datoteke, što se može učiniti bash naredbom „cat“. | Kada je poznato da se flag.txt nalazi u trenutnom direktoriju, potrebno je samo dohvatiti sadržaj flag.txt datoteke, što se može učiniti bash naredbom „cat“. |
| No ovdje se nalazi novi problem, svaka injektirana naredba koja se u izvršava, se šalje unutar -wrapper argumenta novo pokrenutom procesu bash preko -c argumenta. Sve naredbe koje se sastoje od jedne riječi se mogu normalno ovdje navesti i izvršiti, no čim se naredba sastoji od više riječi, pri razdjeljivanju imena i putanje datoteke prije slanja na pokretanje subprocess modula, razdvoji se u listu na svim razmacima. Nakon toga samo prva riječ naredba bude proslijeđena kao argument pozvanom bashu preko -c argumenta. Zato se naredba ls normalno izvršava, a naredba cat flag.txt, bi poslala samo „cat“ kao -c argument pozvanom bashu. | No ovdje se nalazi novi problem, svaka injektirana naredba koja se izvršava, se šalje unutar -wrapper argumenta novo pokrenutom procesu bash preko -c argumenta. Sve naredbe koje se sastoje od jedne riječi se mogu normalno ovdje navesti i izvršiti, no čim se naredba sastoji od više riječi, pri razdjeljivanju imena i putanje datoteke prije slanja na pokretanje subprocess modula, razdvoji se u listu na svim razmacima. Nakon toga samo prva riječ naredbe bude proslijeđena kao argument pozvanom bashu preko -c argumenta. Zato se naredba ls normalno izvršava, a naredba cat flag.txt, bi poslala samo „cat“ kao -c argument pozvanom bashu. |
| Potrebno je pronaći način da se znakovima definira razmak ili odjeljivanje dviju riječi u naredbi koja je izvršena u pozvanom bashu preko -c argumenta, bez korištenja samog razmaka. Za to postoji prikladno rješenje, svaki bash process standardno ima definiranu IFS (Internal Field Separator), varijablu, koju shell koristi kako bi znao gdje razdijeliti riječi ili polja naredbe. Pokretanjem naredbe | Potrebno je pronaći način da se znakovima definira razmak ili odjeljivanje dviju riječi u naredbi koja je izvršena u pozvanom bashu preko -c argumenta, bez korištenja samog razmaka. Za to postoji prikladno rješenje, svaki bash process standardno ima definiranu IFS (Internal Field Separator), varijablu, koju shell koristi kako bi znao gdje razdijeliti riječi ili polja naredbe. Pokretanjem naredbe |
| <code> | <code> |
| </code> | </code> |
| |
| U bashu, može se vidjeti koji su znakovi definirani kao razdjeljivači. Oni su uobičajeno space, tab i newline. Da bi zamijenili ulogu razmaka u naredbi „cat flag.txt“, a održali namjenu razmaka, možemo direktno dohvatiti vrijednost definirane IFS varijable u kontekstu bash procesa. Da bi se to postiglo, razmak u naredbi „cat flag.txt“ se treba zamijeniti dohvaćanjem vrijednosti te varijable – „${IFS}“ kako bi imali naredbu ekvivalentnog značenja, ali drukčije zapisanu – „cat ${IFS}flag.txt“. Koristeći ovaj pristup, potpuna naredba za dohvaćanje flaga je: | u bashu, može se vidjeti koji su znakovi definirani kao razdjeljivači. Oni su uobičajeno space, tab i newline. Da bi u naredbi „cat flag.txt“ imali razmak, ali da ga filter ne vidi, možemo izravno dohvatiti vrijednost definirane IFS varijable u kontekstu (trenutku izvođenja) bash procesa. Da bi se to postiglo, razmak u naredbi „cat flag.txt“ se treba zamijeniti dohvaćanjem vrijednosti te varijable – „${IFS}“ kako bi imali naredbu ekvivalentnog značenja, ali drukčije zapisanu – „cat${IFS}flag.txt“. Koristeći ovaj pristup, potpuna naredba za dohvaćanje flaga je: |
| |
| <code> | <code> |