image

В данной статье вспомним синтаксис ARM ассемблера, разберемся с уязвимостью shellshock, а также решим 8-е и 10-е задания с сайта pwnable.kr.

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

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

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

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

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

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


Нажимаем на первую иконку с подписью leg, и нам говорят, что нужно подключиться по SSH с паролем guest. Так же предоставляют исходный код на C и ассемблере.

image

Давайте скачаем оба файла и посмортим исходный код на языке C. По ассемблерным вставкам можно сказать, что использует синтаксис ARM. Про ARM ассемблер на Хабре писали тут и тут.

image

В функции main() от пользователя принимается число и сравнивается с суммой результатов трех функций key(). Разберем их по порядку.

image

Таким образом в регистр R3 помещается значение из регистра PC. В ARM ассемблере регистр PC содержит адрес следующей инструкции, которая должна быть выполнена. Смотрим дизассемблированный код.

image

Таким образом, функция key1() вернет значение 0x8ce4. Разберем функцию key2().

image

В R3 помещается 0x8d08, которое потом увеличивается на 4 и записывается в регистр R0. То есть key2() вернет 0x8d0c. Рассмотрим key3().

image

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

image

Функция key3() вернет 0x8d80. Подключимся по SSH и введем в программу сумму трех найденных чисел.

image

image

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

image

Shellshock aka Bashdoor


Shellshock (Bashdoor) — программная уязвимость, обнаруженная в программе GNU Bash, которая позволяет исполнять произвольные команды при получении некоторых нестандартных значений переменных окружения. Уязвимость получила номер CVE-2014-6271.

В Unix-подобных операционных системах каждая программа имеет переменными среды. Дочерний процесс наследует у родительского список переменных среды. Кроме переменных среды, bash также поддерживает внутренний список функций — именованных скриптов, которые могут вызываться из исполняемого скрипта. При запуске скриптов из других (родительских) скриптов возможен экспорт значений существующих переменных окружения и определений функций. Определения функций экспортируются путём кодирования их в виде новых переменных окружения специального формата, начинающегося с пустых скобок «()», за которыми следует определение функции в виде строки. Новые экземпляры bash при своем запуске сканируют все переменные среды, детектируя данный формат и преобразовывая его обратно в определение внутренней функции. Таким образом, если злоумышленник имеет возможность подать произвольную переменную среды в запуск bash, то появляется возможность исполнения произвольных команд.

Следующий пример напечатает текст VULN.

env x=’() { : ; }; echo “VULN”’ bash -c “echo text”

Так как при выполнении команды “echo text” будет загружено определение функции, содержащееся в переменной окружения x, а с ним выполнена команда ‘echo “VULN”’.

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


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

image

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

image

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

image

Давай просмотрим исход код.

image

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

/bin/cat flag

Для этого определим функцию в переменной окружения, куда поместим эту команду. А потом запустим программу.

export x="() { :; }; /bin/cat flag;"

image

Сдаем флаг и получаем еще одно очко. До встречи в следующей статье.

Мы в телеграм канале: канал в Telegram.

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