![image](https://habrastorage.org/webt/al/py/ef/alpyefagnx81cc2xc1ncjqs8lus.png)
В данной статье вспомним синтаксис ARM ассемблера, разберемся с уязвимостью shellshock, а также решим 8-е и 10-е задания с сайта pwnable.kr.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Решение задания leg
Нажимаем на первую иконку с подписью leg, и нам говорят, что нужно подключиться по SSH с паролем guest. Так же предоставляют исходный код на C и ассемблере.
![image](https://habrastorage.org/webt/tp/my/fe/tpmyfexuyfyvtftxadhlbycvqpq.png)
Давайте скачаем оба файла и посмортим исходный код на языке C. По ассемблерным вставкам можно сказать, что использует синтаксис ARM. Про ARM ассемблер на Хабре писали тут и тут.
![image](https://habrastorage.org/webt/cz/hs/8_/czhs8_n5hz9ie1tdq5nu898yphe.png)
В функции main() от пользователя принимается число и сравнивается с суммой результатов трех функций key(). Разберем их по порядку.
![image](https://habrastorage.org/webt/ia/h-/zv/iah-zvx_7qfrsjoupbdj8or_23w.png)
Таким образом в регистр R3 помещается значение из регистра PC. В ARM ассемблере регистр PC содержит адрес следующей инструкции, которая должна быть выполнена. Смотрим дизассемблированный код.
![image](https://habrastorage.org/webt/tj/rr/eu/tjrreu4ie7jl7rv1wvyeplbaoni.png)
Таким образом, функция key1() вернет значение 0x8ce4. Разберем функцию key2().
![image](https://habrastorage.org/webt/cj/qx/ln/cjqxlnvud1daccdku7gmivncaga.png)
В R3 помещается 0x8d08, которое потом увеличивается на 4 и записывается в регистр R0. То есть key2() вернет 0x8d0c. Рассмотрим key3().
![image](https://habrastorage.org/webt/yp/mi/7r/ypmi7r5kd-ro6ee8ilr07oofp9a.png)
По аналогии с первой функцией делаем вывод, что key3() вернет значение из регистра LR. LR содержит адрес возврата функции. Посмотрим, где вызывается функция и возьмем следующий адрес.
![image](https://habrastorage.org/webt/77/gc/d1/77gcd1bkm7ufsifqwpksxoevtpy.png)
Функция key3() вернет 0x8d80. Подключимся по SSH и введем в программу сумму трех найденных чисел.
![image](https://habrastorage.org/webt/mo/m3/i3/mom3i3yhdmzzdyleqdv1z5yyxfe.png)
![image](https://habrastorage.org/webt/sh/l9/ph/shl9phxuqspw1bngeyqf-v8nvms.png)
Сдаем флаг и получаем два очка.
![image](https://habrastorage.org/webt/tn/0u/tv/tn0utvomkq7-8pwyni7ehgi2j3y.png)
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](https://habrastorage.org/webt/ur/c_/ko/urc_komo-hzsx8z8at-piypqvag.png)
При подключении мы видим соответствующий баннер.
![image](https://habrastorage.org/webt/os/r5/y9/osr5y9rqx4cdypgefj8ncrsh4um.png)
Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.
![image](https://habrastorage.org/webt/hr/0l/u1/hr0lu1ylo_fdkyswsftxzoqcnj8.png)
Давай просмотрим исход код.
![image](https://habrastorage.org/webt/74/un/1w/74un1w-xrfzvpblpztqv9qd7zdo.png)
Интерес вызывает строка с вызовом функции system. Исходя из названия, предполагаем, что bash, который находится рядом с программой и вызывается из программы, уязвим. По аналогии с описанной в статье атакой, выполним команду чтения флага.
/bin/cat flag
Для этого определим функцию в переменной окружения, куда поместим эту команду. А потом запустим программу.
export x="() { :; }; /bin/cat flag;"
![image](https://habrastorage.org/webt/h8/u9/07/h8u907vxl0x0qjivbolvogqx1-m.png)
Сдаем флаг и получаем еще одно очко. До встречи в следующей статье.
Мы в телеграм канале: канал в Telegram.