13 октября 2013 в 01:29

Очередная программная закладка в роутерах D-Link

image

На информационном портале devttys0.com некто Craig Heffner – опытный специалист в области реверс-инжиниринга – выложил статью-исследование очередной (уже находили) программной закладки в роутерах D-Link. На этот раз закладка была выявлена в официальной прошивке для DIR-100 revA, но, по его мнению, присутствует в роутерах других серий:

  • DIR-100
  • DI-524
  • DI-524UP
  • DI-604S
  • DI-604UP
  • DI-604+
  • TM-G5240
  • Planex BRL-04UR
  • Planex BRL-04CW

Коротко говоря, если у вашего браузера установлен User-Agent как «xmlset_roodkcableoj28840ybtide», то вы автоматически получаете админский доступ к веб-панели управления роутером без всякой авторизации.

Первым делом автор скачал официальную прошивку firmware v1.13 для DIR-100 (для его DI-524 используется та же самая). Затем прошёлся по бинарнику своей утилитой binwalk и вынул SquashFS с ситемой, откуда взял веб-сервер /bin/webs и загрузил его в IDA:
image

Судя по строкам, /bin/webs это модифицированная версия thttpd. Авторы модификации — Alphanetworks, подразделение D-Link, все добавленные методы начинаются с префикса alpha:
image

alpha_auth_check


Данная функция кажется наиболее интересной. При детальном анализе выясняется, что в ней выполняется сравнение строк – строка со смещением 0xD0 в структуре http_request_t и константой «xmlset_roodkcableoj28840ybtide». Если совпадают, то alpha_auth_check сразу же возвращает 1 (успешная авторизация).

Автор погуглил константу xmlset_roodkcableoj28840ybtide и нашёл единственное упоминание на русском форуме: http://forum.codenet.ru/q58748. Сообщения датируются 2010 годом, но про то, каким образом в бинарнике используется эта строка, никто не упомянул.

Продолжая исследование, Craig находит, что по смещению 0xD0 в структуру http_request_t данные пишутся функцией httpd_parse_request.
imageimage

Собирая всю полученную информацию воедино, автор в конечном итоге составляет следующий псевдокод для функции alpha_auth_check:
#define AUTH_OK 1
#define AUTH_FAIL -1

int alpha_auth_check(struct http_request_t *request)
{
    if(strstr(request->url, "graphic/") ||
       strstr(request->url, "public/") ||
       strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)
    {
        return AUTH_OK;
    }
    else
    {
        // These arguments are probably user/pass or session info
        if(check_login(request->0xC, request->0xE0) != 0)
        {
            return AUTH_OK;
        }
    }

    return AUTH_FAIL;
}

You stay classy, D-Link.

UPD: В комментариях сообщают о новых находках:
+209
101241
409
Xlab 12,0

Комментарии (104)

+217
ricochet, #
если развернуть «xmlset_roodkcableoj28840ybtide» задом наперед, получим «editby04882joelbackdoor_teslmx»
+15
Tranced, #
OH SHI~
+76
Sayonji, #
Вспомнилось «ООО Лабеан».
+1
wearymax, #
С 2010-го года этот «юзер агент» еще замечен — www.monosnap.com/image/Ncsxx2aqhZuthrZFmokxsLqLL
Ох сколько тысяч раз им пользовались?)
0
Xlab, #
Сообщения датируются 2010 годом, но про то, каким образом в бинарнике используется эта строка, никто не упомянул.
Единицы, в приватном режиме. Надеюсь :)
+3
hyperwolf, #
<паранойя>АНБ?</паранойя>
+6
shara, #
Ну что, забабахаем меш-сеть?)
Или это сработает только с локальной машины, подключенной проводом?
0
Xlab, #
Кстати, этот факт нужно проверить. Судя по описанию и псевдокоду, проверка юзерагента лежит рядом с проверкой пары логин/пароль, то есть при загрузке страницы панели управления. В настройках можно включить доступ только по проводу, пока не поздно.
0
Valery4, #
Для того чтобы не по проводу попасть на страницу авторизации — нужно быть подключённым к сети. Разве не так?
Как там положение дел со взломом WPA2? (Давно не проверял).
0
KorDen32, #
Если включен WPS (а он по умолчанию включен), то легко, т.к. код WPS всегда 10 цифр, из которых ЕМНИП две контрольные и можно рассчитать, т.е. стойкость — 8 цифр. И то там есть еще сноски по упрощению…
+6
Evengard, #
Для взлома WPS достаточно перебрать 11000 вариантов. Стойкость 4 + 3 цифры.
0
qw1, #
А для WPS разве физически не надо нажимать кнопку на роутере, в который нужно получить доступ?
+4
CodeRush, #
Если нажимать кнопку физически, то WPS PIN вводить не нужно.
А если не нажимать — 11000 тысяч вариантов, как уже указано выше, которые перебираются полностью за достаточно короткое время.
+4
Ezhyg, #
Тогда можно ещё кучу домашних рутеров поиметь. Не один Длинк грешит закладками и инженерными паролями.
Asus, Dlink, Acorp, Huaweii, ZTE, Nateks… Да и вообще, можно найти кучу устройств со стандартной парой логин/пароль видимых снаружи.

Несколько лет назад мы даже устроили акцию доброты, пройдясь по адресам провайдера и отключив доступ снаружи на рутерах/адсл-мопедах, если там были реквизиты умолчальные.
0
hyperwolf, #
У нас провайдер после массовых подобных случаев запретил абонентам между собой на 80й порт стучатся.
+5
Ezhyg, #
Ну здрасьте, я конечно знаю про страшилки с закрытием кучи портов разными провами, но как я буду попадать например с рабочего места на домашний веб-сервер или в настройки собственного рутера, если и там и тут один провайдер?

Да и мы сделали благое дело, а не гадостями занимались.
0
hyperwolf, #
Я Вас не обвиняю. Прошу прощения, если обидел — я не хотел. У нас таким образом крали логин-пароль от интернета, поэтому провайдер и ввёл такие меры жесткие.

Если хотите достучатся до домашнего веб-сервера — придется перевешивать его на нестандартный порт.

–1
Ezhyg, #
Это будет ущемлять мои права, по причине причинения мне неудобств, посему этот пункт из договора будет удалён :)
0
Snowly, #
Удалено, внизу уже ответили.
–2
Ezhyg, #
А я всё равно процитирую ;)
Кстати, вы читали свой договор о предоставлении услуг?

Читал (поэтому последняя фраза уточняет моё мнение)!
Теперь моя позиция:
— договор двухсторонний, поэтому я тоже имею право и ставлю условия
— провайдер для меня, просто «труба»
+5
Snowly, #
Customer may set up one (1) web page per service account for personal use of the Service, but Customer may not establish a web page using a server located at Customer's home. Customer will not use, or allow others to use, Customer's home computer as a web server, FTP server, file server or game server or to run any other server applications or to provide network or host services to others via Charter's network. Customer will not use, or allow others to use, the Service to operate any type of business or commercial enterprise, including, but not limited to, IP address translation or similar facilities intended to provide additional access.


Из моего договора. Для вас провайдер это поставщик услуг, который может вам отказать в случае нарушения договора. А что вы об этом думаете им побарабану :)
–1
Ezhyg, #
Поставляет одну услугу — «трубу» в интернет.
А по такому пункту получается, что банальная веб-морда роутера/камеры/и т.п. — нарушает условия договора настолько, что пора расстреливать?

Еще раз повторю — «договор», «двухсторонний», «соглашение», как угодно назови. Но клиент и провайдер заключают договор на взаимных условиях, по обоюдному согласию и так далее. Если им по барабану я не стану их клиентом и никто из моих знакомых, которые ценят моё мнение и обращаются за консультациями и помощью.
+3
Snowly, #
Вы можете купить «бизнес» тариф, который будет дороже (часто в разы). Там все можно. Ну или без интернета сидеть. Редко когда есть выбор больше чем из 2х провайдеров, а условия примерно у них одинаковые.
0
Chamie, #
>Редко когда есть выбор больше чем из 2х провайдеров, а условия примерно у них одинаковые.
Ну, это смотря где… В СПб вполне типично иметь возможность подключиться к 5 и более провайдерам (2 ADSL от РТК и ВебПлас, DOCSIS от «Твой интернет» и ещё 2-5 и более провайдеров с Ethernet/оптикой).
0
VolCh, #
До недавнего времени в центре Питера у меня была возможность подключить только «Твой Интернет» (теперь, кстати, тоже Ростелеком).
–1
Ezhyg, #
А в случае одного провайдера, давить на свои условия надо еще сильнее!
0
Chamie, #
Такое бывает, в основном, только в «неудачных» местах исторического центра. Опять же, я забыл посчитать Йоту и прочих радио-провайдеров.
–2
Ezhyg, #
Не смогу, так как такой договор можно оформить только на организацию! Что… ну ты понимаешь.
И поверь на слово, провайдеру (если у них там не совсем полоумные) проще пойти на уступки по некоторым пунктам, чем просто потерять клиента, это я говорю на основании успешного заключения нескольких индивидуальных договоров.
+3
VolCh, #
Более вероятно, что договор будет удален.
0
Ezhyg, #
Разве? Как-то странно, ведь именно таким я пользуюсь…
0
VolCh, #
Может у вас его просто не было изначально?
+1
Ezhyg, #
Был договор, который не ограничивал ничего такого. После каких-то изменений, изменили кое-какие пункты, которые меняли многое, при чем существенные в тех условиях. Провайдеру была подана претензия о конкретных пунктах и изменениях и встречное предложение, от которого не было смысла отказываться.
+2
nochkin, #
Достаточно много провайдеров, например, в штатах закрывают порты типа 80, 25, 23, 21 и т.п. (или даже всё ниже 1024 что бы наверняка), так как они просто не разрешают держать сервер на обычном домашнем тарифе и требуют покупать бизнес-тариф для таких вещей.
–1
Ezhyg, #
Удалённый доступ к домашнему компьютеру или рутеру — не сервер, в том смысле, какой они закладывают в него, так что такие провайдеры идут лесом. Борзеет труба :(
+2
nochkin, #
Для удалённого доступа можно использовать другой порт.
–1
Ezhyg, #
Так мне и так приходится два использовать, компутеров два (хотя иногда и с одного на другой ползаю и обратно).

Но есть же стандартный порт, с чего бы мне его менять?! :)
+3
nochkin, #
Стандартный порт обычно используется для публичных серверов. Удалённый доступ для личного использования лучше не ставить на стандартный порт (хороший пример — этот пост на Хабре).
–3
Ezhyg, #
Это личное измышление. Мне нравится использовать как есть, по простым причинам, готовые правила, настройки и т.п.

Чем лучше? Ну да, долбится какой-то французский сервер, с Win2k8, пару раз в месяц, в течение нескольких часов, в попытках войти в систему, ну и что?! :)
+2
nochkin, #
Речь не о том, как кому нравится. Мне лично нравится не помнить и не вводить пароли, но сегодняшний интернет требует не только хорошего логина-пароля, но и дополнительных средств защиты в дополнение к этому.
Ко мне, например, левые IP долбятся примерно 200-300 уникальных в день.
+1
Ezhyg, #
Хм, то есть, факт того, что на «закрытые» порты долбятся не менее «редко», хотя ты об этом можешь даже не знать, тебя не напрягает?
0
nochkin, #
Нет, не напрягает. Всё равно сражаться с ними в большинстве случаев бесполезно.
А так как порты закрыты, то ресурсов они особо не требуют. Особо «одарённые» заблокированы на уровне Firewall.

Открывать стандартный порт своего роутера, что бы его любой мог завалить даже случайно считаю неразумным. Тем более, что этот порт нужен будет только мне, а в этом случае нестандартного порта достаточно что бы избежать ненужных хлопот.
0
Ezhyg, #
Я имел в виду немного другое — сменив порт, он как раз попадёт в те самые ранее закрытые и его точно так же будут долбить :) Извиняюсь, что не смог сразу пояснить свою мыслю.

У меня открыто множество портов, могу дать адрес — ломайте, кому не жалко (у вас сутки). Но я стараюсь использовать стандартные порты, для стандартных служб и те, которые по умолчанию используются разными программами. Причина… проста — девичья память :(
+1
nochkin, #
Понял. Нет, это маловероятно, так как сканируют боты или, на крайний случай, script-kiddies, которые не знают что порт может быть иным. А если и знают, то сканировать и искать не будут, так как обычно их атаки не нацелены на кого-то одного, а больше на поиск уязвимостей в куче разных хостов.
+1
Arik, #
Пару лет назад звонил своему провайдеру с такой проблемой, говорил что дыра хорошая, так как пароль admin:admin у себя на роутерах никто не меняет, в том числе когда приходят «специалисты» от провайдера. IP-адреса очень быстро находятся по местным торрент-трэкерам. Долго надо мной смеялись, что такого не может быть. После в ЛК появилась надпись, что запрещается входить под чужим паролем.

Позже в роутерах начал замечать, что используют js-скрипты для подстановки пароля в поле и через html-разметку очень сложно вытащить пароль. Ну как минимум для какого-нибудь паука, который парсит пароли. А если с браузера, то можно просто в инспекторе у инпут-поля поменять тип с «password» на «text» и пароль снова видно.

В общем хотелось чтоб по-умолчанию закрыли всем 80-порт с внешним ip-адресом, а открывать его будут по запросу или через ЛК на сайте провайдера.
+1
AYrm, #
У одного крупного провайдера Израиля на ADSL роутерах так и стоит admin:admin

Столкнулся на днях. WiFi загнан принудительно на 11 канал, что создает проблемы — провайдер крупный и обнаружить рядом еще несколько точек на 11 канале запросто. Кроме того многие смартфоны и планшеты очень не любят этот канал.

Позвонил в поддержку и попросил переключить на другой свободный или поставить Авто — предложили подключить доп.сервис поддержки WiFi сетей или переключить самому. На резонный вопрос «а пароль» был получен неожиданный admin:admin
0
Chamie, #
У многих, по-моему, так и есть — 80й и прочие порты закрыты, открывается бесплатно в ЛК.
0
SLY_G, #
Фуф. Проверил на D-Link DI-804HV, Firmware Version: V1.51
Не работает.
+3
stifff, #
Возможно, эту прошивку не Joel правил )
0
Skylan, #
На DAP-1360 rev. B1 Firmware Version 2.13 тоже не работает.
–98
argos, #
Проверил на своём. Не работает.
Потому что там OpenWRT.
0
KorDen32, #
Проверил на своем. Работает.
Потому что там OpenWRT.

Если вдруг сарказм не понятен...
«Добавил код в исходники вебморды LUCI. Проверил на своем. Работает. Потому что там OpenWRT»
0
vvzvlad, #
Вы нарушили порядок!
–98
Xlab, #
Проверил на своём. Не работает.
Потому что у меня ZyXEL NBG460N.
+97
odiszapc, #
Два брата-акробата
+31
vvzvlad, #
Два дебила — это сила.
+12
SiPlus, #
-52 у одного, -52 у другого, +52 у вас. Какое единодушие на Хабре.
+21
BubaVV, #
Заметьте, что один из них — автор этого поста
+1
shara, #
И автор съехидничал
+3
Xlab, #
Ну, блин, самое время заметить! ;)
+3
hyperwolf, #
Вы бы еще на Cisco проверили, чтобы гордо заявить «не работает»
+5
alexbers, #
Забавно, что в исходниках прошивки для dir-100 нет кода с бэкдором, а он уже собран в файл .o. Можно поискать такие файлы и в других прошивках.
+1
Xlab, #
+5
Rast1234, #
Поиск в Shodan для ленивых :)
Не забудьте выставить user-agent.
+3
SLIDERWEB, #
На первом же сработал (https://docs.google.com/file/d/0B-Emk2PRfQGITzd6OFlyUTE1bUE/edit?usp=drivesdk)
Это очень печально!
0
YourSearchExpert, #
К счастью существуют прошивки с открытым исходным кодом, например dd-wrt или tomato usb. Порой они даже расширяют базовый функционал роутера. Правда подходят не ко всем моделям роутеров.
+1
ColorPrint, #
К длинку вон тоже выше исходники открытые и без бэкдора )
Кто сам прошивки из исходников компилирует? )
+18
Equin0x, #
Бывают такие косяки и не от злого умысла. Девелопер строгает код и делает себе бэкдор чтобы не тратить время на авторизацию. Но неожиданно, раньше срока, прибегает манагер с намыленой шеей и ужатыми сроками, забирает все как есть и опаньки )
+7
AstonMartin, #
Не верю.
+30
lightman, #
Побаяню
+4
magdelta, #
А зря.
+6
Newbilius, #
А зря. Ставить авторизацию в один клик, дабы проще отладку вести — не самая редкая ситуация.
Но, такая фиговина должна быть продублирована условием, завязанным на окружение или сборку, что бы в релизную версию не попала ну никак. Проверять имя сервера, или тип сборки (на «dev» работать, на «release» отключаться, и т.п.)
+4
stoune, #
Для этого есть feature toggle. Время реализации минут 10-15 с тестированием.
Такие косяки в релизе только свидетельствуют о низкой квалификации и культуре разработки в D-Link.
0
ttools, #
DIR_300BEEB5 не сработало
0
AlexSky, #
Там русская прошивка, которая никак не связана с той, которая обсуждается.
+2
ttools, #
Это так, для сведения, мало ли кто и из чего эту русскую прошивку сделал
+5
MYPABEU, #
А почему это не перевод www.devttys0.com/2013/10/reverse-engineering-a-d-link-backdoor/
+2
Xlab, #
Потому что это — краткий пересказ. Перевод от пересказа отличается тем, что переведённый текст должен совпадать с оригиналом на 100%, а все замечания переводчика помечаются в скобках как «прим. переводчика». Автор статьи начал её с цитаты Футурамы, а также много внимания уделил изучению ассемблерного кода в IDA, так что я решил не заниматься переводами, а вкратце пересказать, для ленивых.
+5
S0mnium, #
Только что проверил DIR-300NRU rev. B5 прошивка 1.4.3
curl 192.168.2.1 -A "xmlset_roodkcableoj28840ybtide"

работает на 100%
0
glesik, #
А вот на 2.14 (февральской, этого года), похоже, уже починили.
0
ViseMoD, #
Последняя 1.4.9, если верить сайту. В ней, впрочем, вход работает.
0
glesik, #
Виноват, оказалось у меня B1. Обновлялся после исправления какой-то из предыдущих уязвимостей, теперь пишет просто что версия железа «Bx».
0
timerov, #
Как раз надо было получить доступ к этой железке DIR-300NRU rev. B5 с неведомой прошивкой. Метод не работает
0
d0rian, #
я правильно понимаю, что если установлен доступ только с конкретного ип, то данная уязвимость с других ип не сработает?
0
d0rian, #
извините, это не я писал, не обращайте внимание на этот глупый вопрос)
0
Indexator, #
DIR-300NRU Hardware Version: B1, Firmware Version: 2.04, Copyright © 2004-2009 D-Link Systems, Inc.
Не работает, запрашивает логин, пароль и капчу…
0
Daimos, #
DAP-1155 и DSL-2500U — не срабатывает такой хак.
–1
KOLANICH, #
Интересно:
1 где он раздобыл имена функций? В бинарник они не включаются.
2 Каковы будут последствия для длинка? Будут ли пользователи с ним судиться? Или репутационные издеки и без суда их разорят? Или же всем как всегда, и с длинка как с гуся вода (наверное, этот вариант)?
3 Длинк ли внедрил бекдор или кто-то взломал репозитарий и внедрил бекдор или длик любезно дал доступ к своему репозитарию гебне?
0
SiPlus, #
На линуксовских компияторах все функции и глобальные переменные экспортируются, поэтому в бинарнике они есть.
GCC даже сигнатуры методов классов оставляет, по крайней мере на Mac, как на Linux — не знаю.
0
dei, #
зависит от переданных параметров
gcc.gnu.org/wiki/Visibility
0
mgaga, #
Итак, я попробовал проделать следующее с культовой DWL-2100 AP, на которой стоит прошивка v2.50eu.

1) Сменил свой User-Agent на xmlset_roodkcableoj28840ybtide и проверил его на этом ресурсе. Проверил, применилась ли смена User-Agent'а (хабра-сторадж лежит, но в общем сменился User-Agent:

habrastorage.org/storage3/ffd/b53/55b/ffdb5355bc213fb56897a5029ba142fe.png

2) После этого подключился по Wi-Fi к DWL-2100AP, но в FF у меня всё так же вылезло окно авторизации = (

3) NON_PROFIT(((
+4
SysCat, #
DIR-120 — Работает.
Так же на страничках где есть кнопка сохранения он позволяет сохранить какой-то файл.
При стандартном User Agent — такого предложения нет.
+1
SysCat, #
H/W Ver.: A1 F/W Ver.: 1.02
–1
d0rian, #
а если установить доступ только с конкретного ип, другого, чем с которого используется уязвимость? сработает?
0
d0rian, #
извините, это не я писал, не обращайте внимание на этот глупый вопрос)
+15
DIHALT, #
О, у меня на даче будет инет!
0
Oval, #
А авторизация, судя по псевдокоду, по URL содержащие graphic/ и public/ никого не приводит в недоумение?
0
dei, #
Жаль у меня нет такой железки.
Запрос вида IP/public/[две точки] работает или нет?

(что-то хабр автозаменяет две точки на многоточие)
0
mwizard, #
или ip/?public/, если GET-параметры включены в url.
0
Indexator, #
работает, перебрасывает на ip (с useragent-ом пока не проверял)
–1
Indexator, #
Возможно, автор просто затупил и перепутал в псевдокоде операцию "||" с операцией "&&"?
0
Longer, #
Забавно, что уже исходники уязвимых прошивок пропали с сайта tsd.dlink.com.tw/ (404 при попытке скачать исходники) совпадение?)

PS Для DIR-300 и DIR120 пока на месте.
0
vitektm, #
Model:
DIR-300
Firmware version:
1.0.4
Build time:
Fri Jan 11 16:47:56 MSK 2013

Не сработало
0
mwizard, #
Обновите прошивку, пожалуйста.
0
Dimon2055, #
DIR-615 H/V: B2 F/V: 2.27RU Не работает.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.