Pull to refresh

Burn-in рутовый шелл в IP-камерах Vesta и не только

Information Security
Так получилось, что передо мной встала задача записывать и хранить видео с IP-камер. Были закуплены и смонтированы камеры Vesta VC-6206 IR без представления архитектуры информационной системы на их основе. Совсем короткий период эксплуатации показал, что камеры имеют свойство зависать и неплохо бы их перезагружать периодически. nmap показывал, что у камеры доступен только telnet, http и rtsp. Ребутать камеру телнетом по крону показалось мне неплохим решением, но рутовый пароль техподдержка дать отказалась.

Коротко о применении камер


В планах заказчика было подружить эти камеры с zoneminder на линуксовом сервере, но zoneminder поддерживает RTSP плоховато, через внешние фильтры слишком обильно расходует shared memory (при разрешении-то в 1920*1080). Саппорт сообщал, что никак не поддерживает работу с линуксом. В итоге было решено писать видео с помощью cvlc порциями по 10 минут с небольшим нахлёстом. Всё отлично, видео пишется, CPU не загружен совсем — поток итак прилетает в H264 и перекодировать не нужно, но вот только зависает часто.

Власти скрывают


Даже андроид и айфон не дают пользователю под рутовые привилегии, но в моем случае полный доступ был обоснованно необходим. Тот факт, что доступ через телнет всегда открыт и поддержка не говорит пароль, заставляет задуматься. Я скачал прошивку, распаковал zip, которым она являлась, увидел cramfs-образа внутри:
# file VC-6206_V4.00.R10.20130129-WiFi.bin
VC-6206_V4.00.R10.20130129-WiFi.bin: Zip archive data, at least v2.0 to extract
# unzip VC-6206_V4.00.R10.20130129-WiFi.bin
Archive: VC-6206_V4.00.R10.20130129-WiFi.bin
inflating: Install
inflating: web-x.cramfs.img
inflating: custom-x.cramfs.img
inflating: user-x.cramfs.img
inflating: logo-x.cramfs.img
inflating: romfs-x.cramfs.img
inflating: InstallDesc

На вкус действительно как cramfs:
# file web-x.cramfs.img
web-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, Standalone Program (gzip), 1310656 bytes, Tue Jan 29 12:50:53 2013, Load Address: 0x023E0000, Entry Point: 0x02520000, Header CRC: 0xD2BAE056, Data CRC: 0x29F4363A

Я попытался примонтировать эти образы, но потерпел неудачу:
# mount -o loop -t cramfs romfs-x.cramfs.img /mnt
mount: wrong fs type, bad option, bad superblock on /dev/loop5,
missing codepage or helper program, or other error
In some cases useful info is found in syslog — try
dmesg | tail or so
root@server:~/VC-6206_V4.00.R10.20130129-WiFi# dmesg | tail -3
[ 168.201350] fuse init (API version 7.13)
[ 171.240014] eth0: no IPv6 routers present
[48915.272594] cramfs: wrong magic

Благодаря хабраюзеру philpirj и его посту, жить стало лучше, жить стало веселей:
for i in *.img ; do mkdir -p /mnt/fw/`basename $i .img` ; dd if=$i of=$i.cut bs=8 skip=8 ; mount -o loop -t cramfs $i.cut /mnt/fw/`basename $i .img` ; done

В образе самой системы (romfs-x.cramfs.img) я первым делом обратил внимание на упакованный UPX-ом telnetd. Распаковал его, сделал на него strings, но не нашёл там захардкоженных паролей и потерял к нему интерес.
Нашёлся вот такой /etc/passwd:
root:absxcfbgXtb3o:0:0:root:/:/bin/sh

Удобно. John The Ripper из пакета в дебиане перебирал DES128 со скоростью всего лишь 1800K c/s, после пересборки его с OpenMP и sse2 стало 6300K c/s. К концу дня john закончил и у меня появился рутовый пароль, который подходит ко всем камерам с такой прошивкой и зашит жёстко в неё.

Успех


Пароль подошёл, конечно же:
root@server:/mnt/cramfs/user-x.cramfs# telnet 192.168.1.11
Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is '^]'.

LocalHost login: root
Password:
# cat /proc/cpuinfo
Processor: ARM926EJ-S rev 5 (v5l)
BogoMIPS: 148.27
Features: swp half thumb fastmult edsp java
CPU implementer: 0x41
CPU architecture: 5TEJ
CPU variant: 0x0
CPU part: 0x926
CPU revision: 5
Cache type: write-back
Cache clean: cp15 c7 ops
Cache lockdown: format C
Cache format: Harvard
I size: 16384
I assoc: 4
I line length: 32
I sets: 128
D size: 8192
D assoc: 4
D line length: 32
D sets: 64

Hardware:
Revision: 3650000
Serial: 0000000000000000
# ps w
PID Uid VSZ Stat Command
1 root 3728 S init
2 root SW [posix_cpu_timer]
3 root SW [softirq-high/0]
4 root SW [softirq-timer/0]
5 root SW [softirq-net-tx/]
6 root SW [softirq-net-rx/]
7 root SW [softirq-block/0]
8 root SW [softirq-tasklet]
9 root SW [softirq-hrtimer]
10 root SW [softirq-rcu/0]
11 root SW< [desched/0]
12 root SW< [events/0]
13 root SW< [khelper]
14 root SW< [kthread]
26 root SW< [kblockd/0]
27 root SW< [kseriod]
36 root SW< [khubd]
93 root SW [pdflush]
94 root SW [pdflush]
95 root SW< [kswapd0]
96 root SW< [aio/0]
97 root SW< [cifsoplockd]
98 root SW< [cifsdnotifyd]
715 root SW [mtdblockd]
750 root SW< [kmmcd]
797 root SWN [jffs2_gcd_mtd7]
822 root 1576 S /sbin/syshelper 25
826 root 3732 S /sbin/telnetd
828 root 2744 S /utils/upgraded
829 root 3516 S /sbin/searchIp
922 root 103628 S /usr/sbin/fvideoencoder -i 2 -s 6 -d 0 -o 1 -h 2 -g 2 -l 81 -t 8 -j 1 -a 3 -b 40
923 root 11596 S /usr/sbin/a1ewtest
938 root 12772 S wlandaemon
943 root 3728 S /bin/sh /usr/etc/dup_app.sh
945 root 1396 S dupc /usr/bin/Sofia
946 root 372884 S /usr/bin/Sofia
1137 root 3732 S -sh
1139 root 3732 R ps w
# cat /mnt/mtd/Config/Account1
{
«Groups»: [
{
«AuthorityList»: [
«ShutDown»,
«ChannelTitle»,
«RecordConfig»,
«Backup»,
«StorageManager»,
«Account»,
«SysInfo»,
«QueryLog»,
«DelLog»,
«SysUpgrade»,
«AutoMaintain»,
«GeneralConfig»,
«EncodeConfig»,
«CommConfig»,
«NetConfig»,
«AlarmConfig»,
«VideoConfig»,
«PtzConfig»,
«PTZControl»,
«DefaultConfig»,
«Talk_01»,
«Monitor_01»,
«Replay_01»
],
«Memo»: «administrator group»,
«Name»: «admin»
},
{
«AuthorityList»: [ «Monitor_01», «Replay_01» ],
«Memo»: «user group»,
«Name»: «user»
}
],
«Users»: [
{
«AuthorityList»: [
«ShutDown»,
«ChannelTitle»,
«RecordConfig»,
«Backup»,
«StorageManager»,
«Account»,
«SysInfo»,
«QueryLog»,
«DelLog»,
«SysUpgrade»,
«AutoMaintain»,
«GeneralConfig»,
«EncodeConfig»,
«CommConfig»,
«NetConfig»,
«AlarmConfig»,
«VideoConfig»,
«PtzConfig»,
«PTZControl»,
«DefaultConfig»,
«Talk_01»,
«Monitor_01»,
«Replay_01»
],
«Group»: «admin»,
«Memo»: «admin 's account»,
«Name»: «admin»,
«Password»: «QyZfVmgd»,
«Reserved»: true,
«Sharable»: true
},
{
«AuthorityList»: [ «Monitor_01», «Replay_01» ],
«Group»: «user»,
«Memo»: «guest 's account»,
«Name»: «guest»,
«Password»: «tlJwpbo6»,
«Reserved»: true,
«Sharable»: true
},
{
«AuthorityList»: [ «Monitor_01» ],
«Group»: «user»,
«Memo»: «default account»,
«Name»: «default»,
«Password»: «OxhlwSG8»,
«Reserved»: false,
«Sharable»: false
}
]
}
#


Распространение


Сначала рассчитывал по-быстрому нагуглить что-нибудь по версии прошивки и узнал, что такая же прошивка используется в IP-камерах Feng по меньшей мере. Судя по тому, что в прошивке есть куча модулей под разные камеры и поддержка wifi, эта прошивка общая на несколько моделей. Добравшись уже изнутри камеры до конфига, я загуглил хэши дефолтных паролей паролей и нашёл пост на форуме третьего производителя, где какой-то парень шатает такие же или похожие камеры через отверстие в вебинтерфейсе. У меня с относительными путями ничего не получилось, но похоже это просто пофиксили. Ещё бы, ведь пост оставлен на форуме производителя.

P.S. Этот пост не претендует на статус серьёзного исследования, в нём я просто рассказываю как я решаю практическую для меня задачу. Я посчитал, что пост будет интересен хабрачитателям как посты вроде этого. Расшифрованный пароль доступен по этой ссылке. (Каждый раз смешно как в первый раз. На самом деле перебор действительно не займёт много времени, пароль простой)
Tags:Vestarootbackdoorfengtelnetip-камера
Hubs: Information Security
Total votes 73: ↑64 and ↓9 +55
Views53.8K

Comments 29

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

Top of the last 24 hours