Реверснули сигналізацію заради Home Assistant
У мене вдома звичайна GSM-сигналізація. Не Ajax і не якась модна історія, простий пульт від постачальника послуг. Керується через хмару: є застосунок, ставиш і знімаєш з охорони. Проблема в тому, шо той застосунок треба щоразу відкривати, або вводити код на панелі, де клавіатура час від часу підзаліпає.
Захотілось, щоб воно саме ставилось, коли всі вийшли з хати, і само знімалось, коли хтось зайшов.
Пошукав можливості інтеграції. Ні відкритого API, ні згадки на сайті виробника, ба більше — конкретно мою модель він уже й не підтримує. Або міняти залізо на щось просунуте, або розбиратися з тим, шо є.
Грошей шкода, а вдома вже стоїть Home Assistant і поряд Claude Code з токенами. Ну то чом би не спробувати.
Перше, шо зробили: завернули трафік застосунку через проксі, подивитись, як воно говорить з хмарою. В мене openwrt на роутері, агент поставив туди якусь приблуду і побачив весь трафік.
І тут перший сюрприз: усе їде по звичайному HTTP, без TLS. Тобто трафік керування охоронною системою читається в тій самій мережі голими руками. Для охоронного продукту це трохи занадто відкрито, але я не шарю — може всі так роблять 🙂
Тіло самої команди все ж було зашифроване, тому дістали APK і декомпілювали. На Android майже все на Java, тому це доволі просто: розбираєш dex і читаєш логіку. Всередині знайшовся ГОСТ 28147-89 (це стандарт шифрування) з нестандартними S-box (це таблиці заміни: шифр підставляє одні значення замість інших), захардкодженими прямо в застосунку.
Тобто безпека тримається на тому, шо ключ заховано в клієнті. Хто ж міг подумати, шо код можна побачити?
Відтворили шифр, креди знаємо, скрафтили команду на постановку, відправили. Хмара відповідає OK, але панель мовчить і нічого не робить. Payload валідний, дешифрується коректно, помилки ніде немає. Тут би я здався, але агенти не здаються.
Розгадка знайшлась, коли почали звіряти свій трафік і живий трафік застосунку. Виявилось, шо команда це не один запит, а два: спершу ping за одноразовим токеном сесії (він живе хвилин десять), і вже той токен треба покласти в наступний запит. А байти, куди запихали ідентифікатор панелі, насправді чекали на токен. Обидва варіанти дешифруються однаково валідно, тому вгадати наперед було неможливо.
Ще був код активації, з якого робиться ключ: у відкритому вигляді він не передається. Довелось брутфорсити його з перехопленого запиту, відсіюючи варіанти по контрольній сумі. Кілька хвилин, і ключ підібрано. Дуже добре, що він виявився коротким і M1 навіть не напрягся.
Там був смішний момент, ось скрін (це з каналу, де планую викладати смішні діалоги і відповіді агентів, підписуйтесь теж)
В цілому воно зараз працює. Панель під'єднана до Home Assistant, ставлю і знімаю з телефона, приходять нотифікації про втрату живлення і тд.
Але прикол в тому, що тепер я повернувся туди, з чого починав. Інтеграція є, а от як її безпечно автоматизувати — досі питання. Думав ловити телефон у домашній Wi-Fi і по цьому знімати охорону. Але телефон може сісти, Wi-Fi глюкнути, а ціна помилки тут не просто "ой": приїде наряд, і далі ти пояснюєш людям з табельною зброєю, шо тривога хибна.
Тому автоматику поки поставив на паузу. Шукаю гарні варіанти, щоб було просто і безпечно. Може ви знаєте? Напишіть в коменти.
Post #692
2.39K
- 👍 28
- ❤ 9
- 🔥 2