+ All Categories
Home > Technology > Exploitace – od minulosti po současnost - Jan Kopecký

Exploitace – od minulosti po současnost - Jan Kopecký

Date post: 16-Jul-2015
Category:
Upload: security-session
View: 129 times
Download: 2 times
Share this document with a friend
32
The OWASP Foundation http://www.owasp.org OWASP meeting Security Session Jan Kopecký Czech chapter leader [email protected]
Transcript

The OWASP Foundationhttp://www.owasp.org

OWASP meeting

Security Session

Jan KopeckýCzech chapter leader

[email protected]

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

The OWASP Foundationhttp://www.owasp.org

Buffer overflow

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

The OWASP Foundationhttp://www.owasp.org

Buffer overflow

DEMO

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

DEMO

Buffer overflow –

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

DEMO

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

DEMO

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

The OWASP Foundationhttp://www.owasp.org

ASLR bypass –

Length overwrite

DEMO

The OWASP Foundationhttp://www.owasp.org

32

Q&A


Recommended