42
Обход защитных механизмов в ОС Windows © 2002—2010 , Digital Security Алексей Синцов Digital Security CHAOS CONSTRUCTIONS ‘10

Обход защитных механизмов в ОС Windows © 2002—2010, Digital Security Алексей Синцов Digital Security CHAOS CONSTRUCTIONS ‘10

  • View
    234

  • Download
    0

Embed Size (px)

Citation preview

Обход защитных механизмов в ОС Windows

© 2002—2010 , Digital Security

Алексей СинцовDigital Security

CHAOS CONSTRUCTIONS ‘10

#whoami

2© 2002—2010, Digital Security

Обходим защиту в win32

Digital Security:• Аудит/Тест на проникновение (ISO/PCI/PA–DSS и бла-бла-бла)• Анализ защищенности ERP / ДБО• Разработка специализированного «софта»• Поиск ошибок и уязвимостей (DSECRG)• Поиск путей эксплуатации

Журнал XAKEP:• Колонка «Обзор Эксплойтов»• Статьи на тему разработки эксплойтов

Люблю поболтать:• РусКрипто 2010 Москва• CONFidence 2010 Krakow• Hack In The Box 2010 Amsterdam• Chaos Construction 2010 СПБ ;)

Эволюция

3© 2002—2010, Digital Security

год

сложность

Сперто у Dino Dai Zovi

1990 200520001995 2010

Обходим защиту в win32

Поиск уязвимостей

Разработка эксплойта

Типовые проблемы

4© 2002—2010, Digital Security

Ошибка Влияние Нагрузка

Переполнение буфера в стеке

• RET• SEH

• Стек• Куча

Переполнение буфера в куче

• Flink • Куча

Ошибка формата строки

• RET• SEH

• Стек• Куча

Ошибки памяти (например Use After Free)

• Bad pointer • Куча

Обходим защиту в win32

Контрмеры

5© 2002—2010, Digital Security

Ошибка Влияние Нагрузка

Переполнение буфера в стеке

• RET• SEH

• Стек• Куча

Переполнение буфера в куче

• Flink • Куча

Ошибка формата строки

• RET• SEH

• Стек• Куча

Ошибки памяти (например Use After Free)

• Bad pointer • Куча

• Stack cookies • Save unlinking• Heap cookies

Обходим защиту в win32

6© 2002—2010, Digital Security

Ошибка Влияние Нагрузка

Переполнение буфера в стеке

• RET• SEH

• Стек• Куча

Переполнение буфера в куче

• Flink • Куча

Ошибка формата строки

• RET• SEH

• Стек• Куча

Ошибки памяти (например Use After Free)

• Bad pointer • Куча

• Stack cookies • Save unlinking • SEH handler validation• SEH chain validation• Heap cookies

Контрмеры

Обходим защиту в win32

Ситуация на 2010

7© 2002—2010, Digital Security

Ошибка Влияние Нагрузка

Переполнение буфера в стеке

• RET• SEH

• Стек• Куча

Переполнение буфера в куче

• Flink • Куча

Ошибка формата строки

• RET• SEH

• Стек• Куча

Ошибки памяти (например Use After Free)

• Bad pointer • Куча

• Stack cookies • Save unlinking • SEH handler validation• SEH chain validation• Heap cookies • DEP • ASLR

Обходим защиту в win32

В нашей программе

78© 2002—2010, Digital Security

Ошибка Влияние Нагрузка

Переполнение буфера в стеке

• RET• SEH

• Стек• Куча

Переполнение буфера в куче

Ошибка формата строки

Ошибки памяти (например Use After Free)

• Stack cookies • SEH handler validation• DEP • ASLR• SEH chain validation

Обходим защиту в win32

Классика жанра - BoF

89© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Обходим защиту в win32

10© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Классика жанра - BoF

Обходим защиту в win32

11© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Классика жанра - BoF

Обходим защиту в win32

12© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Классика жанра - BoF

Обходим защиту в win32

13© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Классика жанра - BoF

Обходим защиту в win32

14© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Классика жанра - BoF

Обходим защиту в win32

15© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

Переполнение:

Буфер Что-тоC RET

Перезаписали метку

Классика жанра - BoF

Обходим защиту в win32

© 2002—2010, Digital Security

Обходим

16

Пути обхода:

• Слабая энтропия / статичные cookie

• Перезапись cookie в секции .data

mov ecx, edx CRASH

• Перезапись объектов и их указателей (vtable)

call [ecx] CRASH

• Перезапись SEH и создание исключительной ситуации

Обходим защиту в win32

17© 2002—2010, Digital Security

Стек до переполнения:

Буфер Что-тоC RET

SEH?

Next SEH SEH Код, который будетвыполнен,если что-топошло не так

Обходим защиту в win32

18© 2002—2010, Digital Security

Стек до переполнения:

Буфер nsC RET

Переполнение:

Буфер nsC RETseh

Перезапись SEH

Перезаписали указатель

seh

Обходим защиту в win32

© 2002—2010, Digital Security

Захват SEH

19

1. Переполняем буфер2. Перезаписываем метку 3. Перезаписываем ещё что-то4. Перезаписываем адрес возврата5. Проверка метки (целостности)6. FAIL

[6]

[7]

Переполнение:

Буфер nsC RETseh

1. Переполняем буфер2. Перезаписываем метку 3. Перезаписываем SEH4. Перезаписываем адрес возврата5. Исключительная ситуация (до

возврата)6. Переход по указателю SEH7. PROFIT

Перезапись RET: Перезапись SEH:

Обходим защиту в win32

SEH ntdll!FinalExceptionHandler

© 2002—2010, Digital Security

SEH

20

Next SEH SEH

Next SEH SEH

Next SEH SEH

Next SEH SEH

0xFFFFFFFF

обработчик

обработчик

обработчик

обработчик

Обходим защиту в win32

SEH ntdll!FinalExceptionHandler

© 2002—2010, Digital Security

SafeSEH

21

Next SEH1

Next SEH2

Next SEH3

Next SEH4

0xFFFFFFFF

обработчик1

обработчик2

обработчик3

обработчик4

SEH1

SEH2

SEH3

SEH4

SafeSEH table:Цепочка SEH :

Обходим защиту в win32

SEH ntdll!FinalExceptionHandler

© 2002—2010, Digital Security

SafeSEH

22

[6]

[7]Буфер nsC RETseh

Evil1 Evil2

Next SEH2

Next SEH3

Next SEH4

0xFFFFFFFF

шеллкод

обработчик2

обработчик3

обработчик4

SEH1

SEH2

SEH3

SEH4

Таблица SafeSEH:

Такого дескриптора в таблице нету

Обходим защиту в win32

© 2002—2010, Digital Security

Кое-что о SafeSEH

23

• Каждый модуль должен поддерживать SafeSEH• У каждого такого модуля – своя таблица• Обратная совместимость с модулями без SafeSEH

APP.EXE

APP.DLL

KERNEL32.DLL

ANOTHER.DLL

SafeSEH ON

SafeSEH OFF

Обходим защиту в win32

© 2002—2010, Digital Security

Обходим SafeSEH

24

[6]

[7]Буфер nsC RETseh

// Стек// Модуль с поддержкой // SafeSEH

pop regpop regretn

// .text секция// модуля без поддержки// SafeSEH

Обходим защиту в win32

© 2002—2010, Digital Security

Обходим SafeSEH

25

[6]

[7]Буфер nsC RETseh

// Стек// Модуль с поддержкой // SafeSEH

pop regpop regretn

// .text секция// модуля без поддержки// SafeSEH

Обходим защиту в win32

© 2002—2010, Digital Security

Обходим SafeSEH

26

[6]

[7]Буфер nsC RETseh

// Стек// Модуль с поддержкой // SafeSEH

pop regpop regretn

// .text секция// модуля без поддержки// SafeSEH

Шеллкод

jmp

Обходим защиту в win32

© 2002—2010, Digital Security

SEHOP

27

Next SEH1

Next SEH2

Next SEH3

Next SEH4

0xFFFFFFFF

обработчик1

обработчик2

обработчик3

обработчик4

SEH1

SEH2

SEH3

SEH4

SafeSEH table:Цепочка SEH :

SEH ntdll!FinalExceptionHandler

Обходим защиту в win32

SEH ntdll!FinalExceptionHandler

© 2002—2010, Digital Security

SEHOP

28

[6]

[7]Буфер nsC RETseh

Evil2

Next SEH2

Next SEH3

Next SEH4

0xFFFFFFFF

pop/pop/ret

обработчик2

обработчик3

обработчик4

Цепочка нарушена

//SafeSEH bypassJMP/CALLШеллкод

Обходим защиту в win32

© 2002—2010, Digital Security

SEHOP

29

Лень рисовать, поэтому сперто у Stefan Le Berre иDamien Cauquil

Обходим защиту в win32

© 2002—2010, Digital Security

DEP

30

На примере Heap Spray: Доступ RW-

Обходим защиту в win32

© 2002—2010, Digital Security

Обходим DEP – retn2libc

31

Используем код отключения DEP:• NtSetinformationProcess• SetProcessDEPPolicy

Работаем с исполняемой памятью:• VirtualAlloc and memcpy• VirtualProtect

Копируем шеллкод в исполняемый поток:• WriteProcessMemory

Обходим защиту в win32

Используем код отключения DEP:• NtSetinformationProcess• SetProcessDEPPolicy

Работаем с исполняемой памятью:• VirtualAlloc and memcpy• VirtualProtect

Копируем шеллкод в исполняемый поток:• WriteProcessMemory

© 2002—2010, Digital Security

DEP bypass – retn2libc

32

Permanent DEP / AlwaysOn

Контрмеры:

Обходим защиту в win32

Используем код отключения DEP:• NtSetinformationProcess• SetProcessDEPPolicy

Работаем с исполняемой памятью:• VirtualAlloc and memcpy• VirtualProtect

Копируем шеллкод в исполняемый поток:• WriteProcessMemory

© 2002—2010, Digital Security

DEP bypass – retn2libc

33

ASLR

Permanent DEP / AlwaysOn

Контрмеры:

Обходим защиту в win32

© 2002—2010, Digital Security

ASLR

34

KERNEL32.DLL

NTDLL.DLL

APP2.DLL

APP.DLL

KERNEL32.DLL

NTDLL.DLL

APP2.DLL

APP.DLL

КАРТА ПАМЯТИ ПРОЦЕССАДО ПЕРЕЗАГРУЗКИ

КАРТА ПАМЯТИ ПРОЦЕССАПОСЛЕ ПЕРЕЗАГРУЗКИ

По какому адресу искать VirtualProtect ?

Обходим защиту в win32

Используем модули без поддержки ASLR• static base address – call functions from modules with unknown address

Используем уязвимости приводящие к раскрытию адресов• @WTFuzz на pwn2own взломал IE8 с помощью ДВУХ дырок

Перезаписываем только младшие адреса Метод грубой силы

• PHP 6.0 DEV эксплойт перебирал старшие байты для VirtualProtect (0xXXXXSSSS).XXXX – то что перебиралось, SSSS – константа для определенной версии dll.

Spraying (чаще всего для браузеров)• javascript Heap Spray• java heap spray (DEP автоматически)• .NET• JIT Spray (DEP автоматически)

© 2002—2010, Digital Security

Обходим ASLR

35

Обходим защиту в win32

Используем код отключения DEP:• NtSetinformationProcess• SetProcessDEPPolicy

Работаем с исполняемой памятью:• VirtualAlloc and memcpy• VirtualProtect

Копируем шеллкод в исполняемый поток:• WriteProcessMemory

© 2002—2010, Digital Security

DEP bypass – retn2libc

36

Для всех этих функций нужно подготовить параметры в стеке При этом надо избегать нулевых байтов и иного не-ASCII байтов

Ещё 5 копеек:

ASLR

Permanent DEP / AlwaysOn

Контрмеры:

bypassed

Обходим защиту в win32

© 2002—2010, Digital Security

Return-Oriented Programming

37

CPU STACKCODE

MOV EAX, 0x10POP EDI

MOV [EDI], EAX

0x7C010102: RETN

0x8C010103: POP EDI0x8C010104: RETN

0x8C0101030x0A0A0A0A0x8C0201040xFFFFFFF00x8C0301050x8C040106

ROP

0x8C020105: POP EAX0x8C020106: RETN

0x8C030107: NEG EAX0x8C030108: RETN

0x8C040109: MOV [EDI], EAX0x8C05010B: RETN

MOV EAX, 0x10

Переполнение:

Буфер Что-то RETROPROPROPROPROP

«Записать по адресу 0x0A0A0A0A значение 0x10»

Обходим защиту в win32

© 2002—2010, Digital Security

ROP

38

• Можем изменить стековый фрейм• CVE-2010-1297

STACK

MOV EAX, 0x10

ECX=0x0C0C0C0C

REGS

MOV [EDI], EAX

0x04001111: CALL [ECX+C]

0x0700156F: MOV EAX,[ECX+34] PUSH [ECX+24] CALL [EAX+8]

0x0C0C0C0C

0x070048EF: XCHG EAX, ESP RETN

0x070049190xCCCCCCCC0x070048EF0x0700156FMOV EAX, 0x10MOV EAX, 0x10

0x070049190xCCCCCCCC0x070048EF0x0700156F. . .0x0C0C0C0C

0x07004919: POP ECX POP ECX MOV [EAX+C],1 POP ESI POP EBX

RETN

НЕ КОНТРОЛИРУЕМ

// +0x34

Обходим защиту в win32

© 2002—2010, Digital Security

Пример ROP

39

Классический эксплойт для ProSSHD – не работает против Win7Добавим в него ROP для ASLR/DEP обхода:

• Модули ProSSHD не поддерживают ASLR• В этих модулях есть вызовы VP из системных библиотек (уже с ASLR)• Готовим параметры для VP без нулевых байтов• Вызываем VP из ASLR модуля по адресу из НЕ ASLR модуля• Делаем стек исполняемым

Вовремя выпущенная тулза - pvefindaddr.py для ImmDbg Plugin авторства Peter Van Eeckhoutte:• !pvefindaddr nonaslr• !pvefindaddr rop <module name>

* Абсолютно бесполезный эксплойт, так как post-auth и привилегии не повышает

*

Обходим защиту в win32

40

© 2002—2010, Digital Security

ProSSHD is under attack

XCHG EAX, ESP

EXPLOIT DEMO

© 2002—2010, Digital Security

Итого

41

Технология ОС Эффективность

Stack cookies • XP/2000• Vista• 7/2008

• Поддержка при компиляции• Энтропия

SafeSEH • XP/2000• Vista• 7/2008

• Поддержка при компиляции• Все модули процесса

SEHOP • Vista• 7/2008

• Поддержка при компиляции• В связке с ASLR

DEP • XP/2000• Vista• 7/2008

• Permanent DEP• В связке с ASLR

ASLR • Vista• 7/2008

• Поддержка при компиляции• Все модули процесса

Обходим защиту в win32

42

© 2002—2010, Digital Security

www.twitter.com/[email protected]

XCHG EAX, ESP XCHG EAX, ESP

Questions?

www.dsecrg.com