Решаем задания на бинарные уязвимости с сайта http://pwnable.kr. Регистрация на сайте http://pwnable.kr достаточно простая, даже подтверждение почты не требуется, поэтому с этим проблем не должно быть. После регистрации мы попадаем на страничку с заданиями, задания расположены в порядке "от простого к сложному", по этому рекомендуется начинать с первого задания, которое называется "fd".
Данный сайт был сделан очень давно, однако задания на нём рассматривают достаточно обширные темы в мире эксплуатации бинарных уязвимостей. С предисловием всё, перейдём к решению задач.
В данном посте разберём задание "ascii".
Взглянем на описание.
Это задание является продолжением задания "ascii_easy" где нужно было найти ROP-гаджеты с адресами, которые состоят только из печатаемых байт. На этот раз задача будет несколько сложнее.
Зайдём на сервер и посмотрим, что у нас есть.
Исходников нет, есть только исполняемый файл. Также нет lbic, которая была в "ascii_easy" и которая загружалась по некоторому адресу.
Скачаем исполняемый файл и загрузим в IDA.
Взглянув на функцию main сразу можно понять, что принцип решения будет совсем не такой, как в прошлом задании данной тематики.
Создаётся некоторый регион памяти с адресом 0x80000000 и размером 4 Кб, после этого считывается 400 байт, которые вводит пользователь и помещаются в данный регион. Если все эти байты печатаемые (ASCII) то вызывается уязвимая функция.
Давайте взглянем на уязвимую функцию.
Она просто копирует в локальный буфер данные с адреса, где находятся введённые пользователем значения.
Размер буфера 168 байт.
Хорошо, у нас есть стандартное переполнение буфера. Давайте посмотрим на защиты, которые есть у исполняемого файла.
У нас нет стековой канарейки, нет рандомизации адресного пространства кода. Однако, у нас есть защита стека от выполнения, что не позволит нам просто выполнить шеллкод на стеке, придётся опять искать гаджеты, только теперь не совсем понятно где их искать.
Где выполнить код - не главный вопрос, потому что у нас есть вызов mmap который создаёт участок памяти, доступный на выполнение.
3 аргумент mmap определяет так называемые защиты региона памяти, в случае со значением 7 нам доступно чтение/запись/выполнение (про mmap).
Более важный вопрос - где получить адреса, которые будут удовлетворять условию ASCII-символов?
На сервере включен ASLR.
Изменить мы это не можем, т.к. у нас нет root-доступа.
Здесь нам может помочь гугл, в котором мы попробуем поискать частичное отключение ASLR без прав суперпользователя.
Немного поискав найдём CVE-2016-3672. Попробуем её использовать на сервере.
Теперь попробуем запустить исполняемый файл и посмотрим на секции памяти.
Мы можем заметить, что секции vvar и vdso располагаются по адресам начинающимся с ASCII-символов. Однако данные адреса всё равно немного рандомизируются, но не сильно, что позволит нам сбрутить, в случае необходимости.
В секции vdso находятся некоторый код (подробнее тут) значит там можно поискать ROP-гаджеты.
Сдампим vdso.
Теперь можем искать там гаджеты.
Какое-то количество есть, но пока не понятно, сможем ли мы из них составить цепочку для вызова "/bin/sh".
Немного подумав и посмотрев на гаджеты можно сделать вывод, что не сможем. Нет необходимых гаджетов для записи в память.
Однако мы можем попробовать передать управление на выделенную секцию через mmap.
Для этого нужно посмотреть на регистры и стек перед возвратом из функции vuln. Поставим точку останова на инструкцию "ret" в функции vuln.
Запустим файл на выполнение и введём некоторые данные.
Мы видим, что адрес секции находится сразу в 3 местах, 2 из них - это регистры. При этом один регистр содержит адрес начала секции, а второй адрес окончания введённых данных. На стеке хранится адрес начала секции, но он достаточно далеко от вершины стека.
Но с помощью ROP-гаджетов вида "pop ret" мы можем переместить вершину стека к данному адресу и тогда инструкция "ret" передаст управление на этот адрес.
Звучит как отличный план.
Однако нам нужен ASCII-шеллкод. Это не сложно, достаточно просто поискать в интернете.
Данная тема довольно популярная и есть несколько видов. Такие шеллкоды также можно создать с помощь msfvenom если указать ASCII-encoding.
Найдём не сложный шелл-код и теперь нам остаётся только найти гаджеты и подобрать верное количество для того, чтобы наш адрес оказался на вершине стека.
Используем 2 раза подряд первый гаджет, который снимает со стека 3 значения и один раз второй гаджет, который снимает со стека 2 значения. И в итоге получим на вершине стека адрес секции куда вы можете записывать свой шелл-код.
Вот пример ASCII-шеллкода
Вы можете использовать его.
С целью предотвращения script-kiddie дальнейшая часть разбора, а именно сбор всего воедино и написание эксплоита остаётся за вами. Выше всё описано довольно подробно, собрать из этого эксплоит не сложно.
авторство - Telegram-канал "Убежище Хакера"
Данный сайт был сделан очень давно, однако задания на нём рассматривают достаточно обширные темы в мире эксплуатации бинарных уязвимостей. С предисловием всё, перейдём к решению задач.
В данном посте разберём задание "ascii".
Взглянем на описание.
Это задание является продолжением задания "ascii_easy" где нужно было найти ROP-гаджеты с адресами, которые состоят только из печатаемых байт. На этот раз задача будет несколько сложнее.
Зайдём на сервер и посмотрим, что у нас есть.
Исходников нет, есть только исполняемый файл. Также нет lbic, которая была в "ascii_easy" и которая загружалась по некоторому адресу.
Скачаем исполняемый файл и загрузим в IDA.
Взглянув на функцию main сразу можно понять, что принцип решения будет совсем не такой, как в прошлом задании данной тематики.
Создаётся некоторый регион памяти с адресом 0x80000000 и размером 4 Кб, после этого считывается 400 байт, которые вводит пользователь и помещаются в данный регион. Если все эти байты печатаемые (ASCII) то вызывается уязвимая функция.
Давайте взглянем на уязвимую функцию.
Она просто копирует в локальный буфер данные с адреса, где находятся введённые пользователем значения.
Размер буфера 168 байт.
Хорошо, у нас есть стандартное переполнение буфера. Давайте посмотрим на защиты, которые есть у исполняемого файла.
У нас нет стековой канарейки, нет рандомизации адресного пространства кода. Однако, у нас есть защита стека от выполнения, что не позволит нам просто выполнить шеллкод на стеке, придётся опять искать гаджеты, только теперь не совсем понятно где их искать.
Где выполнить код - не главный вопрос, потому что у нас есть вызов mmap который создаёт участок памяти, доступный на выполнение.
3 аргумент mmap определяет так называемые защиты региона памяти, в случае со значением 7 нам доступно чтение/запись/выполнение (про mmap).
Более важный вопрос - где получить адреса, которые будут удовлетворять условию ASCII-символов?
На сервере включен ASLR.
Изменить мы это не можем, т.к. у нас нет root-доступа.
Здесь нам может помочь гугл, в котором мы попробуем поискать частичное отключение ASLR без прав суперпользователя.
Немного поискав найдём CVE-2016-3672. Попробуем её использовать на сервере.
Теперь попробуем запустить исполняемый файл и посмотрим на секции памяти.
Мы можем заметить, что секции vvar и vdso располагаются по адресам начинающимся с ASCII-символов. Однако данные адреса всё равно немного рандомизируются, но не сильно, что позволит нам сбрутить, в случае необходимости.
В секции vdso находятся некоторый код (подробнее тут) значит там можно поискать ROP-гаджеты.
Сдампим vdso.
Теперь можем искать там гаджеты.
Какое-то количество есть, но пока не понятно, сможем ли мы из них составить цепочку для вызова "/bin/sh".
Немного подумав и посмотрев на гаджеты можно сделать вывод, что не сможем. Нет необходимых гаджетов для записи в память.
Однако мы можем попробовать передать управление на выделенную секцию через mmap.
Для этого нужно посмотреть на регистры и стек перед возвратом из функции vuln. Поставим точку останова на инструкцию "ret" в функции vuln.
Запустим файл на выполнение и введём некоторые данные.
Мы видим, что адрес секции находится сразу в 3 местах, 2 из них - это регистры. При этом один регистр содержит адрес начала секции, а второй адрес окончания введённых данных. На стеке хранится адрес начала секции, но он достаточно далеко от вершины стека.
Но с помощью ROP-гаджетов вида "pop ret" мы можем переместить вершину стека к данному адресу и тогда инструкция "ret" передаст управление на этот адрес.
Звучит как отличный план.
Однако нам нужен ASCII-шеллкод. Это не сложно, достаточно просто поискать в интернете.
Данная тема довольно популярная и есть несколько видов. Такие шеллкоды также можно создать с помощь msfvenom если указать ASCII-encoding.
Найдём не сложный шелл-код и теперь нам остаётся только найти гаджеты и подобрать верное количество для того, чтобы наш адрес оказался на вершине стека.
Используем 2 раза подряд первый гаджет, который снимает со стека 3 значения и один раз второй гаджет, который снимает со стека 2 значения. И в итоге получим на вершине стека адрес секции куда вы можете записывать свой шелл-код.
Вот пример ASCII-шеллкода
PYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01TxВы можете использовать его.
С целью предотвращения script-kiddie дальнейшая часть разбора, а именно сбор всего воедино и написание эксплоита остаётся за вами. Выше всё описано довольно подробно, собрать из этого эксплоит не сложно.
авторство - Telegram-канал "Убежище Хакера"