固件分析

uart串口连接

由于路由器并未开启telnet与ssh等端口的原因,我们想要调试其中程序 就只能把固件提取出来本地qemu模拟运行环境,但由于板子上的flash芯片比较小众,通过asprogrammer与flashrom等工具无法直接读取flash,因此就只能退而求其次通过串口连接到系统中去进行远程调试。

所需工具:

万用表、电烙铁、焊锡、ttl转usb(支持刷机功能的编程器)、杜邦线

GND

黑针指电源,红针指任意一焊点,万用表到蜂鸣档(有个🔊图标的就是蜂鸣档),发出蜂鸣声即为GND

VCC

红针指向任意一引脚,有稳定在3.3v或5.5v左右电压的便是vcc

otYk8J.png

TXD

红针指向剩余两个引脚中的任意一个,之后重新接上电源等待10秒左右中,其电压值发生巨大波动便为TXD

otJxuq.png

RXD

”RXD 可以通过在整个过程中具有最低电压波动和最低总值的引脚来确定“

最后确定好每个引脚后,为方便后续的操作,在其孔上焊上排针连接杜邦线。

连接电脑

确定相应的引脚后,开始连线到编程器上

其中vcc引脚可以不用连接,gnd对gnd,rxd与txd交叉连接

otYJKI.png

最后通过serial或minicom等工具连接,波特率就猜115200

缓冲区溢出漏洞发现

连上路由器可以看到进入的是一个cli程序,其中只有一些简单的命令。那么现在问题就来了,我们无法直接控制其系统shell,也就不好对二进制程序进行代码分析….

但好在“万物皆有裂痕,那是光照进来的地方”在cli-console中我们可以实时看到系统运行的情况,比如我们在进行一个post请求时,这边是可以时时反馈的状态的

otYaa8.png

也就是说比如我们通过fuzz等进行模糊测试时,如果这边可以实时看到情况,那么便更能帮助我们确定漏洞的真实性

而恰巧这同时,我通过对字符串字段的测试时,发现在设置远程web管理的ip地址字段中,存在溢出

再次编写脚本发送大量cyclic的有序字符数据,可以看到在路由器系统中,由于httpd服务的错误而产生崩溃并输出了问题信息包括寄存器和栈空间的信息,而在其中的$pc寄存器中,已经成功的被覆盖我们输入的字符串,并确定了是在第148位的字符后便可以控制寄存器,到此成功发现了一个栈溢出漏洞

otYBGQ.png

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /goform/setSysTools HTTP/1.1
Host: 192.168.0.1
Content-Length: 446
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Content-Type: application/x-www-form-urlencoded;
Accept: */*
Origin: http://192.168.0.1
Referer: http://192.168.0.1/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: bLanguage=cn; ecos_pw=NTE2NTE2NTE2NTE21qw:language=cn
Connection: close
module1=loginAuth&newPwd=&module2=wanAdvCfg&wanServerName=&wanServiceName=&wanMTU=1480&macClone=default&wanMAC=B0%3ADF%3AC1%3A18%3A48%3A58&wanSpeed=Auto&module3=lanCfg&lanIP=192.168.0.1&lanMask=255.255.255.0&dhcpEn=true&lanDhcpStartIP=192.168.0.100&lanDhcpEndIP=192.168.0.200&lanDns1=192.168.0.1&lanDns2=&module4=remoteWeb&remoteWebEn=true&remoteWebType=specified&remoteWebIP=192.168.1.1&remoteWebPort=8080&module6=softWare&autoMaintenanceEn=true

修改bootloader

由于cli-console归根结底也只是个程序的原因,那么在系统一运行便自动进入到了cli-console中,只能说明是在系统的启动加载项中有那么一条规则写上了运行cli-console的命令,因此现在的目标便是修改bootloader,使他加载/bin/sh让我们可以控制shell。

给路由器断电重启,在启动时按下ctrl+c便可以进入u-boot

之后通过print即可打印环境变量,可以看到原本的bootargs也就是启动参数。

再通过setenv 来修改,加载/bin/sh 完成后输入boot启动

1
setenv bootargs console=ttyS0,115200 init=/bin/sh mtdparts=ath-nor0:40k(boot),4k(ART),980k(ecos)

仍然失败…..(算是最后倔强一下)

Flash读取固件

编程器连接flash

所需工具:

Ch341a编程器、sp8线夹

可以看到芯片型号为:H25S80 BG19WD AP1K864

otYcq0.png

使用Cha41a编程器通过一下方式连接,在路由器不接电源的情况下可以看到指示灯亮即为正确

otYhiF.png

连接好后通过如asprogrammer、flashrom等工具都未能找到该flash芯片

搜集芯片信息

而如果要导入新的芯片型号,那就必不可免的需要知道芯片的参数信息如

size 芯片的总容量大小,以十进制表示,单位为字节(Byte)不是位(bit)(DEC)
page 芯片的分页大小,以十进制表示,单位为字节(Byte)不是位(bit)(DEC)
id 芯片的id识别号,这个用十六进制表示(HEX). 支持9F, 90, AB, 15指令
spicmd 读写spi芯片时所采用的spi命令,如spicmd=”25”, spicmd=”45”, spicmd=”95”,标准25芯片一般不需要单独指定spi命令,KB是单独KB901x系列芯片使用的
otp 芯片拥有的一次性写入的空间大小,以十进制表示

但是可悲的是这些在网上都不能直接找到,最后经过一番折腾,发现了一个叫硕飞编程器的厂商其sp8系列的编程器可以直接支持h25s80芯片的读取(但是要买设备,这个放到最后在考虑)

https://www.sflytech.com/upload/product/SP8/SP8A_List.htm

顺带的也找到了该芯片的厂商名为HuaHong ZealCore 华鸿挚芯,但该厂商官网并找不到相关信息。。。

不过这没关系,我们可以找淘宝,卖家提供的产品编号规则图,并要到了一份芯片手册

[Flash 8M BH25D80A_070120.PDF](https://onedrive.live.com/embed?resid=59C68E0698DE7043!20695&filename=Flash 8M BH25D80A_070120.PDF&authkey=!AIREow9AIP4xhZU)

otYHqx.png

之后确定制造商信息、设备的标识信息与其他信息

制造商ID=68设备ID=4014容量=8Mbits页大小=256bytes电压=2.7~3.6v

Asprogrammer中添加芯片

在程序的chiplist.xml文件中插入芯片信息,尝试读取失败

未完待续…