大致分析
拿到摄像头第一步,拆机,看看有没有uart调试口,找一下flash芯片
小米做的是真的好,不太好拆,可参考硬核拆解
https://www.bilibili.com/video/BV1d4411G7vu?t=64
http://www.eepw.com.cn/article/201608/295287.htm
拆完可以看到,这么大的NOR Flash,一般的编程器提取不了,需要更专业的设备。
uart调试口一般都在flash的附近,仔细观看。正面没有,看看反面
这里有一个坑点,有两个Rx,Tx口。经过测试如下已经焊接上的口是真正的,而另一个接上没反应。
用SecureCRT接上,波特率选择115200
连上之后,没有做用户认证,直接就进来了。看了下开启的端口,有些怪异的地方
23端口运行着 linuxrc ,这应该是防止开启telnetd服务吧
而且没有开启554端口的rtsp服务来传输视频,可能用的别的服务吧
百度了一下运行的程序
其中24883端口的pulseaudio
是一个声音服务器,用来传输声音的
摄像头内网1883端口的mosquitto
是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,用来传输监控视频的
而且他传输视频不像普通摄像头那么简单,我把他进程杀的差不多了,手机还能看到监控视频
而54321端口运行的是小米的miio协议,可参考https://github.com/OpenMiHome/mihome-binary-protocol/blob/master/doc/PROTOCOL.md
针对这个端口python已经有攻击的库了,可参考https://github.com/rytilahti/python-miio,
难受的是现在还不支持小白摄像头,只能自己分析一下了
脱库
可以看到我们想要分析的程序在 ./usr/bin/目录下
busybox刚好自带httpd服务,默认是不开器的,我们把它打开,用来传输文件
把 ./usr 目录 和 ./lib 目录都压缩一下
1 | busybox httpd |
然后wget下来,进行解压 tar -zxvf usr.tar.gz
qemu模拟
找到了摄像头的初始化脚本,可以看到程序的启动方式/usr/bin/mosquitto -c /etc/mosquitto/mosquitto.conf -d
/usr/bin/miio_client -D
使用qemu模拟,先把mosquitt跑起来,再跑 miio_client
然后向54321发送udp数据,可以看到成功接收到
代码审计
根据一些字符串可以快速定位到代码
可以分析出传输的数据是json格式的,比如
1 | {"id":1,"method":"get_prop","params":["night_state","night_beg_time","night_end_time"]} |
而且需要认证ID
可以看到有很多配置method
进入miIo.config_router方法可以看到接收的数据都是用json_object_object_add
函数来匹配接收的,
代码写的很好,没有发现什么栈溢出漏洞
但还是能分析出来一些敏感信息,wifi的连接密码
miio的配置文件
miio的验证token
通过这个token就可以控制摄像头,先安装python-miio方便利用
1 | pip3 install python-miio |
目前这个库还不支持这款摄像头,需要自己再改写一下
1 | #-*-coding:utf8-*- |
1 | import miio |
1 | #-*-coding:utf8-*- |
后记
这个系统竟然可改写,我之前遇见过的摄像头都是不可改写系统。
修改一下初始化脚本,植入后门。这里要修改最初始的脚本,如果修改 usr/imi/start.sh
重启后会复原
1 | vi /usr/local/bin/run.sh |
重启一下,连接成功。经检测重置之后后门依然有效
而且发现了rtsp_server,再把这个服务悄悄放到初始化脚本里,这样不就随便看监控视频了吗