Pohled na zneužívání slabých míst

Jak jsem se těšil na pokračování diskuse o tomto tématu, dovolte mi, abych vám řekl trochu historie, teorie a praxe v oblasti zranitelností. Všichni jsme již slyšeli, že bezpečnostní chyby mohou stát hodně, všichni víme, že musíme udržovat náš software aktuální, všichni víme, že mnoho aktualizací je způsobeno chybami zabezpečení. Ale dnes vám řeknu něco o tom, jak se tyto chyby nacházejí a využívají 🙂 Ale ještě předtím si objasníme několik podrobností, abychom měli lepší přehled.

Než začnete

Nejprve vám chci říct, že se zaměříme na první zranitelnost, kterou jsem se naučil zneužít, známou Přetečení vyrovnávací paměti, v této zranitelnosti využíváme nedostatek ověření paměti, abychom mohli dělat zábavné věci 🙂 Ale pojďme si o tom trochu vyjasnit.

Nebude to scénář skutečného světa

Nemohu si dovolit je naučit rozbít jakýkoli program, který vidí 🙂 zaprvé proto, že je to pro jejich počítače nebezpečné, zadruhé proto, že by to trvalo víc, než je moje obvyklá kvóta slov.

Jdeme na výlet do 80. let

To, co vám ukážu, co na svém notebooku mohu udělat, ale to neznamená, že to dnes lze udělat jednoduchým způsobem 🙂 mnoho z těchto konceptů již bylo tolikrát využito, že nové metody ochrany a nové způsoby, jak se vyhnout objevily se 😛, ale to nás vrací na stejné místo, není prostor, abychom to mohli všechno říct 🙂

Na vašem procesoru to nemusí fungovat

I když použiji velmi jednoduchý příklad, chci, aby bylo od začátku zcela jasné, že podrobností je tolik a tak rozmanitých, že stejně jako to může vyjít stejně jako já, pokud si to chcete vyzkoušet , požadovaného efektu také nemusí být dosaženo 🙂 Ale dokážete si představit, že to v tomto prostoru nemohu vysvětlit, zejména proto, že s tímto úvodem jsem již vzal více než 300 slov, takže se dostáváme rovnou k věci.

Co je Přetečení zásobníku

Abychom na to mohli odpovědět, musíme nejprve pochopit první polovinu této kombinace.

Nárazníky

Protože vše je o paměti v počítači, je logické, že musí existovat nějaký typ informačního kontejneru. Když mluvíme o vstupy výstupy, přicházíme přímo k pojmu nárazníky. Aby to nebylo málo, nárazník Jedná se o paměťový prostor definované velikosti, do kterého budeme ukládat množství informací, jednoduché 🙂

Jak název napovídá, dochází k přetečení, když vyrovnávací paměť vyplní více informací, než zvládne. Ale proč je to důležité?

Stoh

Také známé jako komíny, jsou to abstraktní datový typ, ve kterém můžeme zásobník informace, jejich hlavní charakteristikou je, že mají objednávku LIFO (Last In First Out). Pojďme na chvíli přemýšlet o hromádce talířů, dáme je na jeden po druhém a potom je jeden po druhém vyjmeme shora, čímž vznikne poslední talíř, který jsme dali (ten, který je nahoře) je první talíř, který vyjmeme, samozřejmě pokud můžeme vyjmout jen jeden talíř najednou a rozhodneme se to udělat v tomto pořadí: P.

Nyní, když znáte tyto dva pojmy, musíme je dát do pořádku. Zásobníky jsou důležité, protože každý program, který provozujeme, má svůj vlastní provedení stack. Ale tento zásobník má zvláštní charakteristikaroste dolů. Jediné, co o tom potřebujete vědět, je to, že zatímco běží program, když se volá funkce, zásobník přejde z čísla X v paměti na číslo (Xn). Abychom však mohli pokračovat, musíme pochopit ještě jeden koncept.

Ukazatele

Jedná se o koncept, který poblázňuje mnoho programátorů, když začínají ve světě C, ve skutečnosti je velká síla programování C částečně způsobena použitím ukazatelů. Aby to bylo jednoduché, ukazatel ukazuje na adresu paměti. To zní složitě, ale není to tak složité, všichni máme RAM v našich strojích, že? To lze definovat jako postupné uspořádání bloků, tato místa jsou obvykle vyjádřena v hexadecimálních číslech (od 0 do 9 a poté od A do F, například 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Zde jako zvědavá poznámka, 0x10 NE se rovná 10 😛 pokud jej převedeme na desítkové pořadí, bylo by to stejné, jako kdybychom řekli 15. To je něco, co také zpočátku zaměňuje více než jednu, ale pojďme na to.

Evidence

Procesory pracují s řadou evidence, které pracují na přenosu míst z fyzické paměti do procesoru, pro architektury, které používají 64 bitů, je počet registrů velký a je obtížné je zde popsat, ale pro představu jsou registry jako ukazatele, mimo jiné označují věci , paměťový prostor (umístění).

Nyní trénujte

Vím, že doposud to bylo spousta informací ke zpracování, ale ve skutečnosti se jedná o poněkud složité problémy, které se snažím vysvětlit velmi jednoduchým způsobem, uvidíme malý program, který používá vyrovnávací paměti a budeme přerušte to, abyste pochopili toto o přetečení, zjevně tohle není. Je to skutečný program a my se „vyhneme“ mnoha protiopatřením, která se dnes používají, jen abychom ukázali, jak se věci děly dříve 🙂 a protože některá z nich principy jsou nezbytné, abychom se mohli naučit složitější věci 😉

GDB

Skvělý program, který je bezpochyby jedním z nejpoužívanějších programátorů C. Mezi jeho mnoha přednostmi máme skutečnost, že nám umožňuje vidět vše, o čem jsme dosud mluvili, registry, zásobník, vyrovnávací paměti atd. 🙂 Podívejme se na program, který použijeme pro náš příklad.

retinput.c

Vlastní. Christopher Diaz Riveros

Jedná se o poměrně jednoduchý program, budeme používat knihovnu stdio.h být schopen získat informace a zobrazit je v terminálu. Můžeme vidět funkci nazvanou return_input který generuje a nárazník volal řada, který má délku 30 bajtů (datový typ char je dlouhý 1 bajt).

Funkce gets(array); požadovat informace podle konzoly a funkce printf() vrátí obsah pole a zobrazí jej na obrazovce.

Každý program napsaný v C začíná touto funkcí main(), toto bude mít na starosti pouze volání return_input, nyní budeme program kompilovat.

Vlastní. Christopher Diaz Riveros

Pojďme si vzít trochu z toho, co jsem právě udělal. Možnost -ggdb říká gcc, že ​​musí zkompilovat program s informacemi pro gdb, aby bylo možné správně ladit. -fno-stack-protector Je to možnost, kterou bychom samozřejmě neměli používat, ale kterou budeme používat, protože jinak by bylo možné generovat přetečení vyrovnávací paměti v zásobníku. Nakonec jsem výsledek otestoval. ./a.out pouze běží to, co jsem právě sestavil, požádá mě o informace a vrátí je. Běh 🙂

Varování

Další poznámka zde. Vidíte varování? je zřejmé, že je třeba vzít v úvahu, když pracujeme s kódem nebo kompilací, je to trochu zřejmé a existuje jen málo programů, které dnes mají tuto funkci gets() V kódu. Jednou z výhod Gentoo je, že při kompilaci každého programu vidím, co se může mýlit, „ideální“ program by je neměl mít, ale překvapilo by vás, kolik velkých programů má tato varování, protože jsou prostě VELMI velké a je těžké je sledovat. nebezpečné funkce, když existuje mnoho varování současně. Nyní, pokud budeme pokračovat

Ladění programu

Vlastní. Christopher Diaz Riveros

Nyní může být tato část trochu matoucí, ale protože jsem toho již napsal dost, nemůžu si dovolit vše vysvětlit, takže promiňte, pokud vidíte, že jedu příliš rychle

Deaktivace kódu

Začněme tím, že se podíváme na náš kompilovaný jazykový program.

Vlastní. Christopher Diaz Riveros

Toto je kód naší hlavní funkce v Montáž, to náš procesor chápe, řádek vlevo je fyzická adresa v paměti, <+ n> to je známé jako ofset, v zásadě vzdálenost od začátku funkce (hlavní) k tomuto tvrzení (známému jako opcode). Pak vidíme typ instrukce (push / mov / callq…) a jeden nebo více registrů. Souhrnně lze říci, že jde o indikaci, za kterou následuje zdroj / původ a cíl. <return_input> odkazuje na naši druhou funkci, pojďme se podívat.

return_input

Vlastní. Christopher Diaz Riveros

To je trochu složitější, ale jen chci, abyste zkontrolovali pár věcí, existuje značka s názvem <gets@plt> a poslední volaný operační kód retq označující konec funkce. Dáme pár zarážek, jeden do funkce gets a další v retq.

Vlastní. Christopher Diaz Riveros

Běh

Nyní spustíme program, abychom zjistili, jak akce začíná.

Vlastní. Christopher Diaz Riveros

Vidíme, že se objeví malá šipka označující operační kód tam, kde jsme, chci, aby zohlednili směr 0x000055555555469b, toto je adresa po volání na return_input ve funkci main , to je důležité, protože právě tam by se měl program vrátit, když dokončíte příjem souboru vstup, pojďme do funkce. Nyní provedeme kontrolu paměti před vstupem do funkce gets.

Vlastní. Christopher Diaz Riveros

Vrátil jsem pro vás hlavní funkci a zvýraznil jsem kód, na který jsem odkazoval, jak vidíte, kvůli endianness byla rozdělena do dvou segmentů, chci, aby zohlednily směr 0x7fffffffdbf0 (první zleva po komando x/20x $rsp) protože toto je místo, které musíme použít ke kontrole výsledků get, pokračujme:

Porušení programu

Vlastní. Christopher Diaz Riveros

Zdůraznil jsem je 0x44444444protože jsou reprezentací našich D 🙂 nyní jsme začali přidávat vstup do programu a jak vidíte, jsme jen dva řádky od naší požadované adresy, budeme ji vyplňovat, dokud nebudeme těsně před adresami, které jsme zvýraznili v předchozím kroku.

Změna zpáteční cesty

Nyní, když se nám podařilo zadat tuto část kódu, kde označuje návrat funkce, podívejme se, co se stane, když změníme adresu 🙂 místo toho, abychom šli na místo operačního kódu, které následuje po tom, co jsme měli před chvílí, co si myslíte, když se vrátíme zpět return_input? Ale k tomu je nutné napsat adresu, kterou chceme, v binárním formátu, uděláme to s funkcí printf z bash 🙂

Vlastní. Christopher Diaz Riveros

Nyní jsme obdrželi informace dvakrát - program pro to určitě nebyl vytvořen, ale podařilo se nám rozbít kód a přinutit ho opakovat něco, co neměl dělat.

Úvahy

Tuto jednoduchou změnu lze považovat za využít velmi základní 🙂 podařilo se mu prolomit program a udělat něco, co od něj chceme.

Toto je jen první krok v téměř nekonečném seznamu věcí, které je třeba vidět a přidat, existují způsoby, jak přidat více věcí, než jen opakovat objednávku, ale tentokrát jsem toho napsal hodně a vše, co se týkalo shell kódování je to předmět psát víc než články, řekl bych úplné knihy. Omlouvám se, pokud jsem nebyl schopen ponořit se trochu víc do témat, která by se mi líbila, ale určitě bude šance 🙂 Zdravím a děkuji, že jste se sem dostali.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   2p2 řekl

    Buďte přímější. Pište méně a soustřeďte se na to, na čem záleží

    1.    ChrisADR řekl

      Ahoj, děkuji za komentář.

      Po pravdě řečeno, odřízl jsem velkou část myšlenek, ale i tak se mi zdálo, že jsem nechal minimum, aby někdo, kdo nemá znalosti programování, mohl získat nápad.

      pozdravy

      1.    anonymní řekl

        Problém je v tom, že ti, kteří nemají znalosti programování, se o ničem nedozví, protože je to na začátek příliš složité, ale ti, kteří umí programovat, oceňují, že jsou přímější.

        Předpokládám, že nemůžete oslovit každého, musíte si vybrat, a v tomto případě jste zhřešili, abyste chtěli hodně pokrýt.

        Mimochodem, říkám vám to jako konstruktivní kritiku, miluji tato témata a byl bych rád, kdybyste pokračovali v psaní článků, gratuluji!

    2.    anonymní řekl

      Myslím totéž.

      1.    ChrisADR řekl

        Moc vám oběma děkuji !! Je jistě obtížné pochopit, jak oslovit cílové publikum, když je pravda, že počet lidí s pokročilou úrovní programování, kteří čtou tyto články, je malý (alespoň to lze odvodit na základě komentářů)

        Určitě jsem zhřešil, když jsem chtěl zjednodušit něco, co vyžaduje pochopení široké znalostní základny. Doufám, že chápete, že jelikož s blogováním teprve začínám, dosud jsem neobjevil přesný bod, kdy moji čtenáři vědí a chápou, co říkám. Díky tomu by bylo mnohem snazší říkat pravdu 🙂

        Pokusím se být kratší, když si to zaslouží, aniž by se odosobnil formát, protože oddělit způsob psaní od obsahu je trochu komplikovanější, než by si člověk dokázal představit, alespoň je mám docela propojené, ale předpokládám, že nakonec budu schopen místo přidávání řádků přidávat řádky.

        pozdravy

  2.   Mario řekl

    Kde byste se o tomto tématu mohli dozvědět více? Nějaká doporučená kniha?

    1.    ChrisADR řekl

      Příklad, který jsem dostal z The Shellcoder's Handbook od Chrisa Anleyho, Johna Heasmana, Felixe Lindera a Gerarda Richarteho, ale abych mohl udělat 64bitový překlad, musel jsem se naučit o své architektuře, manuál pro vývojáře Intel, svazky 2 a 3 jsou docela spolehlivý zdroj. Je také dobré si přečíst dokumentaci GDB, která je dodávána s příkazem 'info gdb'. Chcete-li se naučit Assembly a C, existuje mnoho velmi dobrých knih, kromě toho, že knihy Assembly jsou trochu staré, takže existuje mezera k vyplnění jiným typem dokumentace.

      Samotný shellcode již není z různých důvodů tak efektivní, ale stále je zajímavé naučit se nové techniky.

      Doufám, že to trochu pomůže 🙂 Zdravím

  3.   Franz řekl

    Dobrý článek, starý blog desdelinux znovuzrozena =)
    Když říkáte, že vzdálený shell není tak efektivní, máte na mysli protiopatření určená ke zmírnění útoků, nazývají to útočné zabezpečení.
    Zdravím a držte to

    1.    ChrisADR řekl

      Děkuji mnohokrát Franzi 🙂 velmi laskavá slova, vlastně jsem tím myslel, že dnešní Shellcoding je mnohem složitější než to, co zde vidíme. Máme ASLR (generátor náhodného umístění paměti) chránič zásobníku, různá opatření a protiopatření, která omezují počet operačních kódů, které lze vložit do programu, a to je jen začátek.

      S pozdravem,

  4.   Svobodný software řekl

    Dobrý den, uděláte další část rozšiřující téma? To je zajímavé

    1.    ChrisADR řekl

      Dobrý den, téma je určitě docela zajímavé, ale úroveň složitosti, kterou bychom brali, by byla velmi vysoká, pravděpodobně by zahrnovala velké množství příspěvků, které by vysvětlovaly různé předpoklady pro pochopení toho druhého. Pravděpodobně o tom budu psát, ale nebudou to následující příspěvky, chci napsat několik témat, než budu pokračovat v tomto.

      Zdravím a děkuji za sdílení

  5.   kaktus řekl

    Velmi dobrá che! Přispíváte skvělými příspěvky! Jedna otázka, začínám tuto věc IT Security čtením knihy s názvem „Zajištění bezpečnosti testováním pera“. Je tato kniha doporučena? Jak navrhujete, abych se začal o těchto otázkách ptát?

    1.    ChrisADR řekl

      Ahoj kaktusi, je to celý vesmír o zranitelnostech a dalších. Abych řekl pravdu, záleží hodně na tom, co upoutá tvoji pozornost a na potřebách, které máš, IT manažer nemusí vědět totéž jako tester na pera, Nebo výzkumník zranitelnosti nebo forenzní analytik, tým pro zotavení po katastrofě má velmi odlišnou sadu dovedností. Je zřejmé, že každý z nich vyžaduje jinou úroveň technických znalostí, doporučuji vám začít objevovat přesně to, co se vám líbí, a začít hltat knihy, články a další, a co je nejdůležitější, procvičovat vše, co čtete, i když je zastaralé , to nakonec změní.
      S pozdravem,

  6.   Eizen řekl

    Dobrý den.
    Velice vám děkuji za vysvětlení tohoto tématu a za komentář, že pro další informace máme „Příručku Shellcoder's“. Už mám čekající čtení 😉