小米3c虚拟服务器,小米路由器3C固件逆向与测评-新手向
小米3c虚拟服务器,小米路由器3C固件逆向与测评-新手向
本帖最后由 icqb32d3a26 于 2018-2-7 11:20 编辑
之前一直在关注i春秋论坛,觉得氛围挺好的,但一直只是处于观望的态度。最近刚好碰上一个与智能硬件的活动,自己算是一个初学者,靠着厚脸皮参加了这个活动并做了一个分享,希望会对一些志同道合的人有些帮助。后期继续更新
0x00 前期准备
硬件准备:
万用电表(用于查找uart的GND、TXD、RXD)
逻辑分析仪(主要用于观察数字信号电平变化)
usb-ttl模块(某宝有,价格在4元左右)
杜邦线若干
软件准备:
debian/ubuntu,推荐ubuntu14.04
sublime text 3
#For debian or ubuntu
sudo apt-get install binwalk
qemu
#For debian or ubuntu
sudo apt-get install qemu
0x01 明确目标
硬件拆解,了解构造
固件分析,了解执行
逻辑测试,查找缺陷
作为一个新手目前浅显的见解,如果你的目的发现代码层面上的漏洞,那么应该专注于2和3步骤,步骤1提提供的更多是用于调试的串口或者固件的获取;但如果你想以geek的方式来使用智能硬件,那么应该专注1和2。
0x02 我们有什么
- I have a 小米3C路由器
2.1_.jpg (127.54 KB, 下载次数: 98)
2018-2-7 10:47 上传
I have a 小米3C路由器固件
啊,开始漏洞分析
0x03 固件解包与概览
- 查看下我们的固件是否包含文件系统
binwalk miwifi_r3l_firmware_3032e_2.12.15.stable.bin
3.1.jpg (93.18 KB, 下载次数: 92)
2018-2-7 09:57 上传
从binwalk中获取到的信息中有
MIPS指令集的MIPS OpenWrt Linux-3.10.14
包含Squashfs文件系统
文件系统压缩方式为xz
- binwalk大显神通
binwalk本身可以根据文件魔术头来提取文件,我们只需要使用-M和-e参数
-M:递归扫描提取
-e:自动提取已经文件类型
3.2.jpg (107.38 KB, 下载次数: 92)
2018-2-7 10:06 上传
binwalk -Me miwifi_r3l_firmware_3032e_2.12.15.stable.bin
从下图输出结果,我们可以进一步确定,使用little endian(小尾格式)的MIPS。
提取后的文件会输出到_固件名称.extracted文件夹中,比如上述命令会将固件的解包内容输出到
_miwifi_r3l_firmware_3032e_2.12.15.stable.bin.extracted目录中
3.3.jpg (238.22 KB, 下载次数: 115)
2018-2-7 10:06 上传
- tree查看提取到固件目录
tree ./_miwifi_r3l_firmware_3032e_2.12.15.stable.bin.extracted -L 2
-L:显示层级为2层
3.4.jpg (51.23 KB, 下载次数: 96)
2018-2-7 10:06 上传
通过上图,我们可以看到小米路由固件包含一个linux系统,但目前我们还能确定与路由器相关的文件具体在哪一个目录。
0x04 黑盒测试
nmap端口扫描
分析登录认证机制
分析系统管理功能
对特定url进行fuzzing
0x05 白盒测试
1.登录界面,输入错误的密码,获取json响应
{“code”:401,“msg”:“not auth”}
5.1.jpg (12.71 KB, 下载次数: 96)
2018-2-7 10:14 上传
2.查找对应的处理程序或者文件
grep -n -ir “{"code":401” ./* 2>/dev/null
5.2.jpg (29.75 KB, 下载次数: 95)
2018-2-7 10:14 上传
通过grep命令,我们可以快速定位到登录失败的处理文件是位于./usr/lib/lua/luci/的dispatcher.lua,通过sublime text 3打开看一下处理登录逻辑部分的代码,位于240行左右
5.3.jpg (116.4 KB, 下载次数: 94)
2018-2-7 10:14 上传
通过分析代码结构,我们可以了解到一下几点,不同逻辑以为着不同的攻击面
登录时获取post的数据是通过luci.http.xqformvalue这个方法来获取
登录时根据是否传入nonce参数来进入不同验证逻辑
如果 nonce 不为空
调用XQSecureUtil.checkUser(user, nonce, pass)来进行登录检查
如果 nonce 为空
调用XQSecureUtil.checkPlaintextPwd(user, pass)来进行登录检查
3.我们查看一下./usr/lib/lua下的目录结构
ls -alht ./usr/lib/lua
5.4.jpg (212.86 KB, 下载次数: 92)
2018-2-7 10:14 上传
其中luci、xiaoqiang需要我们重要关注
如果你问为什么,步骤2中登录处理逻辑的dispatcher.lua就在luci目录,而xiaoqiang这一个目录不是OpenWrt中自带,那么它应该小米官方基于OpenWrt修改的,因而我们也需要重点关注。
4.具体查看luci的目录结构
tree ./usr/lib/lua/luci -L 1
5.5.jpg (50.89 KB, 下载次数: 94)
2018-2-7 10:14 上传
由上图的目录结构,我们可以看出
OpenWrt使用lua以MVC(Model、Controller、View)模式去开发路由器后台管理系统
如果我们想查看路由,我们可以查看Controller下面对应文件夹的lua文件
5.6.jpg (57.89 KB, 下载次数: 92)
2018-2-7 10:14 上传
比如我们查看web目录下index.lua,可以发现发面内容,每一个entry函数就是一个web路径映射。
5.7.jpg (249.33 KB, 下载次数: 102)
2018-2-7 10:14 上传
5.具体查看xiaoqiang目录结构
tree ./usr/lib/lua/xiaoqiang -L 1
5.8.jpg (32.6 KB, 下载次数: 99)
2018-2-7 10:14 上传
可以看到,xiaoqiang目录下的是一些关于小米路由器系统的工具、配置相关的lua文件。
6.如何更便利的审计这些lua源代码
使用sublime text 3打开./usr/lib/lua/目录,sublime text 3目录会将目录间的文件中建立交叉引用,这样就可以通过点击跳转到具体的文件中
效果如下图:
5.9.jpg (50.83 KB, 下载次数: 92)
2018-2-7 10:14 上传
0x06 串口调试
1.拆机
路由底部是嵌合的
2.2_.jpg (148.41 KB, 下载次数: 94)
2018-2-7 10:55 上传
在路由器中间有一颗螺丝
2.3.jpg (168.79 KB, 下载次数: 86)
2018-2-7 10:55 上传
2.uart连接
靠近为发烧而生的四个通孔,分别为TXD、GND、RXD
2.6.png (954.19 KB, 下载次数: 105)
2018-2-7 10:55 上传
我们只需要连接RXD、TXD、GND
2.5.jpg (233 KB, 下载次数: 100)
2018-2-7 10:58 上传
3.终端输出
小米修改了等待时间,并设置为0。即使串口连接上去也不能进入uboot或者console。
2.png (39.61 KB, 下载次数: 91)
2018-2-7 10:28 上传
1.png (65.49 KB, 下载次数: 80)
2018-2-7 10:28 上传