Взлом «умных» счетчиков на PHDays 8: разбор конкурса MeterH3cker
В этом году конкурсная программа Positive Hack Days пополнилась соревнованием по взлому элементов системы smart grid — «MeterH3cker». В распоряжении участников был макет двух домов, по задумке организаторов солнечные батареи обеспечивали дома электроэнергией, а возникающие излишки энергии можно было продавать в общую электросеть по специальному тарифу. Задачей атакующих было любыми возможными способами нарушить нормальный процесс учета электроэнергии и повлиять на денежный баланс в биллинговой системе.
Стенд
Стенд MeterH3cker
Современные дома, оснащенные солнечными батареями, могут как потреблять электроэнергию, так и отдавать излишки генерации обратно в сеть. Эта модель и легла в основу стенда MeterH3cker.
Стенд представлял собой макет двух современных жилых домов с реальным оборудованием, в которых реализованы элементы технологии smart grid. В каждом доме были установлены контроллеры солнечной батареи, умные электросчетчики и энергопотребители. Оба дома были подключены к макету электроподстанции, на которой было установлено устройство сбора и передачи данных (УСПД); оно опрашивало счетчики и подстанционный счетчик.
Помимо этого, каждый дом был оборудован системой отопления и кондиционирования, которая находилась под общим управлением контроллера, доступного в общей сети стенда. Также возле умных домов была установлена настоящая зарядная станция для электромобилей, которая передавала в УСПД показания о своем потреблении электроэнергии для подключенного электромобиля.
Мы заложили сценарии «день» и «ночь». В режиме «день» солнечные батареи в домах вырабатывали электричество, и их счетчики крутились в обратную сторону и учитывали «потребленную» и «отданную» энергию. Каждый дом имел свой лицевой счет, баланс которого увеличивался при генерации энергии и уменьшался при потреблении, также на значения влияли тарифы, настроенные в счетчиках.
Основной задачей участников конкурса было увеличить баланс лицевого счета домов, атакуя оборудование стенда, и таким образом получить прямую финансовую выгоду от своих хакерских действий.
Для визуализации результатов мы написали собственный биллинговый сервер, который собирал данные с УСПД. Само УСПД, в свою очередь, опрашивало счетчики несколькими способами:
- счетчик в доме № 1 — по открытому вендорскому Modbus-подобному протоколу;
- счетчик в доме № 2 опрашивался устройством VR-007.3 по открытому вендорскому Modbus-подобному протоколу, а затем УСПД получало данные с веб-сервера VR-007.3 по HTTP;
- счетчик подстанции — по протоколу Modbus TCP.
Для получения реальных значений потребления энергии к тем же цепям тока и напряжения, что и атакуемые счетчики, были подключены эталонные счетчики, которые не были доступны атакующим. Биллинговый сервер напрямую опрашивал их по интерфейсу RS-485.
Для того чтобы посетители форума могли наблюдать за происходящим, рядом со стендом был установлен большой монитор, на котором в режиме реального времени выводились графики потребления электричества. График синего цвета отмечал показания с УСПД. Они менялись в зависимости от действий атакующих. График зеленого цвета демонстрировал реальные показания генерации и потребления электричества, собранные с эталонных счетчиков.
Отображение текущих значений для каждого дома: баланс лицевого счета, потребленная и отданная в сеть энергия, тариф
В сети стенда также был доступен внутренний портал для участников конкурса. Там отображались текущие значения графиков, раздел с описанием каждого элемента стенда; там же были опубликованы правила конкурса и время от времени появлялись подсказки.
Внутренний портал
Условия участия
Конкурс проходил два дня. В первый день были отборочные соревнования. Каждый участник при подключении к сети стенда получал доступ ко всему оборудованию двух домов, подстанции и зарядной станции. У участников была возможность изучить оборудование, найти уязвимости и потенциальные векторы атак. В течение дня на внутреннем портале конкурса периодически добавлялись новые подсказки, позволявшие участникам обнаружить слабые стороны оборудования стенда. Участники, достигшие успехов на стенде в первый день, были приглашены для участия в финальном турнире во второй день.
Финал представлял собой своеобразную дуэль. К стенду приглашались по два участника, у каждого из которых был свой дом. Их задача — в течение десятиминутного раунда любыми способами обмануть счетчики и сгенерировать больше энергии, чем противник — условный сосед. Выигрывал тот, у кого в конце соревнования баланс лицевого счета был больше. При этом задача осложнялась тем, что у участников был доступ к оборудованию друг друга, а значит — возможность навредить соседу и занизить его результаты.
День первый: отборочный тур
Желающих попробовать свои силы во взломе оборудования было много. Отметим, что некоторые из них серьезно подготовились к конкурсу и имели с собой необходимое программное обеспечение. В их числе были участники из Японии, которые с первых часов конкурса внимательно изучали стенд, что позволило им добиться значительных результатов во второй день.
Большой неожиданностью для нас стало участие 12-летнего любителя хакинга: несмотря на возраст, он смог сориентироваться в представленном оборудовании и продемонстрировал несколько атак.
Участники конкурса
Первые результаты мы получили к середине дня: японские исследователи объединили усилия захватили управление зарядной станцией для электромобилей и остановили зарядку электромобиля, посылая команды управления через веб-интерфейс. Чуть позже они же смогли подобрать пароль администратора контроллера солнечной батареи и отключить генерацию электроэнергии.
Юный хакер тоже не отставал от взрослых: он научился вызывать непрерывную перезагрузку УСПД, тем самым реализовал атаку «отказ в обслуживании» и нарушил опрос счетчиков.
Ближе к вечеру один из участников японской группы добился серьезных отклонений между значениями энергий на эталонных и атакуемых счетчиках, сильно увеличив значение счета. А его коллега обнаружил уязвимость в веб-интерфейсе счетчика подстанции, позволяющую читать содержимое файлов флеш-карты устройства, в одном из которых находился хеш пароля администратора. Таким образом, после успешного подбора пароля, он получил доступ к параметрам счетчика.
За час до окончания отборочного тура к стенду подключился участник по имени Олег. Несмотря на то, что у него было мало времени в запасе, он успел провести успешную атаку и попасть в турнир, который проводился на следующий день.
В итоге к концу дня все участники могли изменять показания энергии на всех имеющихся электросчетчиках и управлять различными элементами стенда — контроллерами, зарядной станцией.
Результаты атак участников на счетчики. На правом нижнем графике видно, что был изменен коэффициент трансформации счетчика, на левом нижнем — что была проведена успешная атака «отказ в обслуживании» на счетчик ПСЧ-4ТМ
День второй: турнир и финал
По результатам отчетов, присланных участниками в конце первого дня, мы отобрали семь участников, которые смогли найти и поэксплуатировать уязвимости в оборудовании стенда.
Поскольку во второй день участники во время раундов могли влиять на показания не только своих счетчиков, но и на счетчик соседа-соперника, то любая неосторожность могла повлечь за собой серьезные последствия. Так, участник Олег, проводя атаку на оборудование соседа, ошибочно увеличил счет соседу, потому что проводил атаку в момент генерации, а потом не успел «скрутить» его в другую сторону за оставшееся время раунда. В последующих поединках участники учитывали этот печальный опыт и действовали грамотно, например, выставляли максимальные значения коэффициентов своего счетчика в период генерации (режим «день») и минимальные в период потребления (режим «ночь»).
Турнирная таблица
В финале конкурса развернулась нешуточная битва. В начале раунда преимущество было за Сатору Такeкоши, который уже на первых минутах смог успешно провести атаку и сильно увеличить баланс своего счета. Второй участник — Алексей Кузнецов — также смог в начале раунда провести атаку и увеличить баланс своего счета, но в значительно меньшем объеме. Разрыв в показаниях сгенерированной энергии был 25 ГВт·ч против 5 ГВт·ч. На протяжении большей части раунда счет не менялся. Вероятно, чтобы не повторить печальный опыт первых участников, которые атаковали в неподходящее время, Алексей вел себя осторожно и отслеживал смену режимов. Во второй половине раунда ему удалось провести успешную атаку на счетчик электроподстанции и сделать отрыв от соседа минимальным, но суммарный счет все равно не позволял ему победить. На последних секундах Алексей опять атаковал свой счетчик и успешно увеличил его показания, что позволило ему вырвать победу у лидера. Таким образом, Алексей победил, увеличив свой баланс до 92 млрд у. е., а с учетом его успешной атаки на счетчик электроподстанции, его суммарный счет позволил ему безоговорочно победить.
Состояние лицевых счетов на последних секундах, после финальной атаки
Итоги
Итак, победители: 1-е место занял Алексей Кузнецов, 2-е место ушло Сатору Такeкоши, замкнул тройку Никита Ступин. Специальный приз, за 4-е место, получил юный взломщик Юрий Гришин.
За время конкурса (особенно в финальном турнире) были продемонстрированы совершенно разные атаки. Большинство участников старались проводить атаки на показания энергии, снимаемые со счетчиков, увеличить выработку энергии в момент генерации и уменьшить в момент потребления. Также в некоторых раундах участники соревнования успешно атаковали зарядную станцию для электромобиля и контроллер солнечной батареи.
Однако никто из участников не смог провести успешные атаки на УСПД и подменить собираемые данные непосредственно на нем. Потенциально эти атаки могли привести к полному контролю данных, передаваемые в биллинговый центр и увеличению своего счета на произвольное значение. За все два дня мы зафиксировали всего лишь одну подобную попытку атаки, которая, по всей видимости, завершилась неудачей.
Также никто не атаковал контроллер, управляющий системой отопления и кондиционирования. Предполагалось, что атакующий подключится к устройству и сможет управлять оборудованием, используя существующие сигналы управления. Главной сложностью для атакующих оказалось сопоставить открытые порты и название оборудования, чтобы, например, запросить информацию по протоколу FOX. Для атаки на данное оборудование не обязательно было использовать специализированное ПО. Подсказка тоже не помогла, потому что атакующие не воспользовались ею, а ведь всего-то нужно было подменить заголовок User-Agent у себя в браузере для успешного соединения.
Из других наблюдений. Во время соревнования конкурсанты задавали много уточняющих вопросов по структуре и работе стенда, а также об имеющихся устройствах. Это можно объяснить тем, что, помимо задачи «поломать» устройства, необходимо было разобраться, что делает каждое из них и как эксплуатировать его уязвимости для получения выгоды.
Разгар первого дня
Нас порадовало, что хотя наш конкурс — новичок на форуме, пришло много зрителей, которые не собирались участвовать, но интересовались работой стенда, успехами конкурсантов. Свободные пуфики перед стендом быстро закончились!
Еще один любопытный факт связан с участниками из Японии. Внутренний портал конкурса и документация устройств отечественных производителей были на русском языке, тем не менее это не стало преградой для японской команды — практических навыков хватило, чтобы продемонстрировать серию успешных атак. Однако после соревнования они признались, что это все-таки доставило им небольшие неудобства.
В целом конкурс показал, что менее чем за два дня вполне реально разобраться в современных системах учета электроэнергии и выполнить успешные атаки на них.
Разборы других конкурсов Positive Hack Days 8: