Как начать?
Регистрация на сайте http://pwnable.kr достаточно простая, даже подтверждение почты не требуется, поэтому с этим проблем не должно быть. После регистрации мы попадаем на страничку с заданиями, задания расположены в порядке "от простого к сложному", по этому рекомендуется начинать с первого задания, которое называется "fd".
Данный сайт был сделан очень давно, однако задания на нём рассматривают достаточно обширные темы в мире эксплуатации бинарных уязвимостей. С предисловием всё, перейдём к решению задач.
Начинаем разбор категории "Grotesque".
Вот и произошло возвращение к данному циклу. Прошлый пост по решению заданий с данного сайта был аж 19 мая, пора начинать более сложную категорию заданий. К сожалению, первое задание категории "proxy server" сейчас находится на реконструкции, поэтому мы начнём со второго задания - "rootkit". Задания данной категории уже довольно сложные и без подготовки с ходу их решить не получится. Также, я не хочу полностью описывать процесс решения до получения флага, т.к. это запрещено политикой pwnable.kr я лишь объясню в чём уязвимость и как её можно проэксплуатировать. Все моменты, которые могут помочь в простом копипасте для решения задания буду замазаны.
Тридцать девятая задача.
В данном посте разберём задание "rootkit".
Взглянем на описание.
Задание за 400 баллов и решений не много, сразу понятно, что перед нами сложный таск. По описанию можно понять, что на сервере у рута нет возможности прочитать файл (это странно). Нам дают некоторый исполняемый файл под именем "rootkit", посмотрим, что он из себя представляет. Скачаем файл и загрузим в IDA.
Перед нами модуль ядра Linux. Отлично, ядерные уязвимости это просто прекрасно, особенно их эксплуатация - это всегда очень творческий процесс и много кода на Си.
Посмотрим, что делает модуль при инициализации.
По сути модуль заменяет системные вызовы в таблице системных вызовов на свои. При этом в новых системных вызовах просто происходят проверки на наличие флага в аргументе пути до файла.
Таким образом изменены все функции, которые могли бы позволить нам тем или иным способом добраться до файла с флагом. Проверим это.
Да, обычное чтение не работает (различные другие хаки тоже не прокатят). Теперь самый важный вопрос на который надо найти ответ "Где тут уязвимость?" и "Как её эксплуатировать?".
На сколько я понял (вы можете меня подправить, напишите в чат-бота), уязвимости тут как-бы и нет. По сути давать пользователю рута уже есть уязвимость, потому что мы можем запросто написать свой модуль ядра, который восстановит необходимые системные вызовы на оригинальные. Благо адрес таблицы мы знаем (0xC15FA020), а найти оригинальные вызовы не составит проблемы.
Также нам нужно узнать версию ядра, чтобы скачать необходимые исходники и скомпилировать модуль именно под нашу версию.
Отлично, всё что осталось это понять какой код нам необходимо реализовать. Для начала можно просто проанализировать, что делает наш модуль и увидеть, что перед непосредственным исправлением таблицы системных вызовов происходит вызов функции wp. Она выставляет определённое значение регистра cr0 в зависимости от переданного ей аргумента.
Из википедии можно узнать, что этот регистр имеет бит, который отвечает за защиту от записи.
Таким образом, перед исправлением таблицы системных вызовов происходит отключение защиты от записи, а после происходит включение её обратно. Значит это нам тоже нужно проделать.
В итоге получаем примерно следующий код.
Осталось лишь собрать его с необходимыми исходниками и закинуть на сервер. Это не самые сложные задачи, но они тоже требует некоторых навыков. Их описывать в решении мы не будем. После того как вы загрузите свой модуль на сервер вы сможете прочитать флаг.
Да, это действительно флаг, просто он немного сжат с помощью известного алгоритма, думаю для вас это не будет проблемой и вы быстро сообразите как его разжать и получить действительно верный флаг.
На этом всё, надеюсь вы узнали что-то новое из данного небольшого разбора. Если вы решили данное задание другим образом, то поделитесь, было бы очень интересно посмотреть на другие решения.
авторство - Telegram-канал "Убежище Хакера"
Регистрация на сайте http://pwnable.kr достаточно простая, даже подтверждение почты не требуется, поэтому с этим проблем не должно быть. После регистрации мы попадаем на страничку с заданиями, задания расположены в порядке "от простого к сложному", по этому рекомендуется начинать с первого задания, которое называется "fd".
Данный сайт был сделан очень давно, однако задания на нём рассматривают достаточно обширные темы в мире эксплуатации бинарных уязвимостей. С предисловием всё, перейдём к решению задач.
Начинаем разбор категории "Grotesque".
Вот и произошло возвращение к данному циклу. Прошлый пост по решению заданий с данного сайта был аж 19 мая, пора начинать более сложную категорию заданий. К сожалению, первое задание категории "proxy server" сейчас находится на реконструкции, поэтому мы начнём со второго задания - "rootkit". Задания данной категории уже довольно сложные и без подготовки с ходу их решить не получится. Также, я не хочу полностью описывать процесс решения до получения флага, т.к. это запрещено политикой pwnable.kr я лишь объясню в чём уязвимость и как её можно проэксплуатировать. Все моменты, которые могут помочь в простом копипасте для решения задания буду замазаны.
Тридцать девятая задача.
В данном посте разберём задание "rootkit".
Взглянем на описание.
Задание за 400 баллов и решений не много, сразу понятно, что перед нами сложный таск. По описанию можно понять, что на сервере у рута нет возможности прочитать файл (это странно). Нам дают некоторый исполняемый файл под именем "rootkit", посмотрим, что он из себя представляет. Скачаем файл и загрузим в IDA.
Перед нами модуль ядра Linux. Отлично, ядерные уязвимости это просто прекрасно, особенно их эксплуатация - это всегда очень творческий процесс и много кода на Си.
Посмотрим, что делает модуль при инициализации.
По сути модуль заменяет системные вызовы в таблице системных вызовов на свои. При этом в новых системных вызовах просто происходят проверки на наличие флага в аргументе пути до файла.
Таким образом изменены все функции, которые могли бы позволить нам тем или иным способом добраться до файла с флагом. Проверим это.
Да, обычное чтение не работает (различные другие хаки тоже не прокатят). Теперь самый важный вопрос на который надо найти ответ "Где тут уязвимость?" и "Как её эксплуатировать?".
На сколько я понял (вы можете меня подправить, напишите в чат-бота), уязвимости тут как-бы и нет. По сути давать пользователю рута уже есть уязвимость, потому что мы можем запросто написать свой модуль ядра, который восстановит необходимые системные вызовы на оригинальные. Благо адрес таблицы мы знаем (0xC15FA020), а найти оригинальные вызовы не составит проблемы.
Также нам нужно узнать версию ядра, чтобы скачать необходимые исходники и скомпилировать модуль именно под нашу версию.
Отлично, всё что осталось это понять какой код нам необходимо реализовать. Для начала можно просто проанализировать, что делает наш модуль и увидеть, что перед непосредственным исправлением таблицы системных вызовов происходит вызов функции wp. Она выставляет определённое значение регистра cr0 в зависимости от переданного ей аргумента.
Из википедии можно узнать, что этот регистр имеет бит, который отвечает за защиту от записи.
Таким образом, перед исправлением таблицы системных вызовов происходит отключение защиты от записи, а после происходит включение её обратно. Значит это нам тоже нужно проделать.
В итоге получаем примерно следующий код.
Осталось лишь собрать его с необходимыми исходниками и закинуть на сервер. Это не самые сложные задачи, но они тоже требует некоторых навыков. Их описывать в решении мы не будем. После того как вы загрузите свой модуль на сервер вы сможете прочитать флаг.
Да, это действительно флаг, просто он немного сжат с помощью известного алгоритма, думаю для вас это не будет проблемой и вы быстро сообразите как его разжать и получить действительно верный флаг.
На этом всё, надеюсь вы узнали что-то новое из данного небольшого разбора. Если вы решили данное задание другим образом, то поделитесь, было бы очень интересно посмотреть на другие решения.
авторство - Telegram-канал "Убежище Хакера"