exploitace – od minulosti po současnost - jan kopecký
TRANSCRIPT
The OWASP Foundationhttp://www.owasp.org
OWASP meeting
Security Session
Jan KopeckýCzech chapter leader
The OWASP Foundationhttp://www.owasp.orgO mě
• OWASP chapter leader
• Senior ethical hacker pro ING
• Founder captes.cz
• Skills• Webová bezpečnost (server/client side)
• Reverzní inženýrství
• Psaní exploitů
• Analýza malware
• Penetrační testy
The OWASP Foundationhttp://www.owasp.org
3
Agenda
Co je buffer overflow?
Exploity na XP – Stack cookie, SEH, DEP
Exploity na Win7 – ASLR
QA
The OWASP Foundationhttp://www.owasp.org
Buffer overflow
void TriggerOverflow(char *Buffer)
{
char Small_Buf[512];
strcpy(Small_Buf,Buffer);
}
int main (int argc, char **argv)
{
TriggerOverflow(argv[1]);
}
0x00000000
0xFFFFFFFF
Vyhrazeno pro
Small_Buf
EBP – ulozena
EIP – ulozena
* argv[1]
The OWASP Foundationhttp://www.owasp.org
Buffer overflow
void TriggerOverflow(char *Buffer)
{
char Small_Buf[512];
strcpy(Small_Buf,Buffer);
}
int main (int argc, char **argv)
{
TriggerOverflow(argv[1]);
}
0x00000000
0xFFFFFFFF
Vyhrazeno pro
Small_Buf
EBP – ulozena
EIP – ulozena
* argv[1]
“A” * 560
AAAAAAAA
AAAAAAAA
AAAAAAAA
AAAAAAAA
AAAAAAAA
AAAAAAAA
……
The OWASP Foundationhttp://www.owasp.org
Buffer overflow
• Cílem je přepsat
uloženou hodnotu EIP
na stacku.
• EAX ukazuje na začátek
našeho Small_Buf.
• Když přepíšeme EIP na
stacku adresou „jmp
eax“ skočíme přímo na
začátek našeho
shellcodu
0x00000000
0xFFFFFFFF
Shellcode +
padding
padding
Jmp eax
* argv[1]
EAX
The OWASP Foundationhttp://www.owasp.org
Buffer overflow –
Stack Cookie
Jako snaha Microsoftu zamezit exploitaci byla
představena „stack cookie“. 0x00000000
0xFFFFFFFF
Vyhrazeno pro
Small_Buf
EBP – ulozena
EIP – ulozena
* argv[1]
Stack cookie
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – SEH
Jestliže cookie nesedí, je zavolán SEH (Exception
handler)
Pointer to next SEH
SE function
Pointer to next SEH
SE function
FFFFFFFF
SE function
TEB
FS[0]
Program se ukončí a náš shellcode se
neprovede, jenže…
The OWASP Foundationhttp://www.owasp.org
0x00000000
0xFFFFFFFF
Reserved for
Small_Buf
EBP – Saved
EIP – Saved
* argv[1]
SE Function
Pointer to next SEH
SEH je také uložen na stacku,
můžeme jej tedy přepsat, otázka
je čím..
V prologu exception
handleru je hodnota
„Pointer to next SEH“
uložena na stack –
konkrétně ESP+8. Jestliže
přepíšeme SE Function
adresou obsahující
POP/POP/RET; RET se
vrátí do „Pointer to next
SEH“
Buffer overflow – SEH
The OWASP Foundationhttp://www.owasp.org
0x00000000
0xFFFFFFFF
Reserved for
Small_Buf
EBP – Saved
EIP – Saved
* argv[1]
SE Function
Pointer to next SEH
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
SHORT JMP
POP/POP/RET
Shellcode
1. Přepíšeme buffer, tak aby:
• SE Function ->
POP/POP/RET
• Pointer to next SEH ->
adresa SHORT JMP
2. Cookie při kontrole nesedí,
zavolá se náš podstrčený
SEH
3. POP/POP/RET přenese
kontrolu (EIP) na SHORT
JMP -> přistaneme v
Shellcodu
Buffer overflow – SEH
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Stack a heap nejsou spustitelné, nemůžeme skočit do shellcode a spustit jej.
OptIn : Dep se vztahuje pouze na některé Windows služby
OptOut : DEP je aktivován pro všechny procesy, vyjma těch na whitelistu
AlwaysOn : DEP je vždy aktivován, bez vyjímek
AlwaysOff : DEP je vypnutý
Windows XP SP2, XP SP3, Vista SP0 : OptIn
Windows Vista SP1 : OptIn + Permanent DEP
Windows 7: OptIn + Permanent DEP
Windows Server 2003 SP1 and up : OptOut
Windows Server 2008 and up : OptOut + Permanent DEP
Permanent DEP – když je během kompilace nastaven /NXCOMPAT
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Můžeme sice přepsat buffer tak, jak
jsme již viděli, ale nespustíme ani NOP.
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Naštěstí Dino Dai Zovi
definoval pojem ROP(Return
Oriented Programing):
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Instrukce + RET = Gadget
Musíme využít stávající kód v aplikaci (musí být
„executable“) a postavit Gadgety tak, abychom
zavolali jednu z API (a nastavit její parametry),
která umožní DEP vypnout.
• VirtualAlloc()
• SetProcessDEPPolicy()
• NtSetInformationProcess()
• VirtualProtect()
• WriteProcessMemory()
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Stack Pivot
Placeholder 1
Placeholder 2
Set up Placeholder 1
Set up Placeholder 2
Jump to VirtualProtect
Padding
Shellcode
VirtualProtect()
Stack
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Zadání: Dostaňte „5“ do EBX a přičtěte k němu 60. Výsledek uložte
do EAX.
1. Gadget POP EBX; RET
2. Gadget ADD EBX, 60; RET
3. Gadget MOV EAX, EBX;
POP EDX;
RET
34BA4378 POP EBX; RET
34BA9A78 ADD EBX, 60; RET
34BA4FC8 MOV EAX, EBX;
POP EDX;
RET
34BA4378
34BA9A78
34BA4FC8
DEADBEEF
00000005
The OWASP Foundationhttp://www.owasp.org
Buffer overflow – DEP
Přesvědčme se, že můžeme opravdu spouštět
Gadgety..
DEMO… a spouštět kód.
The OWASP Foundationhttp://www.owasp.org
ASLR
Address Space Layout Randomization
(/DYNAMICBASE)
Nemůžeme se nadále spoléhat na statické
adresy, jako v předchozích příkladech:
004013FD JMP EAX
10024F5A POP/POP/RET
7C14DF3C CALL VirtualProtect
Po každém resetu dojde k načtení
modulů na různé místo v paměti
The OWASP Foundationhttp://www.owasp.org
ASLR bypass
• Částečné přepsání
• Non-ASLR modul – stále aktuální, problém Force ASLR
• „Leaks“ – téma na samostatnou přednášku
• Manipulace s délkou nejen BSTR – moderní hlavně při
exploitaci UAF u browserů
The OWASP Foundationhttp://www.owasp.org
ASLR bypass Částečné
přepsání
LOW HIGH
12 34 56 78
Pouze tato část je randomizována. Musíme najít
užitečnou instrukci na adrese 5678 XXXX .
The OWASP Foundationhttp://www.owasp.org
ASLR bypass – non
ASLR modul
• !mona module
• !mona jmp –r esp
DEMO
The OWASP Foundationhttp://www.owasp.org
ASLR bypass –
Length overwrite
Změnímeli vhodně délku stringu, můžeme číst více
adresního prostoru, než bychom měli (můžeme číst celý
adress space náležící browseru).
Délka Data Null b.
The OWASP Foundationhttp://www.owasp.org
ASLR bypass –
Length overwrite
Náš kód musí udělat následující:
Zjistit, jaký objekt jsme poškodili
Poškodit délku dalšího objektu
Zjistiti base adresu Flash modulu (MZ header scan)
Zjistit adresu Kernel32 (IAT)
Najít VirtualProtect
Dynamicky sestavit ROP
Spustit ROP