Познавательный блог  

Поиск по сайту

Гугль

Архивы

Взлом D-Link DIR-100

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

На информационном портале 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:

imagealpha_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.

Собирая всю полученную информацию воедино, автор в конечном итоге составляет следующий псевдокод для функции 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.

Также на хабре в комментариях сообщают о новых находках:

Написать комментарий








Страницы

Свежие записи

Гугль

Мета

Счетчики


Rambler's Top100

Рубрики

  Разработка и дизайн — StvPromo.ru