Решение задания с pwnable.kr 06 — random и 09 — mistake

в 12:08, , рубрики: ctf, pwn, pwnable.kr, rand, дескрипторы, информационная безопасность, Программирование

image

В данной статье узнаем как перехватить данные, передаваемые между библиотечной функцией и программой, вспомним про файловые дескрипторы и решим 6-е и 9-е задания c сайта pwnable.kr.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Решение задания random

Нажимаем на иконку с подписью random, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении мы видим соотвтствующий баннер.

image

Давайте узнаем какие файлы есть на сервере, а также какие мы имеем права.

ls -l

image

Таким образом мы можем можем прочитать исходный код программы, так как есть право читать для всех, и выполнить с правами владельца программу fd (установлен sticky-бит). Давай просмотрим исход код.

image

Программа генерирует случайное число, применяет операцию XOR (исключающее ИЛИ), и если результат операции XOR равен эталонному значению, выводит флаг.

Дело в том, что в данной программе используется функция rand(). Данная функция генерирует псевдослучайное число, преобразуя “зерно”, сгенерированное функцией srand(). Функция srand(number) должна вызываться каждый раз перед вызовом rand(). Если такого не происходит, то по умолчанию перед rand() срабатывает srand(1).

Таким образом, в данной программе генератор псевдослучайного числа каждый раз преобразует по одному и тому же алгоритму одно и то же “зерно”. Нам нужно узнать число, которое возвращает функция rand(), и проксорить с эталонным значением. Так как операция XOR обратима, то подавая на вход программе полученной значение, мы получим флаг.

Давайте перехватим данные между библиотечной функцией rand() и нашей программой. Для этого используем утилиту ltrace.

ltrace ./random

image

Мы видим с какими параметрами вызывается функция rand() и какое значение она возвращает. Теперь проксорим это значение с эталонным.

image

Подадим полученное число на вход нашей программе.

image

Сдаем флаг и получаем одно очко за такое легкое задание.

image

Решение задания mistake

Нажимаем на иконку с подписью mistake, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении мы видим соотвтствующий баннер.

image

Давайте узнаем какие файлы есть на сервере, а также какие мы имеем права.

ls -l

image

Таким образом мы можем можем прочитать исходный код программы, так как есть право читать для всех, и выполнить с правами владельца программу fd (установлен sticky-бит). Давай просмотрим исход код.

image

В самом начале программы открывается файл и создается дескриптор. Про файловые дескрипторы я уже подробно писал в ЭТОЙ статье. Но дело в том, что в условии допущена ошибка. Таким образом сначала выполнится сравнение, результатом которого будет ложь, а потом уже присвоение этого ложного результата (т.е. 0) переменной fd.

image

Далее вызывается функция sleep и без предложения ввода в переменную pw_buf читаются данные. Но из-за ошибки в условии, они читаются не из открытого файла с паролем, а из стандартного ввода (дескриптор 0).

Далее мы вводим 10 символов, которые посимвольно ксорятся с 1 и сравниваются с паролем.

image

Таким образом, мы вводим две строки, символы которых результатом XOR операции должны дать 1. Найдем два символа, если проксорить которые, получим 1.

image

Это символы A и @. Теперь введем в программу две строки, одна из 10 символов ‘A’, а другая — ‘@’.

image

Сдаем флаг и получаем еще одно очко.

image

До встречи в следующих статьях!

Автор: RalfHacker

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js