CCERT-PUBDOC-2004-12-100

Embed Size (px)

Citation preview

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    1/15

    Napredne metode otkrivanjasigurnosnih propusta

    CCERT-PUBDOC-2003-12-100

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    2/15

    Sigurnosni problemi u raunalnim programima i operativnim sustavima podruje jena kojem CARNet CERT kontinuirano radi.

    Rezultat toga rada ovaj je dokument koji je nastao suradnjom CARNet CERT-a i LS&S-a, a za koji se nadamo se da e Vam koristiti u poboljanju sigurnosti Vaeg sustava.

    CARNet CERT, www.cert.hr - nacionalno sredite za sigurnostraunalnih mreai sustava.

    SS, www.lss.hr- laboratorij za sustave i signale pri Zavodu zaelektronike sustave i obradbu informacija Fakulteta elektrotehnike iraunarstva Sveuilita u Zagrebu.

    Ovaj dokument predstavlja vlasnitvo CARNet-a (CARNet CERT-a). Namijenjen je za javnu objavu, njime se moesvatko koristiti, na njega se pozivati, ali samo u originalnom obliku, bez ikakvih izmjena, uz obaveznonavoenje izvora podataka. Koritenje ovog dokumenta protivno gornjim navodima, povreda je autorskih prava

    CARNet-a, sukladno Zakonu o autorskim pravima. Poinitelj takve aktivnosti podlijee kaznenoj odgovornostikoja je regulirana Kaznenim zakonom RH.

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 2 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    3/15

    Sadraj

    1. UVOD .............................................................................................................................................. 42. FUZZING METODE I TEHNIKE ............................................................................................................... 43. LOKALNI FUZZER ALATI...................................................................................................................... 54. MRENI FUZZERALATI ....................................................................................................................... 75. ANALIZA SIGURNOSTI U SAMOM IZVRAVANJU PROGRAMA................................................................... 105.1. RANJIVA STRCPY FUNKCIJA ...................................................................................................................... 105.2. FORMAT STRINGPROPUST ........................................................................................................................ 115.3. PRAENJE KORISNIKOG UNOSA ................................................................................................................. 126. ZAKLJUAK .................................................................................................................................... 137. REFERENCE..................................................................................................................................... 138. DODATAK A .................................................................................................................................... 13

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 3 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    4/15

    1. UvodSigurnost raunalnog sustava uvelike ovisi o stupnju njegove transparentnosti. Ukoliko je sustav

    jednostavan i pristupaan, otkrivanje njegovih sigurnosnih propusta i nedostataka moe biti vrlojednostavan i kratak proces. Kod sloenijih sustava proces otkrivanja sigurnosnih propusta mnogo jekompliciraniji i zahtijeva znatno vie vremena i truda.Osnovni cilj postupka analize sigurnosti raunalnog sustava je prikupiti to vie upotrebljivihinformacija, a da se pri tome utroi to manje vremena i resursa. Ukoliko se radi o kompleksnomraunalnom sustavu to nije uvijek mogue, pa su se iz tog razloga poeli razvijati razliiti alati kojiautomatiziraju postupak ispitivanja sigurnosti. Takvi alati se obino nazivaju fuzzeri i onipredstavljaju znaajan pomak u podruju otkrivanja sigurnosnih propusta. Njihovom upotrebommogue je pravovremeno uoiti nove i nepoznate ranjivosti, koje potencijalni neovlateni korisnicimogu iskoristiti za nedoputene, odnosno maliciozne radnje.U ovom dokumentu opisani su postupci otkrivanja sigurnosnih propusta uz pomo jednostavnih, aliuinkovitih alata, koji automatiziraju proces analize sigurnosti programa i servisa na Linux

    operacijskim sustavima. Iako se alati fokusiraju na otkrivanje danas najopasnijih sigurnosnih propustakao to su preljevi spremnika i format stringpropusti, rezultat analize moe biti i otkrivanje ranjivostina napad uskraivanjem raunalnih resursa (engl. Den al of Service). Fuzzeralati omoguavaju analizusigurnosti raunalnog programa bez izravne intervencije osobe ili tima koji su ukljueni u proces, tosvakako predstavlja odreenu prednost.

    i

    r

    r

    r

    r

    Tehnike i metode koje koriste fuzze alati uglavnom su vrlo jednostavne. Fuzzeralat razumije protokolili nain na koji funkcionira odreena aplikacija, te na temelju toga aplikaciji prosljeuje onevrijednosti koje bi mogle uzrokovati nepredvidljivo ponaanje koje upuuje na potencijalni sigurnosniproblem. Na Internetu je danas mogue pronai besplatne i komercijalne fuzze alate, ija kvalitetavarira od proizvoda do proizvoda. Trenutno najpoznatiji mreni fuzzer je alat pod nazivom SPI KE, koji se odlikuje mnotvom opcija i funkcionalnosti, te predstavlja trenutno najbolji besplatni fuzzeralat. Poznat je i alat pod nazivom CHAM(engl. Common Hacking Attack Methods), komercijalni fuzzer

    alat kojeg je razvila tvrtka eEye koja trenutno zauzima vodee mjesto u podru

    ju otkrivanjasigurnosnih propusta na Windows operacijskim sustavima. CHAM fuzzer dolazi integriran u alat

    Ret i nakoji slui za provjeru ranjivosti (engl. vulne ability scanning) raunalnih sustava i mrea.Za potrebe dokumenta razvijeni su programi koji na jednostavan nain prikazuju tehnike i metode nakojima se baziraju fuzzer alati. Takoer treba napomenuti da je u sklopu provedenih testiranjaotkriveno nekoliko sigurnosnih propusta od kojih e neki biti poblie objanjeni u nastavkudokumentu.

    2. Fuzzing metode i tehnikeDa bi fuzzeralat mogao analizirati sigurnost odreenog raunalnog sustava, odnosno aplikacije, on naneki nain mora s njome komunicirati. Ukoliko se radi o korisnikom programu, fuzzer mora biti umogunosti predavanja unosa aplikaciji, a ukoliko se radi o mrenoj aplikaciji odnosno Internet

    servisu, fuzzermora poznavati i protokol na kojem se servis bazira.Metode za otkrivanje sigurnosnih propusta koje koriste fuzzer alati uglavnom su vrlo jednostavne. Sciljem otkrivanja sigurnosnog propusta, fuzzerpokuava "napasti" aplikaciju korisnikim unosom zakoji se pretpostavlja da bi mogao uzrokovati probleme koji upuuju na potencijalni sigurnosniproblem. Osnovna tehnika na kojoj se baziraju fuzzer alati je modifikacija korisnikog unosa na nainda se umjesto standardnih upita i naredbi koje se predaju aplikaciji, alju podaci koji se razlikuju odonih koje aplikacija oekuje. Najee se radi o predugim upitima ili o specijalnoj kombinaciji naredbi,parametara i znakova koji bi mogli uzrokovati nepredvieno ponaanje aplikacije koja se testira.Iako su fuzze i iznimno moan alat u rukama sigurnosnih strunjaka, oni ipak imaju odreenenedostatke. Nedostatak fuzzeraje injenica da se njihov rad i uspjenost zasniva na metodi pokuaja ipromaaja, te na znanju i iskustvu osobe koja je izradila odreeni fuzzer alat. Neke sigurnosnepropuste koji su na prvi pogled oiti u sluaju analize izvornog koda aplikacije, teko je otkriti fuzzing

    tehnikama. Moe se npr. raditi o sigurnosnom propustu koji za svoju realizaciju zahtijeva odreene

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 4 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    5/15

    akcije koje moraju biti provedene prije nego se pozove naredba, instrukcija ili parametar koji izazivasigurnosni propust.Fuzze programi dijele se na lokalne i mrene verzije. Lokalni fuzze alati slue za analizu korisnikihprograma koji se nalaze na lokalnom raunalu. Uglavnom se radi o korisnikim programima koji nakonpokretanja korisniku daju veu razinu ovlasti od onih koje veima. Mreni fuzzer alati slue za analizusigurnosti mrenih aplikacija odnosno servisa (npr. FTP, HTTP, SMTP, itd.). Da bi mreni fuzzeralatimogli uspjeno provjeriti "otpornost" aplikacije na razliite napade oni moraju dobro poznavatiprotokol na kojem se aplikacija zasniva, pa o tome na kraju i ovisi uspjenost samog fuzzer alata.Prilikom provedbe fuzzingtesta na aplikaciji, poeljno je nadgledati ponaanje aplikacije u odnosu nakoliinu memorije koju alocira, operacije na datotenom sustavu, prekide i signale koje aplikacijauzrokuje i dobiva, te eventualno nasilno prekidanje rada aplikacije (engl. crash) koje moe upuivatina potencijalni sigurnosni problem. Ponaanje aplikacije najbolje je nadgledati nekim rea timealatom za otkrivanje greaka (engl. debuger), pomou kojeg je mogue analizirati stanje aplikacije usvakom trenutku. Za Linux operacijski sustav preporua se gdb, a za Windows operacijske sustavepoznat je alat pod nazivom Ol l yDbg(

    r r

    l

    http://home.t-online.de/home/Ollydbg).

    3. Lokalni fuzzer alatiKao to je veobjanjeno, lokalni fuzze alati slue za analizu sigurnosti korisnikih programa kojimogu biti iskoriteni za eskaliranje privilegija potencijalnog neovlatenog korisnika. Uglavnom se radio tzv. sui d(engl. set use ID) aplikacijama koje korisniku privremeno pruaju viu razinu ovlasti nasustavu. Lokalni fuzzeralat na Linux operacijskom sustavu moe testirati aplikaciju npr. s obzirom naargumente koji se aplikaciji predaju putem naredbenog retka i na podatke koje aplikacija preuzima izvarijabli okruenja (engl. env onment). Takvi fuzzer alati su jednostavni, a uglavnom na brz i efikasannain dokazuju postojanje sigurnosnog propusta.

    r

    r

    ir

    Varijable okruenja esto znaju biti predmet sigurnosnih propusta, jer programeri ne pridodajudovoljnu panju operacijama koje se obavljaju na podacima dobivenim iz njih. Pri analizi sigurnostiaplikacija esto se moe naii na dijelove koda u kojima se podaci preuzimaju iz varijabli okruenja, a

    zatim se nad tim podacima obavljaju operacije za koje se zna da mogu uzrokovati sigurnosni propust.Takve funkcije mogu biti npr. strcpy(), spr i nt f ( ), f pr i nt f ( ) itd. Program, odnosno fuzzeralat koji e testirati ranjivosti vezane uz varijable okruenja jednostavno je napisati, a rezultati mogubiti i vie nego zadovoljavajui. U nastavku je priloen jednostavan Linux fuzzer koji omoguujetestiranje sigurnosti aplikacije s obzirom na podatke koje ona preuzima iz varijabli okruenja. Fuzzerza svaku varijablu okruenja postavlja niz znakova duine 100000 okteta, to kod nekih programauzrokuje preljeve spremnika.

    Myfuzz.c

    #i ncl ude #i ncl ude #i ncl ude #i ncl ude

    char *ptr ;

    char *get env( const char *name){

    i f ( st r ncmp( name, "HOME", 4) == 0)return "/ home/ l j ur ani c";

    i f ( st r cmp(name, "LD_PRELOAD" ) ==0)r eturn NULL;

    i f ( st r cmp(name, "LOGNAME") ==0)r eturn NULL;

    return pt r;}

    ui d_t get ui d ( voi d){

    r eturn 500;}

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 5 / 15

    http://home.t-online.de/home/Ollydbghttp://home.t-online.de/home/Ollydbg
  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    6/15

    ui d_t get eui d ( voi d){

    r eturn 500;}

    ui d_t get gi d ( voi d){

    r eturn 500;}

    ui d_t get egi d ( voi d){

    r eturn 500;}

    voi d _ i ni t ( ){

    pt r = ( char *) mal l oc ( 100000) ;memset ( pt r , ' A' , 100000) ;

    }Priloeni fuzzeralat realiziran je u obliku biblioteke koja preuitava (engl. preload) odreene GLI BCpozive i vraa odreene vrijednosti za svakog od njih. Samo testiranje ranjivosti odnosi se napreuitavanje poziva get env( ) koji slui za dolazak do sadraja varijable okruenja i postavljanjapovratne vrijednosti tog poziva na niz znakova duina 100000 okteta. Linux biblioteke prevode sedrugaije nego obini programi kao to je i prikazano u nastavku.# gcc myf uzz. c - c f PI C# l d - o myf uzz. so myf uzz. o - l dl - shar ed l c

    Nakon prevoenja dobivamo biblioteku myf uzz. so. Linux operacijski sustav pri pokretanjuprograma provjerava varijablu okruenja LD_PRELOAD. Uglavnom je ta varijabla prazna, no onamoe sadravati putanju do biblioteke koja e se naknadno uitati u memoriju aplikacije koja sepokree. U ovom sluaju funkcije koje e se uitati zamjenjuju GLI BCpozive vlastitim kodom, pa eaplikacija umjesto originalnih poziva koristiti pozive od fuzzer programa i na taj nain omoguiti

    analizu sigurnosti. Postavljanje LD_PRELOADvarijable prikazano je u nastavku.# expor t LD_PRELOAD=/ r oot / PROJ EKTI / myf uzz. so

    Za analiziranje sigurnosti korisnikih programa vano je napomenuti da se testovi moraju provoditipod ovlastima r oot korisnikog rauna, jer obian korisnik nema ovlasti preuitavanja biblioteka zasui daplikacije.Ovom jednostavnom bibliotekom otkrivena su 22 preljeva spremnika u standardnim korisnikimprogramima na operacijskom sustavu Linux Red Hat 7. 3 u periodu od 10 minuta. Programi ukojima su otkrivene ranjivosti pomou myf uzz. so biblioteke su: gt k- demo, 4r df, 4xupdat e,Mai l , apacheconf, ar t spl ay, ar t sshel l , aut hconf i g- gt k, consol ehel per,dat econf i g, ddd, di a, di g, di sol , ethereal , f ax2t i f f , f mt est, gconf t ool - 1,get ent, gf tp, gt k- gf t p i gnome- man2ht ml 2.U nastavku je poblie prikazano otkrivanje preljeva spremnika u popularnom programu za nadgledanje

    mrenog prometa pod nazivom Et hereal .[ r oot@l apt op MYFUZZER] # et her eal vethereal 0. 9. 3, wi t h GTK+ 1. 2. 10, wi t h GLi b 1. 2. 10, wi t h l i bpcap 0. 6, wi t hl i bz 1. 1. 3, wi t h UCD SNMP 4. 2. 4[ r oot@l aptop MYFUZZER] # expor t LD_PRELOAD=" . / myf uzz. so"[ r oot@l apt op MYFUZZER] # et her ealSegment at i on f aul t ( cor e dumped)[ r oot @l aptop MYFUZZER] # export LD_PRELOAD=""[ r oot@l aptop MYFUZZER] # gdb - c=cor e. 1737GNU gdb Red Hat Li nux ( 5. 1. 90CVS- 5)Copyr i ght 2002 Fr ee Sof t ware Foundat i on, I nc.GDB i s f r ee sof t ware, cover ed by t he GNU General Publ i c Li cense, and you arewel come to change i t and/ or di st r i but e copi es of i t under cer t ai n condi t i ons.Type " show copyi ng" t o see t he condi t i ons.There i s absol utel y no war r ant y f or GDB. Type "show war r anty" f or detai l s.Thi s GDB was conf i gured as " i 386- r edhat - l i nux".

    Cor e was generat ed by `AAAAAAAAA' .Progr amt ermi nated wi t h si gnal 11, Segment ati on f aul t .#0 0x420824ac i n ?? ( )

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 6 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    7/15

    ( gdb) bt#0 0x420824ac i n ?? ( )#1 0x42051ca8 i n ?? ( )#2 0x4206dbf 3 i n ?? ( )#3 0x4205a257 i n ?? ( )

    #4 0x4005f 5b7 i n ?? ( )#5 0x41414141 i n ?? ( )Cannot access memor y at addr ess 0x41414141( gdb) f r ame 5#5 0x41414141 i n ?? ( )$ei p( gdb) pr i nt $ei p$1 = ( voi d *) 0x41414141( gdb)

    uto oznaene linije oznaavaju uitavanje myf uzz. so biblioteke, pokretanje Ether eal aplikacije i njezino ruenje. Ruenje aplikacije sa porukom "Segmentation fault" oznaava pogrekupri upravljanju sa memorijom, to upuuje na sigurnosni propust.Nakon otvaranja core. 1737datoteke (pomou gdbprograma) koja predstavlja sadraj memorijeEt hereal procesa prilikom ruenja, vidljivo je da je stog prepisan znakovima 'A' (heksadecimalno0x41 na zadnjoj uto oznaenoj liniji), to upuuje na klasini propust preljeva spremnika.

    4. Mreni fuzzeralatiKao to je venavedeno, mreni fuzzer alati omoguuju analizu sigurnosti mrenih aplikacija, odnosnoservisa. Veliki broj sigurnosnih propusta visokog sigurnosnog rizika u brojnim popularnim mrenimaplikacijama moe biti otkriven jednostavnim fuzzingtestom. Isto tako, velik broj ranjivosti koje subrojni poznati mreni crvi koristili za svoje irenje, mogle su biti locirane i eliminirane prije nego tosu ovi maliciozni programi kompromitirali velik broj posluitelja na Internetu i time uzrokovaliogromne novane gubitke.Za ispitivanje sigurnosti odreene mrene aplikacije potrebno je fuzze alat prilagoditi protokolu nakojem se ona zasniva. Bolji fuzzer alati kao to je SPI KE imaju mogunost modeliranja, odnosnodefiniranja specifikacija mrenih protokola, to omoguuje analizu velikog broja mrenih aplikacijarazliitih namjena. Metode i tehnike koje koriste mreni fuzzer alati sline su onima koje koristelokalni fuzzeri, samo to je u tom sluaju potrebno zadovoljiti i pravila koritenog mrenog protokola.U svrhu to kvalitetnije analize, potrebno je napraviti dobru specifikaciju protokola i u okvire testaukljuiti to vie mogunosti koje prua ciljna aplikacija.

    r

    s

    Primjer mrenog fuzzinga biti e objanjen na SMTP (engl. Simple Mail Transfer Protocol)posluiteljskom softveru. SMTP posluiteljski softver prema RFC (engl. Reque t For Comment)definiciji protokola mora podravati nekoliko naredbi kao to su HELO, MAI L, RCPT, DATA, NOOP,VRFY, EXPNi druge. Testiranje sigurnosti SMTP posluiteljskog paketa podrazumijeva testiranje svihnaredbi koje definira RFC specifikacija i njihovih parametara, odnosno argumenata. Samo testiranjeprovodi se parametrima i podacima koji u odreenoj mjeri odstupaju od definiranih standarda, ivjerojatno samim time od oekivanja programera koji je radio na razvoju programa.U nastavku je prikazano nekoliko jednostavnih testova kakve bi izmeu ostalih trebao provoditisolidan SMTPfuzzer alat.

    HELOHELO %n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%nMAI L FROM: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCPT TO: AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@VRFY: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :EXPN

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    8/15

    # VERY Si mpl e SMTP Fuzzer# - - - - - - - - - - - - - - - - - - - - - - -# Wi t h t hi s si mpl e, but aggr essi ve f uzzer i t i s easy t o di scover some obvi ous bugsi n# SMTP server sof t ware.

    ## Coded by Leon J urani c / / ht t p: / / secur i t y. l ss. hr#use I O: : Socket ;use Ti me: : l ocal t i me;

    @var = ( "HELO" , "MAI L FROM", "RCPT TO" , "DATA" , "RSET", "NOOP","VRFY", "EXPN", "VERB", "ETRN", "DSN", "AUTH", "STARTTLS" , "RCPT" , "MAI L",

    "QUI T", "EHLO") ;

    @f zzchr = ( "\ %n", "\ %n@\ %n. \ %n", "\ %x", "@", "@. @", "; ", ". ","t est\ @test. com; ", " : " , ") " , "( " , "#{",

    "" , "", " \ xf f " , " | " , " " , " \ %s" , " / " , "A" , "&" , " !" , "_" , "=" , "`" ) ;

    $SI G{PI PE} = ' \ &connect _smt pd' ; # handl e broken pi pe

    $SI G{ALRM}= ' \ &connect _smt pd' ;

    connect _smt pd( ) ;

    pr i nt $i n = ;

    f or ( $i nc = 1; $i nc < 4000 ; $i nc +=200){

    f oreach $chr ( @f zzchr ) {f oreach $cmd ( @var ){

    pr i nt "CMD: $cmd: " . $chr x 4 . ". . . \ n"; ;pr i nt $sock "$cmd\ r \ n";pr i nt $sock "$cmd" . $chr x $i nc . "\ r \ n";pr i nt $sock "$cmd: " . $chr x $i nc . "\ r \ n";pr i nt $sock " . \ r \ n" ;al ar m( 5) ;i f ( sysr ead ($sock, $i n, 10000) == 0) {

    connect _smt pd() ;}i f ( $i n =~/ 221/ | | $i ne =~ / 421/ ) { connect_ smt pd( ) };

    }

    }}

    pri ntf " \ n- > Stage 2. . . random (no output) \ n";sl eep 3;

    f or ( $i nc = 1; $i nc < 8000 ; $i nc +=400){

    f oreach $cmd ( @var )

    {$a = mi x_f zz_chr ( $i nc);pr i nt $sock "$cmd\ r \ n";

    pr i nt $sock $a . " \ r \ n";pri nt $sock "$cmd: " . $a . "\ r\ n";pr i nt $sock " . \ r \ n" ;al ar m( 5) ;i f ( sysread ($sock, $i n, 10000) == 0) {

    connect _smt pd( ) ;}i f ( $i n =~/ 221/ | | $i ne =~ / 421/ ) { connect_ smt pd( ) };

    }

    }

    pri nt " \ nDONE - FUZZI NG OVER! \ n";

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 8 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    9/15

    sub mi x_f zz_chr ( ) # ver y si mpl e "r andom" st r i ng generat or{

    my $num = @_;$tm = l ocal t i me;sr and ( $t m- >sec) ;

    f or ( $x = 0 ; $x < $num ; $x++){$i ndex = i nt ( r and( $#f zzchr - 1) ) ;$ret . = $f zzchr[ $i ndex];

    }return $ret;

    }

    sub connect _smt pd ( ){

    cl ose ($sock) ;$sock = I O: : Socket : : I NET- >new ( PeerAddr => $ARGV[ 0] ,

    PeerPor t => 25,Proto => "t cp") | | connect _smt pd( ) ;

    pr i nt " . " ;al arm 0;

    }Fuzzerse sastoji od dva testa. U prvom testu fuzzer se spaja na SMTP servis i testira SMTP naredbe naodreene nizove znakova koji mogu izazvati sigurnosni propust. Provoenje drugog testa se odnosi napseudo-sluajni odabir nizova znakova koji se alju SMTP naredbama. Nakon svakog prekida(zatvaranja mrene sjednice) SMTP servisa, fuzzer se ponovo spaja na servis, to rezultira prilinoagresivnom provjerom sigurnosti.Ovakav jednostavan fuzzer moe otkriti mnogo zanimljivih i opasnih sigurnosnih propusta, todokazuju mnogi sigurnosni propusti otkriveni u popularnom SMTP programskom paketu. Ovim SMTPfuzzerom otkriveni su sigurnosni propusti preljeva spremnika i fo mat string propust u SMTPposluitelju pod nazivom qwi k- smt pd. Format string propust u meuvremenu je objavljen (od treestrane), no qwi k- smt pd je izvrstan primjer ranjive aplikacije. U nastavku je prikazan sam proces

    fuzzing testa na qwi k- smt pdSMTP servisu pomou smt pf uzz. pl fuzze a.

    r

    r# per l smt pf uzz. pl l ocal hostCMD: DATA: %s%s%s%s. . .CMD: VRFY: %s%s%s%s. . .CMD: EXPN: %s%s%s%s. . .CMD: QUI T: %s%s%s%s. . .. CMD: EHLO: %s%s%s%s. . .CMD: HELO: / / / / . . .CMD: MAI L FROM: / / / / . . .CMD: RCPT TO: / / / / . . .CMD: DATA: / / / / . . .

    Vano je napomenuti da se smt pf uzz. pl fuzze om mogu otkriti mnogi jo neotkriveni sigurnosnipropusti u SMTP posluiteljima. U nastavku je prikazano otkrivanje fo mat stringpropusta u qwi k-smt pdposluitelju pomou smt pf uzz. pl fuzzera.

    r

    r

    [ r oot @l apt op SECRES] # perl smt pf zz. pl l ocal host. 220 l apt op r eadyCMD: HELO: %n%n%n%n. . .CMD: MAI L FROM: %n%n%n%n. . .CMD: RCPT TO: %n%n%n%n. . .CMD: DATA: %n%n%n%n. . .CMD: RSET: %n%n%n%n. . .CMD: NOOP: %n%n%n%n. . .CMD: VRFY: %n%n%n%n. . .CMD: EXPN: %n%n%n%n. . .CMD: VERB: %n%n%n%n. . .. CMD: ETRN: %n%n%n%n. . .CMD: DSN: %n%n%n%n. . .CMD: AUTH: %n%n%n%n. . .CMD: STARTTLS: %n%n%n%n. . .. CMD: QUI T: %n%n%n%n. . .

    . CMD: EHLO: %n%n%n%n. . .CMD: HELO: %n@%n. %n%n@%n. %n%n@%n. %n%n@%n. %n. . .

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 9 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    10/15

    CMD: MAI L FROM: %n@%n. %n%n@%n. %n%n@%n. %n%n@%n. %n. . .CMD: RCPT TO: %n@%n. %n%n@%n. %n%n@%n. %n%n@%n. %n. . .CMD: DATA: %n@%n. %n%n@%n. %n%n@%n. %n%n@%n. %n. . .

    Nakon zadnje naredbe DATA, SMTP posluitelj vie ne odgovara, a nakon analize debuger alatom,

    otkriven je format stringpropust kao to je prikazano u nastavku.Segment at i on f aul t ( cor e dumped)GNU gdb Red Hat Li nux ( 5. 1. 90CVS- 5)Copyr i ght 2002 Fr ee Sof t ware Foundat i on, I nc.GDB i s f r ee sof t ware, cover ed by t he GNU General Publ i c Li cense, and you arewel come to change i t and/ or di st r i but e copi es of i t under cer t ai n condi t i ons.Type " show copyi ng" t o see t he condi t i ons.There i s absol utel y no war r ant y f or GDB. Type "show war r anty" f or detai l s.Thi s GDB was conf i gured as " i 386- r edhat - l i nux". . .Core was gener ated by `qwi k- smt pd' .Progr amt ermi nated wi t h si gnal 11, Segment ati on f aul t .Readi ng symbol s f rom / l i b/ i 686/ l i bc. so. 6. . . done.Loaded symbol s f or / l i b/ i 686/ l i bc. so. 6Readi ng symbol s f rom / l i b/ l d- l i nux. so. 2. . . done.Loaded symbol s f or / l i b/ l d- l i nux. so. 2#0 0x42051f 75 i n vf pr i nt f () f rom / l i b/ i 686/ l i bc. so. 6( gdb)

    Oznaena linija predstavlja nasilno prekidanje rada programa u vf pr i nt f funkciji, to upuuje naformat string ranjivost.

    5. Analiza sigurnosti u samom izvravanju programaProces u izvravanju ponekad je lake analizirati ukoliko se za analizu odaberu specifi ne funkcijekoje mogu uzrokovati sigurnosni propust. U tu svrhu LSS grupa (http://security.lss.hr) je razvilaLi bAudi t biblioteku koja preuitava neke potencijalno ranjive GLI BCpozive i prijavljuje ih ukolikose pozivaju od strane ciljne aplikacije (ija sigurnost se analizira). Ova biblioteka posebno je korisnaukoliko se analizira sigurnost veih aplikacija, a pogotovo za programe za koje nije dostupan izvornikod. Li bAudi t trenutno preuitava strcpy, st r ncpy, get env, f pr i nt f , spri nt f ,snpr i nt f, vspr i nt f i vsnpr i nt f funkcije. Ukoliko ciljna aplikacija pozove neku od funkcija

    koje Li bAudi t preuitava, ispisuje se poruka koja moe izgledati otprilike ovako:

    [ Li bAudi t ] st r cpy ( 0xbf f f d2c0[ 32] , "CERT+LSS"[ 0xbf f f d464] )

    Iz primjera je vidljivo da ciljna aplikacija poziva strcpy funkciju, sa prvim argumentom (odredinispremnik) koji se nalazi na adresi 0xbf f f d2c0 i ima rezervirana 32 okteta, te sa drugimargumentom koji je "CERT+LSS", a nalazi se na adresi 0xbf f f d464. Li bAudi t u ovoj verzijimoe saznati veliinu spremnika samo ako se radi o stog dijelu memorijskog prostora. Takoer jevano napomenuti da se veliina argumenta kod ispisa argumenata funkcije skrauje na maksimalno50 znakova.Li bAudi t biblioteka se prevodi na sljedei nain:gcc l i baudi t . c -c f PI Cl d - o l i baudi t . so l i baudi t . o - l dl - shared l c

    Uitavanje biblioteke u memoriju procesa koji e se pokrenuti:# expor t LD_PRELOAD="/ r oot / PROJ ECTS/ LI BAUDI T/ l i baudi t . so

    Li bAudi t biblioteka priloena je u Dodatku A, a nain koritenja biblioteke prikazan je u nastavkuna nekoliko jednostavnih primjera.

    5.1. Ranjiva strcpy funkcijaPrvi primjer se odnosi na klasian preljev spremnika uzrokovan pogrenim koritenjem strcpyfunkcije. U nastavku je priloen izvorni kod za prvi primjer.Vuln1.c

    mai n (i nt ar gc, char **argv){

    char buf [ 32] ;

    pr i nt f ( "Trazenj e pr opust a pr i mj er #1\ n") ;

    pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;i f ( argc != 2){

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 10 / 15

    http://security.lss.hr/http://security.lss.hr/
  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    11/15

    pr i nt f ( "Upotr eba: %s \ n\ n", argv[ 0] ) ;exi t ( -1) ;

    }

    str cpy ( buf , ar gv[1] ) ;

    pr i nt f ( " I spi s : %s\n" , buf ) ;}

    Kao to je vidljivo iz izvornog koda, program je ranjiv na klasini preljev spremnika koji je oznaenutom bojom. U nastavku je prikazano prevoenje programa i njegova analiza pomou Li bAudi t biblioteke.

    [ r oot@l apt op MYFUZZER] # gcc vul n1. c o vul n1[ r oot@l apt opMYFUZZER] # expor t LD_PRELOAD="/ r oot/ PROJ ECTS/ LI BAUDI T/ l i baudi t . so[ r oot @l apt op MYFUZZER] # . / vul n1Tr azenj e propust a pr i mj er #1- - - - - - - - - - - - - - - - - - - - - - - - - - - -Upot r eba: . / vul n1 [ r oot@l aptop MYFUZZER] # . / vul n1 CERT+LSSTr azenj e propust a pr i mj er #1- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    [ Li bAudi t ] st r cpy ( 0xbf f f d2c0[ 32] , "CERT+LSS"[ 0xbf f f d464] )I spi s: CERT+LSS[ r oot @l apt op MYFUZZER] # . / vul n1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATr azenj e propust a pr i mj er #1- - - - - - - - - - - - - - - - - - - - - - - - - - - -[ Li bAudi t ] str cpy( 0xbf f f d290[ 32] , "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"[ 0xbf f f d42 f ] )I spi s: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASegment at i on f aul t[ r oot @l aptop MYFUZZER] #

    Oznaena linija predstavlja poruku koju ispisuje Li bAudi t biblioteka. Iz poruke je vidljivo da seunutar vul n1 programa poziva strcpy funkcija koja kopira parametre iz naredbenog retka u

    spremnik veliine 32 okteta, to upu

    uje na preljev spremnika. Program na kraju dobiva porukuSegmentation faultzbog preljeva spremnika koji je prepisao dio stog memorije.

    5.2. Format stringpropustFormat stringpropuste jako je lako otkriti pomou Li bAudi t biblioteke. Umjesto cjelovite analizeizvornog ili asemblerskog koda, mogue je pratiti korisniki unos kroz argumente funkcija kojeispisuje Li bAudi t biblioteka. Tako je mogue otkriti format string funkcije koje korisnikuomoguavaju da sam specificira format string argument i tako iskoristi format s ring propust. Unastavku je prikazan program koji je ranjiv na format s ringpropust.

    t

    tVuln2.c

    #i ncl ude

    mai n (i nt ar gc, char **argv){

    char buf [ 32] ;

    pr i nt f ( "Trazenj e pr opust a pr i mj er #2\ n") ;pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;i f ( argc != 2){

    pr i nt f ( "Upotr eba: %s \ n\ n", argv[ 0] ) ;exi t ( -1) ;

    }

    str ncpy (buf , argv[1] , s i zeof (buf )) ;f pr i nt f ( s tdout , buf ) ;

    }

    Oznaena linija predstavlja sam fo mat s ringpropust. Korisnik je u mogunosti odrediti format s ring

    argument f pr i nt f funkcije i na taj nain moe iskoristiti propust. U nastavku je prikazanoprevoenje, pokretanje i analiza programa vul n2.

    r t t

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 11 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    12/15

    [ r oot@l apt op MYFUZZER] # gcc vul n2. c o vul n1[ r oot@l apt op MYFUZZER] # expor t LD_PRELOAD=/ r oot/ PROJ ECTS/ LI BAUDI T/ l i baudi t . so[ r oot@l aptop MYFUZZER] # . / vul n2 CERT+LSSTr azenj e propust a pr i mj er #2- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    [ Li bAudi t ] st r ncpy ( 0xbf f f d2c0[ 32] , "CERT+LSS"[ 0xbf f f d462] , 32)[ Li bAudi t ] f pr i nt f ( 1, "CERT+LSS"[ 0xbf f f d2c0] , CERT+LSS)

    CERT+LSS[ r oot @l aptop MYFUZZER] # . / vul n2 CERT+LSS. %x. %x. %x. %xTr azenj e propust a pr i mj er #2- - - - - - - - - - - - - - - - - - - - - - - - - - - -[ Li bAudi t ] st r ncpy ( 0xbf f f d2b0[32] , "CERT+LSS. %x. %x. %x. %x"[ 0xbf f f d456] , 32)[L i bAudi t ] f pr i nt f (1,"CERT+LSS. %x. %x. %x. %x"[ 0xbf f f d2b0] , CERT+LSS. 20. bf f f d344. 54524543. 53534c2b)CERT+LSS. 20. bf f f d344. 54524543. 53534c2b

    Prva oznaena linija predstavlja f pr i nt f funkciju koja ispisuje korisniki unos na standardni izlaz.Kao to je vidljivo, korisnik moe sam odrediti format s ring argument te funkcije (u ovom sluajuCERT+LSS) , to automatski upuuje na format string propust. Drugo pokretanje programa saargumentom CERT+LSS. %x. %x. %x. %x otkriva sam format string propust, jer korisnik

    specificira format stringkoji je u ovom sluaju '%x' i

    ita memoriju sa stoga. Druga uto ozna

    enalinija ispisuje argumente f pr i nt f funkcije i otkriva format s ring kojeg je odredio korisnik.

    t

    t

    5.3. Praenje korisnikog unosaNakon to korisnik na neki nain preda podatke odreenom programu, podaci "teku" kroz viemeuspremnika i sistemskih poziva. Praenjem tih podataka mogue je otkriti funkcije koje obavljajuoperacije nad njima, a rade to na pogrean nain. U nastavku je priloen program koji pomouget env poziva uzima sadraj USER varijable okruenja i kopira ga u neki spremnik na stoguranjivom funkcijom strcpy.

    mai n (i nt ar gc, char **argv){

    char buf [ 32] , *l ang;

    pr i nt f ( "Trazenj e pr opust a pr i mj er #3\ n") ;pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;l ang = getenv (" USER") ;str cpy (buf , l ang);pr i nt f ( " I spi s : %s\n" , buf ) ;

    }

    U nastavku je prikazano prevoenje, pokretanje i analiza vul n3programa.[ r oot@l apt op MYFUZZER] # gcc vul n3. c o vul n3[ r oot@l apt op MYFUZZER] # expor t LD_PRELOAD=/ r oot/ PROJ ECTS/ LI BAUDI T/ l i baudi t . so[ r oot @l apt op MYFUZZER] # . / vul n3Tr azenj e propust a pr i mj er #3- - - - - - - - - - - - - - - - - - - - - - - - - - - -[ Li bAudi t ] bf f f d5c2 = get env ( "USER")[ Li bAudi t ] str cpy ( 0xbf f f d350[ 32] , "r oot "[ 0xbf f f d5c2] )I spi s : root[ r oot @l apt opMYFUZZER]# expor t USER=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    [ r oot @l apt op MYFUZZER] # . / vul n3Tr azenj e propust a pr i mj er #3- - - - - - - - - - - - - - - - - - - - - - - - - - - -[ Li bAudi t ] bf f f d54e = get env ( "USER")[ Li bAudi t ] st r cpy( 0xbf f f d2d0[ 32] , "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"[ 0xbf f f d54e] )I spi s: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASegment at i on f aul t[ r oot @l aptop MYFUZZER] #

    Iz prve dvije oznaene linije vidljivo je da program dobiva pokaziva na sadraj USER varijablepomou get envpoziva. Pokazivaje na adresi 0xbf f f d5c2iji sadraj se kasnije kopira pomouranjive strcpyfunkcije u spremnik na stogu koji se nalazi na adresi 0xbf f f d350i veliine je 32

    okteta. Prije sljedeeg pokretanja vul n3programa, varijabla USERse postavlja na velik niz znakova,to pri kopiranju strcpyfunkcijom izaziva preljev spremnika (druge dvije oznaene linije).

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 12 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    13/15

    6. ZakljuakAnaliza i testiranje sigurnosti programske podrke vrlo je vaan proces kojim je mogue pravovremenouoiti i otkloniti sigurnosne propuste u raunalnom sustavu. Fuzzing tehnike i metode otkrivanja

    sigurnosnih propusta, analizirane u dokumentu, mogu se primijeniti na bilo kojoj aplikaciji ija jesigurnost kljuna za pouzdano i nesmetano izvravanje odreenih zadataka. No, iako jednostavne, ivrlo esto iznimno uinkovite, koritenje ovih tehnika ipak zahtijeva odreenu razinu znanja i iskustvaosobe koja provodi analizu.

    7. Reference[1] Jack Koziol, Shellcode s Handbookr[2] SPI KEfuzzer, http://www.immunitysec.com

    8. DODATAK A

    LibAudit.c

    / *** Li br ar y Audi t [ Li bAudi t ] v0. 1* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -* Thi s si mpl e l i br ary wi l l t r ace some potent i al l y danger ous f unct i on cal l s* f rom program t hat you audi t .** Coded by Leon J ur ani c / ht t p: / / secur i t y. l ss. hr**/

    #i ncl ude #i ncl ude #i ncl ude #i ncl ude

    #i ncl ude t ypedef st r uct _I O_FI LE FI LE;ext ern FI LE *st di n; / * St andard i nput st r eam. */ext ern FI LE *st dout ; / * St andard out put st r eam. */ext ern FI LE *stderr ;

    char * ( *get env_or i g) ( const char * name);char *( *str cpy_or i g) ( char *dest, const char *src) ;char *( *str ncpy_ori g) ( char *dest, const char *src, si ze_t n) ;i nt ( *f pr i ntf _or i g) (FI LE *str eam, const char *f ormat, . . . ) ;i nt ( *vspri nt f _or i g)( char *str , const char *f ormat , va_l i st ap);i nt ( *vsnpri ntf _or i g) (char *str , s i ze_t s i ze, const char *f ormat , va_l i stap);

    l ong get_memsi ze (char *bl ock) / / adopt ed f r om "Shel l coder' s Handbook" f r omwi n t o l i nux{

    i nt num=0, memsi ze=0;i nt *f r ame;i nt *pr ev_f r ame;i nt *s tack_base = ( i nt*) 0xbf f f f f f f ;i nt *st ack_top = ( i nt *) 0xb0000000;

    asm ( "movl %%ebp, %0" : "=r " ( f r ame) ) ;

    i f ( bl ock < ( char *) st ack_base && bl ock > ( char *) st ack_top)f or ( num=0; num ( i nt *) stack_t op){

    pr ev_f r ame = ( i nt *) *f r ame;i f ( pr ev_f r ame < st ack_base && pr ev_f r ame > st ack_t op) {

    i f ( f rame < ( i nt *) bl ock & ( i nt *) bl ock < prev_f r ame)

    {memsi ze = ( i nt ) pr ev_f r ame - ( i nt ) bl ock - 8;

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 13 / 15

    http://www.immunitysec.com/http://www.immunitysec.com/
  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    14/15

    br eak;}el se f r ame = pr ev_f r ame;

    }}

    }r etur n ( memsi ze) ;

    }

    i nt f pr i ntf ( FI LE *str eam, const char *f ormat , . . . ){

    va_ l i s t ap;va_start ( ap, f or mat ) ;pri nt f ( "[ Li bAudi t ] f pri nt f ( %d, \ "%. 50s\ "[ 0x%x] , ",

    f i l eno( str eam) , f ormat , f or mat ) ;vf pr i nt f (st dout, f ormat, ap);pr i nt f ( " ) \ n" ) ;va_end ( ap) ;r et urn vf pri nt f ( str eam, f or mat , ap) ;

    }

    i nt vspri nt f ( char *st r , const char *f ormat , va_l i st ap){

    pri nt f ( "[ Li bAudi t ] vspri nt f ( %x[ %d] , \ "%. 50s\ "[ 0x%x] , ",st r , get_memsi ze( st r ) , f or mat , f ormat) ;

    vf pr i nt f (st dout, f ormat, ap);pr i nt f ( " ) \ n" ) ;return vspri ntf _or i g (st r , f ormat , ap) ;

    }

    i nt vsnpr i nt f ( char *st r, si ze_t si ze, const char *f ormat , va_l i st ap){

    pr i nt f ( "[ Li bAudi t ] vsnpr i nt f ( %x[%d] , %d, \ "%. 50s\ "[ 0x%x], ",str , get _memsi ze( str ) , si ze, f or mat , f ormat ) ;

    vf pr i nt f (st dout, f ormat, ap);pr i nt f ( " ) \ n" ) ;return vsnpri nt f _or i g ( str , s i ze, f ormat, ap);

    }

    i nt spr i ntf ( char *st r , const char *f ormat , . . . ){

    va_ l i s t ap;va_start ( ap, f or mat ) ;pr i nt f ( "> spr i nt f ( 0x%x[%d] , \ "%. 50s \ " [ 0x%x] , " , s t r ,

    get _memsi ze( st r ) , f ormat , f or mat) ;vf pr i ntf (st dout, f ormat, ap);pr i nt f ( " ) \ n" ) ;va_end ( ap) ;return vspri ntf _or i g (st r , f ormat , ap) ;

    }

    i nt snpri nt f ( char *str , s i ze_t s i ze, const char *f ormat , . . . ){

    va_ l i s t ap;va_start ( ap, f or mat ) ;pr i nt f ( "[ Li bAudi t ] snpr i nt f ( 0x%x[%d] , %d, \ "%. 50s\ "[ 0x%x], ", st r ,

    get _memsi ze( st r ) , si ze, f or mat , f or mat ) ;vf pr i nt f (st dout, f ormat, ap);pr i nt f ( " ) \ n" ) ;va_end ( ap) ;return vsnpri nt f _or i g ( str , s i ze, f ormat, ap);

    }

    char *get env( const char *name){l ong x;

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 14 / 15

  • 5/21/2018 CCERT-PUBDOC-2004-12-100

    15/15

    char *r et = getenv_or i g( name);pri nt f ( "[ Li bAudi t ] %x = get env ( \ "%. 50s\ ") \ n", ret, name) ;return ret;

    }

    char *st r cpy (char *dest , const char *sr c){

    pri ntf (" [L i bAudi t] str cpy( 0x%x[%d] , \ "%. 50s\ "[ 0x%x]) \ n", dest, get_memsi ze(dest ) , sr c, sr c) ;

    return str cpy_ori g(dest, src) ;}

    char *st r ncpy (char *dest , const char *sr c, si ze_t n){

    pr i nt f ( "[ Li bAudi t ] st r ncpy ( 0x%x[%d] , \ "%. 50s\ "[ 0x%x],%d) \ n", dest , get_memsi ze( dest ) , src, sr c, n) ;

    r et urn str ncpy_or i g( dest, src, n) ;}

    voi d _ i ni t ( ){voi d *hdl ;char *err or;

    hdl = dl open ( "/ l i b/ l i bc. so. 6", RTLD_LAZY) ;i f ( !hdl ) {

    f puts (dl er r or ( ) , s tderr ) ;exi t ( 1) ;

    }

    get env_or i g = dl sym ( hdl , "get env");str cpy_ori g = dl sym (hdl , "str cpy") ;str ncpy_ori g = dl sym (hdl , "str ncpy") ;f pr i nt f _or i g = dl sym( hdl , " f pr i nt f " ) ;vspr i nt f _or i g = dl sym (hdl , "vspr i nt f " ) ;vsnpr i nt f _or i g = dl sym (hdl , "vsnpr i nt f " ) ;

    i f ( (er ror = dl err or ( ) ) != NULL) {f pr i nt f ( s tderr , "%s\n" , er r or ) ;exi t ( 1) ;

    }

    }

    Revizija v1.1 CCERT-PUBDOC-2004-12-100 Stranica 15 / 15