Pogled na iskorištavanje ranjivosti

Dok sam se radovao nastavku rasprave o ovoj temi, dozvolite mi da vam kažem malo istorije, teorije i prakse o ranjivostima. Svi smo do sada čuli da sigurnosne greške mogu koštati puno, svi znamo da moramo ažurirati svoj softver, svi znamo da su mnoga ažuriranja uzrokovana sigurnosnim greškama. Ali danas ću vam reći malo o tome kako se te greške pronalaze i koriste ited Ali prije ovoga razjasnit ćemo nekoliko detalja kako bismo imali bolji pregled.

Prije nego što započnete

Prvo vam želim reći da ćemo se usredotočiti na prvu ranjivost koju sam naučio iskorištavati, poznatu Prelivanje međuspremnika, u ovoj ranjivosti koristimo nedostatak provjere memorije da bismo radili zabavne stvari 🙂 Ali pojasnimo malo više o tome.

Ovo neće biti stvarni scenarij

Ne mogu si priuštiti da ih naučim da razbiju bilo koji program koji vide 🙂 prvo jer je to opasno za njihove računare, drugo jer bi za to trebalo više od moje uobičajene kvote riječi.

Idemo na putovanje u 80-te

Ono što ću vam pokazati mogu raditi na svom laptopu, ali ne znači da se to danas može učiniti na jednostavan način 🙂 mnogi od ovih koncepata već su toliko puta iskorišteni da su nove metode zaštite i nove metode za izbjegavanje oni su se pojavili 😛 ali to nas vraća na isto mjesto, nema prostora da se sve to ispriča 🙂

Možda neće raditi na vašem procesoru

Iako ću se poslužiti vrlo jednostavnim primjerom, želim da od početka bude sasvim jasno da su detalji toga toliko različiti da baš kao što može ispasti isto kao i ja, ako to želite isprobati , željeni efekt se također možda neće postići 🙂 Ali možete zamisliti da to ne mogu objasniti na ovom prostoru, pogotovo jer sam ovim uvodom uzeo više od 300 riječi, pa prelazimo pravo na našu poantu.

Šta je a Preliv pufera

Da bismo na to odgovorili, prvo moramo razumjeti prvu polovinu ove kombinacije.

Buffers

Budući da se sve odnosi na memoriju na računaru, logično je da mora postojati neka vrsta spremnika informacija. Kad razgovaramo o tome ulazi izlazi, dolazimo direktno do koncepta buffers. Da bude kratko, a buffer To je memorijski prostor definirane veličine u koji ćemo pohraniti količinu informacija, jednostavnih 🙂

Kao što naziv govori, preljevi se javljaju kada se međuspremnik napuni s više informacija nego što ih može obraditi. Ali zašto je ovo važno?

stog

Poznati i kao stogovi, oni su apstraktni tip podataka u kojem možemo slagati informacije, njihova glavna karakteristika je da imaju narudžbu LIFO (zadnji u prvom izlasku). Pomislimo na trenutak o hrpi ploča, stavimo ih na vrh jednu po jednu, a zatim ih izvadimo jednu po jednu s vrha, ovo čini zadnju ploču koju smo stavili (onu koja je na vrhu ) je prva ploča Što ćemo izvaditi, očito ako možemo izvaditi samo po jednu pločicu i odlučimo to učiniti tim redoslijedom:

Sad kad znate ova dva pojma, moramo ih dovesti u red. Skupovi su važni jer svaki program koji pokrećemo ima svoj izvršni stog. Ali ovaj stog ima posebna karakteristikaraste dolje. Jedino što o tome trebate znati je da dok se program izvodi, kada se funkcija pozove, stek prelazi s broja X u memoriji na broj (Xn). Ali da bismo nastavili, moramo razumjeti još jedan koncept.

Pokazivači

Ovo je koncept koji izluđuje mnoge programere kad započnu svijet C, zapravo velika snaga C programiranja dijelom je posljedica upotrebe pokazivača. Da bude jednostavnije, pokazivač pokazuje na memorijsku adresu. Ovo zvuči složeno, ali nije tako složeno, svi imamo RAM u svojim mašinama, zar ne? Pa, ovo se može definirati kao a uzastopni raspored blokova, ove lokacije su obično izražene u heksadecimalnim brojevima (od 0 do 9, a zatim od A do F, kao što su 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Ovdje kao neobična napomena, 0x10 NE jednako je 10 😛 ako ga pretvorimo u decimalni redoslijed to bi bilo isto kao da kažemo 15. To je nešto što također zbunjuje više od jednog u početku, ali krenimo na to.

Zapisi

Procesori rade sa više njih zapisi, koji rade na prenošenju lokacija iz fizičke memorije u procesor, za arhitekture koje koriste 64-bitne podatke, broj registara je velik i ovdje je teško opisati, ali da bismo shvatili, registri su poput pokazivača, oni između ostalog ukazuju , memorijski prostor (lokacija).

Sada vežbajte

Znam da je do sada bilo puno podataka za obradu, ali u stvarnosti to su pomalo složena pitanja koja pokušavam objasniti na vrlo jednostavan način, vidjet ćemo mali program koji koristi međuspremnike i idemo na razbijte to da biste razumjeli ovo o preljevima, očito ovo nije. To je pravi program, a mi ćemo "izbjeći" mnoge protumjere koje se danas koriste, samo da pokažemo kako su se stvari radile prije 🙂 i jer neke od njih principi su neophodni da bi se mogle naučiti složenije stvari 😉

GDB

Sjajan program koji je nesumnjivo jedan od najčešće korištenih programera C. Među njegovim brojnim vrlinama imamo i činjenicu da nam omogućava da vidimo sve ovo o čemu smo do sada govorili, registre, stog, bafere itd. 🙂 Pogledajmo program koji ćemo koristiti za naš primjer.

retinput.c

Svoje. Christopher Diaz Riveros

Ovo je prilično jednostavan program, koristit ćemo knjižnicu stdio.h kako bi mogli dobiti informacije i prikazati ih na terminalu. Možemo vidjeti funkciju koja se zove return_input koji generiše a buffer pozvana array, koja ima dužinu od 30 bajtova (tip podataka char iznosi 1 bajt).

Funkcija gets(array); zatražite informacije putem konzole i funkcije printf() vraća sadržaj niza i prikazuje ga na ekranu.

Svaki program napisan na C započinje funkcijom main(), ovo će biti zaduženo samo za pozivanje return_input, sada ćemo kompajlirati program.

Svoje. Christopher Diaz Riveros

Uzmimo malo ono što sam upravo učinio. Opcija -ggdb govori gcc-u da kompajlira program s informacijama za gdb kako bi mogao ispravno ispraviti pogreške. -fno-stack-protector To je opcija koju očito ne bismo trebali koristiti, ali koju ćemo koristiti, jer bi u suprotnom bilo moguće generirati preljev međuspremnika u stogu. Na kraju sam testirao rezultat. ./a.out samo pokreće ono što sam upravo kompajlirao, pita me za informacije i vraća ih. Trčanje 🙂

Upozorenja

Još jedna napomena ovdje. Možete li vidjeti upozorenja? jasno je da je to nešto što treba uzeti u obzir kada radimo sa kodom ili kompajliramo, to je pomalo očito i malo je programa koji danas imaju funkciju gets() U kodu. Jedna od prednosti Gentoo-a je ta što kompajliranjem svakog programa vidim što bi moglo biti pogrešno, "idealan" program ih ne bi trebao imati, ali iznenadili biste se koliko velikih programa ima ova upozorenja jer su VRLO VELIKI i to je teško je pratiti njihove opasne funkcije kad istovremeno ima mnogo upozorenja. Ako nastavimo

Otklanjanje grešaka u programu

Svoje. Christopher Diaz Riveros

Sada ovaj dio može biti pomalo zbunjujući, ali budući da sam već napisao prilično malo, ne mogu si priuštiti da sve objasnim, pa žao mi je ako vidite da idem prebrzo 🙂

Isključivanje koda

Počnimo sa gledanjem našeg kompajliranog programa za mašinski jezik.

Svoje. Christopher Diaz Riveros

Ovo je kôd naše glavne funkcije u montaža, ovo razumije naš procesor, linija s lijeve strane je fizička adresa u memoriji, <+ n> je poznat kao ofset, u osnovi udaljenost od početka funkcije (glavne) do te izjave (poznate kao opcode). Tada vidimo vrstu instrukcije (push / mov / callq…) i jedan ili više registara. Rezimirano možemo reći da je to indikacija koju slijede izvor / porijeklo i odredište. <return_input> odnosi se na našu drugu funkciju, pogledajmo.

Povratni_ulaz

Svoje. Christopher Diaz Riveros

Ovo je malo složenije, ali samo želim da provjerite nekoliko stvari, zove se oznaka <gets@plt> i posljednji nazvani opcode retq označava kraj funkcije. Stavit ćemo nekoliko prijelomnih točaka, jednu u funkciju gets i još jedan u retq.

Svoje. Christopher Diaz Riveros

trčanje

Sada ćemo pokrenuti program da vidimo kako akcija počinje.

Svoje. Christopher Diaz Riveros

Vidimo da se pojavljuje mala strelica koja ukazuje na optički kod gdje smo, želim da uzmu u obzir smjer 0x000055555555469b, ovo je adresa nakon poziva na return_input u funkciji main , ovo je važno jer bi se ovo mjesto trebalo vratiti programu kada završite s primanjem ulazni, uđimo u funkciju. Sada ćemo provjeriti memoriju prije ulaska u funkciju gets.

Svoje. Christopher Diaz Riveros

Vratio sam vam glavnu funkciju i istaknuo kod na koji sam se pozivao, kao što vidite, zbog endianness je podijeljen u dva segmenta, želim da uzmu u obzir smjer 0x7fffffffdbf0 (prvi slijeva nakon komandosa x/20x $rsp) pošto je ovo lokacija koju moramo koristiti za provjeru rezultata dobivanja, nastavimo:

Prekid programa

Svoje. Christopher Diaz Riveros

Istakao sam ih 0x44444444jer su oni predstavljanje naših DS-a 🙂 sada smo počeli dodavati ulazni programu, a kao što vidite, udaljeni smo samo dva retka od željene adrese, popunit ćemo je dok ne stignemo neposredno prije adresa koje smo istakli u prethodnom koraku.

Promjena povratnog puta

Sad kad smo uspjeli unijeti ovaj odjeljak koda gdje označava povratak funkcije, pogledajmo što će se dogoditi ako promijenimo adresu 🙂 umjesto da idemo na mjesto opcijskog koda koje slijedi onaj koji smo imali prije, šta mislite ako se vratimo return_input? Ali za to je potrebno adresu koju želimo upisati u binarnu datoteku, to ćemo učiniti s funkcijom printf od bash 🙂

Svoje. Christopher Diaz Riveros

Sad smo informacije dobili dva puta 😀 sigurno program nije stvoren za to, ali uspjeli smo razbiti kôd i natjerati ga da ponavlja nešto što nije trebalo.

Reflections

Ova jednostavna promjena može se smatrati a iskoristiti vrlo osnovno - uspio je razbiti program i učiniti nešto što mi želimo od njega.

Ovo je samo prvi korak na gotovo beskonačnoj listi stvari koje treba vidjeti i dodati, postoje načini za dodavanje više stvari nego jednostavno ponavljanje narudžbe, ali ovaj put sam napisao puno i sve vezano za shell kodiranje predmet je pisanja više od članaka, rekao bih kompletnih knjiga. Žao mi je ako nisam uspio malo više zalaziti u teme koje bih volio, ali sigurno će biti šanse 🙂 Pozdrav i hvala što ste stigli ovdje.


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   2p2 rekao je

    Budite direktniji. Pišite manje i usredotočite se na ono što je važno

    1.    ChrisADR rekao je

      Zdravo, hvala na komentaru.

      Da kažem istinu, izrezao sam dobar dio ideja, ali čak i tako mi se činilo da sam ostavio minimum da neko ko nema znanje programiranja može dobiti ideju.

      Saludos

      1.    Anónimo rekao je

        Problem je u tome što oni koji nemaju znanje programiranja neće saznati ni o čemu jer je previše složeno za početak, ali oni koji znaju programirati cijene da su direktniji.

        Pretpostavljam da ne možete doći do svih, morate odabrati, a u ovom slučaju ste sagriješili da želite puno toga pokriti.

        Inače, kažem vam kao konstruktivnu kritiku, volim ove teme i volio bih da i dalje pišete članke, čestitam!

    2.    Anónimo rekao je

      Mislim isto.

      1.    ChrisADR rekao je

        Puno hvala oboma! Svakako je teško razumjeti kako doći do ciljne publike kad je istina da je broj ljudi sa naprednim nivoom programiranja koji čitaju ove članke nizak (barem se to može zaključiti na osnovu komentara)

        Svakako sam zgriješio želeći pojednostaviti nešto što zahtijeva široku bazu znanja da bi se razumjelo. Nadam se da razumijete da s obzirom da tek počinjem s bloganjem, još nisam otkrio tačnu točku u kojoj moji čitatelji znaju i razumiju ono što govorim. To bi puno olakšalo govorenje istine 🙂

        Pokušat ću biti kraći kad to zasluži bez depersonalizacije formata, jer je odvajanje načina pisanja od sadržaja malo složenije nego što se moglo zamisliti, barem ih imam prilično povezane, ali pretpostavljam da ću u konačnici moći za dodavanje linija umjesto rezanja sadržaja.

        Saludos

  2.   Mario rekao je

    Gdje biste mogli znati više o toj temi? Bilo koja preporučena knjiga?

    1.    ChrisADR rekao je

      Primjer su iz The Shellcoder's Handbook preuzeli Chris Anley, John Heasman, Felix Linder i Gerardo Richarte, ali da bih napravio 64-bitni prijevod morao sam naučiti o svojoj arhitekturi, priručniku za programere Intel, svesci 2 i 3 su prilično pouzdan izvor za to. Također je dobro pročitati GDB dokumentaciju koja dolazi s naredbom 'info gdb'. Da biste naučili Assembly i C postoji mnogo vrlo dobrih knjiga, osim što su knjige Skupštine malo stare pa postoji praznina koju treba popuniti drugom tipska dokumentacija.

      Sami ljuski danas iz različitih razloga više nije toliko učinkovit, ali svejedno je zanimljivo naučiti nove tehnike.

      Nadam se da će malo pomoći 🙂 Pozdrav

  3.   Franz rekao je

    Dobar članak, stari blog desdelinux ponovo se rodio =)
    Kad kažete da udaljena ljuska nije toliko učinkovita, mislite na protumjere namijenjene ublažavanju napada, oni to nazivaju uvredljivom sigurnošću.
    Pozdrav i tako nastavite

    1.    ChrisADR rekao je

      Puno vam hvala, Franz, vrlo lijepe riječi, zapravo mislio sam da je Shellcoding danas mnogo složeniji od onoga što ovdje vidimo. Imamo ASLR (generator slučajne memorije) zaštitnika steka, razne mjere i protumjere koje ograničavaju broj opkodova koji se mogu ubrizgati u program, i to je samo početak.

      pozdrav,

  4.   Slobodni softver rekao je

    Pozdrav, hoćete li napraviti još jedan dio šireći temu? Interesantno je

    1.    ChrisADR rekao je

      Pozdrav, tema je svakako prilično zanimljiva, ali nivo složenosti koji bismo zauzeli postao bi vrlo visok, vjerojatno bi uključivao velik broj objava kako bi se objasnili razni preduvjeti za razumijevanje drugog. Vjerovatno ću o tome pisati, ali to neće biti sljedeći postovi, želim napisati nekoliko tema prije nego što nastavim s ovom.

      Pozdrav i hvala na podjeli

  5.   kaktus rekao je

    Vrlo dobar che! Doprinosite sjajnim objavama! Jedno pitanje, započinjem ovu stvar o IT sigurnosti čitajući knjigu pod nazivom "Osiguravanje sigurnosti testiranjem olovke." Preporučuje li se ova knjiga? Kako predlažete da se počnem raspitivati ​​o ovim problemima?

    1.    ChrisADR rekao je

      Pozdrav kaktusu, to je čitav svemir o ranjivostima, a drugi, istini za volju, puno ovise o onome što privlači vašu pažnju i potrebama koje imate, IT menadžer ne mora znati isto što i tester olovke Ili istraživač ranjivosti ili forenzički analitičar, tim za oporavak od katastrofe ima vrlo različit skup vještina. Očito je da svaki od njih zahtijeva drugačiji nivo tehničkog znanja, preporučujem da počnete otkrivati ​​tačno ono što volite i počnete proždirati knjige, članke i druge, i što je najvažnije, vježbajte sve što pročitate, čak i ako je zastarjelo, to će na kraju promijeniti.
      pozdrav,

  6.   Eizen rekao je

    Zdravo.
    Puno vam hvala što ste objasnili ovu temu, kao i što ste komentirali da za dodatne informacije imamo "The Shellcoder's Handbook". Već imam čitanje nding