废文警告本文为弃坑文,原因是设备砖了,仅能为您带来点思路。
WIFI 密码为空,需要用特殊手段去连接,这里也没有尝试成功。
如果有相同设备建议 TTL 然后自行写入 SN 以及其它配置来安排。
开篇废话
在上个学期末的几天突然对桌面上的充电宝(乐视随身看)有了兴趣,于是开机了下,发现开的 WIFI 变成了 LEHE 密码未知,和这个帖子的症状一致。
于是我拆开了这玩意,去楼下请工作室同学帮忙焊了下 ttl 进去搞事了。
当时是可以直接 uci set
丢个密码进去写下 SN 完事的,不过既然都折腾到了这个地步,那么就直接安排查找密码了。
然后就翻车
正文
TTL
接上 TTL 后一直乱码,常见的 9600 和 115200 都不太行,最后从低到高一个个试,确认了比特率为 57600
用户名 root
密码 ifconfig
进去发现一直有程序刷日志,发现是 dm_letv 干的,我们手动停止 ta
/etc/init.d/dm_letv stop
然后 busybox 命令有些不全,可以自行找 mipsel 的 busybox 丢进去会舒服点。
收集信息
首先我们要明确下这些东西是怎么缝合在一起的,我们解压 T50.bin (乐视随身看固件),这里推荐文件夹直接拖入 VSCode
通过查看 /etc/banner
可以得知 T50 是魔改了 OpenWrt (系统为 OpenWrt 但是把 luci 给干了)
因为连不上的 WIFI 名字是 LEHE 所以我们直接搜索 LEHE 不出意外就有相关设置脚本。
-
在
/lib/wifi/mt7628sta.sh
下可以发现密码是由 sn 的一部分组成的,我们手动运行了下getcfg get sn
输出结果是空的,可以得知相关配置数据损毁了(可能因为充电宝长时间吃灰导致此部分数据消失)。
通过一些关键字搜寻 getcfg 相关源码可以在 Github 上找到(传送门)
当然也可以知道配置分区在/dev/mtdblock2
这里没有再折腾 -
在
/etc/init.d/boot
下的 $psk 应始终为空,因为在上文无定义
然后我们也要知道 WIFI 驱动用的是什么,这里我们随便翻一翻,顺便了解下 OpenWrt 处理 WIFI 的大概逻辑
知道用什么驱动也可以用
lsmod | grep mt
或者dmesg | grep mt
之类的大概看看
瞎找,然后看到了 bin/WIFI_switch.sh
文件
还有在 /lib/wifi 目录下有几个奇妙的 .sh 脚本
了解WIFI工作方式
脚本大概都看了一圈,我们可以大概推测出这个闭源驱动在 OpenWrt 的大概工作方式。
用户层面使用 (L)uCI 进行配置(最终用户层面是有个类似的网页控制面板来控制的,目录在 /usr/mips/
)
然后使用 uci2dat 程序将 (L)uCI 的配置进行转译 /etc/config/wireless
的配置转译成 /etc/wireless/mt7628/mt7628.dat
/ /etc/wireless/mt7628sta/mt7628sta.dat
让闭源驱动读取配置。
然后 /lib/wifi/
有一堆脚本可以来控制开关状态之类的(在系统内可以直接输入 wifi
/ wifi down
来安排,不需要手动调用那些脚本)
其次这玩意有两个工作模式 一个是 AP 模式,另外一个是 STA 模式,这两个模式的区别不再说明 不然又能水一篇文章出来,分别对应了两个驱动 mt7628.ko / mt7628sta.ko ,在后面调试的时候要注意这个区别。
输入 uci2dat -t -f /etc/config/wireless
来输出所有配置印象中命令是这个 可能有点出入
可以看到不出意外密码依旧为空,可以洗洗睡了。
中场休息
众所周知,在 WPA2-PSK 标准下,规定了其密码长度为至少8位,可种种迹象证实了此处由联发科闭源开出来的 WIFI 似乎是没有密码的。
要继续找到答案也就只有继续逆向驱动了。
逆向驱动
在这里没有使用 gdb 之类的工具,哪里来的环境跑这个。。。
为了获得更多驱动到底干了什么鬼的信息,我尝试了反编译驱动,使用了 ghidra
.ko 丢进去,点下 🐲(CodeBrowser)然后分析,等一会,随便点几个函数我们可以发现这个驱动是自带一些调试输出的(printk 是把日志打印到 dmesg
上的)
我们只需要把 RTDebugLevel
数字改大一点(我改成了8)即可让驱动自己吐出对我们可能有用的 log。
(原始代码里面有个 DBGPRINT 函数,在这里不作截图)
改完后导出程序,然后用奇怪的办法传到随身看上(我是 smb 传到 32G 存储里面再 cp 的)
我们先把 WIFI 给关了
wifi down
然后把模块给卸载了并且加载我们改过的版本
rmmod mt7628
insmod 新的 m7628.ko 路径
然后打开 WIFI
wifi
然后就刷屏了(印象中是直接输出的,也有可能是在 dmesg
里面输出)
欢声笑语中打出 GG
继续逆向提示这些的相关函数,我们可以知道至少这个固件使用的闭源驱动没有对不符合规范的密码做中断操作。
通过一些资料我们可以得知,RtmpPasswordHash 是用来生成 PMK 的,而密码为空会导致 PMK 生成不成功(if else 了)此时直接使用 PMK 来连接这个 WIFI 的路子也被堵了,至少在我的能力范围内是彻底没有招数了。
(或者是我不会连,日志里面的 WPAPSK Key 其实就是 PMK)
(技术交流用,相关版权为联发科所有)
翻车
在彻底确认以目前能力是连不上这个 WIFI 后,我的心里只有一个念头,那就是自己做一份固件进去,至少把 busybox 给补齐一点,然后配置调一调,当个 smb 网盘就算了,可惜运气不好,用 firmware-mod-kit 重新打包的 T50 固件启动不起来, uboot 提示坏块之类的。然而这玩意没有有线,uboot 也是残缺的,没有有线接口导致不能用 TFTP 之类的工具,只有编程器能对付了。
于是就翻车,残念です。
>_<
总结
这是我第一次成功给设备接上 TTL,第一次逆向驱动并且打了 patch 顺便学习了点 WPA2 PSK 的一点协商流程,虽然最后以失败告终,不过感觉还算是学到了你不少,大概不亏(虽然为了50块的玩意浪费了三四天)。
现在想起来,也许当时应该尝试用 WPS 来连接,没准就成功 dump PMK 了,不过当时没想到。
最后这次有好几个锅要甩(((
首先是乐视开发这个项目的人,并没有在 WIFI 配置下留下任何 fallback ,导致在配置分区损毁后整台机器无法使用 ttl 以外的方式连接 终于可以当充电宝了 。
当然这个产品就已经很莫名其妙了,怀疑就是当年极速扩张的时候钱没地方烧搞出来的,充电宝 + 随身 smb 谁会想连这么慢的玩意啊,,,,
然后是联发科,提供了这么灵车的驱动,居然让不符合规范的 WIFI 可以开起来,也算是让我切身实际地体会到了这些厂都是草台班子。。。
最后就是我,为什么要买这么灵的充电宝,为什么要想不开在没有保险的情况下刷固件
完
参考资料
- MediaTek | MT7628K/N/A
- 6291-xl (兄弟产品的源码,逻辑是一模一样的,就 web ui 可能有点变化)
- 记一次乐视随身看T50固件telnet的root密码寻找流程
- MT7688 AP-Client模式
- mtk 的uci2dat工具
- mt7628/mt7688 apcli0 中继调试记录
- MT7681使用中常见问题解答与程序指导 (RtmpPasswordHash)
- d00mfist1’s CTF wiki -> WIFI
- Could I authenticate to a known WiFi using PMK only?