Я Грэг Хеффнер, и это разговор о том, как голливудский хакер использует камеры наблюдения. Некоторые из вас могут знать или не знать, что когда впервые была опубликована моя работа по этой теме, на интернет-портале Reuters об этом появилась статья.
Для меня как для спикера это было действительно здорово. Но проблема заключалась в том, что в статье решили подчеркнуть, что я работал для конкретного учреждения с трёхбуквенным названием, о котором в прессе было совсем немного заметок в последнее время. Причём они зашли так далеко, что утверждали, будто бы на BlackHat я презентовал свою работу, выполненную для этого трёхбуквенного агентства. Эта публикация привела к некоторым очень интересным телефонным звонкам от моего бывшего работодателя.
К счастью у нас есть люди, которые отвечают на мои телефонные звонки, так что в основном кричали на них, а не на меня, но мне всё равно пришлось успокаивать людей и, в конце в концов, я смог убедить бывшего работодателя, что иногда люди в интернете тоже бывают неправы.
Поэтому, чтобы быть предельно ясным, объясню — сегодняшний разговор не о любой работе, которую я когда-либо делал для бывших работодателей, а о том, что я делаю для своего нынешнего работодателя. Я работаю в качестве штатного аналитика уязвимостей компании Tactical Network Solutions, я также преподаю на курсах по эксплуатации встроенных устройств и время от времени балуюсь взломом беспроводных устройств.
Сегодня я расскажу о безопасности камер наблюдения, вернее, об отсутствии этой безопасности. В начале прошлого, 2011 года, я начал изучать вопрос безопасности прошивки камер, подключённых к сети наблюдения, и обнаружил много интересных вещей.
Отброшу в сторону угрозу «нулевого дня», я поговорю о ней, когда до неё доберусь, сначала я продемонстрирую вам, как в стиле настоящего голливудского хакера можно воспользоваться обнаруженными мною уязвимостями.
Итак, когда я начал изучать камеры наблюдения, а надо сказать, что я изучил множество встроенных устройств, но не камеры, то я захотел начать с чего-то простого, что наверняка гарантировало бы мне победу. Я выбрал D-Link, потому что они никогда не разочаровывают.
Я остановил свой выбор на модели DCS-7410 стоимостью около $900, это одна из самых дорогих наружных всепогодных камер наблюдения D-Link, работающая в дневном и ночном режимах. Как и остальные камеры, о которых мы сегодня будем говорить, она имеет административный интерфейс и поддерживает доступ видеопотока через интернет к веб-серверу, а также питается через сеть (PoE). Это делает её очень привлекательной целью для злоумышленника
Конкретно эта камера использует Lighttpd II — веб-сервер с открытым исходным кодом, который не часто применяется со встраиваемыми устройствами. Разработчики создали вменяемую конфигурацию и правила, ограничивающие доступ к тому, к чему можно добраться через веб-сервер.
На следующем слайде вы видите, что если вы хотите получить что-то в административном каталоге cgi/admin, нужно обладать правами администратора. Если вы хотите получить что-нибудь в директории видео, вы можете быть любым пользователем, но должны пройти авторизацию. У них имеются записи и правила входа для каждой отдельной директории в веб-интерфейсе, кроме директории cgi-bin.
Большинство cgi-скриптов камеры расположены в защищенном каталоге cgi. Незащищенный cgi-bin каталог содержит только один файл, rtpd.cgi, который является скриптом оболочки bash, используемым для запуска и остановки транспортного протокола RTP камеры в режиме реального времени.
Однако rtpd.cgi скрипт имеет серьезный изъян. Он анализирует параметры запроса путем замены всех амперсандов & в строке $QUERY_STRING на пробелы, а затем получает результат использованием функции eval:
Так что если вы хотите просто остановить камеру, достаточно отправить запрос: rtpd.cgi?action=stop. При использовании по назначению следующий запрос HTTP приведет к изменению имени ?action, значение которого будет установлено в положение «start»:
$ wget http://192.168.1.101/cgi-bin/rtpd.cgi?action=start
Но поскольку данные в $query_string исполняются вслепую методом eval, злоумышленник может выполнить любую команду, просто указав ее как часть параметров http GET:
$ wget http://192.168.1.101/cgi-bin/rtpd.cgi?reboot
Таким образом, хакер сможет перезагрузить камеру. Мне на самом деле было трудно категоризировать эту уязвимость, потому что это даже не инъекция команд, мы ничего не вводим, а просто позволяем программе выполняться с другими параметрами. Я назвал эту уязвимость «Рон Бургунди», потому что она будет выполнять буквально всё, что вы введёте в строке запроса.
Злоумышленник может использовать эту уязвимость для получения обычного пароля администратора камеры из NVRAM. Следующая команда выполняется скриптом запуска камеры после перезагрузки и отправляет вашему браузеру ответ такого вида:
Теперь у вас есть не только root-доступ, ведь получив пароль, вы становитесь ещё и администратором, поэтому можете делать с камерой и видеозаписями всё что угодно.
Как выясняется, D-link, как и многие производители, действительно любят повторно использовать код, устанавливая одинаковую прошивку, и это имеет место во многих их продуктах. Но это влияет не только на продукцию D-link, потому что подобная практика используется компанией Trendnet и некоторыми другими «небрендовыми» производителями подобных устройств. Сейчас широко распространено повторное использование кода как среди производителей одного бренда, так и между разными брендами. Эта уязвимость содержится в прошивках множества моделей камер, которые проиндексированы на ресурсе коллекций компьютерной уязвимости Shodan Dork.
Эта уязвимость может показаться знакомой некоторым людям, и это вероятно потому, что после моего выступления по этому поводу Core Security установил для этой продукции индекс уязвимости CVE-2013-1599, указав, что она присутствует только в устройствах D-link, не упомянув ни одного другого производителя, использующего в своих устройствах такую же прошивку. Даже если кто-то из производителей исправит эту ошибку в новой версии прошивки, большинство устройств останутся уязвимыми ещё года 3, потому что обычно никто не обновляет прошивку вовремя, а некоторые вообще не знают, что это такое. Как я уже сказал, продукция D-link одна из самых доступных целей для атаки, поэтому давайте рассмотрим камеры более авторитетных производителей, таких, как Cisco с моделью PVC 2300. Это IP-камера бизнес класса средней ценовой категории стоимостью $500.
В настоящее время она также имеет веб-сервер, и он обеспечивает аутентификацию, используя файл пароля в формате HTTP.
Большинство людей знакомы с этой системой – вы устанавливаете свой HTTP файл паролей, или точнее, ссылку на централизованный файл паролей в любой директории, которую хотите защитить паролем. Поэтому, если просмотреть прошивку, то веб-интерфейс каждой директории содержал файл паролей .htpasswd, кроме одной директории — oamp, расположенной по адресу /usr/local/www/oamp.
Вместо файла паролей в ней содержалась куча XML-файлов, которые служили ссылками на бинарный файл oamp.cgi. Давайте посмотрим, что делает этот cgi. Оказывается, он реализует своего рода мини-API, который полностью отделён от всего остального, что запускается в веб-интерфейсе.
Он ожидает от вас запроса на определённые действия, включая загрузку файла конфигурации, обновление файла конфигурации, загрузку файла обновления прошивки, обновление прошивки и многое другое. Разработчики были не настолько глупы, поэтому прежде чем выполнить ваш запрос, oamp.cgi проверяет, имеется ли у вас правильный действительный сеанса Session ID.
Если у вас не указан действительный идентификатор сеанса, то единственное, что он позволяет сделать – это ввести логин.
Это само по себе интересно, потому что они реализовали такую проверку аутентификации, которая больше в интерфейсе нигде не используется. Я стал разбираться, как они управляют входом, то есть логином. Они рассчитывают на то, что вы указываете имя пользователя и пароль, и больше никаких сюрпризов.
А дальше они делают два вызова функции PRO_GetStr, и я понятия не имею, на что они влияют. Но я знаю, что при первом вызове этой функции ей передаются две строки – OAMP и имя пользователя L1_usr, а при втором вызове – ещё две строки, OAMP и пароль пользователя L1_pwd.
Затем первое значение возвращается для пользователя L1 и сравнивается с именем пользователя user, L1_usr, указанном при аутентификации, и так же возвращается второе значение строки – пароль password, L1_usr, который сравнивается с паролем, введённым пользователем при входе.
Предположительно, этот логин пользователя L1 и его пароль, какие бы значения они не принимали, обеспечивают правильный вход в систему для этого интерфейса OAMP. Единственное другое место, которое я смог найти в прошивке, и которое действительно связано с логином и паролем пользователя, находится в файле конфигурации.
И эти значения жестко закодированы в устройствах, использующих при работе файл конфигурации раздела OAMP. Вы видите, что значение логина пользователя L1 установлено в строке L1_admin, а значение пароля пользователя – в строке L1_51.
И это настоящая проблема, потому что весь этот интерфейс OAMP и эти жестко запрограммированные учетные записи полностью недокументированы, поэтому никто не знает, что они там, кроме тех людей, которые потрудились заглянуть в прошивку. Конечно, администратор никогда не станет этого делать.
Но даже если бы он об этом узнал, для него нет никакого способа изменить эти значения, так как в данной камере нет никакого интерфейса администратора. Проблема жёстко закодированных секретных паролей в том, что благодаря использованию бэкдоров они ненадолго остаются в секрете.
Таким образом, мы можем использовать эти бэкдор-аккаунты для осуществления входа в систему и получения идентификатора сеанса session ID. Теперь, когда мы можем отослать этот session ID вместе с нашими запросами, мы также можем вызвать любые другие действия, поддерживаемые oamp.cgi, в том числе скачать файл конфигурации настроек.
Проблема в том, что если попытаться расшифровать его с помощью Base64, это не срабатывает, вы просто получаете кучу хлама. Это тот самый случай, когда Base64 оказывается не Base64.
Причина этого становится очевидной, когда вы смотрите на конечный код Base64 в самом двоичном файле прошивки PVC-2300 – здесь создана основа для кодирования, но при этом используется нестандартная строка ключа Base64, что выяснилось при анализе шифрования и расшифровки кода 64. К счастью, с помощью Python очень легко изменить строку ключа в модуле Python Base64 на пользовательскую строку ключа, как это показано на слайде.
Так, с помощью пары строк Python мы можем легко расшифровать файл конфигурации и превратить его в простой текст, который дает нам параметры входа под логином администратора.
Получив контроль над камерой, мы можем увидеть серверную комнату. Проблема в том, что просмотр серверных комнат действительно захватывает первые 10 секунд, но потом это становится довольно скучным занятием.
Поэтому я вернулся к коду и занялся изучением возможности загружать прошивку. Это на самом деле очень интересно, потому что вместо загрузки файла прошивки на устройство с официального сайта можно указать свой URL-адрес, устройство перейдёт по этому адресу и загрузит то, что предположительно считает прошивкой.
Функция system2 просто генерирует команду из строки форматирования и url перед вызовом системной функции libc, что позволяет злоумышленнику вводить произвольные команды оболочки через параметр url. Команда злоумышленника будет выполнена с правами суперпользователя, и поскольку проверка выполняется по значению url, её очень легко обойти с помощью такого скрипта:
$ wget --header=”sessionID: 57592414”
http://192.168.1.101/oamp/System.xml?action=loadFirmware&url=https://127.0.0.1:6
5534/;reboot;
После этого происходит перезагрузка компьютера, расположенного по этому URL-адресу, и вы сможете запустить любую команду, какую только хотите.
Эта уязвимость была проверена на всех версиях прошивки двух моделей камер наблюдения Cisco — PVC-2300 и WVC-2300, аналогичной камеры с двумя антеннами. На момент написания моей статьи Shodan показал более 500 общедоступных и потенциально уязвимых IP-камер, принадлежащих отелям, серверным помещениям и инжиниринговым компаниям, разрабатывающим оборудование для Международной космической станции.
Итак, D-link и Cisco не обеспечивают защиту камер наблюдения должным образом, хотя вы знаете, что эти камеры не является для них основным видом продукции. Поэтому давайте рассмотрим бренды, специализирующиеся именно на разработке и производстве камер наблюдения. Я выбрал компанию IQ Invision, выпускающую дорогостоящие камеры высокой чёткости, такие как IQ 832n стоимостью более $1000 за штуку, что совсем не дешево.
Основная причина моего интереса заключается в том, что это те ребята, которые делают камеры, установленные в деловом комплексе, где я работаю, так что на это имелись личные причины. Итак, что же вы получаете, используя профессиональную камеру наблюдения за тысячу долларов?
По умолчанию эти камеры обеспечивают видеоизображение без проверки подлинности, и ни одно из развернутых исследований инсталляции камеры не смогло изменить этот параметр по умолчанию. В то время как административный интерфейс защищен паролем, пользовательский интерфейс предоставляет доступ к любым ресурсам камеры без аутентификации, что создаёт широкое поле для атаки.
Настройки параметров аутентификации пользователя может изменить администратор, но попробуйте угадать, сколько администраторов подключили свои камеры к интернету, не изменяя настроек по умолчанию – практически все. Однако большинству администраторов в нашем комплексе хватило ума, чтобы изменить эти настройки, поэтому я стал смотреть, что я ещё смогу сделать без аутентификации. Оказалось, что я могу свободно получить доступ к странице.
Здесь содержится целая куча параметров камеры, таких, как настройка фокусировки, которые являются не настолько интересными, как имена пользователей и пароли. Более интересен был код, размещённый за этой страницей oidtable.cgi. Если деассемблировать этот бинарный файл, то можно увидеть, что страница принимает только один параметр, grep, который используется для фильтрации результатов, возвращаемых странице oidtable.cgi.
После проверки того, что предоставленное значение параметра имеет длину меньше 32 символов, oidtable.cgi размещает это значение в командной строке и передаёт его popen:
Увиденное заставило меня изобразить «фейспалм» и побудило произвести инъекцию некоторых команд.
Вы видите, что здесь, так же как и в случае с D-Link, я могу выполнить команду PS и получить выходные данные, отправляемые обратно моему браузеру. Таким образом, я, не пройдя аутентификации, могу легко вводить произвольные команды оболочки, которые будут выполняться как root. В списках процессов видно, что в этих камерах уже установлен Netcat с возможностью ввода «тире» dash-e, поэтому я уверен, что большинство из присутствующих здесь людей смогут придумать более интересные команды для выполнения, чем список процессов. Однако моей основной целью всё же было попасть в «админку», и я придумал, как это сделать.
16:30 мин
Конференция BLACK HAT USA. Как Голливудский хакер использует камеры наблюдения. Часть 2
Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).
Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
Автор: ua-hosting