Сим-сим откройся или реверс инжиниринг умного домофона

После прочтения поста Krupnikas возникла мысль разобраться с mitmproxy и посмотреть как устроен бэкенд ежедневно используемых мобильных приложений. Выбор пал на приложение домофон. После авторизации оно позволяет открывать двери и отвечать на видеозвонки. Что из этого вышло и какие дырки мне удалось найти расскажу под катом.



Настройка прокси


Для анализа трафика часто применяется подход называемый человек посередине (man in the middle). Он состоит в том, что при подключении к локальной сети трафик с анализируемого устройства сначала идет на компьютер, на котором он расшифровывается и анализируется, а затем зашифровывается обратно и отправляется на сервер. Для расшифровки трафика наиболее популярной является программа mitmproxy. Установка mitmproxy не составила больших проблем.

Для просмотра трафика с мобильного устройства нужно подключиться к домашнему wifi с телефона и компьютера. На комп установить mitmproxy и запустить. На телефоне в настройках wifi установить локальный адрес и порт компа как прокси сервер. Далее зайти с телефона на mitm.it и установить сертификат дающий возможность расшифровки https запросов. После этих шагов запросы из браузера стали видны. Ура! Однако следующим шагом меня ждало разочарование:


Поиск в гугле привел к открытому issue на гитхабе. Оказалось, что, начиная с API Level 24, приложения больше не доверяют пользовательским сертификатам. К счастью это можно обойти если разархивировать apk и добавить в AndroidManifest.xml следующий конфиг:

<network-security-config>  
     <debug-overrides>  
          <trust-anchors>  
               <!-- Trust preinstalled CAs -->  
               <certificates src="system" />  
               <!-- Additionally trust user added CAs -->  
               <certificates src="user" />  
          </trust-anchors>  
     </debug-overrides>  
</network-security-config>

Более того, на гитхабе есть готовый скрипт который делает это автоматом. Итак, скачиваем apk, патчим скриптом, ставим командой adb install и вуаля все работает.

Анализ трафика


Видим, что запросы выполняются на адреса вида:

https://{intercom-company-url}/api/

В заголовке передаются два параметра:
'api-version': '2',
'authorization':  'Bearer your.jwt.token’

Первый параметр — это версия api, а второй — токен авторизации. Для авторизации используется json web token состоящий из трех частей: заголовок, полезная нагрузка (payload) и подпись.
Декодировав его с помощью команды:

pyjwt decode --no-verify your.jwt.token

увидим, что в payload содержатся account_id и exp. Поле exp соответствует времени создания токена, что позволяет генерить токены для разных девайсов с одного аккаунта.

Наиболее интересными для нас являются запросы на получение списка доступных домофонов и открытие дверей. При отправке запроса (я использовал python и библиотеку requests) к

https://{intercom-company-url}/api/customers/properties/{account_id}/intercoms 

Получаем json содержащий список домофонов c полями:

[
    {
        'id': ID,
        'mode': MODE, 
        'sip_account': {'ex_user': USER_ID, 'proxy': PROXY,  'password': PSWD}, 
        'video': [{'quality': 'low', 'source': 'rtsp://LINK }]
    }
]

В json id — идентификатор домофона, mode — какую дверь можно открыть (возможные значения one_door, left_door, right_door), sip аккаунт и ссылка на видео трансляцию. Ого!

С помощью протокола установления сеанса (session initiation protocol, sip) осуществляются видео звонки через домофон. В поле sip_account нам пришли id'шники и пароли домофонов к которым есть доступ у нашего аккаунта. Позвонить на них всё же не получится так как они находятся во внутренней сети. А вот поле видео — это интересно. В нем содержится внешняя ссылка на трансляцию видео с камеры. Достаточно открыть vlc, скопировать ссылку и можно круглосуточно смотреть в камеру домофона. Не хорошо такими ссылками разбрасываться!

Далее разберёмся как открыть дверь. При нажатии на кнопку открытия дверей приложение посылает get-запрос:

https://{intercom-company-url}/api/customers/intercoms/{intercom_id}/unlock?door=left_door&id={intercom_id}

Оказалось, что наличие или отсутствие параметра id ни на что не влияет, а вот door позволяет в случае домофона с двумя дверьми открывать не только свою, но и соседнюю дверь по выбору.

Сим-сим откройся!


Разобравшись с api, я решил сделать что-то полезное. В результате получилось приложение под Андроид, которое распознает голосовые команды, и при распознавании заранее заданных команд вроде «сим-сим откройся» отправляет запрос на открытие соответствующей двери.

Выводы


Умный домофон — это хорошо, но безопасный и умный домофон ещё лучше.

Средняя зарплата в IT

113 750 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 5 830 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 2

    –2
    До пользователей Хабра добрался mitmproxy, но не добралось понимание, что такое хакгинг.
    А именно это и происходит, когда вы пересобираете apk, если что.
    По поводу всех возможных ответственностей не буду растекаться мысью по древу, есть отличная статья.
    Ответы юриста: как избежать ответственности за поиск уязвимостей

    Этичный хакинг подразумевает извещение владельца «дыры», и дает ему (владельцу) время на устранение (обычно от 30 до 45 дней), даже если нет программы багбаунти и найденная уязвимость под нее не попадает.
    Примеров правильных статей кстати достаточно много прямо здесь.
    А так то конечно все можно попробовать на зуб )
    Ave novie-nostra ales. Если один человек построил - другой завсегда разобрать может....(*Формула Любви)
    image
      0

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

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

      Самое читаемое