Радиоатака на бойлер

Радиоатака на бойлер, image #1
Пожалуйста, будьте ответственными и изучите законодательство вашей страны, прежде чем пытаться делать нечто похожее. Передача радиосигналов может очень быстро вызвать юридические проблемы, а полосу, которую я использовал в посте (868 МГц) занимать в США без лицензии незаконно. Не хочу, чтобы в ваш дом из-за меня постучались люди в штатском. Я вас предупредил!

Недавно я переехал в новую квартиру, чтобы наконец-то начать жить в одиночку. Это дало мне достаточную степень свободы, чтобы обустраивать жильё под свой вкус, но не крушить стены, ведь у меня был арендодатель (и залог!).

Обогрев квартиры показался довольно неудобным. Термостат бойлера, установленный владельцем квартиры, оказался простым радиоуправляемым устройством, использующим встроенный датчик температуры для включения и отключения отопления. Из-за этого возникло несколько проблем:

  • Датчик температуры мог замерять показания только в одной комнате квартиры, которая нагревалась неравномерно.
  • Эта комната зависела от физической близости пульта управления термостатом, что неудобно, если я нахожусь в спальне, а пульт — в гостиной или наоборот.
  • Если я забуду выключить отопление перед уходом из квартиры, то впустую потрачу кучу дорогостоящей энергии.

Я автоматизирую устройства в своей квартире с помощью Home Assistant, и хотел поступить так же с бойлером. Очевидно, для этого есть множество готовых решений, но они бы потребовали участия арендодателя и, вероятно, прихода электрика. А мне этого не хотелось!

Вместо этого я решил управлять отоплением квартиры так, чтобы не оставлять следов, при помощи термостата владельца квартиры, и, может, в процессе узнать немного нового о радиопередаче.

С чего начать?

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

Я решил, что гораздо проще будет попробовать так называемую атаку повторного воспроизведения. Для этого мне нужно клонировать сигналы, передаваемые между бойлером и термостатом, а затем выдать себя за термостат и передавать сигналы самому. Благодаря этому нам не нужно понимать протокол, мы просто воспроизведём его.

Такая методика требует большой доли удачи. От атак повторного воспроизведения достаточно легко защититься счётчиком с инкрементом, из-за которого сигналы с уже встречавшимся значением счётчика буду игнорироваться. К счастью, мой термостат этого не делал.

Первоначальная разведка

Первым делом я решил проверить, можно ли найти онлайн какую-то информацию о моей модели термостата. Я нашёл в продаже точно такую же модель с даташитом в разделе Attachments. Раздел RF Communication был именно тем, что мне нужно:

Радиоатака на бойлер, image #2

Из этого можно понять, что термостат выполняет обмен данными в диапазоне 868 МГц. Поначалу меня смутила надпись Protocol: Encrypted, но оказалось, что это не проблема.

Первой трудностью стало то, что в Интернете на удивление мало ресурсов о клонировании сигнала 868 МГц. Самые информативные ресурсы были посвящены LoRa/Meshtastic. Я нашёл кучу постов на Reddit, в которых пользователи пытались сделать то же самое с потолочными вентиляторами и дверьми гаражей, но, похоже, никаких ответов им получить не удалось…

Я подозреваю, это связано с тем, что в США нелицензированная передача на частоте 868 МГц незаконна, а пользователей из Европы было мало, но кто знает. Моя жизнь стала бы намного проще, если бы сигнал передавался на частоте 433 МГц — существует куча потребительских инструментов для передачи данных в этом диапазоне.

Изучаем сигналы

Не получив практически никакой информации, я решил, что первым делом стоит посмотреть на радиопакеты и изучить их. Раньше я читал о Software-Defined Radio, поэтому решил, что они подойдут мне лучше всего. Большинство SDR очень дорогие, поэтому я купил бюджетное RTL-SDR V4 на AliExpress. В конечном итоге, это оказалось необязательным по причинам, которые я объясню ниже.

Возможно, вы слышали о знаменитом Flipper Zero и его способности клонировать и воспроизводить сигналы. Я думал использовать его в этой ситуации, но стоит учесть, что Flipper — это НЕ SDR. Flipper очень избирателен в отношении частот, на которых он может работать. Я узнал это на своей шкуре: позаимствовал его и немного отчаялся, когда понял, что он не сработал.

После получения радио я подключил его к ноутбуку с установленным ПО SDR++ для проверки работоспособности и чтобы начать разбираться, что же передаёт мой термостат. После нескольких нажатий на кнопки термостата график ожил!

Радиоатака на бойлер, image #3

Не обращайте внимания на толстую вертикальную линию на графике — это стандартное последствие работы с очень дешёвым SDR, в моём случае она возникает на всех исследуемых частотах.

Этот шаг не особо важен, но можете попробовать воспользоваться инструментом rtl_433 tool (несмотря на название, он работает и на других частотах), чтобы проверить, не общается ли термостат по известному протоколу. Для не очень популярных устройств это может и не сработать!

Радиоатака на бойлер, image #4

Похоже, этот термостат обменивается данными по тому же протоколу, как и модель Honeywell. Атрибут demand задаёт, включён (1) или выключен (0) термостат, после чего бойлер передаёт подтверждение (предположительно для того, чтобы термостат мог проверить, находится ли бойлер в пределах его действия).

Попытаемся кричать в ответ

Теперь, когда мы понаблюдали за реальной передачей данных туда и обратно, можно попробовать отправить пакеты самостоятельно и управлять бойлером, как будто мы термостат.

Первая неудачная попытка — Challenger Dev Board на 868 МГц...
Первая неудачная попытка — Challenger Dev Board на 868 МГц...

На этом этапе я застрял на несколько месяцев. Я пытался пойти по «умному» пути, попытавшись выполнить реверс-инжиниринг и воссоздание пакетов вручную при помощи URH, а затем транслировать их через очень дешёвые микроконтроллерные платы на 868 МГц. Можно с уверенностью сказать, что это гораздо выше моих навыков. Ни одна плата не рассчитана на общение ни с кем, кроме как с точно такой же платой, а для дальнейших шагов мне потребовалось бы изучать регистры радио, чего мне не хотелось.

HackRF

Официальная плата HackRF One, которая породила множество клонов на AliExpress
Официальная плата HackRF One, которая породила множество клонов на AliExpress

После этого я решил начать забивать гвозди микроскопом: использовать полнофункциональный SDR для простого воспроизведения того же сигнала, не заботясь о его содержимом. Но купленный мной ранее дешёвый RTL-SDR поддерживал только приём, но не трансляцию. SDR, способные выполнять широковещание, обычно стоят сотни долларов.

Я сказал «обычно», потому что у одного из самых популярных SDR с функцией вещания, HackRF One(обычно стоит до 400$), было множество клонов на AliExpress в десять раз дешевле — всего за 40$.

Я сказал «было», потому что когда я начал несколько месяцев спустя писать этот пост, AliExpress удалил практически все товары, которые можно было найти по запросу «HackRF». Насколько я понимаю, их арестовывали на таможнях многих стран, которые напрягал импорт грозных хакерских инструментов, поэтому маркетплейс решил удалить все товары, а не разбираться с этим. Более новые клоны можно купить здесь, но они стали гораздо дороже…

С дешёвыми клонами опенсорсного оборудования связаны очевидные этические (а, возможно, и технические) проблемы, но я решил, что для моего маленького случая их использование допустимо. Если это в ваших силах, поддержите оригинальный проект!

Значит, как я и говорил выше, тогда необходимость в RTL-SDR отпадает? На самом деле, я думаю, что всегда неплохо иметь под рукой ещё один SDR, чтобы убедиться, что вы не засоряете другие частоты.

Кричим в ответ по-настоящему

Купив HackRF, можно использовать инструмент hackrf_transfer для записи, и что ещё важнее, для воспроизведения сигналов. Я выполняю эти команды, а затем нажимаю соответствующие кнопки на термостате, чтобы записывать сигналы в отдельные файлы:

# Устанавливаем частоту на 868,3 МГц и частоту сэмплирования на 2000000.
hackrf_transfer -r turn_off.raw -f 868300000 -s 2000000
hackrf_transfer -r turn_on.raw -f 868300000 -s 2000000

Далее мы можем попытаться выключать и включать бойлер из командной строки:

# Используем -a для включения усилителя и -x, чтобы немного увеличить коэффициент усиления.
hackrf_transfer -t turn_off.raw -f 868300000 -s 2000000 -a 1 -x 23
hackrf_transfer -t turn_on.raw -f 868300000 -s 2000000 -a 1 -x 23

После этого мы можем услышать отключение и включение физического реле внутри бойлера!

Автоматизируем всё это

Мой клон HackRF находится в распечатанном на 3D-принтере корпусе, подключённом к серверу.

HackRF подсоединён к USB-концентратору сервера Assistant. Я написал простейший веб-сервер, который всего лишь передаёт показанные выше команды в контейнер Docker.

Затем при помощи Average Sensor Plugin и конфигурации YAML я получил работающий термостат!

command_line:
  - switch:
    name: Boiler
    command_on: "curl http://docker-vm:1111/api/on"
    command_off: "curl http://docker-vm:1111/api/off"

sensor:
  - platform: average
    name: "Average Temperature"
    entities:
      - sensor.bedroom_thermostat_temperature
      - sensor.kitchen_thermostat_temperature

climate:
  - platform: generic_thermostat
  name: Boiler Thermostat
  heater: switch.boiler
  sensor.average_temperature 

К этому моменту я был доволен уже тем, что он хотя бы работает наконец, спустя столько месяцев попыток. Стоит признать, что эта система с Home Assistant довольно сырая и её определённо можно улучшить. Лучше было бы написать настоящий плагин и управлять радиосигналом напрямую, а не передавать команды в CLI. Наверно, использовать curl— это уже перебор?

Стоило ли оно того?

График Grafana, показывающий, как температуры сходятся к заданной
График Grafana, показывающий, как температуры сходятся к заданной

Я пользовался этой системой для управления обогревом квартиры с начала декабря, и у меня ни разу не возникало проблем! Стало очень удобно настраивать температуру с телефона, а созданные мной автоматизации определённо стоили того, чтобы работать над этим проектом.

У меня есть несколько простых автоматизаций, например, снижение температуры, когда я сплю, и нагрев утром перед моим пробуждением. Кроме того, обогрев отключается, когда я выхожу из дома, и включается, когда я нахожусь всего в нескольких станциях метро от дома, поэтому когда я возвращаюсь, там тепло и комфортно!

Единственное, что меня не устраивает — это необходимость использования такого мощного и универсального радио, как HackRF, для простого включения-отключения бойлера. Но я лучше буду пользоваться чем-то излишне мощным, чем тратить кучу времени, чтобы заставить менее совершенные радио выполнять мои требования.

Главное, что мне теперь тепло!

Источник

117 views·13 shares