Хакер - «Я хотел её только настроить…» Как я искал уязвимости в IP-камерах и нашел их

nopaywall

https://t.me/nopaywall

Новостями про уязвимости в тех или иных моделях IP-камер уже сложно кого-то удивить. Регулярно появляется информация о разнообразных багах и недокументированных учетных записях (бэкдорах). Несмотря на это, многие производители до сих пор относятся к безопасности своей продукции кое-как. Об одном из таких случаев и хочу рассказать.
warning-icon.jpg

WARNING

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

Начну с предыстории. Я и мой коллега внедряли распределенную систему видеонаблюдения на несколько сотен IP-каналов. Модель камер выбрали быстро — сыграла роль привлекательная цена и приличные ТТХ. Экземпляры, взятые на тестирование, показали себя нормально, работали стабильно, без нареканий.

Поскольку камер мы планировали покупать много, то потребовалось автоматизировать их настройку. Заставить нормально работать штатную утилиту (IPCManager) я так и не смог, поэтому пришлось изобретать свой велосипед.

По задумке управление камерой будет происходить через запросы по HTTP на 80-й порт скриптом на Python с использованием библиотеки requests.

Процесс должен сводиться к простому алгоритму:

  1. Запустил скрипт.
  2. Достал из коробки камеру.
  3. Подключил.
  4. Получил оповещение о завершении перенастройки.
  5. Отключил.
  6. Подключил следующую.
  7. Далее по циклу.

В качестве оповещения об успешной перенастройке логично было бы использовать звуковой сигнал из динамика камеры. Однако заставить камеру пищать при помощи запроса по HTTP так и не получилось.

 

Собираем информацию

Я начал поиски альтернативного способа подчинить себе динамик камеры — просканировал камеры при помощи Nmap.

Уже немало... Уже немало…

С портами 80 (HTTP) и 554 (RTSP) все понятно, 1935-й порт вроде как используется приложением Flash, через которое браузер показывает видео с камеры, а вот что висит на остальных портах — пока загадка.

Мое внимание привлек открытый 23-й порт. Но вот незадача — логин и пароль от веб-интерфейса к Telnet не подходят, в интернете на этот счет ничего нет, а техподдержке поставщика пароль неизвестен. Через веб-интерфейс настроить или отключить Telnet нельзя, остается только гадать, для чего или для кого он вообще работает. Но ведь если есть Telnet, значит, должны быть и учетные данные на него. Что ж, придется искать.

Почти все манипуляции я проводил в Ubuntu desktop 16.04. Для начала я скачал прошивку камеры и начал ее изучать. Нужно заметить, что прошивки для исследуемой камеры в зависимости от версии могут иметь разное содержимое. Вот несколько примеров различий.

  1. Файлы .rootfs и .fm. Первый содержит корневую файловую систему, включая искомый etc\passwd с паролем на Telnet, второй — включает «брендированный обвес» — веб-интерфейс с логотипом и другими индивидуальными особенностями конкретного продавца (об этом позже).
  2. Файл .fm, который корневую ФС не включает.
  3. Файл .fm, внутри которого сразу корневая ФС и «обвес».

Далее попробовал определить тип файла командой file.

$ file -b -i IPCAM_BV_EW_11_E_V2.37.170715_Airlink.fm application/octet-stream; charset=binary

Для дальнейших манипуляций с файлами прошивки понадобится утилита binwalk. Забегая вперед, отмечу еще, что обязательно наличие модуля jefferson — для распаковки JFFS2.

www-icon.jpg

WWW

На странице проекта в GitHub есть вся необходимая информация по установке.

Я заглянул внутрь бинарника при помощи binwalk.

Вывод binwalk Вывод binwalk

JFFS2 — файловая система, которую часто используют на флеш-памяти.
Squashfs — специализированная сжатая файловая система, часто применяемая в роутерах, IP-камерах и прочих IoT-устройствах.

В интернете можно найти несколько способов монтирования JFFS2 и Squashfs, но проще всего распаковать их через тот же binwalk.

binwalk -Me IPCAM_BV_EW_11_E_V2.37.170715_Airlink.fm binwalk -Me IPCAM_BV_EW_11_V2.37.170715.rootfs

где

  • -e включает режим извлечения;
  • -M пытается распаковывать вложенные элементы.

В итоге получилось два каталога с содержимым прошивки. В каталоге _IPCAM_BV_EW_11_V2.37.170715.rootfs.extracted можно найти файл etc/passwd, внутри которого находится хеш типа MD5 (Unix). Брутанув этот хеш с помощью John или hashcat, можно получить искомый пароль для подключения по Telnet.

Вот пример запуска брута через hashcat:

hashcat64 -m 500 -a 0 --force usr\hashes.txt dict\worst_passwds.dict -o usr\recovered.txt

Здесь

  • -m 500 — тип хеша, который будем брутить, 500 — md5crypt / MD5(unix);
  • -a 0 — режим работы, 0 — атака по словарю;
  • --force — игнорировать предупреждения;
  • usr\hashes.txt — файл, в который я положил взламываемый хеш;
  • dict\worst_passwds.dict — словарь;
  • -o usr\recovered.txt — файл, в который будет записан восстановленный пароль.

Hashcat отработал очень быстро, так как пароль тривиален и есть в популярных словарях. Учетки на Telnet получены, но моя история только начинается…

 

Исследуем строки

Я решил продолжить свое импровизированное исследование и посмотреть на другие файлы, извлеченные из прошивки, посмотрел, что и как стартует при загрузке камеры.

Файл /squashfs-root/etc/init.d/rcS показывает, что запускается скрипт /home/bvtech/start_ipcam.sh, а этот скрипт стартует Telnet, cmdserv, reset, daemonserv и bvipcam.

Используя доступ через Telnet с правами root, глянул, как демоны слушают порты.

Вывод netstat -ltupn с камеры Вывод netstat -ltupn с камеры

Получается, что bvipcam — основное приложение, отвечает практически за всю работу камеры, в том числе веб-интерфейс, FTP, RTSP и прочее. Взглянем на него повнимательней.

Я попробовал извлечь последовательности печатных символов из бинарного файла bvipcam при помощи утилиты strings. Например, команда ниже выведет в файл strings.txtпечатные символы, которые встречаются сериями более четырех подряд.

strings -n 5 bvipcam > strings.txt

Бинарник оказался ничем не запакован, удалось достать достаточно много строк.

Часть вывода утилиты strings Часть вывода утилиты strings

Когда смотрел strings.txt, внимание привлекла эта строка:

User-Agent: www.brovotech.com/Marketing@brovotech.com

Насколько я смог понять, этот заголовок будет подставляться в запросы от камеры к сервисам DDNS.

В файлах прошивки постоянно упоминается какой-то bvtech… В путях /home/bvtech, в заголовке X-Mailer: sz.brovotech, в заголовке HTTP-сервера — Server: Brovotech в строке User-Agent. Возникает вопрос: кто же такие эти Brovotech, bvtech и www.brovotech.com?

На сайте www.brovotech.com я глянул список продукции и нашел близнеца своей камеры, которую купил в России под совершенно другим брендом.

Брат-близнец моей камеры Брат-близнец моей камеры

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

Поскольку сервер HTTP имеет вполне узнаваемый заголовок SERVER (Server: Brovotech/2.0.0), решил поискать подобные камеры через Shodan.

Поиск аналогичных камер в Shodan Поиск аналогичных камер в Shodan

Почти все найденные устройства были закрыты паролем, но оказалось, что у этого семейства камер есть QR-код, который доступен по URI /logo/qrcode.png без аутентификации.

После декодирования QR-кода выяснилось, что он в большинстве случаев содержит указание на модель камеры и ее MAC-адрес. Проанализировав данные с QR-кодов, обнаружил, что они принадлежат разным моделям камер разных брендов.

Встретились камеры нескольких российских брендов, китайские, польские, турецкие… Видимо, производитель Brovotech неплохо продает свою продукцию, и не только в России. ?

 

Анализируем трафик

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

На сайте одного из российских продавцов я нашел настоящую жемчужину — ПО для простого сброса текущего пароля без каких-либо дополнительных телодвижений. Единственное условие — нужно находиться в одном сегменте L2 с камерой. Программа называлась RSTPWD_V1.01.exe и находилась в архиве Reset_Password.rar.

Волшебная утилита, по недосмотру поставщика попавшая в открытый доступ Волшебная утилита, по недосмотру поставщика попавшая в открытый доступ

Глянул при помощи Wireshark на ее трафик…

Вот что происходит при нажатии restore password в RSTPWD Вот что происходит при нажатии restore password в RSTPWD

Оказалось, утилита общается с камерой по порту 6000, текстовым протоколом, без шифрования, а для аутентификации на камере используются логин и пароль… Захардкоженные. Недокументированные. Изменение или отключение которых невозможно.

Я поковырял эту апишку (6000 TCP), нашел кое-что интересное. Для примера привожу несколько забавных штук.

telnet IP_адрес_камеры 6000LOGIN BVT/1.0 cseq: 1 username: *** password: ***

В конце запроса нужно нажать Enter дважды.

Получаем сессионный ключ (userid), с которым будем делать дальнейшие запросы в рамках Telnet-сессии.

Вот такой запрос вернет список всех пользователей вместе с их паролями, которые были заведены на камере через веб-интерфейс. ? Не сбросит! А именно заботливо вернет. Все открытым текстом, никаких хешей!

GET_PARAMETER BVT/1.0 userid: _USERID_ cmd: 47 cmdtype: 0 chn: 0 streamidx: 0 cseq: 3

А вот этот запрос вернет SSID и ключ Wi-Fi-сети, к которой подключена камера. Удобно!

GET_PARAMETER BVT/1.0 userid: _USERID_ cmd: 19 cmdtype: 0 chn: 0 streamidx: 0 cseq: 3

Еще из полезного можно получить учетки от PPPoE, SMTP, FTP. И самое главное — вшитые учетные данные для этой апишки подходят для логина через веб-интерфейс с правами администратора.

Выше я говорил про бинарный файл bvipcam, который отвечает за взаимодействие камеры с внешним миром. Насколько я вижу, недокументированные учетные данные находятся именно в нем. Их можно обнаружить при помощи hex-редактора или той же утилиты strings. Ай да китайцы, ай да красавчики!

Проверил наличие описанных штук на своих камерах с использованием прошивок разных версий, а также на одной камере другой марки, которую предоставил коллега. Баги были обнаружены во всех случаях.

Есть основания полагать, что «болезнь» охватывает весьма широкий спектр камер Brovotech.

 

Возможности удаленного доступа

Думаешь, на этом все? Еще нет. Многие модели камер, как сейчас модно, облачные — сами соединяются и держат соединение с сервисом некоего оператора.

Использование облака особенно удобно для просмотра картинки с камеры удаленно или через мобильное приложение, так как не нужно ничего настраивать, заморачиваться с firewall или NAT на роутере и иметь белый IP.

Зачастую функция соединения с облаком включена по умолчанию, а для активации устройства достаточно просто подключить камеру к сети, зайти на сайт облачного сервиса, ввести MAC камеры, логин и пароль.

Несложно догадаться, что недокументированные учетные данные, заботливо вшитые китайцами из Brovotech, работают и тут. Можно добавлять в свой личный кабинет чужие камеры, просто перебирая MAC-адреса. А облачный сервис видеонаблюдения может даже не располагать элементарной капчей, так что технически возможно перебирать МАС и добавлять камеры скриптом.

Многие владельцы камер даже не подозревают, что камера сама может куда-то подключаться и управляться из облака. Каково?

Не стоит забывать про UPnP, который во многих случаях по умолчанию включен, равно как и на SOHO-роутерах. Это приводит к тому, что камера доступна через интернет без ведома владельца.

Я слышал достаточно историй о том, что из камеры, установленной в квартире или офисе, вдруг на окружающих обрушивалась нецензурная брань или другая непотребщина. Это называется cam prank — если поищешь эти слова на YouTube, найдешь много забавных роликов.

Осложняет дело то, что исследуемые модели камер имеют не только динамик, но и микрофон (!). Я уже не говорю, что описанные баги могут стать неплохим подспорьем для злого хацкера, который пожелает проникнуть в локальную сеть.

Конечно же, я пытался донести изложенную информацию до поставщиков. Связывался с двумя российскими компаниями, которые продают уязвимые камеры под своим брендом.

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

 

Баги в реализации FTP-сервера

На закуску еще один баг — кривая реализация сервера FTP — он отдает любой запрошенный файл. Для примера вот так можно дернуть тот же /etc/passwd.

#!/bin/bash HOST='_IP_адрес_камеры_' USER='_login_' PASSWD='_passwd_' ftp -n -v $HOST << EOT user $USER $PASSWD type binary get /etc/passwd ./passwd bye EOT

Для аутентификации подойдут пароли, заданные через веб-интерфейс, или все тот же волшебный захардкоженный.

Отмечу, что у меня этот баг воспроизводится не на всех прошивках, то есть именно такой набор команд FTP работает не всегда. Полагаю, что можно поиграть с командами FTP и добиться желаемого.

Я специально не стал раскрывать список уязвимого оборудования и давать более детальную информацию, чтобы не помогать хулиганам учинять безобразия. Моя цель — обратить внимание на проблему.

 

И что с этим делать?

Первым делом определить, относится ли камера к группе риска или нет. Одна из отличительных особенностей уязвимых камер — заголовок вида Server: Brovotech. Проверить наличие этого заголовка можно через консоль разработчика в браузере или при помощи curl.

curl -I http://192.168.0.135 HTTP/1.0 302 Moved Temporatily Server: Brovotech/2.0.0 Pragma: no-cache Cache-Control: no-cache Content-Type: text/html Location: http://192.168.0.135/cn/viewer_index.asp

А еще о возможной принадлежности камеры к уязвимому семейству можно судить по открытым портам. Повторю номера портов TCP: 21, 23, 80, 554, 1556, 1935, 6000 и 49152.

Также можно делать выводы по наличию заголовков X-Mailer: sz.brovotech — добавляется в email и User-Agent: www.brovotech.com/Marketing@brovotech.com — добавляется в HTTP-запросы самой камеры.

 

Минимизация рисков

  • Не подключать камеру к интернету напрямую.
  • Отключить UPnP на камере или роутере, если ты не планируешь использовать этот протокол.
  • Отключить функцию соединения камеры с облаком, если ты им не пользуешься.
  • Изолировать камеру на уровне сети, чтобы к ней было невозможно подключиться посторонним.
  • Изолировать камеру от локальной сети предприятия, чтобы она не могла стать плацдармом для атаки на сеть.
  • Понимать, что через уязвимости в камере злоумышленник может получить пароли от SMTP, FTP и Wi-Fi.
  • Понимать, что камера имеет целый букет уязвимостей, включая такие, о которых в этой статье не написано.
  • Понимать, что у камеры есть не только объектив, но еще и микрофон, через который тебя могут прослушивать.

Ну а продавцов уязвимых камер все же прошу обратить внимание на проблему и добиться от китайских партнеров исправлений. Хотя мне до сих пор непонятно, на кой черт в камере Telnet и захардкоженные недокументированные учетные данные.

 

Outro

Уверен, что я расковырял лишь малую часть багов и в камерах Brovotech еще очень много интересного. Ах да, то, из-за чего все затевалось, — скрипт для автоматизации настройки камер был-таки написан, а проект реализован. 

Читайте ещё больше платных статей бесплатно: https://t.me/nopaywall