固件分析与解包
使用binwalk 命令先看看固件相关的信息,可以看他是一个ubi镜像,我们得使用专门ubi提取固件的工具进行提取,看到ubi那可以判断他是nand类型的闪存
我们使用binwalk进行解包,发现有一个2B4.ubi镜像,使用下面的教程就可以解压出来。
binwalk -Me miwifi_ra70_firmware_cc424_1.0.168.bin
安装工具:
pip install ubireader
提取:
ubireader_extract_images 2B4.ubi
解包发现有个ubifs文件,我们只有需要去解密最核心的rootfs文件,即可得到里面的SquashFS文件系统。
✅ 总结流程图
固件.bin
↓ binwalk
发现 UBI 结构 (0x2B4 等)
↓
提取 UBI 镜像 (dd 或 binwalk)
↓
用 ubireader_extract_images
↓
提取出 UBIFS 镜像
↓
用 ubireader_extract_files 解包 或者binwalk
↓
得到文件系统内容
unluac_miwifi的使用
某米的前端是使用是lua脚本,是编译后luac文件, 且是魔改后的luac, 那么还需要对其进行反编译
<font style="color:rgb(36, 41, 47);">专门针对某米固件的反编译工具</font><font style="color:rgb(9, 105, 218);">unluac_miwifi</font>
git clone https://github.com/NyaMisty/unluac_miwifi.git
cd unluac_miwifi
mkdir build
javac -d build -sourcepath src src/unluac/*.java
jar -cfm build/unluac.jar src/META-INF/MANIFEST.MF -C build .
解密
java -jar ./unluac.jar /home/iotsec-zone/xiaomi/ubifs-root/miwifi_r2100_all_7d7b2_2.0.743.bin/squashfs-root/usr/lib/lua/luci/controller/api/xqdatacenter.lua > ./xqdatacenter.lua
某米后端逻辑
米使用是openwrt框架下cgi的主要逻辑在usr/lib/lua/luci/controller/目录下, 此外还有一个某米自己常用的库在路径usr/lib/lua/xiaoqiang/, 我们关注的主要也就是这两部分
漏洞存在位置
web路径cgi-bin/luci/;stok={token}/api/xqdatacenter/request,需要我们传入payload
字段包含的是一段 JSON 数据,JSON数据中包含api,pluginID等字段。
漏洞利用链分析
在反编译的/usr/lib/lua/luci/controller/api/xqdatacenter.lua
中,可以看到 URL /api/xqdatacenter/request
相关的handler
函数是tunnelRequest
函数,且访问/api/xqdatacenter
这个节点是需要鉴权的,我们使用ai让我们代码具有可读性。
local L0, L1, L2, L3, L4, L5
L0 = module
L1 = "luci.controller.api.xqdatacenter"
L2 = package
L2 = L2.seeall
L0(L1, L2)
function L0()
local L0, L1, L2, L3, L4, L5, L6
L0 = node
L1 = "api"
L2 = "xqdatacenter"
L0 = L0(L1, L2)
L1 = firstchild
L1 = L1()
L0.target = L1
L0.title = ""
L0.order = 300
L0.sysauth = "admin"
L0.sysauth_authenticator = "jsonauth"
L0.index = true
L1 = entry
L2 = {}
L3 = "api"
L4 = "xqdatacenter"
L2[1] = L3
L2[2] = L4
L3 = firstchild
L3 = L3()
L4 = _
L5 = ""
L4 = L4(L5)
L5 = 300
L1(L2, L3, L4, L5)
L1 = entry
L2 = {}
L3 = "api"
L4 = "xqdatacenter"
L5 = "request"
L2[1] = L3
L2[2] = L4
L2[3] = L5
L3 = call
L4 = "tunnelRequest"
L3 = L3(L4)
L4 = _
L5 = ""
L4 = L4(L5)
L5 = 301
L1(L2, L3, L4, L5)
module("luci.cont