Обход защитных механизмов в ОС windows © 2002—2010, digital security...
Post on 21-Dec-2015
234 Views
Preview:
TRANSCRIPT
Обход защитных механизмов в ОС 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 – 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
© 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/asintsova.sintsov@dsec.ru
XCHG EAX, ESP XCHG EAX, ESP
Questions?
www.dsecrg.com
top related