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

Статья Разбор уязвимости shellshock. ARM ассемблер. Уязвимость bash.

pablo

(L2) cache
Пользователь
Регистрация
01.02.2019
Сообщения
433
Реакции
1 524
В данной статье вспомним синтаксис ARM ассемблера, разберемся с уязвимостью shellshock, а также решим 8-е и 10-е задания с сайта pwnable.kr.

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

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

image


Давайте скачаем оба файла и посмортим исходный код на языке C. По ассемблерным вставкам можно сказать, что использует синтаксис 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


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


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