User Tools

Site Tools


pages:blagajna

PRIMJER - Zadatak s Hacknite platforme - Blagajna

Postoje glasine da jedan proizvođač online blagajni ima backdoor u programu koji dopušta napadaču 
da dobije shell na serveru na kojem se blagajna pokreće. Možeš li ga otkriti i iskoristiti da pročitaš flag?

Na online servis se možeš spojiti naredbom:
  nc chal.platforma.hacknite.hr 13015 ako koristite Linux ili 
  telnet chal.platforma.hacknite.hr 13015 ako koristite Windows.

Hint: Global Offset Table . Entry za exit funkciju

Ovo je reversing zadatak u kojem treba naći način za pokretanje shella. Program korišten za reversing je Ghidra.

Pokretanjem programa, korisnika se pita za unos opcije 1 do 4.

Ponuđene opcije su: prijava blagajnika, ispis podataka o programu, početak unosa stavki te izlaz.

Prijava blagajnika uključuje unos naziva blagajnika te broj zaposlenika.

Ispis o programu ispisuje tekst s informacijama poput verzije, opcije plaćanja itd…

Opcija 3 nudi unos broja stavki te kroz iteriranje traži naziv, cijenu i količinu svake pojedine stavke.

Zadnja opcija jest izlaz iz programa.

Kako bi se riješio zadatak, najprije je potrebno dekompajlirati kôd pomoću ghidre i zatim pregledati dobivene funkcije.

Postavljenjem unutar main funkcije može se pronaći glavni switch odgovoran za petlju unosa opcija.

Svaka opcija poziva svoju zasebnu funkciju. Funkcija za opciju jedan je prikazana na sljedećoj slici.

Spremnik (engl. Buffer) u koji se upisuju podaci je dan kao argument “param1”. Naziv blagajnika unosi se u prvih 0x32 bajta, a na offsetu 0x38 od njegovog početka se unosi varijabla tipa long koja predstavlja broj zaposlenika.

Funkcija za opciju 2 je prikazana na sljedećoj slici.

Iako je funkcionalnost za vrijeme izvođenja programa naizgled bila samo ispis teksta, analizom funkcije vidi se naredba “if” koja pregledava je li broj na offsetu 38 prvog parametra veći od 100 te, ako je, se od adrese 0x404060 indeksira parametrom “param2” te upisuje podatak koji se nalazi na offsetu 38 prvog parametra. Pregledom main funkcije vidimo da je prvi parametar koji je proslijeđen ovoj funkciji isti kao i u prethodnoj, odnosno, upisuje se broj zaposlenika. Adresa 0x404060 pripada .got sekciji. To je sekcija koja sadrži pointere na funkcije dinamički povezanih datoteka, u ovom slučaju libc. Napadi uobičajeno, izmjenom nekih od podataka zapisanih u .got sekciji, promijene predviđeni tok programa. S obzirom na to da je cilj zadatka pokrenuti shell, očito je da se tok nekako mora izmijeniti u poziv system funkcije s argumentom za shell. Jedino što je preostalo jest otkriti koji podatak je drugi parametar funkcije za ispis podataka o programu. Pregledom main funkcije argument kojim se poziva funkcija za ispis ima naziv “local_b0” (sam naziv može varirati od analize do analize, bitno je da se prati gdje se ta varijabla koristi). Pregledom ostatka funkcije main može se pronaći odsječak kôda kojim se upisuje u tu varijablu.

Kôd kojim se upisuje u varijablu jest dio 3. opcije unutar glavne petlje odgovorne za unos broja stavki. Praćenjem toka programa vidi se da se nakon toga upisa nigdje drugdje ne izmijeni vrijednost unutar te varijable (unutar iste iteracije). Dakle, kada bi se unutar broja stavki upisala ispravna vrijednost, njome se mogu proizvoljno indeksirati adrese krečući od 0x404060 (s razmacima od 8 bajta) te upisati vrijednost broja zaposlenika na dobivenu adresu. Kako bi se pokrenuo shell, treba upisati takvu vrijednost adrese kojom se poziva system funkcija na neku od dostupnih dinamičkih funkcija (tj. one koje se koriste u normalnom toku programa), te kao prvi argument imati vrijednost adrese stringa kojom se pokreče shell. Uobičajeni argument kojim se pokreće shell jest “/bin/sh”.

Dakle, koraci potrebni za pokretanje shella su:

  1. Upisati adresu system funkcije u broj zaposlenika. To može biti vrijednost unutar .plt sekcije ili adresa unutar libc sekcije. Pošto je za unos adrese iz libc sekcije potrebna nekakava vrsta leaka njene adrese (koji nije dostupan) upisivat će se adresa iz .plt. Vrijednost adrese system iz .plt sekcije jest 0x401070 odnosno 4198512.
  2. Unijeti broj stavki za indeksiranje od adrese 0x404060. Ako se kao broj stavki unese 0, vrijednost će biti zapisana na 0x404060. Ako je uneseno 1, vrijednost će biti zapisana na 0x404060 + 1 * 8 (pointer aritmetika). Zbog funkcije koja se koristi za učitavanje. Na izračunatoj adresi se mora nalaziti funkcija koja se poziva unutar normalnog toka programa, te se ne smije pozivati prije završetka idućeg koraka (još je potrebno unijeti adresu stringa za shell) kako ne bi došlo do greške u izvođenju te izlaza iz programa. Funkcija koja će se prepisivati jest exit upravo iz tog razloga. Indeks potreban za exit jest adresa exit-a unutar .got sekcije oduzeto sa 0x404060 te sve podijeljeno s 8, tj. (0x404070-0x404060)/8 što je jednako vrijednosti 2. Funkcija exit se poziva odabirom opcije 4. Također, pregledom main funkcije vidljivo je da se ta funkcija poziva s argumentom “local_b0” što je broj stavki, što znači da će postavljanje argumenta biti napravljeno ponovnim upisom broja stavki.
  3. Unos argumenta za pokretanje shella. Argument kojim se pokreće shell može biti “/bin/sh”, “sh”, “/bin/bash” i slične varijacije. Traženjem (grep) stringa unutar programa za “sh” ispisuje adresu 0x004022a3 koji je dio teksta Gotovina/Cash.

Dakle, cijeli proces pokretanja shella jest unos opcije 1 s brojem zaposlenika postavljenim na 0x401070, unošenje vrijednost 2 za broj stavki unutar opcije 3, ispis podataka o programu kako bi se izmijenila adresa unutar got-a za funkciju exit, ponovni upis broja stavki, ali s vrijednošću 0x004022a3 (tj. 4203171) te na kraju pozivanje opcije 4 za završetak programa.

pages/blagajna.txt · Last modified: 2025/05/08 15:27 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki