2013年,D-Link DIR-645无线路由器被爆出存在缓冲区溢出漏洞,远程攻击者通过向该无线路由器的"post_login.xml"、"hedwig.cgi"、"authentication.cgi"等接口接口提交特制请求即可触发缓冲区溢出,可使应用程序停止响应,造成拒绝服务攻击,漏洞编号为CNVD-2013-11625。后经安全研究员分析发现,该漏洞同时影响D-LINK的DIR-815/300/600/645型号路由器设备。本文基于D-LINK DIR-815路由器的存在漏洞版本的固件进行相关分析
首先下载路由器固件文件
https://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1000487&fileName=DIR-815A1_FW101SSB03.bin&fileSize=3784844.0
首先使用binwalk解压固件
binwalk -Me DIR-815A1_FW101SSB03.bin --run-as=root
解压后在/squashfs-root得到固件的文件系统
接下来使用qemu-system-mipsel系统模拟,模拟前需要先下载mips架构的内核镜像和文件系统
https://people.debian.org/~aurel32/qemu/mipsel/
下载完成后执行下面的命令进行模拟
sudo qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic
输入root/root即可进入qemu模拟系统
接下来需要在宿主机进行网卡配置
若没有安装依赖需要先执行如下命令安装依赖库
sudo apt-get install bridge-utils uml-utilities
然后依次执行下面的命令配置网卡
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -Fsudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -A POSTROUTING -o ens32 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tap0 -j ACCEPT
sudo iptables -I FORWARD 1 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPTsudo ifconfig tap0 172.16.20.254 netmask 255.255.255.0
此时通过ifconfig命令即可看到配置好的tap0网卡
接下来进入到qemu虚拟机中进行网络配置
依次执行下面的命令
ifconfig eth0 172.16.20.2 netmask 255.255.255.0route add default gw 172.16.20.254ifconfig
可以看到qemu虚拟机的eth0网卡ip地址已经配置为172.16.20.2
此时若上述配置没有问题,宿主机和qemu虚拟机之间已经可以相互连通
通过下面的命令从宿主机将解压固件后的得到的文件系统传到qemu虚拟机上
scp -r squashfs-root/ root@172.16.20.2:/root
传输完成后,进入到qemu虚拟机的squashfs-root/目录,新建一个http_conf文件,该文件是http服务的配置文件
文件内容如下
然后在qemu虚拟机的squashfs-root/下编写一个init.sh脚本,通过这个脚本进行初始化并启动路由器h固件http服务
init.sh脚本内容如下
通过浏览器访问
http://172.16.20.2:4321/hedwig.cgi
可以看到成功启动了http服务
打开burpsuite,抓取浏览器访问http://172.16.20.2:4321/hedwig.cgi的请求包
由于直接浏览器访问提示不支持GET请求方法,所以将请求方法改为POST
会返回411错误,根据报错应该是缺少Length字段
在请求头中加入Content-Length字段后再次请求,返回200,提示“no xml data”
创建一个exp.py脚本,脚本内容如下,该脚本的功能是利用漏洞执行“touch /tmp/havebeenpwn”命令
在宿主机执行python exp.py
可以看到qemu虚拟机的/tmp目录下成功创建了一个名为havebeenpwn的文件