文章目录
- 一、环境搭建
- 二、固件解密解压
- 三、漏洞分析
- 四、动态测试
本文复现了D-Link DIR878型号当中存在的一个命令执行漏洞,漏洞编号CVE-2019-8316,漏洞链接。
本文分为以下几个部分:
1.环境搭建
2.固件解密解压
3.漏洞分析
4.动态测试
一、环境搭建
本文章的实验环境:win10主机,firefox浏览器设置代理,BurpSuiteCommunity实现抓包以及修改报文,逆向分析工具ghidra;Linux虚拟机,版本1804,安装binwalk以及7z。
我手头上有DIR878型号的路由器,所以我直接通过无线网络连接到路由器上,内网地址:192.168.0.1。如果没有路由器的朋友可以参考qemu搭建模拟环境的这个链接,不过非常的繁琐我自己也没有搭建完成。

虚拟机上首先安装qemu组件,执行命令:sudo apt install qemu-utils(注:我不是要用qemu来模拟路由器,只是后面的解密固件需要用到qemu)。安装完成后查看组件,执行命令:ls /usr/bin,查看是否有qemu-mipsel-static组件,有则说明可以正常使用了。

二、固件解密解压
固件的解密参考了解密链接,我结合链接当中的过程,描述一下自己的解密过程以及遇到的问题。
DIR878型号的路由器采用链接当中提到的第一种形式,最初几个版本不加密,从中间某个版本之后开始加密,而解密文件存放在开始加密的前一个版本,也就是最后一个不加密的版本,878型号当中的这个固件版本是1.04,可以在官网根据路由器型号查找到各个版本的固件。如图所示,我们采用的固件版本是最新的1.20,包含解密文件的版本是1.04,放在和第一个加密版本1.10一起。


我们首先尝试解压1.20的固件,可以发现没有任何的输出,可以判定固件已经被加密了。

所以首先提取包含解密文件的旧版本1.04,在固件目录下输入命令:binwalk -Me xxxx

接下来进入提取出来的路径,提取文件系统:binwalk -e A0,在cpio-root路径下就可以看到整个文件系统,熟悉Linux的朋友可能很快就发现和Linux的目录结构是一样的。





接下来利用qemu,启动mips虚拟执行环境,进入busybox,命令:chroot . /bin/sh




三、漏洞分析
根据漏洞编号CVE-2019-8316当中的介绍,命令注入存在于站点过滤功能,把分析定位到这个方向。
首先利用ghidra进行反编译,这里提一下,IDA的可视化功能非常强大,可以看到程序流图,但是只支持ARM架构,如果要分析本路由器的话需要安装别的插件,ghidra的反编译功能则比较强大,可以反编译成C程序,可读性更高,我采用的是ghidra。ghidra新建项目后,把librcm.so文件拉入工程中进行反编译,首先定位到站点过滤函数:


这个函数比较大,有两百多行,(这里剧透一下这个函数有问题),然后查看一下这个函数被哪些函数调用以及调用了哪些函数




经过我们的分析,可以发现这里对url的处理并不能过滤命令注入,所以twsystem函数会执行用户注入的命令,接下来开始动态测试来验证我们的分析。
四、动态测试
首先来到站点过滤的地方,尝试在前端直接注入命令,发现不行这里有对特殊字符的限制,没办法直接注入命令。

所以只能采用burpsuite抓包改报文的方式来实现命令注入,首先随意输入一个合法的url,此处已www.baidu.com为例,保存设置,截下前端发送的报文:


对报文当中的url字段进行修改,注入命令:$(telnetd -l sh -p 1337 -b 0.0.0.0),开放路由器的1337端口等待他人连接

改完报文发送过去之后,就可以看到我们的设置成功了,也就是注入的命令被执行了

接下来在主机尝试telnet连接路由器,验证一下我们注入的命令被成功执行:


*本文作者:黄培扬payoung,转载请注明来自一一网络博客