13 февраля 2018
Дорогой бензин? Сделаем его дешевым!
Несколько месяцев назад, занимаясь исследованием устройств, имеющих подключение к интернету, мы обнаружили нечто неожиданное и почти сразу поняли, что, вероятно, имеем дело с критической угрозой безопасности. Нам попался простой веб-интерфейс, который оказался связан с реальной заправочной станцией; мы предположили, что благодаря такой связи эту заправку можно удаленно взломать.
Мы с Амиханом Нейдерманом — на тот момент сотрудником компании Azimuth Security — исследовали находку. Когда наши подозрения подтвердились, мы связались с производителем и сообщили о проблеме.
Недавно об этой истории написало онлайн-издание Motherboard VICE, а в этом посте мы поделимся некоторыми техническими деталями. Более подробную информацию о нашем исследовании мы представим в начале марта на конференции Security Analyst Summit 2018 в Канкуне.
Исследуемое нами устройство оказалось не просто миниатюрным веб-интерфейсом. Это встроенный модуль, на котором выполняется блок контроллера на базе Linux, установленный вместе с компактным HTTPD-сервером.
Как сообщает производитель, ПО контроллера — это средство автоматизации, которое отвечает за управление всеми компонентами АЗС, в том числе топливораздаточной колонкой (ТРК), платежными терминалами и т.д.
Иными словами, контроллер является центральным узлом АЗС, и если злоумышленникам удается перехватить контроль над модулем, это может привести к катастрофическим последствиям. Еще одна тревожная деталь, которая выяснилась в ходе нашего анализа: многие экземпляры устройства были встроены в системы АЗС более десяти лет назад и все это время были подключены к интернету.
До начала исследования мы искренне полагали, что все без исключения системы АЗС изолированы от интернета и находятся под надлежащим контролем. Но мы ошибались: на деле оказалось, что злоумышленник, обладающий даже минимальными навыками, может, эксплуатируя данный продукт, получить контроль над системой АЗС из любой точки мира.
Игра в прятки
Как нам удалось установить, заправочные станции, использующие данный продукт, помечены определенным образом. Это позволяет обнаружить их, введя в поисковую систему всего одно ключевое слово. В течение нескольких секунд все подключенные к интернету АЗС выдают свое точное местоположение и доступные пассивные открытые соединения.
Используя данные, полученные в результате онлайн-поиска и из других источников, мы получили географическое распределение таких заправочных станций (отображено на карте ниже). Мы обнаружили более тысячи АЗС, к которым можно получить доступ с любого компьютера в мире. Стоит отметить, что в контексте взлома IoT-устройств, АЗС — мишень намного более опасная, чем, например, веб-камеры.
Наше исследование в основном заключалось в изучении данных, доступных онлайн. Производитель опубликовал в интернете значительную часть технической информации об устройстве, сделав ее доступной для клиентов. В частности, опубликованы подробные руководства по эксплуатации, которые включают скриншоты, установленные по умолчанию учетные данные, описания различных команд и пошаговые инструкции для получения доступа и управления каждым интерфейсом. Эти сведения в принципе позволили нам собрать всю необходимую информацию, не написав ни единой строчки кода.
Мы стали понимать, насколько сильно устарело исследуемое устройство, когда увидели, что к нему можно получить доступ и управлять удаленно при помощи сервисов, которые в современных устройствах не используются. В руководствах по эксплуатации скрупулезно указаны используемые сервисы и сетевая архитектура. Для понимания принципов работы устройства в сети особых хакерских навыков не требуется.
Учетные данные по умолчанию
Мы обнаружили, что установленные по умолчанию учетные данные неоднократно упоминаются в интернете. Имеются подтверждения того, что перечисленные в руководстве сервисы в какой-то момент времени были собраны поисковой системой. Поскольку она довольно новая, можно предположить, что эти сервисы в настоящее время доступны. Также мы нашли упоминания того, что протоколы SSH, HTTP и X11 потенциально могут использоваться для получения неавторизованного доступа.
В ходе исследования мы смогли авторизоваться в одной консоли начальника смены. Но это лишь частный случай, и у нас не было доказательств того, что аналогичным образом можно получить доступ ко всем другим АЗС. Нам нужно было получить разрешение владельца АЗС, чтобы попытаться получить к ней доступ, когда она отключена от сети.
Мы хотели выяснить, что скрывается за этим веб-интерфейсом. Каков его функционал — такой же, как у веб-камеры? Или мы сможем обнаружить критическую уязвимость, которая может привести к серьезному ущербу?
Консоль выглядит достаточно многофункциональной. Учитывая уровень технических знаний, требуемый от начальников смены, доступные функции позволяют им изменять параметры настройки ТРК, в том числе действующие на АЗС цены на бензин, настройки принтера, отчеты смены и т.д. Риск связан с действиями возможного инсайдера — начальник смены может вносить изменения в отчеты по смене, кассовые чеки и в цены на бензин. По нашему мнению, такие права должны быть только у владельца АЗС. Кроме того, мы подозреваем, что в сети есть другие интерфейсы, позволяющие сотруднику АЗС с расширенными правами отслеживать данные из магазина при станции и с платежного терминала. На скриншоте, приведенном выше, нет никакого указания на то, что в системе установлено защитное ПО.
Наш следующий шаг — проверить, сможем ли мы получить удаленный доступ к заправочной станции без каких-либо учетных данных. Мы стали искать нестандартный способ обхода механизма аутентификации. Предполагая, что этот механизм устарел, а перед развертыванием как следует не тестировался, мы рассчитывали найти такой способ за пару дней.
Первая находка
Мы были практически уверены, что в первую очередь обнаружим какую-нибудь уязвимость в коде. Однако мы совсем не ожидали увидеть то, что первым привлекло наше внимание.
Когда мы сделали дамп прошивки и обратную разработку основного кода, мы стали искать в декомпилированном коде механизм аутентификации и, к своему удивлению, обнаружили, что его ядром является оператор IF (см. скриншот). В качестве аргументов оператора были в явном виде прописаны логин и пароль. Таким образом, мы наткнулись на лазейку, которую разработчик оставил в коде на случай, если потребуется удаленный или локальный доступ к устройству с максимальными правами.
Эти учетные данные зашиты в каждом подобном устройстве этого производителя с версиями не выше той, что мы исследовали. Мы сообщили об обнаруженных уязвимостях в MITRE, запросили регистрацию CVE, а также связались с производителем.
Наряду с зашитыми в код паролями, мы обнаружили множество участков небезопасного кода, делающего возможным удаленное выполнение кода. Анализируя один из этих компонентов (soWebServer::XMLGetMeansReportRowsNumber), мы обнаружили параметр имени, который контролируется конечным пользователем и уязвим для атаки на переполнение стекового буфера. На базе этой находки мы скомпилировали полностью действующее удаленное исполнение кода. Часть этого кода представлена ниже на скриншоте.
Также мы обратили внимание на участок кода, который является компонентом аутентификации и содержит SQL-инъекцию. Вообще, на протяжении всего исследования мы находили свидетельства недостаточной защиты от SQL-инъекций. Вот характерный пример:
Эксплуатация геоданных
Вполне вероятно, что IP-адрес указывает на фактическое местоположение АЗС. Однако мы решили копнуть глубже и выяснить, действительно ли данные о названии и местоположении АЗС вводятся владельцем АЗС, и можно ли установить фактическое местонахождение АЗС, название компании-владельца и другую информацию, привязанную к этой точке.
Мы нашли XML-компонент, который отвечает за создание ежедневных отчетов, а в нем обнаружили параметр, содержащий фактическое название и местонахождение АЗС. Мы написали простую программу-прототип, которая считывает значение этого параметра.
Как уже было сказано, мы не тестировали этот код глобально, но в нашем конкретном случае он успешно считал название АЗС, которое после недолгого онлайн-поиска позволило выяснить ее фактическое местонахождение, название компании-владельца и контактную информацию.
Как изменить цены
Если в руки злоумышленника попадут прописанные в коде учетные данные для входа в веб-интерфейс SiteOmat и он получит возможность менять входные параметры компонента update_price.cgi, то он сможет менять цены на отпускаемый бензин. Чтобы предпринять попытку такого вмешательства, нужно в первую очередь извлечь данные топливораздаточной колонки в формате JSON — из них можно узнать, какие нефтепродукты продаются и по какой цене. Это можно сделать, используя один из XML-файлов, отвечающий за хранение цен на горючее, обновляемых в режиме реального времени, в локальной базе данных.
Для каждого реализуемого продукта прописан идентификатор, марка бензина, название, следующее за маркой, и цена. Чтобы изменить цену, злоумышленнику нужно изменить только марку бензина.
Решив, какие цены он будет менять, злоумышленник должен отправить запрос соответствующему компоненту CGI, который меняет цены.
Платежный терминал
Злоумышленник, получивший доступ к АЗС, может напрямую подключиться к платежному терминалу, чтобы перехватывать информацию о платежах либо непосредственно атаковать платежный шлюз и перехватывать сами транзакции. Мы не исследовали эти возможности, поскольку у нас не было доступа к сети АЗС, однако мы уверены в необходимости изучения данного вопроса и соответствующего тестирования.
Что может сделать злоумышленник
Итак, какие же возможности получает злоумышленник, получивший контроль над системой АЗС путем эксплуатации уязвимого устройства, которое мы обнаружили? Вот несколько возможных сценариев:
- Выключение всех заправочных систем
- Вызывание утечки топлива, с риском жертв
- Изменение цен на бензин
- Обход платежного терминала для кражи денег
- Кража данных о номерных знаках машин и личных данных водителей
- Прерывание работы АЗС и требование выкупа
- Выполнение кода на блоке контроллера
- Свободный доступ ко всей сети АЗС
Насколько мы знаем, уязвимые АЗС еще не получили распоряжения отключить удаленный доступ через этот контроллер. В сентябре 2017 г. мы предупредили производителя об обнаруженных проблемах и предложили переслать ему подробную информацию, чтобы помочь закрыть уязвимости.
В статье издания Motherboard Vice упоминался недавний инцидент в Москве, когда хакер, написав вредоносный код, помог красть бензин у клиентов. Однако этот случай не имеет отношения к нашему исследованию. Мы не обнаружили в России ни одной АЗС, где был бы установлен описываемый контроллер, и на недавней презентации нашего исследования в Москве мы не сообщали ни название продукта и его производителя, ни технические подробности обнаруженных уязвимостей.
MITRE получила отчеты об уязвимостях, обнаруженных в ходе нашего исследования; их приоритизация еще продолжается. Мы также отправили подробную информацию об уязвимостях в CERT-группы Израиля и США.
CVE обнаруженных уязвимостей
Зарезервированные CVE | Описание |
---|---|
CVE-2017-14728 | Учетные данные администратора, встроенные в код |
CVE-2017-14850 | Хранимый XSS |
CVE-2017-14851 | SQL-инъекция |
CVE-2017-14852 | Незащищенный канал связи |
CVE-2017-14853 | Инъекция кода |
CVE-2017-14854 | Переполнение буфера, позволяющее удаленное исполнение кода |