13.03.2014

Компрометация Netgear с помощью инъекций команд

image

В конце моего поста об уязвимостях аутентификации Netgear wndr3700v4, я обещал не забрасывать эту тему. Если у вас есть доступ к веб интерфейсу, любая уязвимость, связанная с аутентификацией, становится приоритетной для использования.

Автор: Zach Cutlip

В конце моего поста об уязвимостях аутентификации Netgear wndr3700v4, я обещал не забрасывать эту тему. Если у вас есть доступ к веб интерфейсу, любая уязвимость, связанная с аутентификацией, становится приоритетной для использования. 

Ранее я рассказывал о net-cgi из прошивки wndr3700. Встроенный функционал net-cgi обширен и чем-то напоминает BusyBox. Одна из самых интересных функций – cmd_ping6(). Вот как она выглядит:

Функция осуществляет ping по имени или IPv6 адресу, переданному через строковый параметр *host. Это общепринятый стандарт, поэтому первым делом при исследовании прошивки роутера вы всегда должны проверить наличие страницы диагностики ping’а и способ его выполнения.

В нашем случае – как, впрочем, и во многих других – параметр host с помощью sprintf() копируется на стек для дальнейшего использования в качестве параметра shell команды. Это, наверно, самая явная уязвимость переполнения буфера, какую я вообще видел. Но ее не стоит использовать, несмотря на всю заманчивость, потому что дальше в коде идет вызов system()! Функция system() передает данную ей строковую переменную вызову /bin/sh. Вот вам и вторая - и более интересная для нас – уязвимость – инъекция команд в самом чистом виде, которую очень легко использовать. Если в качестве передаваемой строки будет выступать строка «; evil_command; #», работа ping6 будет прервана, и за ней будет выполнена инжектированная команда.

Но что если целевая машина не использует IPv6? Какая разница, ping6 вообще не играет никакой роли в ходе атаки. Главное здесь – чтобы наша команда была передана функции system().

Так как же осуществляется вызов этой функции?

cmd_ping6() вызывается из cgi_commit().

cgi_commit() вызывается из sub_4052d0(), которая является функцией выхода для MIME обработчика apply.cgi (как работает таблица MIME обработчиков я объяснял ранее).

Вы спросите, почему cgi_commit() вызывает cmd_ping6()? Это происходит, когда к apply.cgi осуществляется post-запрос, содержащий «submit_flag=ping6».

sub_43a60() обработчик вызывается при submit_flag’е равном «ping6».

Post-запрос отправляется обработчику apply.cgi с флагом ping6 со страницы ping6_traceroute6_hidden_info.htm.

Как правило, эта страница должна быть доступна только авторизованным пользователям. Но с помощью обхода аутентификации, который я описывал ранее, страница становится доступной для всех. Как вы можете заметить, эта форма позволяет вам осуществлять ping по IP адресу или имени хоста. Вместо IP адреса вы можете написать shell команду, например, reboot.

Замена IP адреса на shell команду.

ping6_text=`reboot`

Это очень очевидная проверка, потому что эффект проявляется немедленно и его легко увидеть, да и команда имеет простой синтаксис, в котором сложно ошибиться.

Эта страница недоступна пользователю через ссылки в веб интерфейсе, даже в ее имени используется «hidden» (скрытый). Но как страницу не скрывай, она не станет полностью недосягаемой, особенно для Python’а. Я написал несколько «подтверждающих концепцию» скриптов, благодаря которым можно получить доступ к странице и стартовать telnet сервер, что позволит вам войти под root’ом.

Поиск «скрытых» файлов с помощью Python. Отключаем аутентификацию, а затем эксплуатируем уязвимость инъекции команд под root’ом.

Код эксплоита делает следующее:

  1. Определяет устройство, чтобы убедиться в наличии у него уязвимостей.
  2. Отключает аутентификацию.
  3. Инжектирует команду для получения доступа к iptables и стартует telnet server, прослушивающий интернет на порту 2323 [1].
  4. Включает аутентификацию, восстанавливает исходное состояние устройства.

Код эксплоита вы можете скачать с GitHub. Необходимо будет установить Bowcaster.

[1] Как правило, у маршрутизаторов Netgear уже есть telnet сервер, слушающий сеть на 23 порте и использующий жестко прописанный пароль.

[2] Не пытайтесь пробовать это на устройствах, принадлежащих другим людям. Это незаконно с точки зрения законодательства.

или введите имя

CAPTCHA