IOCTL в драйвере. IDA Pro «с нуля» ч.57

Обсудить статью на форуме


Массу свежих 2020 года крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.
Хорошо. Мы будем пытаться эксплуатировать переполнение стека из скрипта PYTHON. Обычно эксплуатация ядра происходит локально. Другими словами, скрипт уже эксплуатирует некоторую программу, которая не имеет привилегий системы и хочет повысить привилегии и быть с правами SYSTEM, что устраняет ограничения, которые имеет эксплуатируемый процесс, который имеет только ограниченные привилегии обычного пользователя на машине.

Поэтому, за исключением очень редких исключений, эксплойты ядра - это эксплоиты для повышения привилегий или PRIVILEDGE ESCALATION.

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

В любом случае, как код в C, так и код на PYTHON основаны на вызовах одних и тех же WINDOWS API, таких, как CREATEFILE, DEVICEIOCONTROL и т.д. Поэтому, то, что делается на одном языке, легко переносится на другой.

Давайте напомним нашу модель PYTHON предыдущего примера.

IDA Pro взлом и реверсинг программ

Первым шагом будет изменение имени для драйвера поэтому, когда вы делаете CREATEFILE, нам возвратится его правильный дескриптор.

Напомним, что имя генерируется здесь

IDA Pro взлом и реверсинг программ

IDA Pro взлом и реверсинг программ

Здесь драйвер возвращает SYMBOLICNAME, который приходит из строки, которая находится в DEVICENAME.

IDA Pro взлом и реверсинг программ

Без особых проблем, конечно, если я заменяю имя старого драйвера драйвером новым.

IDA Pro взлом и реверсинг программ

Мы можем скопировать его на целевую машину и посмотреть, не даст ли он мне ошибку или даст действительный дескриптор, но я буду продолжать смотреть.

Этот драйвер запущен, и я запускаю скрипт.

IDA Pro взлом и реверсинг программ

Поскольку SYMBOLICLINK идет отсюда, имеет смысл использовать это имя.

IDA Pro взлом и реверсинг программ

Давайте попробуем так.

IDA Pro взлом и реверсинг программ

Мы видим, что всё работает.

IDA Pro взлом и реверсинг программ

Мне вернулось положительное значение, которое является дескриптором драйвера. Остальное меня не интересует, поэтому я закрываю его.

IDA Pro взлом и реверсинг программ

На данный момент, мы удаляем WHILE и все остальное, что нас не интересует. Следующая вещь заключается в том, чтобы увидеть, какой именно IOCTL переносит нас в блок переполнение стека, чтобы отправить его.

Вопрос состоит в том, как добраться туда.

IDA Pro взлом и реверсинг программ

Мы видим, что драйвер идёт отсюда.

IDA Pro взлом и реверсинг программ

Регистр EDX имеет код IOCTL, который получается отсюда.

IDA Pro взлом и реверсинг программ

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

Давайте посмотрим, достигнет ли программа блока, где мы хотим присоединить IDA и устанавливаем BP.

IDA Pro взлом и реверсинг программ

Я запускаю драйвер на целевой машине и попадаю в BP.

IDA Pro взлом и реверсинг программ

Мы видим, что в регистр EDX драйвер считывает IOCTL код, который он передает.

IDA Pro взлом и реверсинг программ

IDA Pro взлом и реверсинг программ

Программа помещает результат в регистр EAX, вычитает из него значение 0x222003 и поскольку результатом будет нуль, драйвер переходит в уязвимый блок.

IDA Pro взлом и реверсинг программ

IDA Pro взлом и реверсинг программ

Программа читает длину, которая является нулем, так как я не передал ей аргументы за исключением IOCTL.

IDA Pro взлом и реверсинг программ

Поскольку аргумент равен нулю, программа пропускает функцию, в которой происходит переполнение стека.

IDA Pro взлом и реверсинг программ

Поскольку API функция, вызывается из WIN32FILE в PYTHON, она имеет меньше аргументов, чем исходная функция, которая имеет больше.

IDA Pro взлом и реверсинг программ

IDA Pro взлом и реверсинг программ

Здесь находится определение WIN32FILE PYTHON.

IDA Pro взлом и реверсинг программ

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

IDA Pro взлом и реверсинг программ

Поскольку библиотека WIN32FILE не имеет доступа ко всем API, она не позволяет копировать непосредственно в буфер как функция MEMCPY или что-то вроде этого, поэтому мы можем копировать его только с помощью функции READFILE, поэтому мы делаем файл PEPE.BIN, заполняя его 0x1000 буквами A. Мы передаем файл в функцию CREATEFILE, чтобы она открывала его и вернула нам дескриптор, и мы передали его в функцию READFILE с аргументом BUF буфера, который мы выделяем и копировать содержимое файла туда.

Очевидно, что если мы сделаем это на C, C++ или языке, в котором мы можем использовать функцию VIRTUALALLOC и легко копировать с помощью функции MEMCPY или той которую мы хотим. Но здесь у нас есть определенные ограничения, и мы должны приспосабливаться к этому.

Нам нужно дополнительно знать, какую длину мы должны отправить. Давайте посмотрим на буфер назначения в IDA.

IDA Pro взлом и реверсинг программ

Мы замечаем, что с начала буфера до адреса возврата получается 520 десятичных байт * 4 размер элемента.

Поэтому

hex(520*4) = '0x820'

Поэтому мы должны отправить 0x820 + RET.

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

IDA Pro взлом и реверсинг программ

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

IDA Pro взлом и реверсинг программ

IDA Pro взлом и реверсинг программ

Здесь cуществует адрес, который мы можем передать с помощью STRUCT.PACK после 0x820 A. Досадно, что мы должны записать их в файл, который читается.

Следовательно, как только у меня есть адрес буфер.

IDA Pro взлом и реверсинг программ

Я пишу в файл ФРУКТЫ, которые хочу отправить.

IDA Pro взлом и реверсинг программ

Перед функцией READFILE скопируем их в буфер.

Давайте посмотрим, заработает ли это. В этом случае нет необходимости иметь файл, потому что он будет создан и заполнен, поэтому мы удалили предыдущий.

IDA Pro взлом и реверсинг программ

Для этого мы изменили аргумент на CREATE ALWAYS.

IDA Pro взлом и реверсинг программ

Хорошо. Предположительно здесь - наш буфер с буквами A. IDA остановлена. Давайте посмотрим, что я передаю.

IDA Pro взлом и реверсинг программ

Мы видим, что входной буфер, который передается в регистр EDX, показывает нам то же самое значение. Давайте посмотрим, есть ли там A.
=======================================================================
IDA Pro взлом и реверсинг программ
=======================================================================
IDA Pro взлом и реверсинг программ
=======================================================================
Он не заполнился буквами A. Давайте пропустим эксплуатацию и давайте исправим скрипт.

IDA Pro взлом и реверсинг программ

Я меняю EIP здесь с помощью правой кнопки и SET IP и нажимаю RUN.

Я думаю, что проблема в том, что размер буфера должен соответствовать размеру файла.

IDA Pro взлом и реверсинг программ

Давайте сделаем так.

Ах, уже упал.

IDA Pro взлом и реверсинг программ

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

IDA Pro взлом и реверсинг программ

Я трассирую до MEMCPY.

IDA Pro взлом и реверсинг программ

Я добираюсь до RET.

IDA Pro взлом и реверсинг программ

Я продолжаю с помощью F7.

IDA Pro взлом и реверсинг программ

Я вижу, что я попал в буфер. Проблема состоит в том, что, поскольку я не выделил его с помощью VIRTUALALLOC, а выделяю его с помощью API ALLOCATEREADBUFFER, WIN32FILE у него нет прав на выполнение. Поэтому мне придется найти способ выделить исполняемый код другим способом.

IDA Pro взлом и реверсинг программ

Я добавил библиотеку CTYPES, и у неё есть функция VIRTUALPROTECT, поэтому я дал ей права на выполнение, и теперь у нас нет проблем.

IDA Pro взлом и реверсинг программ

Программа переходит и выполняет без проблем. Я действительно вижу, что CTYPES более продвинутая, чем WIN32API, поэтому вы можете делать все, вызывает прямо функцию VIRTUALALLOC непосредственно из CTYPES.

Версия c CTYPES – это так

IDA Pro взлом и реверсинг программ

Библиотека использует напрямую функции CREATEFILE, VIRTUALALLOC, RTLMOVENEMORY и DEVICEIOCONTROL. Вам просто нужно быть осторожным с одним из типов, но она работает хорошо.

IDA Pro взлом и реверсинг программ

Здесь всё работает. Вопрос сейчас состоит в том, что мы выполняем код. Нам осталось бы делать шеллкод, потому что так у нас будет только красивый синий экран.

Мы проанализируем шеллкод и создадим его в следующей части.

=======================================================
Автор текста: Рикардо Нарваха - Ricardo Narvaja (@ricnar456)
Перевод на русский с испанского: Яша_Добрый_Хакер(Ростовский фанат Нарвахи).
03.11.2018
Версия 1.0


Обсуждение статьи: IOCTL в драйвере. IDA Pro «с нуля» ч.57 >>>


При перепечатке ссылка на https://exelab.ru обязательна.



Видеокурс ВЗЛОМ