19.11.2014

Уязвимость в кабельном модеме компании Arris

image

Бекдоры от производителя – самые мерзкие. Конечно, некоторые огрехи в коде могут привести к непреднамеренным уязвимостям, но явные бреши недопустимы. Сегодня я покажу пример уязвимости в продукте от компании Arris.

Автор: someLuser

Бекдоры от производителя – самые мерзкие. Конечно, некоторые огрехи в коде могут привести к непреднамеренным уязвимостям, но явные бреши недопустимы. Сегодня я покажу пример уязвимости в продукте от компании Arris. На сайте производителя есть потрясающая цитата:

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

Конечно, слова «проверенная» и «безопасный» не имеют никакого отношения к бекдорам, верно?! Тем не менее, в кабельном модеме Arris TG862G (версия прошивки TS070563_092012_MODEL_862_GW) наблюдалось следующее.

После успешной авторизации на странице администратора устанавливались такие cookie (на стороне клиента):

Cookie: credential=eyJ2YWxpZCI6dHJ1ZSwidGVjaG5pY2lhbiI6ZmFsc2UsImNyZWRlbnRpY
WwiOiJZV1J0YVc0NmNHRnpjM2R2Y21RPSIsInByaW1hcnlPbmx5IjpmYWxzZSwiYWNjZXNzIjp
7IkFMTCI6dHJ1ZX0sIm5hbWUiOiJhZG1pbiJ9

Все запросы должны иметь корректные «авторизационные» cookie (в предыдущих версиях прошивок наличие cookie вообще не требовалось). Если cookie отсутствуют, тогда на странице появится форма авторизации. Содержимое cookie представляет собой json-объект, закодированный в base64:

{"valid":true,"technician":false,"credential":"
YWRtaW46cGFzc3dvcmQ=","primaryOnly":false,"access":
{"ALL":true},"name":"admin"}

После декодирования содержимого поля «credential» получаем следующее:

{"valid":true,"technician":false,"credential"
:"admin:password","primaryOnly":false,"access":
{"ALL":true},"name":"admin"}

Устройство во время каждой аутентификации пересылает учетные записи (без HTTPS), то есть, по сути, используется basic-auth 2.0. Меня смутило поле «technician» со значением «false». После установки в поле «technician» значения «true» не произошло ничего выдающегося, однако после некоторых экспериментов выяснилось, что следующие cookie прекрасно работают:

Cookie: credential=eyJjcmVkZW50aWFsIjoiZEdWamFHNXBZMmxoYmpvPSJ9

После декодирования получаем:

{"credential":"dGVjaG5pY2lhbjo="}

И, наконец:

{"credential":"technician:"}

Замечательно. Имя пользователя – «technician» с пустым паролем. Попытка залогиниться при помощи найденной учетной записи ни к чему не привела.

Рисунок 1: Попытка залогиниться при помощи найденной учетной записи

Ситуация была довольно странной. Я не мог понять, зачем нужна скрытая учетная запись, при помощи которой нельзя залогиниться в интерфейсе пользователя. Что же можно сделать, используя данный аккаунт? Само по себе веб приложение представляет собой html/js-обертку для CGI для получения/установки SNMP-значений в модеме. В предыдущих версиях прошивки для CGI-вызовов вообще не требовались «авторизационные» cookie. Этот баг был устранен несколько лет назад.

Теперь мы вновь можем воспользоваться возможностью для установки/получения SNMP-значений при помощи аккаунта «technician»:

Рисунок 2: Получение/установка SNMP-значений при помощи аккаунта «technician»

Замечательно. Однако намного приятнее использовать удобный веб-интерфейс, а не работать из командной строки. Смена пароля, кажется, не представляется возможной, поскольку нам требуется предыдущий пароль.

Рисунок 3: Попытка поменять пароль для учетной записи technician

Но тут выяснилось, что приложение не проверяет старый пароль. В файле «mib.js» есть следующая строка:

SysCfg.AdminPassword= new Scalar("AdminPassword","1.3.6.1.4.1.4115.1.20.1.1.5.1",4);

Кажется, что идентификатор объекта «1.3.6.1.4.1.4115.1.20.1.1.5.1» содержит пароль администратора! Попытка получить содержимое идентификатора объекта при помощи учетной записи «technician» ни к чему не привела:

HTTP/1.1 200 OK
Date: Tue, 23 Sep 2014 19:58:40 GMT
Server: lighttpd/1.4.26-devel-5842M
Content-Length: 55
{
"1.3.6.1.4.1.4115.1.20.1.1.5.1.0":"",
"1":"Finish"
}

Как насчет того, чтобы установить новое значение в идентификатор объекта? Естественно, этот трюк не сработает…

Рисунок 4: Попытка установить новый пароль в идентификатор объекта

Однако ответ выглядит обнадеживающим. Теперь мы можем залогиниться, используя пароль «krad_password».

Рисунок 5: Попытка залогиниться при помощи ранее установленного пароля прошла успешно

Установку пароля можно выполнить при помощи следующей команды:

curl -isk -X 'GET' -b 'credential=eyJjcmVkZW50aWFsIjoiZEdWamFHNXBZMmxoYmpvPSJ9'
'http://192.168.100.1:8080/snmpSet?oid=1.3.6.1.4.1.4115.1.20.1.1.5.1.0=krad_password;4;'

Конечно, смена пароля достаточно безобидная операция. Возможно, намного интереснее изменить настройки DNS. Важно отметить, что установить SNMP-значения можно при помощи CSRF-атаки (межсайтовая подделка запроса), если вы «поймали» пользователя, который недавно залогинился в модем.

Реальная проблема в том, что компания Arris не дает доступа к прошивкам, разрешая загружать новые версии и обновления только кабельным операторам. Даже если в компании Arris решат, что нужно залатать дыру, вам следует рассчитывать только на милость кабельного оператора. Ведь вы конечный пользователь и не можете обновить прошивку из-за того, что в интерфейсе нет подобного функционала. Что сказать, последнее слово техники.