PV177 - Útoky na vlastní stroj Lukáš Ručka (učo: 359687), Jan Doleček (učo: 256331) 5. kvetna 2010 1 Zadání Vyzkoušet si různé metody útoku proti distribuci DVL (Linux). Sepsat zprávu. 2 Lokální útoky Pro provedení tohoto typu útoku je zapotrebí mít základní práva k systému (tzn. napr. uZivatelsky shell). K tomu se muze útoCník dostat pomocí útoku na sít'ove sluzby. Obvyklúm cílem útoku je zvysení oprúvnení uCtu, ktery hacker ke svym operacím pouzíva, avsak muze se jednat i o pokus napadnout nejakou sluzbu pomocí její zname nebo cerstve objevene slabiny. V dalsí cústi je zmíneno nekolik vyzkousenych a jiz nejakou dobu znamúch útoku vuci slabinúm programu umístenych v systemu. 2.1 Utok vyúž ívaj íc í volán í jiného programů Mejme hypotetickou situaci, kdy mame uzivatele A a program P (s prúvy L, patrící uzivateli B s nastaveným SUID bitem) a utocníkuv kod Q. Uzivatel A spustí program B, kterú behem sveho provadení, napríklad na zaklade promenne prostredí, vola program R. Jelikoz mú tento program P nastaveny SUID bit, je spusten jako proces s pravy vlastníka a proto i jeho dcerine procesy, pokud se teto vyhody dobrovolne nevzdají, pokracují s temito opravneními. Jako príklad takoveho postupu muze byt program, kterú si obstarava strankovaní pomocí programu, uvedenem v promenne prostredí $ { PAGER} . Toho lze docílit napríklad tak, ze si zalozíme pojmenovanou rouru, do ktere z programu presmerujeme vústup, a ze ktere bude císt prave strúnkovací program. Takovú strankovací program je pak pri nesprúvne implementaci tohoto mechanismu spusten s oprúvneními L. Vzhledem k faktu, ze se SUID bit obvykle pouzívú pro prístup na vyssí úroveň oprúvnení, muze takto útocník eskalovat sva oprúvnení (byt treba v omezene míre). Znamúm prípadem tohoto druhu utoku je exploit promenne $ { PAGER} u programu cdrecord ze zúrí roku 20041. Tato konkretní bezpecnostní díra se jiz v DVL nevyskytuje. 2.2 Utok vyúž ívaj íc í prétéCén í búfférú Tento druh uítoku se opíría o to, ňze nňekdy není kontrolovían vstup programu, zda nepňresahuje velikost oblasti pamňeti, kam je vstup nahravan. Toho muze vyuzít útocník tak, ze svúm vstupem prepíse núvratovou adresu ulozenou na zasobníku tak, ze nova núvratovú adresa bude ukazovat do jeho vstupu. Ten pak muze obsahovat predchystanú kod, ktery je spusten pod oprávnením dane aplikace. Takovú kod mú obvykle podobu tzv. nopsledu + útocnych instrukcí. Nopsled je slangovy vúraz pro posloupnost instrukce nop 2 (No OPeration).. Za touto posloupností jiz nasledují vlastní instrukce uítoku. Procesor tedy pňri níavratu z rutiny najde adresu ukazující do nopsledu, ten pňreskoňcí a spustí útocníkuv kod. Toto je popis konkretní verze techniky, vyuzívající pretecení dat na zasobníku. Cílem útocníka nemusí byt jen spuňstňeníí koídu, níybrňz i manipulace s daty, nad nimiňz program operuje. To je víyhodou oproti pňredchozíímu uvedeníemu uítoku. Mozne obrany proti tomuto útoku jsou: • Osetrovat delku jakehokoli vstupu 1 http://www.milw0rm.com/exploits/438 2 Tato instrukce je jednobajtová a je procesorem ignorována. V bežne praxi se používá na zarovnání spustitelného kodu na adresy dělitelné poCtem bitu architektury daneho stroje (na i?86 platformach se obvykle jedna o 4B nebo 8B pro 64bit architektury) 1 • Metoda "kanárků" Tato metoda je pojmenována podle praxe horníků, kteří když potrebovali vedet, zda je v sachte dychatelny vzdůch, spustili do ní klícků š kanárkem. Pokůd kanarek přežil, bylo vše v pořadků. Jedna z možných implementací spoCíva v alokaci místa na vrcholů zasobníků a ůložení nejakeho magickeho císla do tohoto prostorů. Pokůd pri opoůstení volane růtiny najdeme neplatnoů hodnotů, mame jistí pokůs o ítok a skoncíme. Obecne se tedy jedna o zajistení integrity dat na zasobníků behem průbehů zranitelne fůnkce. (kompilator gcc ůmí tůto kontrolů vklídat aůtomaticky) • Randomizace prostorů virtůalních adres Aby ůtocník mohl íspesne prepsat nívratovoů adresů, potrebůje k tomů predem znat adresů pameti, kde je ůlozen jeho kod. Stací mů program spůstit s níhodnoů nívratovoů adresoů, coz vsak způsobí pad programů. V zaznamů o padů programů si pak ůtocník můze najít adresů, kde byla provedena neplatna operace, a tím adresů svíeho kíodů zjistit. Proto vznikla technika naíhodníeho mapovíaní kíodů a knihoven do prostorů adres virtůílní pameti. Pri kazdem spůstení programů operacní system napamůje bloky kodů a dat na jine virtůalní adresy a tůdíz ítocník nemůze predpovedet spravnoů navratovoů adresů, ktera by odkazovala na jeho kod. Tento typ ůtoků se tak stava nepoůzitelnym. Po shlednůtí demonstrace samotneho ítoků3 Tip: Na konec vlastních ítocních instrůkcí je lepsí pridat instrůkce pro zapis původní navratove hodnoty do napadene oblasti pameti a skocit na tůto adresů. Vyhneme se tak napríklad zaznamenaní padů hostitelskeho programů. 3 Vzdálené útoky 3.1 Remote Code Injection PhpMyAdmin je program napsaní v jazyce PHP, kterí ůmozňůje jednodůche spravovaní databazí mySQL v prostredí weboveho rozhraní. Pro jeho snadnoů instalaci je k archivů programů pribalen i konfigůracní průvodce, ktery tento program nastaví, a ůmozní tak snadnoů instalaci komůkoliv. Průvodce fůngůje tak, ze se zepta na potrebne ídaje k databazi (prípadne se nektere pokůsí dohledat sím), a pri dokoncovíní vytvorí konfigůracní soů-bor nesoůcí zadane nastavení a ůlozí jej na disk. Program phpMyAdmin z tohoto soůborů nacítí konfigůraci. Jak je ů PHP aplikací zvykem, konfigůracní soůbor je klasickí spůstitelny .php soůbor, ve kterem jsoů inicializovane konfigůracní promenne. Protoze verze phpMyAdminů instalovana na strojích DVL nekontrolůje důsledne vstůp zadany ůzivatelem, je mozne ůmele vytvorit http pozadavek se specifickími daty, které znetvorí konfigůracní soůbor a primití jej tak provadet akce, které sami chceme. Konkrétne se jedna o radek s kídem: $ cfg['Servers'][$ i]['hosť] = 'hodnota zadana ůzivatelem' ; Pokůd ůzivatel zadía jako vstůp nap r.: ''; skodlivy-kod; // vznikne v konfigůracním soůborů radek: $ cfg['Servers'][ $ i]['host'] = ' ' ; skodlivy-kod; //' ; Pňri spůňstňeníí tohoto soůborů se nyníí nejen provede inicializace promňennyích, ale takíe se spůstíí libovolnyí kíod zadanyí ůítoňcnííkem se stejnyím opraívnňeníími, jako mía spůňstňenaí PHP aplikace. Je tak moňzníe zíískat shell na stroji, na ktery nemame vůbec pristůp. Prípadne ítocník můze zkůsit poůzít zranitelnosti popsane ve 2. kapitole pro eskalaci prív a pokůsit se tak dostat na shell administratora. (pomocí príkazů v PHP stahnoůt a spůstit externí program, kteryí ůmoňzníí ůíroňcnííkovi pňripojit se na shell administríatora) Pňri spůňstňeníí tohoto soůborů se nyníí nejen provede inicializace promňennyích, ale takíe se spůstíí libovolníy kíod zadanyí ůítoňcnííkem se stejníym opraívnňeníími, jako maí spůňstňenía PHP aplikace. Je tak mozne získat shell na stroji, na kterí nemame vůbec pristůp. Prípadne ítocník můze zkůsit poůňzít zranitelnosti popsaníe ve 2. kapitole pro eskalaci príav a pokůsit se tak dostat na shell administríatora. (pomocí príkazů v PHP stahnoůt a spůstit externí program, ktery ůmozní írocníkovi pripojit se na shell administrátora) (Pozn.: na strojích DVL nebyl konfigůracní průvodce poůzit, níbrz byla konfigůrace vytvorena jinde a poůze prekopírovína. Konfigůrator tak nemel nastaveno oprávnení zapisovat a nemohl zranitelní soůbor vytvorit. Zde se tedy ůítok nepovedl.) 4 Záver Pomocí nekolika postůpnych ůtoků můze ítocník relativne snadno získat administratorska prava k systemů, ke kteremů by nemel mít vůbec zadny prístůp. Velmi casto za to můze trestůhodna nedbalost ci lenost programatorů (oznaňceníe místo okomentůjí, ňze je tňreba pozdňeji toto oňsetňrit, a samozňrejmňe to nikdy neůdňelají) pňri oňsetňrovíaní vstůpů zadaníeho ůňzivatelem. 3http://www.youtube.com/watch?v=ZZ0LVAFIDrA 2