• XSS.stack #1 – первый литературный журнал от юзеров форума

PWN CVE-2016-3672 и ASCII-printable shellcode

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Решаем задания на бинарные уязвимости с сайта http://pwnable.kr. Регистрация на сайте http://pwnable.kr достаточно простая, даже подтверждение почты не требуется, поэтому с этим проблем не должно быть. После регистрации мы попадаем на страничку с заданиями, задания расположены в порядке "от простого к сложному", по этому рекомендуется начинать с первого задания, которое называется "fd".

0ed7fcc0cfdcba8fbe4c0.png

Данный сайт был сделан очень давно, однако задания на нём рассматривают достаточно обширные темы в мире эксплуатации бинарных уязвимостей. С предисловием всё, перейдём к решению задач.

В данном посте разберём задание "ascii".

Взглянем на описание.

0d9f1a7dd49c2f946309a.png

Это задание является продолжением задания "ascii_easy" где нужно было найти ROP-гаджеты с адресами, которые состоят только из печатаемых байт. На этот раз задача будет несколько сложнее.

Зайдём на сервер и посмотрим, что у нас есть.

36eddb2fa59c712613f75.png

Исходников нет, есть только исполняемый файл. Также нет lbic, которая была в "ascii_easy" и которая загружалась по некоторому адресу.

Скачаем исполняемый файл и загрузим в IDA.

Взглянув на функцию main сразу можно понять, что принцип решения будет совсем не такой, как в прошлом задании данной тематики.

f5bbd03044250a1c4c2cb.png

Создаётся некоторый регион памяти с адресом 0x80000000 и размером 4 Кб, после этого считывается 400 байт, которые вводит пользователь и помещаются в данный регион. Если все эти байты печатаемые (ASCII) то вызывается уязвимая функция.

Давайте взглянем на уязвимую функцию.

72a66a901bb0f5526aa08.png

Она просто копирует в локальный буфер данные с адреса, где находятся введённые пользователем значения.

Размер буфера 168 байт.

10491cb495b80cbfef664.png

Хорошо, у нас есть стандартное переполнение буфера. Давайте посмотрим на защиты, которые есть у исполняемого файла.

d74c7f5c0f6adc14359ab.png

У нас нет стековой канарейки, нет рандомизации адресного пространства кода. Однако, у нас есть защита стека от выполнения, что не позволит нам просто выполнить шеллкод на стеке, придётся опять искать гаджеты, только теперь не совсем понятно где их искать.

Где выполнить код - не главный вопрос, потому что у нас есть вызов mmap который создаёт участок памяти, доступный на выполнение.

2a7c7ed8350ea701b891e.png

3 аргумент mmap определяет так называемые защиты региона памяти, в случае со значением 7 нам доступно чтение/запись/выполнение (про mmap).

Более важный вопрос - где получить адреса, которые будут удовлетворять условию ASCII-символов?

На сервере включен ASLR.

907a86ec03f8daa0fe974.png

Изменить мы это не можем, т.к. у нас нет root-доступа.

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

f51609711724fbd186d12.png

Немного поискав найдём CVE-2016-3672. Попробуем её использовать на сервере.

7604648b71f4fb995b27b.png

Теперь попробуем запустить исполняемый файл и посмотрим на секции памяти.

c2372d553e02f60327e70.png

Мы можем заметить, что секции vvar и vdso располагаются по адресам начинающимся с ASCII-символов. Однако данные адреса всё равно немного рандомизируются, но не сильно, что позволит нам сбрутить, в случае необходимости.

В секции vdso находятся некоторый код (подробнее тут) значит там можно поискать ROP-гаджеты.

Сдампим vdso.

a747c7c1535fca40cc2a0.png

Теперь можем искать там гаджеты.

ffd9cc1e4ef7abd1d8b6a.png

Какое-то количество есть, но пока не понятно, сможем ли мы из них составить цепочку для вызова "/bin/sh".

Немного подумав и посмотрев на гаджеты можно сделать вывод, что не сможем. Нет необходимых гаджетов для записи в память.

Однако мы можем попробовать передать управление на выделенную секцию через mmap.

Для этого нужно посмотреть на регистры и стек перед возвратом из функции vuln. Поставим точку останова на инструкцию "ret" в функции vuln.

78f59e4d75993224e0f52.png

Запустим файл на выполнение и введём некоторые данные.

303329a6c8aeec96f00d3.png

Мы видим, что адрес секции находится сразу в 3 местах, 2 из них - это регистры. При этом один регистр содержит адрес начала секции, а второй адрес окончания введённых данных. На стеке хранится адрес начала секции, но он достаточно далеко от вершины стека.

Но с помощью ROP-гаджетов вида "pop ret" мы можем переместить вершину стека к данному адресу и тогда инструкция "ret" передаст управление на этот адрес.

Звучит как отличный план.

Однако нам нужен ASCII-шеллкод. Это не сложно, достаточно просто поискать в интернете.

9e60112b862f72482ca61.png

Данная тема довольно популярная и есть несколько видов. Такие шеллкоды также можно создать с помощь msfvenom если указать ASCII-encoding.

Найдём не сложный шелл-код и теперь нам остаётся только найти гаджеты и подобрать верное количество для того, чтобы наш адрес оказался на вершине стека.

9481b533b549ddac83aaa.png

Используем 2 раза подряд первый гаджет, который снимает со стека 3 значения и один раз второй гаджет, который снимает со стека 2 значения. И в итоге получим на вершине стека адрес секции куда вы можете записывать свой шелл-код.

Вот пример ASCII-шеллкода

PYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01Tx

Вы можете использовать его.

С целью предотвращения script-kiddie дальнейшая часть разбора, а именно сбор всего воедино и написание эксплоита остаётся за вами. Выше всё описано довольно подробно, собрать из этого эксплоит не сложно.

авторство - Telegram-канал "Убежище Хакера"
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх