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

Статья Ревёрсим небольшой руткит в виде модуля ядра для Linux

tabac

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

0ed7fcc0cfdcba8fbe4c0.png

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

Начинаем разбор категории "Grotesque".
Вот и произошло возвращение к данному циклу. Прошлый пост по решению заданий с данного сайта был аж 19 мая, пора начинать более сложную категорию заданий. К сожалению, первое задание категории "proxy server" сейчас находится на реконструкции, поэтому мы начнём со второго задания - "rootkit". Задания данной категории уже довольно сложные и без подготовки с ходу их решить не получится. Также, я не хочу полностью описывать процесс решения до получения флага, т.к. это запрещено политикой pwnable.kr я лишь объясню в чём уязвимость и как её можно проэксплуатировать. Все моменты, которые могут помочь в простом копипасте для решения задания буду замазаны.

Тридцать девятая задача.
В данном посте разберём задание "rootkit".

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

c8c2c24420d2842a87eac.png

Задание за 400 баллов и решений не много, сразу понятно, что перед нами сложный таск. По описанию можно понять, что на сервере у рута нет возможности прочитать файл (это странно). Нам дают некоторый исполняемый файл под именем "rootkit", посмотрим, что он из себя представляет. Скачаем файл и загрузим в IDA.

a0afbc59dfff9ef3018d7.png

Перед нами модуль ядра Linux. Отлично, ядерные уязвимости это просто прекрасно, особенно их эксплуатация - это всегда очень творческий процесс и много кода на Си.

Посмотрим, что делает модуль при инициализации.

5039fbb48e3c1b6f768a6.png

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

bb2fb30459b72f03aa99c.png

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

51ca0763a27d2a7e9bec0.png

Да, обычное чтение не работает (различные другие хаки тоже не прокатят). Теперь самый важный вопрос на который надо найти ответ "Где тут уязвимость?" и "Как её эксплуатировать?".

На сколько я понял (вы можете меня подправить, напишите в чат-бота), уязвимости тут как-бы и нет. По сути давать пользователю рута уже есть уязвимость, потому что мы можем запросто написать свой модуль ядра, который восстановит необходимые системные вызовы на оригинальные. Благо адрес таблицы мы знаем (0xC15FA020), а найти оригинальные вызовы не составит проблемы.

f7634347a763c9c2d668a.png

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

68ef159bdb8fe5abf6d26.png

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

58cc8d3c4896262ab852d.png

Из википедии можно узнать, что этот регистр имеет бит, который отвечает за защиту от записи.

c151c884ae10024801994.png

Таким образом, перед исправлением таблицы системных вызовов происходит отключение защиты от записи, а после происходит включение её обратно. Значит это нам тоже нужно проделать.

В итоге получаем примерно следующий код.

35663ad2edaf319f09710.png

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

d2ad5f90d83009ced15a5.png

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

На этом всё, надеюсь вы узнали что-то новое из данного небольшого разбора. Если вы решили данное задание другим образом, то поделитесь, было бы очень интересно посмотреть на другие решения.


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


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