stihl не предоставил(а) никакой дополнительной информации.
Недавно я исследовал крайне необычный для меня девайс — видеодомофон с сенсорным экраном и Wi-Fi. Я разобрал его, изучил и нашел… некоторые уязвимости. Я хотел ответить на вопрос «А могут ли меня подслушивать?». Ответ мы сегодня найдем вместе.
Я привык, что домофон — это такая висящая на стене трубка, которую надо снять, когда звонят, а потом нажать кнопку с ключиком, чтобы открыть дверь. Пару раз я видел вариант с маленьким экраном, на котором не видно ровным счетом ничего: черно‑белая картинка, сильно зернистая, с плохо распознаваемыми силуэтами.
Однажды в мои руки попал не такой простецкий домофон, а навороченный: с большим цветным тачскрином и подключением по Wi-Fi. Я хотел узнать, нельзя ли его использовать для прослушивания. Забегая вперед скажу, что при определенных условиях вполне можно.
Вот как выглядело это чудо.
Для просмотра ссылки Войдиили Зарегистрируйся
На обратной стороне девайса — клеммы для подключения питания, сигнализации, звонка и Ethernet-кабеля, который по факту оказался разъемом PoE (можно питать домофон сразу от локальной сети). На торчащие провода обращать внимание не нужно: это уже мои «доработки», о них я расскажу позже.
Для просмотра ссылки Войдиили Зарегистрируйся
Включив аппарат, первым делом идем в настройки и ищем что‑нибудь на тему Telnet/SSH/FTP, но ничего полезного не обнаруживаем. Однако в веб‑интерфейсе нашлась возможность обновлять прошивку, что может пригодиться.
Выключаем домофон и идем в Google — искать обновления. К сожалению, самих файлов с прошивкой для своего домофона я не накопал, зато нашлась вендорская утилита, предназначенная для сервисных инженеров. Тулза общая для всего семейства устройств и должна упрощать настройку устройств и раскатку инфраструктуры.
Пришлось принять сложное волевое решение — разобрать девайс. В случае неудачи меня ждала покупка нового аппарата, а они недешевые. Так что ставки высоки!
Для просмотра ссылки Войдиили Зарегистрируйся
Судя по начинке, основная плата домофона — это фактически контроллер дисплея, Wi-Fi и PoE, а отдельная платка — не что иное, как съемный CPU с оперативкой и флешкой. Похоже, такая реализация удобна для обслуживания.
Для просмотра ссылки Войдиили Зарегистрируйся
Рядом с маленькой платой — странный нераспаянный разъем CN2 (на фото я к нему уже припаялся), на двух выводах которого — резисторы. Верный знак того, что это что‑то важное (например, UART-консоль). Прежде чем браться за паяльник, можно изучить поближе съемную плату, с нее вполне возможно прочитать прошивку.
Для просмотра ссылки Войдиили Зарегистрируйся
Правда, BGA я тогда запаивать обратно (реболить) не умел, поэтому сконцентрировал усилия на UART.
Для просмотра ссылки Войдиили Зарегистрируйся
Увидеть при запуске лог загрузки — это, несомненно, круто! Но еще круче увидеть строку «Hit any key to stop autoboot». Активно нажимаем Enter и попадаем в меню U-Boot. Затем набираем команду help и ищем среди доступных команд что‑то для работы с eMMC. Команда mmc read вполне сгодится. У меня уже был опыт получения дампа флешек через UART, поэтому я просто взял и адаптировал старый Для просмотра ссылки Войдиили Зарегистрируйся на Python под вывод команды.
Для просмотра ссылки Войдиили Зарегистрируйся
Дампятся такие штуки обычно крайне долго (можно научиться паять BGA за это время). Я оставил процесс на ночь, но даже этого не хватило. Поэтому я прервал чтение и поправил скрипт так, чтобы тот дампил из файловой системы только нужные мне файлы. Например, файлик /etc/shadow пригодится для брута учеток и входа на домофон по SSH (Telnet на девайсе был выключен). К сожалению, ничего набрутить мне не удалось.
Остается вариант дампить все исполняемые файлы и искать в них механизм обновления. Под подозрение попали каталоги /sbin и /usr/sbin — как содержащие наибольшее количество интересных файлов вроде xxxx-upgrade, xxxxManager.py.
Дождавшись окончания дампа каталогов, я стал искать строки с ошибками обновления — «Upgrade failed», «Error code» и все в таком духе. И файлик нашелся.
Дальше — долгий и муторный процесс изучения механизма обновления. Я запускал все причастные скрипты и исполняемые файлы на своей системе — с целью отладки — и, конечно, параллельно писал скрипт, формирующий файл с обновлением.
Если кратко, то структура прошивки выглядит так:
Для просмотра ссылки Войдиили Зарегистрируйся
Сказать, что алгоритм обновления очень серьезный, — ничего не сказать. Со стороны без знаний о структуре прошивки, даже имея под рукой сами обновления, взломать такое нереально. Но, как говорится, есть нюанс.
Суть ее вот в чем: до Для просмотра ссылки Войдиили Зарегистрируйся команда tar из BusyBox при распаковке принимала символьную ссылку, ведущую за пределы рабочей директории, а затем следовала ей — что позволяло выполнить directory traversal (обход каталога) и перезаписать произвольные файлы.
Я решил попробовать.
Для просмотра ссылки Войдиили Зарегистрируйся
Я сделал ровно так, как там и написано, только в качестве файла, который должен оказаться на устройстве, я подложил файл справки в PDF. Тестовая накатка обновления, и… я смог получить доступ к своей PDF через веб‑интерфейс.
Что ж, нужно расширять вектор, подумал я, самое время подложить свой /etc/shadow. Простые манипуляции с содержимым архива, и у нас есть доступ на устройство по SSH.
Что же это получается, если ко мне в подъезд попадет какой‑нибудь нехороший дядя, он сможет подключиться к домовой сети и закрепиться на всех местных домофонах? И да и нет.
По умолчанию для входа в веб‑интерфейс требуется ввод пароля, но это не очень серьезная преграда, когда пароль прописан во всех руководствах к устройству: 112233.
Зная пароль, можно обновить прошивку домофона и, например, через встроенный микрофон подслушивать, что происходит в квартире, — без ведома жильцов. А если к домофону подключены IP-камеры, можно будет получать и изображение с них.
В моем случае на домофоне был именно дефолтный пароль.
Хотелось сделать так, чтобы можно было играть, а не просто смотреть заставку. Поэтому пришлось изучать, как хранятся ресурсы игры, как вывести нужные картинки на экран, как обрабатывать нажатия и много чего еще. Самой крепкой занозой стал SDL2: все современные форки Doom используют SDL, а в дефолтной прошивке его не было. Ставить этот фреймворк с нуля — очень плохая затея (из которой у меня ничего не вышло).
Тем не менее процесс оказался крайне увлекательным. Я нашел форк под названием fbDoom, заставил его использовать ALSA Audio, ну и, конечно, реагировать на тапы по сенсорному экрану.
Я привык, что домофон — это такая висящая на стене трубка, которую надо снять, когда звонят, а потом нажать кнопку с ключиком, чтобы открыть дверь. Пару раз я видел вариант с маленьким экраном, на котором не видно ровным счетом ничего: черно‑белая картинка, сильно зернистая, с плохо распознаваемыми силуэтами.
Однажды в мои руки попал не такой простецкий домофон, а навороченный: с большим цветным тачскрином и подключением по Wi-Fi. Я хотел узнать, нельзя ли его использовать для прослушивания. Забегая вперед скажу, что при определенных условиях вполне можно.
Вот как выглядело это чудо.
Для просмотра ссылки Войди
На обратной стороне девайса — клеммы для подключения питания, сигнализации, звонка и Ethernet-кабеля, который по факту оказался разъемом PoE (можно питать домофон сразу от локальной сети). На торчащие провода обращать внимание не нужно: это уже мои «доработки», о них я расскажу позже.
Для просмотра ссылки Войди
Включив аппарат, первым делом идем в настройки и ищем что‑нибудь на тему Telnet/SSH/FTP, но ничего полезного не обнаруживаем. Однако в веб‑интерфейсе нашлась возможность обновлять прошивку, что может пригодиться.
Выключаем домофон и идем в Google — искать обновления. К сожалению, самих файлов с прошивкой для своего домофона я не накопал, зато нашлась вендорская утилита, предназначенная для сервисных инженеров. Тулза общая для всего семейства устройств и должна упрощать настройку устройств и раскатку инфраструктуры.
Пришлось принять сложное волевое решение — разобрать девайс. В случае неудачи меня ждала покупка нового аппарата, а они недешевые. Так что ставки высоки!
Для просмотра ссылки Войди
Судя по начинке, основная плата домофона — это фактически контроллер дисплея, Wi-Fi и PoE, а отдельная платка — не что иное, как съемный CPU с оперативкой и флешкой. Похоже, такая реализация удобна для обслуживания.
Для просмотра ссылки Войди
Рядом с маленькой платой — странный нераспаянный разъем CN2 (на фото я к нему уже припаялся), на двух выводах которого — резисторы. Верный знак того, что это что‑то важное (например, UART-консоль). Прежде чем браться за паяльник, можно изучить поближе съемную плату, с нее вполне возможно прочитать прошивку.
Для просмотра ссылки Войди
Правда, BGA я тогда запаивать обратно (реболить) не умел, поэтому сконцентрировал усилия на UART.
Для просмотра ссылки Войди
Увидеть при запуске лог загрузки — это, несомненно, круто! Но еще круче увидеть строку «Hit any key to stop autoboot». Активно нажимаем Enter и попадаем в меню U-Boot. Затем набираем команду help и ищем среди доступных команд что‑то для работы с eMMC. Команда mmc read вполне сгодится. У меня уже был опыт получения дампа флешек через UART, поэтому я просто взял и адаптировал старый Для просмотра ссылки Войди
Для просмотра ссылки Войди
Дампятся такие штуки обычно крайне долго (можно научиться паять BGA за это время). Я оставил процесс на ночь, но даже этого не хватило. Поэтому я прервал чтение и поправил скрипт так, чтобы тот дампил из файловой системы только нужные мне файлы. Например, файлик /etc/shadow пригодится для брута учеток и входа на домофон по SSH (Telnet на девайсе был выключен). К сожалению, ничего набрутить мне не удалось.
Остается вариант дампить все исполняемые файлы и искать в них механизм обновления. Под подозрение попали каталоги /sbin и /usr/sbin — как содержащие наибольшее количество интересных файлов вроде xxxx-upgrade, xxxxManager.py.
Дождавшись окончания дампа каталогов, я стал искать строки с ошибками обновления — «Upgrade failed», «Error code» и все в таком духе. И файлик нашелся.
Дальше — долгий и муторный процесс изучения механизма обновления. Я запускал все причастные скрипты и исполняемые файлы на своей системе — с целью отладки — и, конечно, параллельно писал скрипт, формирующий файл с обновлением.
Если кратко, то структура прошивки выглядит так:
- Файл .tar с uImage и uImage.dtb.
- Файл .bz2 с rootfs.
- Структура с определенным заголовком, содержащая файлы 1 и 2. Все это зашифровано захардкоженным ключом 3DES.
- Файл лицензии, сформированный на основе MAC-адреса домофона, захардкоженного массива из 16 байт под названием license number и версии прошивки.
- Архив .tar.gz с файлами 3 и 4 — это и есть файл обновления.
Для просмотра ссылки Войди
Сказать, что алгоритм обновления очень серьезный, — ничего не сказать. Со стороны без знаний о структуре прошивки, даже имея под рукой сами обновления, взломать такое нереально. Но, как говорится, есть нюанс.
Уязвимость
Изучая механизм обновления, а именно то, как принимается загружаемый через веб‑интерфейс файл, я заметил, что:- первым делом распаковывается .gz через вызов gunzip, который убирает суффикс .gz, оставляя лишь .tar, после чего передает результат в вызов следующей команды;
- вызывается команда tar -x -C /tmp/upgrade, которая принимает через stdin архив .tar, а на выходе — файл лицензии и зашифрованный файл с rootfs и uImage;
- команда tar — не самостоятельный бинарник, а симлинк на BusyBox (практически стандарт для embedded-устройств).
Суть ее вот в чем: до Для просмотра ссылки Войди
Я решил попробовать.
Для просмотра ссылки Войди
Я сделал ровно так, как там и написано, только в качестве файла, который должен оказаться на устройстве, я подложил файл справки в PDF. Тестовая накатка обновления, и… я смог получить доступ к своей PDF через веб‑интерфейс.
Что ж, нужно расширять вектор, подумал я, самое время подложить свой /etc/shadow. Простые манипуляции с содержимым архива, и у нас есть доступ на устройство по SSH.
info
На домофоне за SSH отвечает dropbear, а в его конфиге разрешена только авторизация по ключу, поэтому для получения SSH пришлось еще и патчить конфиг.Что же это получается, если ко мне в подъезд попадет какой‑нибудь нехороший дядя, он сможет подключиться к домовой сети и закрепиться на всех местных домофонах? И да и нет.
По умолчанию для входа в веб‑интерфейс требуется ввод пароля, но это не очень серьезная преграда, когда пароль прописан во всех руководствах к устройству: 112233.
Зная пароль, можно обновить прошивку домофона и, например, через встроенный микрофон подслушивать, что происходит в квартире, — без ведома жильцов. А если к домофону подключены IP-камеры, можно будет получать и изображение с них.
В моем случае на домофоне был именно дефолтный пароль.
Митигация
Есть и хорошие, и плохие новости:- Можно включать запись с микрофона, смотреть видео с подключенных IP-камер, если попасть в консоль домофона.
- Для исправления уязвимости достаточно обновить BusyBox до последней версии и не использовать дефолтный пароль.
- Производитель видеодомофонов больше не обслуживает клиентов из РФ, а выпустить обновление может только он.
- Через веб‑интерфейс можно сбросить домофон до заводских настроек, что приведет к сбросу пароля до дефолтного.
- Беспарольный SSH-доступ с чьим‑то публичным ключом, зашитым в устройство, предоставляет доступ неизвестно кому (вендору или управляющей компании).
Запускаем на домофоне Doom II
В угоду модным трендам я дополнительно решил окончательно ушатать домофон запустить Doom II на домофоне. Пришлось погружаться в тему сборки игры для не самых шустрых устройств, но главной проблемой стал сенсорный экран. Подключить клавиатуру‑то никак не получится. Нужно что‑то придумывать.Хотелось сделать так, чтобы можно было играть, а не просто смотреть заставку. Поэтому пришлось изучать, как хранятся ресурсы игры, как вывести нужные картинки на экран, как обрабатывать нажатия и много чего еще. Самой крепкой занозой стал SDL2: все современные форки Doom используют SDL, а в дефолтной прошивке его не было. Ставить этот фреймворк с нуля — очень плохая затея (из которой у меня ничего не вышло).
Тем не менее процесс оказался крайне увлекательным. Я нашел форк под названием fbDoom, заставил его использовать ALSA Audio, ну и, конечно, реагировать на тапы по сенсорному экрану.