Ranjivost prelijevanja međuspremnika

Sadržaj

U ovom ćemo vodiču govoriti o prelijevanju međuspremnika (Prepuštanje međuspremnika), greška koja postoji već duže vrijeme, događa se kada se podaci koji se kopiraju u memorijsko područje (koje je prethodno rezervirano) ne provjere ispravno, može se dogoditi da aplikacija radi ispravno ako korisnik umetne podatke sa odgovarajuće veličine, ali ako rezerviramo memoriju za 15 znakova, a korisnik umetne 20, to će utjecati na drugo područje memorije, koje može, ali i ne mora biti rezervirano.

To može učiniti da naš program visi, ali može biti i puno gore, korisnik sa zlonamjernim namjerama može iskoristiti ovu pogrešku i utjecati na rad aplikacije ili izvršiti proizvoljan kôd na računalu (obično će taj kôd otvoriti tumač naredbi ). Također, ako program radi s povišenim privilegijama, imamo ozbiljnu sigurnosnu grešku. Drugi napad koji može promijeniti rad aplikacije ili ubrizgati kod je XSS.

BilješkaPogubljenja koja ćete vidjeti u ovom vodiču izvedena su u 32-bitnom operativnom sustavu Ubuntu 16.04.

Pogledajmo a Jednostavan primjer C koda koji je ranjiv na ovaj napad, pri pokretanju programa moramo proslijediti parametar, aplikaciju očekujte da primite niz ne dulji od 15 znakova, ako je to očekivani niz, to će biti uspješan pristup, ako ne, bit će "odbijen". Kôd je prikazan ispod:

 #include #include #define password "Test" void test (char * str) {char buffer [15]; int n = 0; strcpy (međuspremnik, str); if (strcmp (međuspremnik, lozinka) == 0) {n = 1; } if (n) {printf ("Uspjeh \ n"); izlaz (0); } else {printf ("Pristup odbijen \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Aplikacija zahtijeva parametar \ n"); izlaz (-1); } test (argv [1]); }
Program je dobio ime prelijevanje.c, a za sastavljanje korišteno je sljedeće:
 gcc overflow.c -o overflow -fno -stack -protector
Zadnji dio: -fno-stack-protector Koristi se tako da prevoditelj ne stavlja zaštitu i možemo pokazati primjer. Ako korisnik unese točne podatke, što je niz od najviše 15 znakova, program radi dobro, ako unesemo netočnu "lozinku" to će nam pokazati Pristup odbijen, a ako stavimo "Test”Stavit će nas Uspjeh. Pogledajmo snimku koja izvodi program 2 puta, jednom s netočnim pristupom, a drugi s ispravnim nizom:

Vidimo da sve radi ispravno. Ali što ako umetnemo gornji niz, da vidimo što će se dogoditi:

Pokrenuli smo program s 20 slova A, i pokazuje nam Uspjeh. U ovoj aplikaciji nemamo ništa, jednostavno izlazimo iz aplikacije, ali pristupili smo ograničenom području bez poznavanja lozinke. Zamijenimo li sljedeću funkciju:

 strcpy (međuspremnik, str);
Sljedećim:
 strncpy (međuspremnik, str, 15);
Y izvršavamo kôd s 20 slova A, imamo sljedeći izlaz:

Također možete vidjeti da se mi koristimo strcmp, umjesto toga bismo trebali koristiti strncmp, pa kontroliramo i veličinu. Kontrolirali smo da se može kopirati najviše 15 znakova, tako da to ne utječe na naš program ako umetnu više. Ako nakon prikaza poruke Uspjeh izvršavamo naredbu sustava (u ovom slučaju tko sam ja), dobivamo sljedeće podatke:

Gore nismo root, ali ako ga izvedemo sa sudo, dobivamo sljedeće:

Jedino što smo dodali je red u kodu koji smo vidjeli gore, ispod retka koda:

 printf ("Uspjeh \ n");
Stavili smo:
 sustav ("whoami");
Da bih malo razumio što se dogodilo, izmijenit ću program tako da prikaže 2 varijable koje imamo (pufer Y n) je li točan ili nije, a ispod je izlaz, prvo ubacujemo niz koji će se tretirati kao ispravan („Test”), Zatim netočna koja ne prelazi duljinu i na kraju 20 slova A:

Vidimo da u prvom izvršenju vrijedi 1 Varijabla n, jer je lanac koji je prošao ispravan, u drugom vrijedi 0, jer je pogrešno, ali u posljednjem vrijedi 1094795585, što preskače uvjet koji stavljamo ako (n), bit će istinito sve dok je n različito od 0. To nije dobro stanje, iako ne bi moralo propasti da je ostatak koda točan. Ako stavimo 16 slova A kao parametar vidjet ćemo da je vrijednost varijable n to je 65:

Ako pogledamo ASCII kod, broj 65 odgovara slovu DO, vidjeli smo da smo memoriju varijable n slučajno dodirnuli, da je dodatno slovo koje smo proslijedili kao parametar otišlo u varijablu n. Zapamtili bismo sljedeće:

Ako idemo dalje od znakova, možda će nam poslati poruku o kršenju segmenta (ako uklonimo izlaz (0) što imamo u ako (n)), možemo vidjeti na sljedećoj slici:

Ovo je upozorenje posljedica pokušaja pristupa memorijskom području koje je izvan granica onog koje operacijski sustav dodjeljuje aplikaciji. Ako smo primjer sastavili na sljedeći način:

 gcc overflow.c -o overflow -fstack -protector
Ili samo uklanjanje -fno-stack-protector Iz kompilacije koju smo vidjeli prvi put i izvršavamo kôd s preljevom, dobivamo sljedeći rezultat:

Dodatna zaštita koju nam pruža gcc.

BilješkaAko želimo izvršiti kôd (shellcode) morali bismo prepisati povratnu adresu s onom iz našeg shellcode -a, nešto je složeniji od primjera viđenog u vodiču i stoga zahtijeva više rada.

Ako netko uspije iskoristiti ovu ranjivost, može vam nanijeti veliku štetu. Izbjegnite ovu vrstu kvara i da zlonamjerni korisnik to može iskoristiti vrlo je jednostavno, programirajte ispravno, morate dobro poznavati programski jezik koji se koristi, znati koje funkcije koristiti, a koje ne, testirati aplikaciju dobro, ne samo s točnim podacima, već mora ispravno raditi i kada se bavimo nepredviđenim podacima.

Drugi napadi koje možete pregledati i biti svjesni kako ne bi utjecali na vas ili smanjili njihove rizike su: DoS i Brute Force. Ne zaboravite provjeriti ima li ranjivosti na stranici CVE.

Je li vam se svidio i pomogao ovaj vodič?Autor možete nagraditi pritiskom na ovaj gumb kako biste mu dali pozitivan bod

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave