Обход защитных механизмов в ОС Windows CHAOS CONSTRUCTIONS ‘10 Алексей Синцов Digital Security © 2002—2010 , Digital Security Обходим защиту в win32 #whoami Digital Security: • Аудит/Тест на проникновение (ISO/PCI/PA–DSS и бла-бла-бла) • Анализ защищенности ERP / ДБО • Разработка специализированного «софта» • Поиск ошибок и уязвимостей (DSECRG) • Поиск путей эксплуатации Журнал XAKEP: • Колонка «Обзор Эксплойтов» • Статьи на тему разработки эксплойтов Люблю поболтать: • РусКрипто 2010 Москва • CONFidence 2010 Krakow • Hack In The Box 2010 Amsterdam • Chaos Construction 2010 СПБ ;) © 2002—2010, Digital Security 2 Обходим защиту в win32 Эволюция сложность 1990 1995 2000 2005 2010 год Разработка эксплойта Поиск уязвимостей Сперто у Dino Dai Zovi © 2002—2010, Digital Security 3 Обходим защиту в win32 Типовые проблемы Ошибка Влияние Нагрузка Переполнение буфера в стеке • RET • SEH • Стек • Куча Переполнение буфера в куче • Flink • Куча Ошибка формата строки • RET • SEH • Стек • Куча Ошибки памяти (например Use After Free) • Bad pointer • Куча © 2002—2010, Digital Security 4 Обходим защиту в win32 Контрмеры Ошибка Влияние Нагрузка Переполнение буфера в стеке • RET • SEH • Стек • Куча Переполнение буфера в куче • Flink • Куча Ошибка формата строки • RET • SEH • Стек • Куча Ошибки памяти (например Use After Free) • Bad pointer • Куча • Stack cookies © 2002—2010, Digital Security • Save unlinking • Heap cookies 5 Обходим защиту в win32 Контрмеры Ошибка Влияние Нагрузка Переполнение буфера в стеке • RET • SEH • Стек • Куча Переполнение буфера в куче • Flink • Куча Ошибка формата строки • RET • SEH • Стек • Куча Ошибки памяти (например Use After Free) • Bad pointer • Куча • Stack cookies © 2002—2010, Digital Security • Save unlinking • Heap cookies • SEH handler validation • SEH chain validation 6 Обходим защиту в win32 Ситуация на 2010 Ошибка Нагрузка Влияние Переполнение буфера в стеке • RET • SEH • Стек • Куча Переполнение буфера в куче • Flink • Куча Ошибка формата строки • RET • SEH • Стек • Куча Ошибки памяти (например Use After Free) • Bad pointer • Куча • Stack cookies © 2002—2010, Digital Security • Save unlinking • Heap cookies • SEH handler validation • SEH chain validation • DEP • ASLR 7 Обходим защиту в win32 В нашей программе Ошибка Переполнение буфера в стеке Нагрузка Влияние • RET • SEH • Стек • Куча Переполнение буфера в куче Ошибка формата строки Ошибки памяти (например Use After Free) • Stack cookies © 2002—2010, Digital Security • SEH handler validation • SEH chain validation • DEP • ASLR 78 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 89 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 10 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 11 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 12 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 13 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер © 2002—2010, Digital Security 14 Обходим защиту в win32 Классика жанра - BoF Стек до переполнения: Буфер C Что-то RET C Что-то RET Переполнение: Буфер Перезаписали метку © 2002—2010, Digital Security 15 Обходим защиту в win32 Обходим Пути обхода: • Слабая энтропия / статичные cookie • Перезапись cookie в секции .data mov ecx, edx CRASH • Перезапись объектов и их указателей (vtable) call [ecx] CRASH • Перезапись SEH и создание исключительной ситуации © 2002—2010, Digital Security 16 Обходим защиту в win32 SEH? Стек до переполнения: Буфер Next SEH © 2002—2010, Digital Security C Что-то SEH RET Код, который будет выполнен, если что-то пошло не так 17 Обходим защиту в win32 Перезапись SEH Стек до переполнения: Буфер C ns seh RET C ns seh RET Переполнение: Буфер Перезаписали указатель © 2002—2010, Digital Security 18 Обходим защиту в win32 Захват SEH Переполнение: [6] Буфер [7] C ns seh Перезапись RET: 1. 2. 3. 4. 5. 6. Переполняем буфер Перезаписываем метку Перезаписываем ещё что-то Перезаписываем адрес возврата Проверка метки (целостности) FAIL © 2002—2010, Digital Security RET Перезапись SEH: Переполняем буфер Перезаписываем метку Перезаписываем SEH Перезаписываем адрес возврата Исключительная ситуация (до возврата) 6. Переход по указателю SEH 7. PROFIT 1. 2. 3. 4. 5. 19 Обходим защиту в win32 SEH © 2002—2010, Digital Security Next SEH SEH обработчик Next SEH SEH обработчик Next SEH SEH обработчик Next SEH SEH обработчик 0xFFFFFFFF SEH ntdll!FinalExceptionHandler 20 Обходим защиту в win32 SafeSEH Цепочка SEH : SafeSEH table: Next SEH1 обработчик1 Next SEH2 обработчик2 Next SEH3 обработчик3 Next SEH4 обработчик4 0xFFFFFFFF SEH © 2002—2010, Digital Security SEH1 SEH2 SEH3 SEH4 ntdll!FinalExceptionHandler 21 Обходим защиту в win32 SafeSEH Такого дескриптора в таблице нету [6] Буфер [7] C ns seh RET Таблица SafeSEH: Evil1 Evil2 шеллкод Next SEH2 обработчик2 SEH1 Next SEH3 обработчик3 SEH2 Next SEH4 обработчик4 SEH3 0xFFFFFFFF SEH © 2002—2010, Digital Security ntdll!FinalExceptionHandler SEH4 22 Обходим защиту в win32 Кое-что о SafeSEH • Каждый модуль должен поддерживать SafeSEH • У каждого такого модуля – своя таблица • Обратная совместимость с модулями без SafeSEH APP.EXE APP.DLL KERNEL32.DLL ANOTHER.DLL © 2002—2010, Digital Security SafeSEH ON SafeSEH OFF 23 Обходим защиту в win32 Обходим SafeSEH [6] Буфер [7] C ns seh pop reg pop reg retn © 2002—2010, Digital Security RET // Стек // Модуль с поддержкой // SafeSEH // .text секция // модуля без поддержки // SafeSEH 24 Обходим защиту в win32 Обходим SafeSEH [6] Буфер [7] C ns seh pop reg pop reg retn © 2002—2010, Digital Security RET // Стек // Модуль с поддержкой // SafeSEH // .text секция // модуля без поддержки // SafeSEH 25 Обходим защиту в win32 Обходим SafeSEH [6] Буфер [7] C jmp ns seh pop reg pop reg retn RET // Стек // Модуль с поддержкой // SafeSEH // .text секция // модуля без поддержки // SafeSEH Шеллкод © 2002—2010, Digital Security 26 Обходим защиту в win32 SEHOP Цепочка SEH : SafeSEH table: Next SEH1 обработчик1 Next SEH2 обработчик2 Next SEH3 обработчик3 Next SEH4 обработчик4 0xFFFFFFFF SEH © 2002—2010, Digital Security SEH1 SEH2 SEH3 SEH4 ntdll!FinalExceptionHandler 27 Обходим защиту в win32 SEHOP Цепочка нарушена [6] Буфер Шеллкод © 2002—2010, Digital Security [7] C ns seh JMP/CALL Evil2 pop/pop/ret Next SEH2 обработчик2 Next SEH3 обработчик3 Next SEH4 обработчик4 0xFFFFFFFF SEH RET //SafeSEH bypass ntdll!FinalExceptionHandler 28 Обходим защиту в win32 SEHOP Лень рисовать, поэтому сперто у Stefan Le Berre и Damien Cauquil © 2002—2010, Digital Security 29 Обходим защиту в win32 DEP На примере Heap Spray: Доступ RW- © 2002—2010, Digital Security 30 Обходим защиту в win32 Обходим DEP – retn2libc Используем код отключения DEP: • NtSetinformationProcess • SetProcessDEPPolicy Работаем с исполняемой памятью: • VirtualAlloc and memcpy • VirtualProtect Копируем шеллкод в исполняемый поток: • WriteProcessMemory © 2002—2010, Digital Security 31 Обходим защиту в win32 DEP bypass – retn2libc Используем код отключения DEP: • NtSetinformationProcess • SetProcessDEPPolicy Контрмеры: Permanent DEP / AlwaysOn Работаем с исполняемой памятью: • VirtualAlloc and memcpy • VirtualProtect Копируем шеллкод в исполняемый поток: • WriteProcessMemory © 2002—2010, Digital Security 32 Обходим защиту в win32 DEP bypass – retn2libc Используем код отключения DEP: • NtSetinformationProcess • SetProcessDEPPolicy Работаем с исполняемой памятью: • VirtualAlloc and memcpy • VirtualProtect Контрмеры: Permanent DEP / AlwaysOn ASLR Копируем шеллкод в исполняемый поток: • WriteProcessMemory © 2002—2010, Digital Security 33 Обходим защиту в win32 ASLR По какому адресу искать VirtualProtect ? APP.DLL NTDLL.DLL APP2.DLL KERNEL32.DLL KERNEL32.DLL APP2.DLL NTDLL.DLL APP.DLL КАРТА ПАМЯТИ ПРОЦЕССА ДО ПЕРЕЗАГРУЗКИ © 2002—2010, Digital Security КАРТА ПАМЯТИ ПРОЦЕССА ПОСЛЕ ПЕРЕЗАГРУЗКИ 34 Обходим защиту в win32 Обходим ASLR Используем модули без поддержки 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 35 Обходим защиту в win32 DEP bypass – retn2libc Используем код отключения DEP: • NtSetinformationProcess • SetProcessDEPPolicy Работаем с исполняемой памятью: • VirtualAlloc and memcpy • VirtualProtect Контрмеры: Permanent DEP / AlwaysOn ASLR Копируем шеллкод в исполняемый поток: • WriteProcessMemory Ещё 5 копеек: Для всех этих функций нужно подготовить параметры в стеке При этом надо избегать нулевых байтов и иного не-ASCII байтов © 2002—2010, Digital Security 36 Обходим защиту в win32 Return-Oriented Programming Переполнение: Буфер Что-то RET ROPROPROPROPROP «Записать по адресу 0x0A0A0A0A значение 0x10» CODE POP EDI MOV EAX, 0x10 MOV [EDI], EAX MOV EAX, 0x10 © 2002—2010, Digital Security CPU 0x7C010102: RETN 0x8C010103: 0x8C010104: POP EDI RETN 0x8C020105: 0x8C020106: POP EAX RETN 0x8C030107: 0x8C030108: NEG EAX RETN 0x8C040109: 0x8C05010B: MOV [EDI], EAX RETN STACK 0x8C010103 0x0A0A0A0A 0x8C020104 0xFFFFFFF0 0x8C030105 0x8C040106 R O P 37 Обходим защиту в win32 ROP • Можем изменить стековый фрейм • CVE-2010-1297 STACK 0x04001111: CALL [ECX+C] MOV EAX, 0x10 0x0700156F: MOV EAX,[ECX+34] PUSH [ECX+24] MOV [EDI], EAX CALL [EAX+8] 0x070048EF: XCHG EAX, ESP RETN 0x07004919: POP ECX ECX MOV EAX,POP 0x10 MOV [EAX+C],1 POP ESI POP EBX RETN © 2002—2010, Digital Security НЕ КОНТРОЛИРУЕМ 0x07004919 0xCCCCCCCC 0x070048EF 0x0700156F 0x0C0C0C0C 0x07004919 0xCCCCCCCC 0x070048EF 0x0700156F . . . 0x0C0C0C0C REGS ECX=0x0C0C0C0C // +0x34 38 Обходим защиту в win32 Пример ROP Классический эксплойт для 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 и привилегии не повышает © 2002—2010, Digital Security 39 XCHG EAX, ESP © 2002—2010, Digital Security 40 Обходим защиту в win32 Итого Технология ОС Эффективность 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 • Поддержка при компиляции • Все модули процесса © 2002—2010, Digital Security 41 XCHG EAX, ESP XCHG EAX, ESP www.dsecrg.com www.twitter.com/asintsov a.sintsov@dsec.ru © 2002—2010, Digital Security 42