0%

小白的跨方向IoT DIR850L-A1固件漏洞分析

固件下载

我是到官网的查询下载的,下载地址:http://support.dlink.com.cn/ProductInfo.aspx?m=DIR-850L
也可以直接到ftp服务器上下载:ftp://ftp2.dlink.com/PRODUCTS/DIR-850L/REVA/DIR-850L_REVA_FIRMWARE_1.14.B07_WW.ZIP

固件解压

下载的bin文件利用binwalk进行解压

1
binwalk -Me DIR850L_FW113WWb01_f4if.bin

起文件系统的路径为

1
/_DIR850L_FW113WWb01_f4if.bin.extracted/squashfs-root

其中web服务放置于htdocs中,我是进行白盒跟着早前的分析文章进行分析,所以将文件夹打包到本地查看代码。

漏洞分析

漏洞分析得前提是要会用ida逆向cgi文件来分析web服务调用逻辑。

0x01 getcfg.php 任意文件读取

查看\htdocs\web\getcfg.php的源代码👇

这个代码逻辑特别简单了,就是SERVICES参数的值传入变量$GETCFG_SVC中,最后拼接到了变量$file中,利用dophp函数给load出来了,也就是说我们可以控制SERVICES的值,即可以控制file指向的文件,虽然说后面拼接了’.xml.php’,不过虽然事小白的我也知道后缀为’.xml.php’有管理员信息的文件~,不过显然这是一个else条件触发的代码,所以看一下前面的if条件👇

这里需要判断一个AUTHORIZED_GROUP的值和CACHE,CACHE的简单,不输入或者不为True就好了,AUTHORIZED_GROUP这个就要涉及到分析cgi的事了,其中cgibin文件是负责解析php的,参考https://www.anquanke.com/post/id/175625来进行分析(毕竟一个IoT小白得先跟着一步一步来)👇

通过sess_validate来解析验证AUTHORIZED_GROUP变量值,并通过sprintf处理作为全局变量,之后调用了sobj_add_string和sobj_add_char,由于在调用 sobj_add_char 函数时,会用换行符来分隔参数,也就是说构造 %0aAUTHORIZED_GROUP=1 即AUTHORIZED_GROUP会当作参数处理,处理后并作为全局变量,所以也就可以用来绕过is_power_user函数的身份检验,所以payload可以为👇

1
SERVICES=DEVICE.ACCOUNT&[随便啥都行]=%0aAUTHORIZED_GROUP=1

就可以触发相关逻辑代码,实现任意文件读取。

0x02 fatlady.php 任意文件读取

由于用户向hedwig.cgi发送xml数据时,hedwig.xml会调用fatlady.php 文件进行处理,查看fatlady.php文件代码,路径\htdocs\webinc\fatlady.php👇

同理,service直接拼接到了变量$target上,之后调用dophp进行load,导致直接读取任意以php为后缀的文件,同上,我们可以读取DEVICE.ACCOUNT.xml.php文件,即利用service进行跨目录读取,例如构造service的值为../../../htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml,这里POST 数据包中 xml 数据带上 postxml标签即可,如👇

1
<?xml version "1.0" encoding "utf-8"><postxml><module><service>../../../htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml</service></module></postxml>

发送xml数据,将header中的Content-Type设置为text/xml即可。

未完待续。。。。。。