![]() |
|
![]() |
#1 | |||||||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Статья из Хабр песочницы.
Около года назад я купил камеру D-Link DCS-2121. Вот ее краткие характеристики: Камера 1 Мп + микрофон, Поддержка WiFi, Web-интерфейс для доступа к данным, Запись на SD-карту, детектор движения, Внешние логические выходы. Повесил я ее дома, подключил к zoneminder для видеонаблюдения. Также сделал «секретную» страничку на домашнем веб-сервере под паролем, чтобы домашние могли заглядывать в камеру, находясь вне дома. Одно меня беспокоило — никак нельзя понять, смотрит сейчас кто-нибудь в камеру или нет. D-Link во все свои устройства встраивает linux. Решил я на досуге поковыряться в прошивке, вдруг чего интересное найдется. Для начала скачиваем ее с сайта d-link Прошивка представляет собой обычный самораспаковывающийс я shell-скрипт с прицепленным бинарником. Весь смысл скрипта сводится к тому, чтобы отделить бинарник и распаковать его с помощью программу ddPack, которая находится на устройстве и что делает неизвестно. Предполагаем, что внутри находится cramfs, поэтому пробуем поискать ее «magic»-байты — 0x28cd3d45. perl -ln0777e 'print pos()-4 while /(\x45\x3d\xcd\x28)/g' update_DCS-2102_DCS-2121_1.06_5731.bin Получаем смещение — 1072552. С помощью dd отделяем cramfs от всего остального: dd if=update_DCS-2102_DCS-2121_1.06_5731.bin of=cramfs bs=1072552 skip=1 Проверяем: root@server:/# file cramfs cramfs: Linux Compressed ROM File System data, little endian size 5926912 version #2 sorted_dirs CRC 0x701ef55d, edition 0, 3667 blocks, 1255 files Раз все прошло удачно, то монтируем: mount -o loop,ro cramfs /mnt/tmp Теперь у нас есть возможность изучить внутренности камеры. Из прошивки становится понятно, что файловая система монтируется readonly, часть конфигурационных файлов генерируют скрипты в /tmp, куда монтируется tmpfs. SD-карта монтируется в /mnt/usb. Камера Использует lighttpd, файлы лежат в /var/www. Большинство cgi-скриптов являются символическими ссылками на один бинарный cgi — /var/www/cgi. Было решено проверить этот скрипт на так называемый semicolon injection: Цитата:
Для проверки заходим в web-интерфейс камеры в Setup -> Recording, включаем «Enable recording», выбираем «Samba Network Drive» и вводим во всех полях test, чтобы посмотреть, как камера реагирует на ошибку. Теперь попробуем в полях «Password» и «Password confirm» написать что-то навроде «test;/bin/true». Нам повезло, камера весело откликнулась Ok. Тогда пробуем вписать туда «test;/usr/sbin/telnetd» и доступ к камере открылся: Цитата:
/etc/passwd и /etc/shadow являются символическими ссылками на одноименные файлы в /tmp, следовательно их генерируют скрипты. Находим упоминания об этом в /etc/rc.d/rc.local: Цитата:
Путем нехитрых манипуляция с гуглом выясняем, что данному хэшу соответствует пароль admin... Мило. Наконец-то мы смогли зайти на нашу камеру. Цитата:
В /var/www была обнаружена следующая символическая ссылка - /var/www/sdcard -> /mnt/usb. Оказалось, что достаточно просто положить файл telnet.cgi на sd-карту (/mnt/usb/telnet.cgi): Цитата:
Т.к. web-сервер позволяет выполнять любые файлы с расширением cgi я стал думать, как это можно использовать в своих целях. Порывшись в бинарниках был найден интересный экземпляр с недвусмысленным названием - /bin/light. При запуске он выдает следующий список параметров: light [out1|out2|out3|out4|led|power|active|wps Led|rs485|ir|irupper] [on|off] Он позволяет включать-выключать светодиоды и управлять внешними выходами. Светодиодом power/active управлять особо не получилось, т.к. им управляет демон watchDog. А вот светодиод wpsLed, находящийся сзади вполне себе свободен, при его включении сзади камеры появляется приятное синее освещение. Решено, попробуем использовать его в качестве индикации того, что кто-то сейчас просматривает камеру. Раньше для доступа к картинке с камеры я использовал 1-й профиль в режиме mjpeg, доступный по адресу: /video/mjpg.cgi?profileid=1 С помощью nginx я проксировал внешнюю ссылку на этот адрес. На sd-карту было положено два файла: Первый - light.sh: Цитата:
и второй - light.cgi Цитата:
Для этой задачи был написан php-скрипт. Пусть тяжеловато, но другого способа передавать данные и одновременно дергать скрипт для поддержки индикации я не нашел. PHP код:
Теперь домашние обращаются к этому php-скрипту. Они видят картинку с камеры, ну а я вижу что в камеру в данный момент кто-то смотрит. Интересно провел время и задача решена. |
|||||||
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|