品牌 : D-LINK
架构 : mips
大小端序:大端
web服务器 : httpd
固件加密情况 : 未加密
文件系统 :squashfs
服务开启情况 :tftpd、telnet、http
端口开放情况 :80(http)、31338(telnet)
启动项 :(使用二进制文件启动)
/squashfs-root/etc/rc.d/rcS
/squashfs-root/sbin/rc
/squashfs-root/sbin/init
历史cve (部分cve的固件版本可能会不同所以导致无法复现)
CVE-2019-13265协议方面的漏洞(我也不懂)
CVE-2019-13264协议方面的漏洞(我也不懂)
CVE-2019-13263协议方面的漏洞(我也不懂)
CVE-2019-9126信息泄露
CVE-2019-9122任意代码执行
CVE-2019-9123密码为空(抽象至极)
CVE-2019-16920任意代码执行
CVE-2020-10213任意命令执行
CVE-2020-10214缓冲区溢出
CVE-2020-10215任意命令执行
CVE-2020-10216任意命令执行
CVE-2020-29557缓冲区溢出
CVE-2021-29296拒绝服务攻击
CVE-2021-46441任意系统命令执行
CVE-2021-46442未授权漏洞
CVE-2022-29332 目录遍历
CVE-2022-47035 任意代码执行
CVE-2024-0717 信息泄露
固件模拟 (推荐FirmAE)
sudo ./run.sh -d dlink DIR825B1_FW210NAb02.bin
启动项分析
/squashfs-root/etc/rc.d/rcS
注释了多行代码 只是挂载了几个目录 但在最后一行用了rc init进行启动
所以我们应该着重分析这两个二进制文件
/squashfs-root/sbin/rc
大概流程就是 如果文件名包含 “init”,则调用 sub_405014()
;如果文件名不包含 “rc”,则根据特定子字符串调用相应的主函数;如果文件名包含 “rc”,则根据命令行参数(如 “start”、”stop”、”restart”、”init”)执行不同的操作
在pid=57的进程传入了参数init 所以程序就会执行sub_405014()
我们跟进sub_405014()函数看看
在sub_405014()函数中 前面有几个初始化函数
分别是创建目录
创建一个记录当前进程 PID 的文件
创建链接( 作用是这些文件可以被 /sbin/rc
程序统一处理。 )
sub_405014()函数在41行时又调用了service_init()函数
在service_init()函数中还调用了init_nvram(); init_network();函数 篇幅有限暂不展开
在第47行启动了tftpd服务
其中第73行存在命令注入( CVE-2020-10216 )但是在ida这里没有显示格式化字符串参数
但在ghidra里就显示了格式化字符串参数(不得不说ghidra对mips架构的反汇编更加友好 但小孩子才做选择)
至此service_init()函数大概能利用的点都已分析
让我们回到sub_405014()函数
在sub_405014()函数的这一部分重启了很多服务
例如redial、monitor、
最后让我们回到main函数
一开始我们调用了sub_405014()函数里的create_symlink()函数
将rc和部分文件夹链接
在调用完sub_405014()函数后 先前与rc链接的文件都会调用rc程序
也就是会启动在var/sbin/目录下的程序
至此这个固件的启动项大致就分析到这了
CVE-2020-10216复现
最后这是第一次遇到用二进制文件来进行启动的 难免分析的有点不好 其实本质和靠脚本启动差不多 但是有时候犄角旮旯会藏几个服务 我在刚开始分析的时候就漏了不少
参考链接
https://github.com/kuc001/IoTFirmware/blob/master/D-Link/vulnerability1.md
https://www.iotsec-zone.com/vulnerability?p=1&k=dir-825
固件下载链接
https://pan.baidu.com/s/12uDQXBZms6WZDpKA_A60NQ?pwd=Nopp
原文始发于微信公众号(ProtoWare安全实验室):DIR825B1_FW210NAb02信息收集