ROP - Digital Security

реклама
Обход защитных механизмов в ОС
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
[email protected]
© 2002—2010, Digital Security
42
Скачать