1/3
2/3
3/3
「系统玩家」玩转小爱mini (一):获取root shell
system-player
2022年04月10日 21:19

小米小爱音箱mini,型号LX01,主控用了全志R16-J,四核cortex-a7,NAND 128MB,RAM 128MB。喇叭4欧8w,没有音腔,音质一般。

供电口用的是micro usb,可以用来fastboot烧写分区及adb。启动时没有secure boot,可以编译烧写全志的原版Tina开源linux系统(基于openwrt),作为自己的开发板使用。

拆解并连接uart ttl

底盖是用双面胶粘了一圈,需要先把底座撬开,拆下四颗螺丝,再把喇叭撬出来。后面就拧下螺丝,比较好拆了。

电路板一面有两组丝印标识TX/RX,一组电压0.9v,一组电压3.3v。使用usb-ttl连接3.3v的,如图所示,baudrate 115200。

小爱mini UART Debug port

两个硬件版本

手里有两个小爱mini,硬件上有区别,一个是18年4月生产的,用了两片音频ADC芯片AC108,以下称这个版本为1st。另一个是只用了一片AC108,而且少了散热用的金属铝板和散热贴纸,大概是为了降低成本,减配了,以下称这个版本为2nd。

小爱mini有四个mic,一个AC108芯片有四路ADC。为了AEC降噪还需要回采通道,所以猜测一片AC108的2nd版本是用了R16-J芯片的ADC。

单个AC108芯片版本

两个AC108芯片版本

uboot命令行

1st的uboot版本:

代码块
Shell
自动换行
复制代码
U-Boot 2011.09-rc1-00000-g6f728c1-dirty (Mar 31 2018 - 17:56:48) Allwinner Technology
复制成功

2nd的uboot版本:

代码块
Shell
自动换行
复制代码
U-Boot 2011.09-rc1-00000-g8396a35-dirty (Sep 20 2018 - 15:49:22) Allwinner Technology
复制成功

1st在启动时可以按任意键进入uboot命令行。 2nd在启动时可以按's&#​39;键进入(多按几次或一直按住)。

fastboot

在uboot命令行中执行fastboot_test命令,可以使用fastboot烧写分区

代码块
Shell
自动换行
复制代码
sunxi#fastboot_test
run usb fastboot
sunxi_fastboot_init
recv addr 0x41000000
send addr 0x45260410
delay time 0
usb init ok
set address 0x8
复制成功

pc中执行:

代码块
Shell
自动换行
复制代码
% fastboot erase rootfs1
% fastboot flash rootfs1 rootfs.img
复制成功

小爱mini的nand分区为:

代码块
Shell
自动换行
复制代码
--------fastboot partitions--------
-total partitions:9-
-name-        -start-       -size-      
env         : 1000000       100000      
kernel1     : 1100000       600000      
rootfs1     : 1700000       2000000     
kernel2     : 3700000       600000      
rootfs2     : 3d00000       2000000     
misc        : 5d00000       100000      
private     : 5e00000       100000      
crashlog    : 5f00000       100000      
UDISK       : 6000000       0    
复制成功

登陆shell

旧版固件直接登陆 1st的固件版本号: 1.2.10,2018年4月9号,应该是出厂固件,没更新过。 启动完成后,按回车可以直接进入root shell

代码块
Shell
自动换行
复制代码
all servers are OK
LED boot ok.

BusyBox v1.24.1 () built-in shell (ash)

  _____  _              __    __ __ ___ ___
 |     ||_| ___  ___   |  |  |  |  |   |_  | 
 | | | || ||  _|| . |  |  |__|-   -| | |_| |_
 |_|_|_||_||___||___|  |_____|__|__|___|_____|
 ----------------------------------------------
 Tina Linux (Neptune, 91)
 ----------------------------------------------

imilab trunk version 0.5.6

root@mico:/# 
复制成功

需要密码登陆

2nd的固件版本号:1.50.4,2020年12月4号。

小米在后来的固件中加了登陆密码,采用了sn+特定字符串计算md5的方式,多款小米音箱都适用。很容易被逆向出密码规则,感兴趣的可以自行搜索一下。这个特定字符串在不同版本固件中还改了几次。

代码块
Shell
自动换行
复制代码
ledserver[453]: open_light start
ledserver[453]: light_show_effect 4
all servers are OK
LED boot ok.

LX01 login: root
Password: 
BusyBox v1.24.1 () built-in shell (ash)
  _____  _              __    __ __ ___ ___
 |     ||_| ___  ___   |  |  |  |  |   |_  | 
 | | | || ||  _|| . |  |  |__|-   -| | |_| |_
 |_|_|_||_||___||___|  |_____|__|__|___|_____|
 ----------------------------------------------
      ROM Type:release / Ver:1.50.4
 ----------------------------------------------
root@LX01:~# 
复制成功

不过在最新的固件中,小爱mini为1.56.1,登陆密码改为了DSA签名算法,使用私钥加密SN+随机字符串作为登陆密码, 输入后公钥解密, 验证。这种加密方式本身还是很难被攻破的。

代码块
Shell
自动换行
复制代码
LX01 login: root
================================
pipe try (micocfg_sn)
pipe try (micocfg_channel)
file /tmp/mico_pam_magic.data empty, recreadte
c09a4a8a

try get user:magic[release]: 18***/********C09A4A8A

get user:root

user try login root
magic[release]: 18***/********C09A4A8A
password:
>>>>>>>>>password_in=30313233343536

dsa verify sign len 14:30313233343536, magic(len 22) 18***/********C09A4A8A
dsa verify sign len 7, digest(len 22) 18***/********C09A4A8A
DSA_verify err error:0D07209B:lib(13):func(114):reason(155)!

dsa verify failed
Login incorrect
LX01 login: 
复制成功

但可以另辟蹊径,先来看一则锁的故事:

代码块
clike
自动换行
复制代码
一间屋子换了一把新锁(DSA), 没有钥匙很难打开。但隔壁屋子的锁容易打开, 而且大家都知道了怎么打开。而从隔壁屋子可以进到这间屋子, 从里面可以把锁打开, 还可以把锁换掉, 甚至直接把门拆了。

后来两间屋子都被换了新锁, 从外面进不去了。  

知道屋子要经常装修(OTA), 就找到了装修公司的电话, 叫来了装修队。半途把装修队拦了下来, 说锁不要装了, 大门常打开。装修队谁的话都听, 照办了。可是监工(MISO)看装修队的施工方案有问题, 不让动工。于是找到了门卫(UBOOT), 经过门卫的同意, 装修队把屋子硬给装了(FASTBOOT), 大门常打开。

门卫也是谁的话都听, 如果不听话了, 还可以把门卫换成自己的人, 那样干什么就更方便了。  

后来还把装修公司的电话扔了, 再也叫不来装修队了(rm /bin/ota)。
复制成功

获取并修改固件

1. 分区中的固件

新的固件使用DSA签名的登陆验证,很难进入。而通过uboot切换启动分区,另一分区中如果仍为旧的验证方式,则可以进入系统。

在uboot命令行中, 通过执行命令:

代码块
Shell
自动换行
复制代码
run setargs_first boot_first
run setargs_second boot_second
复制成功

可以选择启动的分区。

进入系统后,可以将另一个rootfs分区dd出来。使用unsquashfs工具解压,修改后,用mksquashfs工具打包,再从uboot中用fastboot烧写进去。

2. ota固件

小爱mini中,通过执行matool_check_upgrade命令来检查是否需要升级,如果需要升级,则显示ota包的下载地址,否则没有显示。此外,在/tmp目录中的log日志文件中也可以看到ota请求的地址。

代码块
Shell
自动换行
复制代码
root@mico:/tmp# matool_check_upgrade 
https://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/lx01/mico_firmware_c1cac_1.56.1.bin 31458536
复制成功

获得了ota固件链接,下载后使用binwalk提取固件,同样可以使用unsquashfs/mksquaskfs/fastboot修改固件并烧写。

代码块
Shell
自动换行
复制代码
$ binwalk mico_firmware_c1cac_1.56.1.bin    

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
23944         0x5D88          uImage header, header size: 64 bytes, header CRC: 0x32556CD8, created: 1970-01-01 00:00:00, image size: 2944424 bytes, Data Address: 0x40008000, Entry Point: 0x40008000, data CRC: 0xCBE58ED2, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "ARM OpenWrt Linux-3.4.39"
24008         0x5DC8          Linux kernel ARM boot executable zImage (little-endian)
40299         0x9D6B          gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)
4195272       0x4003C8        Squashfs filesystem, little endian, version 4.0, compression:xz, size: 27150277 bytes, 2061 inodes, blocksize: 262144 bytes, created: 2021-10-28 13:55:53
复制成功

提取固件:

代码块
Shell
自动换行
复制代码
$ binwalk -e mico_firmware_c1cac_1.56.1.bin
复制成功

warning提示改变了一些symbol link,所以删掉squashfs-root和squashfs-root-0目录。

使用unsquashfs重新解压rootfs

代码块
Shell
自动换行
复制代码
$ sudo unsquashfs 4003C8.squashfs       
Parallel unsquashfs: Using 8 processors
1968 inodes (2124 blocks) to write

[==========================================================================/] 2124/2124 100%

created 1389 files
created 93 directories
created 578 symlinks
created 1 device
created 0 fifos
created 0 sockets
复制成功

得到的squashfs-root目录即为rootfs。

3. 修改固件

修改的固件中的inittab可以绕过登陆验证: 在/etc/inittab中将 ::askconsole:/bin/login 改为 ::askconsole:/bin/sh

4. 打包squashfs

代码块
Shell
自动换行
复制代码
$ sudo mksquashfs squashfs-root rootfs_mod.img -comp xz -b 256k
Parallel mksquashfs: Using 8 processors
Creating 4.0 filesystem on rootfs_mod.img, block size 262144.
[==========================================================================-] 1545/1545 100%

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 262144
        compressed data, compressed metadata, compressed fragments,
        compressed xattrs, compressed ids
        duplicates are removed
Filesystem size 26510.50 Kbytes (25.89 Mbytes)
        41.29% of uncompressed filesystem size (64198.31 Kbytes)
Inode table size 17618 bytes (17.21 Kbytes)
        24.42% of uncompressed inode table size (72145 bytes)
Directory table size 20300 bytes (19.82 Kbytes)
        43.05% of uncompressed directory table size (47149 bytes)
Number of duplicate files found 29
Number of inodes 2061
Number of files 1389
Number of fragments 74
Number of symbolic links 578
Number of device nodes 1
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 93
Number of ids (unique uids + gids) 1
Number of uids 1
        root (0)
Number of gids 1
        root (0)
复制成功

5. 使用fastboot烧写

代码块
Shell
自动换行
复制代码
$ fastboot erase rootfs1                    
Erasing 'rootfs1'                                  OKAY [  7.492s]
Finished. Total time: 7.514s


$ fastboot flash rootfs1 rootfs_mod.img 
Sending 'rootfs1' (26512 KB)                       OKAY [  1.291s]
Writing 'rootfs1'                                  OKAY [  6.057s]
Finished. Total time: 7.383s
复制成功

启动后,回车进入root shell:

代码块
Shell
自动换行
复制代码
BusyBox v1.24.1 () built-in shell (ash)

  _____  _              __    __ __ ___ ___
 |     ||_| ___  ___   |  |  |  |  |   |_  | 
 | | | || ||  _|| . |  |  |__|-   -| | |_| |_
 |_|_|_||_||___||___|  |_____|__|__|___|_____|
 ----------------------------------------------
      ROM Type:release / Ver:1.56.1
 ----------------------------------------------
root@LX01:~#
复制成功

小结

小爱音箱mini板子上留有uart调试口,可以较容易的进入root shell。小米没有对这款设备做诸多限制,可以完全作为自己的设备开发使用。

下篇中将会介绍下编译烧写全志的Tina linux(小爱mini本身也是基于Tina linux开发)。文中提到的开发工具均为linux下的,windows下的工具问题请感兴趣的同学自行搜索。

如果有问题或者想交流,可以通过以下方式联系(base64):  wx:c3lzdGVtMnBsYXllcgo=, email: c3lzdGVtLXBsYXllckBvdXRsb29rLmNvbQo=,提问前请先 学会提问 ref: 1. https://zhuanlan.zhihu.com/p/35292635 2. https://bbs.hassbian.com/forum.php?mod=viewthread&tid=11139&page=1