image

В данной статье решим 25-е задание с сайта pwnable.kr.

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

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

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

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

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

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


Продолжаем второй раздел. Скажу сразу, что сложнее первого, но в этот раз на предоставляют исходный код программы. Не забываем про обсуждение здесь(https://t.me/RalfHackerPublicChat) и здесь (https://t.me/RalfHackerChannel). Начнем.

Нажимаем на иконку с подписью otp. Нам дают адрес и порт для подключения.

image

Подключаемся и осматриваемся на сервере.

image

Флаг, который мы не можем прочитать, программа и ее исходный код. Давайте посмотрим исходник.

image

Раберем его. Программа принимает в качестве аргумента пароль.

image

Далее в переменную otp сохраняется рандомные 16 байт.

image

В папке tmp создается файл со случайным именем (первые 8 байт otp) и в него записывается рандомные 8 байт (вторые 8 байт otp).

image

Зачем-то и созданного файла считывается значение и сравнивается с введенным паролем.

image

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

# ulimit -f 0

image

Теперь запустим программу.

image

Получаем ошибку. Не беда, ведб ее можно обработать с помощью того же питона.

python -c "import os, signal; signal.signal(signal.SIGXFSZ, signal.SIG_IGN); os.system('./otp 0')" 

image

Получаем флаг и свои легкие 100 очков. И мы продолжаем: в следующей статье затронем Web. Вы можете присоединиться к нам в Telegram.

Комментарии (1)


  1. datacompboy
    11.10.2019 10:13
    +1

    М… а
    trap '' SIGINT
    ./otp 0

    сработало бы?