Pull to refresh
3344.67
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

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

Level of difficultyMedium
Reading time7 min
Views4.4K
Original author: videah

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

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

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

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

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

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

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


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

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

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

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


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


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

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

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

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


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

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

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


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

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


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

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


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

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

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

▍ HackRF


Официальная плата 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
  target_sensor: sensor.average_temperature

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

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


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

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

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

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

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

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Tags:
Hubs:
+48
Comments9

Articles

Information

Website
ruvds.com
Registered
Founded
Employees
11–30 employees
Location
Россия
Representative
ruvds