如何通过UART破解硬件设备
Raymond Felch //
前言:
几周前我开始探索固件逆向工程(参见《JTAG – 微控制器调试》),虽然在目标板(三星S3C4510 CPU的Linksys BEFSR41路由器)上成功找到并识别了JTAG(联合测试行动组)引脚,但遇到了复杂问题。使用OpenOCD和多种JTAG适配器(包括自制树莓派Pi3作为JTAG/SWD适配器)提取固件时出现多次故障:有时能dump闪存数据,但binwalk工具识别异常,可能是时序问题或未正确暂停目标状态。供应商也可能通过拉高复位引脚或熔断关键JTAG路径来保护专有信息。由于使用的是状态未知的二手板卡,问题更加复杂。
OpenOCD(开源片上调试器)的理解与实施本身即是一项巨大挑战。根据维基百科,OpenOCD是用于ARM和MIPS系统的免费片上调试、在线编程和边界扫描测试工具。OpenOCD服务器通过TCP/IP端口接收远程命令,并提供与板上设备交互的接口(可通过Telnet端口4444或GDB端口3333)。
选择新路由器与新方法
拆解过程简单:移除底部三颗螺丝,用塑料撬片即可分离外壳。
定位UART测试点
仿照JTAG方法,我检查板上可能提供串行访问(TX RX GND)的引脚组。立即发现一个5引脚点(标记JD6),疑似串行端口访问点。为方便操作,我焊接了5针排针。
使用JTAGulator工具
用万用表通过连续性测试找到GND引脚(DJ6-5,与金属屏蔽层连接)。随后使用JTAGulator将剩余4引脚连接至通道0–3,并将GND引脚跳线至JTAGulator的GND。
连接完成后,为目标板和JTAGulator供电。启动PICOCOM后立即获得提示符:
输入H获取帮助菜单,可见UART命令用于查找TX和RX引脚。
继续前需设置目标I/O电压,使用V命令完成:
随后使用U命令查找TX和RX引脚。需指定要检查的通道数(引脚数量):
按空格键开始后,JTAGulator尝试多种波特率以寻找最佳匹配。评估发现115200波特率下通信量最大,且无论波特率如何,TX和RX引脚识别结果一致。
最终结果:通道3为TX(DJ6引脚2),通道2为RX(DJ6引脚3),波特率115200。可通过Passthrough模式(使用P命令)进一步测试,与芯片实际通信:
成功获取设备可用命令列表。执行reboot命令可重启路由器并获取设备信息(确认与Broadcom射频芯片BCM43236通信,使用其专有wl驱动)。
尝试wlhist命令会dump堆栈并自重启:
rpcdump命令提供Dongle信息,有趣但实用性有限。
参考Quarkslab.com的《逆向工程Broadcom无线芯片组》博客,尝试使用PySerial脚本执行’md’命令进行内存dump,但仅能获取不足2k数据(芯片识别入侵后自重启中断操作)。将dump限制为1k(1024字节)可生成小型bin文件,但实用性低。
定位第二个UART测试点
意识到当前命令有限且芯片安全性较高,我继续寻找可能直接连接Broadcom CPU的串行访问点。谷歌搜索中发现E2500路由器确实有两个串行端口TAP,且其中一个(DJ6射频芯片43236)无法用于固件修复,这促使我寻找另一个TAP。最终找到另一组5引脚(标记DJ2),同样焊接5针排针。
此次改用Attify Badge作为UART接口(原因:JTAGulator成本较高且易损,而Attify Badge专为串行通信设计,支持UART、SPI、I2C及JTAG)。设置简单:D0和D1分别为TX和RX,GND为D8。
通过新TAP(测试访问点DJ2)和Attify Badge供电后,立即获得BusyBox的root shell:
输入’help’获取更多命令,尝试’login’后使用admin:admin和admin:密码均失败,多次Ctrl-C后终端返回’#‘提示符(可能因密码错误直接进入root shell)。
执行ls -la
遍历目录和子目录,查找配置文件、日志文件等,并执行ps、netstat等命令:
确认已进入固件核心的Linux shell,达成原始目标(dump固件以逆向分析代码和环境)。尝试通过端口23 Telnet或端口22 SSH连接均被拒绝,表明路由器网络安全良好,但无需凭证即获root访问权限存在安全隐患。
总结
这是一次愉快且高效的探索,证明了除JTAG外还有其他硬件访问方法。定位两个UART串行端口并使用新设备(Attify Badge、JTAGulator)连接它们,成为极具生产力的替代解决方案。