Pohľad na zneužívanie slabých miest

Keď som sa tešil na ďalšiu diskusiu o tejto téme, dovoľte mi povedať vám trochu histórie, teórie a praxe v oblasti zraniteľností. Všetci sme už počuli, že bezpečnostné chyby môžu stáť veľa, všetci vieme, že musíme udržiavať náš softvér aktualizovaný, všetci vieme, že veľa aktualizácií je spôsobených bezpečnostnými chybami. Ale dnes vám poviem niečo o tom, ako sa tieto chyby nachádzajú a využívajú 🙂 Ale predtým si objasníme niekoľko podrobností, aby ste mali lepší prehľad.

Než začnete

Najprv vám chcem povedať, že sa zameriame na prvú zraniteľnosť, ktorú som sa naučil zneužiť, známu Prepady vyrovnávacej pamäte, v tejto zraniteľnosti využívame nedostatok overenia pamäte na vykonávanie zábavných vecí 🙂 Poďme si však o tom niečo ujasniť.

Toto nebude scenár zo skutočného sveta

Nemôžem si dovoliť naučiť ich porušovať akýkoľvek program, ktorý vidia 🙂 jednak preto, že je to pre ich počítače nebezpečné, jednak preto, že by to trvalo viac, ako je moja obvyklá kvóta slov.

Ideme na výlet do 80. rokov

To, čo vám ukážem, čo dokážem na svojom notebooku, ale neznamená to, že sa to dá dnes urobiť jednoduchým spôsobom 🙂 mnohé z týchto konceptov už boli toľkokrát využité, že nové spôsoby ochrany a nové spôsoby obchádzania sa objavili 😛 ale tým sa vraciame na rovnaké miesto, nie je priestor na to, aby sme to všetko mohli povedať 🙂

Na vašom procesore to nemusí fungovať

Aj keď použijem veľmi jednoduchý príklad, chcem, aby bolo od začiatku úplne jasné, že podrobností je toľko a tak rozmanitých, že rovnako, ako to môže vyjsť rovnako ako ja, ak si to chcete vyskúšať , požadovaný efekt sa tiež nemusí dosiahnuť 🙂 Ale viete si predstaviť, že si to neviem vysvetliť v tomto priestore, najmä preto, že s týmto úvodom som už urobil viac ako 300 slov, takže sa dostávame priamo k veci.

Čo je a Prepad vyrovnávacej pamäte

Aby sme na to mohli odpovedať, najskôr musíme pochopiť prvú polovicu tejto kombinácie.

nárazníky

Pretože všetko je o pamäti v počítači, je logické, že tu musí byť nejaký druh informačného kontajnera. Keď hovoríme o vstupy výstupy, prichádzame priamo k pojmu nárazníky. Aby to nebolo málo, a nárazník Je to pamäťový priestor definovanej veľkosti, do ktorého budeme ukladať kvantum informácií, jednoduché 🙂

Ako vyplýva z názvu, k preplneniu dôjde, keď vyrovnávacia pamäť naplní viac informácií, ako dokáže zvládnuť. Prečo je to však dôležité?

Stoh

Tiež známe ako komíny, sú abstraktným dátovým typom, v ktorom môžeme stoh informácie, ich hlavnou charakteristikou je, že majú objednávku LIFO (posledný na prvom mieste). Na chvíľu si rozmyslime stoh tanierov, jeden po druhom ich položíme na vrch a potom jeden po druhom ich zhora vyberieme, čím sa vytvorí posledný tanier, ktorý sme vložili (ten, ktorý je hore) ) je prvý tanier Čo budeme vyberať, samozrejme ak môžeme vybrať iba jeden tanier naraz a rozhodli sme sa to urobiť v tomto poradí: P.

Teraz, keď poznáte tieto dva pojmy, musíme ich uviesť do poriadku. Stohy sú dôležité, pretože každý program, ktorý prevádzkujeme, má svoje vlastné zásobník vykonania. Ale tento zásobník má osobitná vlastnosťdorastá. Jediná vec, ktorú o tom musíte vedieť, je, že keď je program spustený, keď sa volá funkcia, zásobník prechádza z čísla X v pamäti na číslo (Xn). Aby sme však mohli pokračovať, musíme pochopiť ešte jednu koncepciu.

Ukazovatele

Toto je koncept, ktorý mnohých programátorov privádza do šialenstva, keď začínajú vo svete jazyka C, v skutočnosti je veľká sila programovania v C čiastočne spôsobená používaním ukazovateľov. Aby to nebolo jednoduché, ukazovateľ ukazuje na adresu pamäte. To znie zložito, ale nie je to také zložité, všetci máme vo svojich strojoch pamäť RAM, však? Dá sa to definovať ako postupné usporiadanie blokov, tieto miesta sú zvyčajne vyjadrené v hexadecimálnych číslach (od 0 do 9 a potom od A do F, napríklad 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Tu ako zvedavá poznámka 0x10 NO sa rovná 10 😛 ak ho prevedieme na desatinné miesto, bolo by to rovnaké ako povedať 15. To je niečo, čo tiež najskôr zamieňa viac ako jednu, ale poďme na to.

záznamy

Procesory pracujú s mnohými evidencia, ktoré pracujú na prenose polôh z fyzickej pamäte do procesora, pre architektúry využívajúce 64 bitov je počet registrov veľký a je ťažké ich tu opísať, ale pre predstavu sú tieto registre podobné ukazovateľom, ktoré okrem iného naznačujú , miesto v pamäti (umiestnenie).

Teraz cvič

Viem, že doteraz bolo potrebné spracovať veľa informácií, ale v skutočnosti ide o trochu zložité problémy, ktoré sa snažím vysvetliť veľmi jednoduchým spôsobom. Uvidíme malý program, ktorý používa vyrovnávacie pamäte, a chystáme sa rozbite to, aby ste pochopili toto o pretečení, zjavne tento nie je. Je to skutočný program a my sa „vyhneme“ mnohým protiopatreniam, ktoré sa dnes používajú, len aby sme ukázali, ako sa veci robili predtým 🙂 a pretože niektoré z nich princípy sú potrebné, aby sme sa dokázali naučiť zložitejšie veci 😉

GDB

Skvelý program, ktorý bezpochyby patrí k najpoužívanejším programátorom C. Medzi jeho mnoho cností patrí skutočnosť, že nám umožňuje vidieť toto všetko, o čom sme doteraz hovorili, registre, zásobník, vyrovnávacie pamäte atď. 🙂 Pozrime sa na program, ktorý použijeme pre náš príklad.

sietnica.c

Vlastné. Christopher Diaz Riveros

Toto je dosť jednoduchý program, budeme používať knižnicu stdio.h vedieť získať informácie a zobraziť ich v termináli. Môžeme vidieť funkciu s názvom return_input ktorá generuje a nárazník volal rad, ktorá má dĺžku 30 bajtov (typ údajov char má dĺžku 1 bajt).

Funkcia gets(array); vyžiadať informácie podľa konzoly a funkcie printf() vráti obsah poľa a zobrazí ho na obrazovke.

Každý program napísaný v jazyku C začína funkciou main(), toto bude mať na starosti iba volanie return_input, teraz ideme kompilovať program.

Vlastné. Christopher Diaz Riveros

Zoberme si trochu z toho, čo som práve urobil. Možnosť -ggdb hovorí gcc, že ​​musí zostaviť program s informáciami pre gdb, aby bolo možné správne ladiť. -fno-stack-protector Je to možnosť, ktorú by sme samozrejme nemali používať, ale ktorú použijeme, pretože inak by bolo možné vygenerovať pretečenie medzipamäte v zásobníku. Nakoniec som výsledok otestoval. ./a.out iba spustí to, čo som práve zostavil, požiada o informáciu a vráti ju. Behanie 🙂

varovanie

Ďalšia poznámka tu. Vidíte varovania? zjavne je to niečo, čo treba brať do úvahy, keď pracujeme s kódom alebo kompiláciou, je to trochu zrejmé a existuje len málo programov, ktoré dnes majú funkciu gets() V kóde. Jednou z výhod Gentoo je, že pri kompilácii každého programu vidím, čo môže byť zlé, „ideálny“ program by ich nemal mať, ale boli by ste prekvapení, koľko veľkých programov má tieto varovania, pretože sú len VEĽMI veľké a sú ťažko sledovať ich nebezpečné funkcie, keď existuje veľa varovaní súčasne. Teraz, ak budeme pokračovať

Ladenie programu

Vlastné. Christopher Diaz Riveros

Teraz môže byť táto časť trochu mätúca, ale keďže som toho už dosť napísala, nemôžem si dovoliť všetko vysvetliť, takže prepáčte, ak vidíte, že idem príliš rýchlo 🙂

Deaktivácia kódu

Začnime pohľadom na náš skompilovaný program v strojovom jazyku.

Vlastné. Christopher Diaz Riveros

Toto je kód našej hlavnej funkcie v Montáž, to je to, čo náš procesor chápe, riadok vľavo je fyzická adresa v pamäti, <+ n> je známy ako ofset, v zásade vzdialenosť od začiatku funkcie (hlavnej) k uvedenému výroku (známemu ako OPCODE). Potom vidíme typ inštrukcie (push / mov / callq…) a jeden alebo viac registrov. V súhrne môžeme povedať, že ide o údaj, za ktorým nasleduje zdroj / pôvod a cieľ. <return_input> odkazuje na našu druhú funkciu, poďme sa na to pozrieť.

return_input

Vlastné. Christopher Diaz Riveros

Toto je trochu zložitejšie, ale chcem iba, aby ste skontrolovali niekoľko vecí. Existuje značka s názvom <gets@plt> a volal sa posledný operačný kód retq označujúci koniec funkcie. Dáme pár hraničných bodov, jeden do funkcie gets a ďalší v retq.

Vlastné. Christopher Diaz Riveros

beh

Teraz spustíme program, aby sme videli, ako sa akcia začne.

Vlastné. Christopher Diaz Riveros

Vidíme, že sa objaví malá šípka označujúca operačný kód tam, kde sme, chcem, aby zohľadňovali smer 0x000055555555469b, toto je adresa po hovore na return_input vo funkcii main , je to dôležité, pretože tu by sa mal program vrátiť, keď dostanete program vstup, poďme na funkciu. Teraz ideme skontrolovať pamäť pred vstupom do funkcie gets.

Vlastné. Christopher Diaz Riveros

Vrátil som pre vás hlavnú funkciu a zvýraznil som kód, na ktorý som odkazoval, ako vidíte, z dôvodu endianness bol rozdelený na dva segmenty, chcem, aby zohľadnili smer 0x7fffffffdbf0 (prvý zľava po komando x/20x $rsp) pretože toto je miesto, ktoré musíme použiť na kontrolu výsledkov get, pokračujme:

Porušenie programu

Vlastné. Christopher Diaz Riveros

Zdôraznil som tieto 0x44444444pretože sú reprezentáciou našich Ds 🙂 teraz sme začali pridávať vstup do programu a ako vidíte, sme len dva riadky od našej požadovanej adresy, budeme ju vyplňovať, kým nebudeme tesne pred adresami, ktoré sme zvýraznili v predchádzajúcom kroku.

Zmena spiatočnej cesty

Teraz, keď sa nám podarilo zadať túto časť kódu, kde naznačuje návrat funkcie, pozrime sa, čo sa stane, ak zmeníme adresu 🙂 namiesto toho, aby sme šli na miesto operačného kódu, ktoré nasleduje za tým, ktoré sme mali pred chvíľou, čo si myslíš, ak sa vrátime späť return_input? Ale na to je potrebné napísať adresu, ktorú chceme, v binárnej podobe, ideme to robiť s funkciou printf z bash 🙂

Vlastné. Christopher Diaz Riveros

Teraz sme dostali informácie dvakrát - program na to určite nebol vyrobený, ale podarilo sa nám prelomiť kód a prinútiť ho opakovať niečo, čo nemal robiť.

Úvahy

Túto jednoduchú zmenu možno považovať za a využiť veľmi základné 🙂 podarilo sa mu prelomiť program a urobiť niečo, čo od neho chceme.

Toto je iba prvý krok v takmer nekonečnom zozname vecí, ktoré treba vidieť a pridať. Existujú spôsoby, ako pridať viac vecí, ako len opakovať objednávku, ale tentokrát som toho napísal veľa a všetko, čo sa týka shell kódovanie Je to predmet, ktorý píše viac ako články, povedal by som aj úplné knihy. Prepáčte, ak som sa nedokázal trochu viac venovať témam, ktoré by sa mi páčili, ale určite bude šanca 🙂 Zdravím a ďakujem, že ste sa sem dostali.


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.

  1.   2p2 dijo

    Buďte priamejší. Píšte menej a sústreďte sa na to, na čom záleží

    1.    ChrisADR dijo

      Ahoj, ďakujem za komentár.

      Pravdupovediac, veľkú časť myšlienok som vystrihol, ale aj tak sa mi zdalo, že to zostalo z minima, aby niekto, kto nemá programovacie vedomosti, dostal nápad.

      pozdravy

      1.    Anonymný dijo

        Problém je v tom, že kto nemá programovacie vedomosti, o ničom sa nedozvie, pretože je to na začiatok príliš zložité, ale tí, ktorí vedia programovať, ocenia, že sú priamejší.

        Predpokladám, že nemôžete osloviť každého, musíte si vybrať, a v takom prípade ste zhrešili, že chcete veľa pokryť.

        Mimochodom, hovorím vám to ako konštruktívnu kritiku, milujem tieto témy a bol by som rád, keby ste pokračovali v písaní článkov, gratulujem!

    2.    Anonymný dijo

      Myslím, že to isté.

      1.    ChrisADR dijo

        Obom veľmi pekne ďakujem !! Určite je ťažké pochopiť, ako osloviť cieľové publikum, keď je pravda, že počet ľudí s pokročilou úrovňou programovania, ktorí čítajú tieto články, je malý (aspoň to sa dá odvodiť na základe komentárov)

        Určite som zhrešil, keď som chcel zjednodušiť niečo, čo si vyžaduje pochopenie širokej vedomostnej základne. Dúfam, že rozumiete tomu, že keď začínam s týmto blogovaním, ešte som neobjavil presný bod, v ktorom moji čitatelia vedia a chápu, čo hovorím. To by oveľa ľahšie hovorilo pravdu 🙂

        Pokúsim sa byť kratší, keď si to zaslúži, bez odosobnenia formátu, pretože oddeliť spôsob písania od obsahu je trochu komplikovanejšie, ako by si človek mohol predstaviť, mám ich aspoň dosť prepojené, ale predpokladám, že nakoniec budem schopný pridať riadky namiesto rezania obsahu.

        pozdravy

  2.   mario dijo

    Kde by ste sa o tejto téme mohli dozvedieť viac? Nejaká odporúčaná kniha?

    1.    ChrisADR dijo

      Príklad si prevzali z príručky The Shellcoder's Handbook Chris Anley, John Heasman, Felix Linder a Gerardo Richarte, ale aby som mohol urobiť 64-bitový preklad, musel som sa dozvedieť viac o svojej architektúre, príručka pre vývojárov Intel, zväzky 2 a 3 sú dosť spoľahlivý zdroj. Je tiež dobré prečítať si dokumentáciu GDB, ktorá sa dodáva s príkazom „info gdb“. Na osvojenie jazyka Assembly a jazyka C je veľa veľmi dobrých kníh, až na to, že knihy Assembly sú trochu staré, takže je potrebné vyplniť ďalšiu typová dokumentácia.

      Samotný shellcode už z rôznych dôvodov nie je taký efektívny, ale stále je zaujímavé učiť sa nové techniky.

      Dúfam, že to trochu pomôže 🙂 Zdravím vás

  3.   Franz dijo

    Dobrý článok, starý blog desdelinux znovuzrodený =)
    Keď hovoríte, že vzdialený shell nie je taký efektívny, máte na mysli protiopatrenia určené na zmiernenie útokov, ktoré označujú ako útočné zabezpečenie.
    Zdravím a len tak ďalej

    1.    ChrisADR dijo

      Ďakujem pekne Franz 🙂 veľmi milé slová, vlastne som tým myslel, že dnešný Shellcoding je oveľa zložitejší ako to, čo vidíme tu. Máme ASLR (generátor náhodného umiestnenia pamäte) ochranu zásobníka, rôzne opatrenia a protiopatrenia, ktoré obmedzujú počet operačných kódov, ktoré je možné vložiť do programu, a je to len začiatok.

      S pozdravom,

  4.   slobodný softvér dijo

    Dobrý deň, urobíte ďalšiu časť rozširujúcu tému? Je to zaujímavé

    1.    ChrisADR dijo

      Dobrý deň, téma je určite celkom zaujímavá, ale úroveň zložitosti, ktorú by sme brali, by bola veľmi vysoká a pravdepodobne by zahŕňala veľké množstvo príspevkov, ktoré vysvetľujú rôzne predpoklady na pochopenie toho druhého. Asi o tom napíšem, ale nebudú to nasledujúce príspevky, skôr ako budem pokračovať v tejto, chcem napísať niekoľko tém.

      Zdravím a ďakujem za zdieľanie

  5.   kaktus dijo

    Veľmi dobrá che! Prispievate skvelými príspevkami! Jedna otázka, začínam túto vec IT bezpečnosti čítaním knihy s názvom „Zaistenie bezpečnosti testovaním perom“. Je táto kniha odporúčaná? Ako mi navrhujete, aby som sa začal pýtať na tieto problémy?

    1.    ChrisADR dijo

      Ahoj kaktus, je to celý vesmír o zraniteľnostiach a ďalšie, pravdupovediac, veľa záleží na tom, čo upúta tvoju pozornosť a od potrieb, ktoré máš, manažér IT nemusí vedieť to isté ako tester na perá, Alebo má výskumník zraniteľnosti alebo súdny analytik a tím pre zotavenie po katastrofe veľmi odlišné schopnosti. Je zrejmé, že každý z nich vyžaduje inú úroveň technických znalostí, odporúčam vám, aby ste začali objavovať presne to, čo sa vám páči, a začali hltať knihy, články a ďalšie, a čo je najdôležitejšie, precvičiť si všetko, čo čítate, aj keď je to zastarané, tým sa nakoniec zmení.
      S pozdravom,

  6.   Eizen dijo

    Dobrý deň.
    Ďakujeme veľmi pekne za vysvetlenie tejto témy a tiež za vyjadrenie, že pre ďalšie informácie máme „Príručku Shellcodera“. Čakajúce čítanie už mám 😉