Как открыть 1500 шлагбаумов Москвы

Случилось как-то, что рядом с нашим офисом жильцы соседнего дома поставили себе шлагбаум. С парковкой в центре Москвы и так проблемы, а если еще и офисное здание неподалеку…в общем, жильцов можно понять. Но не давало покоя ощущение, что доступ к шлагбаумам могут получить далеко не только жильцы дома.

Стало интересно, кто вообще занимается установкой шлагбаумов и насколько активно. Для этого выходим из офиса на улицу и проводим разведку по открытым источникам на местности:

Компания, установившая шлагбаумКомпания, установившая шлагбаум

Переходим на сайт компании и продолжаем разведку уже в онлайне. Восклицательный знак в правом верхнем углу отправляет нас прямиком в «святая святых» любого веб-приложения — на страницу входа в админ-панель.

Админка для Админка для «старших по объектам»

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

Вход в личный кабинент от имени тестового аккаунтаВход в личный кабинент от имени тестового аккаунта

Переходим по очень интересному URL — https://lk.amvideo-msk.ru/index.php? login=test — и попадаем в админ-панель, как нам и обещали на предыдущей странице. На открывшейся странице в глаза бросается еще один пользователь test14. Сразу же хочется подставить test14 в «интересный» URL вместо test:

Вход в личный кабиент от имени скрытого тестового аккаунта!Вход в личный кабиент от имени скрытого тестового аккаунта!

Успешно вошли от имени test14. Данных стало чуть больше — это видно даже визуально, но не прав доступа. Походим по админке от имени этого аккаунта, посмотрим, что есть. В списке шлагбаумов всего один с названием «ТЕСТ», «Список клиентов» явно тестовый, как и «История проездов», «Добавление клиентов» недоступно, да и вообще большинство действий блокируется сообщением с текстом «Недостаточно прав».

Осталась вкладка «Управление КПУ», но и там почти все действия заблокированы, кроме просмотра стрима с камеры, встроенной в шлагбаум, и получения состояния оборудования:

Возможности тестового аккаунтаВозможности тестового аккаунта

Немного странно, что эти действия были разрешены кому попало для вполне реального шлагбаума. Если можно смотреть стрим с камеры и получать состояние оборудования на одном КПУ (контрольно пропускное устройство), мешает ли что-то делать это на других? Посмотрим, как устроены запросы, которые отправляются при запросе стрима и состояния оборудования:

Структура двух HTTP-запросов, управляющих КПУСтруктура двух HTTP-запросов, управляющих КПУ

В обоих случаях в HTTP-запросах фигурирует числовой идентификатор (!). Не остается выбора, кроме как попробовать поподставлять другие идентификаторы в запросы:

Просмотр чужих камер и состояния КПУПросмотр чужих камер и состояния КПУ

Три случайно выбраных числовых идентификатора привели к трем разным объектам! От имени тестового пользователя! На самом нижнем шлагбауме даже видно, что из-за того, что статус панели — «не в сети», одна из камер не работает.

Интересно еще то, что запрос на получение состояния оборудования возвращает статусы только в том случае, если объект с переданным идентификатором существует. Благодаря этому можно «сбрутить» все идентификаторы КПУ простым перебором чисел, которых не сильно больше 1500, судя по данным официального сайта (всего в Москве установлено 7082 шлагбаума).

Выходит, в приложении компании по установке шлагбаумов есть некоторая системная уязвимость, из-за которой не проверяется, можно ли тому, КТО запросил, отдавать то, ЧТО он запросил, а значит приключение только начинается!

Читаем тикеты тех.поддержки (можно даже создавать тикеты-задачи от имени любого пользователя, в т.ч администраторов):

image-loader.svg

Получаем адреса и телефонные номера шлагбаумов для их открытия:

image-loader.svg

Получаем списки жильцов на объектах с персональной информацией (номера машин, телефонов, квартир):

image-loader.svg

И на этом уже можно было бы остановиться — каждый, кто «успел» собрать улов из номеров шлагбаумов и номеров жильцов, уже может открывать любой шлагбаум в удобное для него время с помощью SIP-сервисов для подмены номера, которых сейчас развелось предостаточно — SipCaller, BlackVoip и тому подобные.

Но мы решили не останавливаться. Вишенкой на торте стал не сильно примечательный на первый взгляд эндпоинт редактирования информации о пользователе, при переходе на который визуально казалось, что ничего не происходит. Однако под капотом возвращались реальные данные (адрес, ник, email, фио) вместе с кодом редиректа 302 на index.php:

Сервер отправил Сервер отправил «домой» вместе с запрошенными данными

В этом эндпоинте, как и во всех других, передается числовой идентификатор. Пройдясь по первой тысяче чисел (0–999), удалось многое узнать о пользователях данной системы — как развивалась схема имен с ростом компании, когда примерно никнеймы в виде телефонного номера начали вытеснять текстовые и даже то, как в некоторых случаях по никнейму можно определить адрес. Но самым важным обнаружением стал пользователь с ником test30.

В этот момент возникло непреодолимое желание вернуться в самое начало и подставить test30 теперь уже вместо test14 в URL авторизации. Результат был выше всяких ожиданий:

(не)Тестовый аккаунт(не)Тестовый аккаунт

Мы попали не в очередной тестовый аккаунт, а в аккаунт с повышенными (сильно повышенными) правами — в аккаунт диспетчера всей системы!

Теперь стало возможным управлять любыми шлагбаумами без SIP-телефонии как независимо, так и массово :) Присутствие шлагбаумов компании в Москве выглядит довольно обширно:

Шлагбаумы МосквыШлагбаумы Москвы

Есть даже шлагбаумы в других городах, но там их не много. Полученные доступы такого уровня — не важно, жилец вы конкретного дома или просто проезжаете мимо — открывают для любого желающего «режим Бога» со следующими функциями:

  1. Скрытное открытие шлагбаумов (проезды не будут светиться в истории)

    1. Из веб-админки

    2. Звонком через SIP (с подмененного телефона жильца на телефон шлагбаума)

      1. В истории не фиксируются открытия только с номеров админов, это ок?

  2. Просмотр в реальном времени имен/телефонов/квартир проезжающих через шлагбаум

  3. Получение видео с камер шлагбаумов

    1. В режиме реального времени

    2. За любой промежуток времени за последние 7 дней

  4. Чтение тикетов службы поддержки и создание тикетов от имени любого пользователя

  5. Получение конфиденциальной и технической информации

    1. Geo-координаты всех шлагбаумов

    2. Информация об аппаратуре

      1. Внутренние SIP-номера шлагбаумов и креды авторизации в SIP

      2. IP адреса камер и панелей управления

      3. Логины и пароли (в основном дефолтные) прямого доступа к аппаратуре (доступной через Интернет)

        1. К камерам

        2. К «микротикам» по SSH

        3. К Beward-панелям КПУ

    3. Cписки жильцов (телефоны и имена) по адресам с номерами квартир, а также номерами и марками автомобилей

    4. Cписок объектов

      1. Адреса объектов

      2. Тарифы на объектах и у пользователей

      3. Номера телефонов КПУ на объектах

  6. Рассылка Push-уведомлений на номера телефонов пользователей

  7. Редактирование и просмотр пользователей

    1. Изменение имени\телефона\email

    2. Выдача\изъятие прав на платные действия

      1. Открытие с мобильного приложения

      2. Создание одноразовых заявок на проезд

      3. Просмотр видео с КПУ

  8. Создание новых пользователей на объектах

  9. Создание одноразовых заявок на проезд

  10. Просмотр созданных заявок на проезд (запланированные проезды)

  11. Звонки диспетчерам от имени любого шлагбаума через внутреннюю SIP-систему

  12. Перевод всей системы в аварийный режим или включение тестового режима

  13. Блокировка открытия шлагбаума и перезагрузка оборудования

Outro

До начала исследования этой проблемы казалось, что софт для систем такого уровня поставляется строго в виде пакетных решений от производителей оборудования и не содержит самописных элементов в принципе, ведь при наличии таковых пришлось бы самостоятельно покрывать кучу разных издержек, в числе которых информационная безопасность. А для компании, у которой IT профиль не является основным, это непозволительная роскошь. Но на практике мало кто об этом заботится, что в итоге может приводить к печальным последствиям, способным поставить под угрозу само существование компании.

Вся информация о найденных уязвимостях была передана разработчикам, а уязвимости — успешно и оперативно устранены к моменту публикации статьи. В ходе исследования не было скопировано ни бита информации.

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

© Habrahabr.ru