Случилось как-то, что рядом с офисом Postuf жильцы соседнего дома поставили себе шлагбаум. С парковкой в центре Москвы и так проблемы, а если еще и офисное здание неподалеку...в общем, жильцов можно понять. Но не давало покоя ощущение, что доступ к шлагбаумам могут получить далеко не только жильцы дома.
Стало интересно, кто вообще занимается установкой шлагбаумов и насколько активно. Для этого выходим из офиса на улицу и проводим разведку по открытым источникам на местности:
![Компания, установившая шлагбаум Компания, установившая шлагбаум](https://habrastorage.org/getpro/habr/upload_files/7ea/b20/b81/7eab20b8170554d8c49fdaaaa2f3bf54.png)
Переходим на сайт компании и продолжаем разведку уже в онлайне. Восклицательный знак в правом верхнем углу отправляет нас прямиком в "святая святых" любого веб-приложения - на страницу входа в админ-панель.
![Админка для "старших по объектам" Админка для "старших по объектам"](https://habrastorage.org/getpro/habr/upload_files/fe5/738/65c/fe573865cd10c7ec64c5bff412e73c49.png)
Внизу можно увидеть едва заметную ссылку, предлагающую ознакомиться с возможностями личного кабинета в тестовом режиме. Почему бы и не ознакомиться?
![Вход в личный кабинент от имени тестового аккаунта Вход в личный кабинент от имени тестового аккаунта](https://habrastorage.org/getpro/habr/upload_files/9ff/402/e1b/9ff402e1bcdf9d22fdff82989ea61c63.png)
Переходим по очень интересному URL - https://lk.amvideo-msk.ru/index.php?login=test - и попадаем в админ-панель, как нам и обещали на предыдущей странице. На открывшейся странице в глаза бросается еще один пользователь test14
. Сразу же хочется подставить test14
в "интересный" URL вместо test
:
![Вход в личный кабиент от имени скрытого тестового аккаунта! Вход в личный кабиент от имени скрытого тестового аккаунта!](https://habrastorage.org/getpro/habr/upload_files/e0b/5f2/e4d/e0b5f2e4d52b0637cd333782f0568cd7.png)
Успешно вошли от имени test14
. Данных стало чуть больше - это видно даже визуально, но не прав доступа. Походим по админке от имени этого аккаунта, посмотрим, что есть. В списке шлагбаумов всего один с названием "ТЕСТ", "Список клиентов" явно тестовый, как и "История проездов", "Добавление клиентов" недоступно, да и вообще большинство действий блокируется сообщением с текстом "Недостаточно прав".
Осталась вкладка "Управление КПУ", но и там почти все действия заблокированы, кроме просмотра стрима с камеры, встроенной в шлагбаум, и получения состояния оборудования:
![Возможности тестового аккаунта Возможности тестового аккаунта](https://habrastorage.org/getpro/habr/upload_files/5b4/a9d/7d1/5b4a9d7d11b23e791817806125f10cf4.png)
Немного странно, что эти действия были разрешены кому попало для вполне реального шлагбаума. Если можно смотреть стрим с камеры и получать состояние оборудования на одном КПУ(контрольно пропускное устройство), мешает ли что-то делать это на других? Посмотрим, как устроены запросы, которые отправляются при запросе стрима и состояния оборудования:
![Структура двух HTTP-запросов, управляющих КПУ Структура двух HTTP-запросов, управляющих КПУ](https://habrastorage.org/getpro/habr/upload_files/20c/8dd/8c4/20c8dd8c4922ce9697804be4744736f4.png)
В обоих случаях в HTTP-запросах фигурирует числовой идентификатор(!). Не остается выбора, кроме как попробовать поподставлять другие идентификаторы в запросы:
![Просмотр чужих камер и состояния КПУ Просмотр чужих камер и состояния КПУ](https://habrastorage.org/getpro/habr/upload_files/2c1/9ea/c28/2c19eac28f5048bbfd94c20a7721b765.png)
Три случайно выбраных числовых идентификатора привели к трем разным объектам! От имени тестового пользователя! На самом нижнем шлагбауме даже видно, что из-за того, что статус панели - "не в сети", одна из камер не работает.
Интересно еще то, что запрос на получение состояния оборудования возвращает статусы только в том случае, если объект с переданным идентификатором существует. Благодаря этому можно "сбрутить" все идентификаторы КПУ простым перебором чисел, которых не сильно больше 1500, судя по данным официального сайта (всего в Москве установлено 7082 шлагбаума).
Выходит, в приложении компании по установке шлагбаумов есть некоторая системная уязвимость, из-за которой не проверяется, можно ли тому, КТО запросил, отдавать то, ЧТО он запросил, а значит приключение только начинается!
Читаем тикеты тех.поддержки (можно даже создавать тикеты-задачи от имени любого пользователя, в т.ч администраторов):
![](https://habrastorage.org/getpro/habr/upload_files/606/b8d/09c/606b8d09c23396baa0c8b1ac94658e98.png)
Получаем адреса и телефонные номера шлагбаумов для их открытия:
![](https://habrastorage.org/getpro/habr/upload_files/0a1/c80/c91/0a1c80c91000d7cd797abd349b9904fa.png)
Получаем списки жильцов на объектах с персональной информацией (номера машин, телефонов, квартир):
![](https://habrastorage.org/getpro/habr/upload_files/34d/eda/d8f/34dedad8ff3834ee4d8353154e09d1de.png)
И на этом уже можно было бы остановиться - каждый, кто "успел" собрать улов из номеров шлагбаумов и номеров жильцов, уже может открывать любой шлагбаум в удобное для него время с помощью SIP-сервисов для подмены номера, которых сейчас развелось предостаточно - SipCaller, BlackVoip и тому подобные.
Но мы решили не останавливаться. Вишенкой на торте стал не сильно примечательный на первый взгляд эндпоинт редактирования информации о пользователе, при переходе на который визуально казалось, что ничего не происходит. Однако под капотом возвращались реальные данные(адрес, ник, email, фио) вместе с кодом редиректа 302 на index.php
:
![Сервер отправил "домой" вместе с запрошенными данными Сервер отправил "домой" вместе с запрошенными данными](https://habrastorage.org/getpro/habr/upload_files/799/419/dbb/799419dbb3e3976e74053363e6a730b5.png)
В этом эндпоинте, как и во всех других, передается числовой идентификатор. Пройдясь по первой тысяче чисел (0-999), удалось многое узнать о пользователях данной системы - как развивалась схема имен с ростом компании, когда примерно никнеймы в виде телефонного номера начали вытеснять текстовые и даже то, как в некоторых случаях по никнейму можно определить адрес. Но самым важным обнаружением стал пользователь с ником test30
.
В этот момент возникло непреодолимое желание вернуться в самое начало и подставить test30
теперь уже вместо test14
в URL авторизации. Результат был выше всяких ожиданий:
![(не)Тестовый аккаунт (не)Тестовый аккаунт](https://habrastorage.org/getpro/habr/upload_files/dfa/dcd/774/dfadcd774b1d71bde28e60e34b016431.png)
Мы попали не в очередной тестовый аккаунт, а в аккаунт с повышенными (сильно повышенными) правами - в аккаунт диспетчера всей системы!
Теперь стало возможным управлять любыми шлагбаумами без SIP-телефонии как независимо, так и массово :) Присутствие шлагбаумов компании в Москве выглядит довольно обширно:
![Шлагбаумы Москвы Шлагбаумы Москвы](https://habrastorage.org/getpro/habr/upload_files/4ef/92e/bc3/4ef92ebc3ea0ae27759865fbc262ab24.png)
Есть даже шлагбаумы в других городах, но там их не много. Полученные доступы такого уровня - не важно, жилец вы конкретного дома или просто проезжаете мимо - открывают для любого желающего "режим Бога" со следующими функциями:
Скрытное открытие шлагбаумов (проезды не будут светиться в истории)
Из веб-админки
Звонком через SIP (с подмененного телефона жильца на телефон шлагбаума)
В истории не фиксируются открытия только с номеров админов, это ок?
Просмотр в реальном времени имен/телефонов/квартир проезжающих через шлагбаум
Получение видео с камер шлагбаумов
В режиме реального времени
За любой промежуток времени за последние 7 дней
Чтение тикетов службы поддержки и создание тикетов от имени любого пользователя
Получение конфиденциальной и технической информации
Geo-координаты всех шлагбаумов
Информация об аппаратуре
Внутренние SIP-номера шлагбаумов и креды авторизации в SIP
IP адреса камер и панелей управления
Логины и пароли (в основном дефолтные) прямого доступа к аппаратуре (доступной через Интернет)
К камерам
К "микротикам" по SSH
К Beward-панелям КПУ
Cписки жильцов (телефоны и имена) по адресам с номерами квартир, а также номерами и марками автомобилей
Cписок объектов
Адреса объектов
Тарифы на объектах и у пользователей
Номера телефонов КПУ на объектах
Рассылка Push-уведомлений на номера телефонов пользователей
Редактирование и просмотр пользователей
Изменение имени\телефона\email
Выдача\изъятие прав на платные действия
Открытие с мобильного приложения
Создание одноразовых заявок на проезд
Просмотр видео с КПУ
Создание новых пользователей на объектах
Создание одноразовых заявок на проезд
Просмотр созданных заявок на проезд (запланированные проезды)
Звонки диспетчерам от имени любого шлагбаума через внутреннюю SIP-систему
Перевод всей системы в аварийный режим или включение тестового режима
Блокировка открытия шлагбаума и перезагрузка оборудования
Outro
До начала исследования этой проблемы казалось, что софт для систем такого уровня поставляется строго в виде пакетных решений от производителей оборудования и не содержит самописных элементов в принципе, ведь при наличии таковых пришлось бы самостоятельно покрывать кучу разных издержек, в числе которых информационная безопасность. А для компании, у которой IT профиль не является основным, это непозволительная роскошь. Но на практике мало кто об этом заботится, что в итоге может приводить к печальным последствиям, способным поставить под угрозу само существование компании.
Вся информация о найденных уязвимостях была передана разработчикам, а уязвимости - успешно и оперативно устранены к моменту публикации статьи. В ходе исследования специалистами Postuf не было скопировано ни бита информации.
На определенных этапах исследования не покидало ощущение, что в отдельных участках этой системы уже кто-то может обитать. Очень надеемся, что разработчики проведут более глубокий аудит с привлечением надежных специалистов и исправят то, что пока не было найдено.