DIR-815栈溢出漏洞复现
字数 1660 2025-08-30 06:50:11

DIR-815栈溢出漏洞复现与分析

1. 漏洞概述

D-Link DIR-815路由器存在一个栈溢出漏洞(CNVD-2013-11625),该漏洞存在于hedwig.cgi组件中,影响DIR-815/300/600/645等多个型号。漏洞源于对Cookie中uid参数的处理不当,导致可以触发栈溢出并最终实现远程代码执行。

2. 环境准备

2.1 工具准备

  • 固件分析工具:

    • binwalk: 用于固件解包
    • IDA Pro 9.0: 用于逆向分析
    • MIPSROP插件: 用于查找ROP gadget
  • 调试工具:

    • qemu: 用于模拟MIPS环境
    • gdb-multiarch: 用于调试
    • gdbserver: 用于远程调试

2.2 固件获取与解包

binwalk -Me DIR815_firmware.bin

解包后会得到squashfs-root目录,其中包含路由器的文件系统。

3. 漏洞分析

3.1 漏洞定位

漏洞位于/htdocs/cgibin二进制文件中的hedwig.cgi组件。通过分析发现:

  1. 程序通过getenv检查环境变量
  2. 检查是否为POST请求
  3. 调用cgibin_parse_request函数处理请求

3.2 关键漏洞点

漏洞核心在sess_get_uid函数中:

  1. 获取HTTP_COOKIE环境变量
  2. 检查cookie名是否为"uid"
  3. 提取"uid="后的内容到缓冲区
  4. 缓冲区大小仅0x400字节,但未做长度限制

3.3 利用条件

成功利用需要满足两个条件:

  1. /var/tmp/temp.xml文件存在
  2. haystack指针不为NULL

4. 漏洞利用

4.1 利用思路

  1. 通过构造超长uid参数触发栈溢出
  2. 控制程序执行流
  3. 需要确保程序能正常执行到ROP链

4.2 两种利用方式

方式一:设置CONTENT_TYPE

CONTENT_TYPE=application/x-www-form-urlencoded

这种方式会:

  1. 使sub_409A6C处理请求数据
  2. 确保haystack不为空
  3. 需要设置REQUEST_URI和CONTENT_LENGTH环境变量

方式二:任意CONTENT_TYPE

只需设置POST传参,其他参数无需控制:

  1. 避免进入sub_402FFC
  2. 最终进入sub_403794->cgibin_print_http_status
  3. 栈溢出偏移不同但同样可利用

4.3 ROP链构造

使用MIPSROP插件查找合适的gadget,考虑:

  1. 寄存器控制
  2. 栈布局
  3. 系统调用构造

5. 复现环境搭建

5.1 QEMU用户态模拟

# 启动调试
cyclic 2000 > payload
gdb-multiarch -x mygdb.sh

5.2 QEMU系统态模拟

步骤1:下载内核和镜像

Index of /~aurel32/qemu/mipsel获取

步骤2:创建网桥

  1. 安装依赖:
apt-get install bridge-utils uml-utilities
  1. 修改网络配置:
sudo cp /etc/network/interfaces /etc/network/interfaces.brk
sudo vim /etc/network/interfaces
  1. 创建/etc/qemu-ifup并添加内容:
#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing $1 for bridged mode..."
/sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
/usr/sbin/brctl addif br0 $1
sleep 2
  1. 创建/etc/qemu/bridge.conf
allow br0
  1. 重启系统

步骤3:配置QEMU网络

  1. 修改/etc/network/interfaces,将eth0改为eth1
  2. 启用接口:
ifup eth1
  1. 检查网络连通性

步骤4:启动环境

  1. squashfs-root传到QEMU虚拟机的/root目录
  2. 创建http_conf文件启动HTTP服务

6. 漏洞复现

6.1 本地调试

  1. 使用gdbserver在QEMU中启动服务:
./gdbserver.mipsel 0.0.0.0:1234 ./htdocs/web/cgibin
  1. 使用gdb-multiarch连接调试

6.2 远程攻击

方法一:上传payload

  1. 生成payload
  2. 通过scp上传到QEMU虚拟机
  3. 设置环境变量触发漏洞

方法二:发送HTTP报文

构造恶意HTTP请求,包含超长uid cookie触发漏洞

7. 参考链接

  1. DIR-815 栈溢出漏洞(CNVD-2013-11625)复现-先知社区
  2. 从零到一:复现 DIR-815 栈溢出漏洞
  3. [D-Link DIR-815路由器溢出漏洞分析](ZIKH26's Blog)

8. 注意事项

  1. 退出仿真环境时执行fini.sh脚本,避免下次启动问题
  2. 若忘记退出导致问题,需重新下载内核和镜像
  3. 虚拟桥接网络可保持开启,如需关闭需重新配置
DIR-815栈溢出漏洞复现与分析 1. 漏洞概述 D-Link DIR-815路由器存在一个栈溢出漏洞(CNVD-2013-11625),该漏洞存在于hedwig.cgi组件中,影响DIR-815/300/600/645等多个型号。漏洞源于对Cookie中uid参数的处理不当,导致可以触发栈溢出并最终实现远程代码执行。 2. 环境准备 2.1 工具准备 固件分析工具 : binwalk: 用于固件解包 IDA Pro 9.0: 用于逆向分析 MIPSROP插件: 用于查找ROP gadget 调试工具 : qemu: 用于模拟MIPS环境 gdb-multiarch: 用于调试 gdbserver: 用于远程调试 2.2 固件获取与解包 解包后会得到squashfs-root目录,其中包含路由器的文件系统。 3. 漏洞分析 3.1 漏洞定位 漏洞位于 /htdocs/cgibin 二进制文件中的 hedwig.cgi 组件。通过分析发现: 程序通过 getenv 检查环境变量 检查是否为POST请求 调用 cgibin_parse_request 函数处理请求 3.2 关键漏洞点 漏洞核心在 sess_get_uid 函数中: 获取HTTP_ COOKIE环境变量 检查cookie名是否为"uid" 提取"uid="后的内容到缓冲区 缓冲区大小仅0x400字节,但未做长度限制 3.3 利用条件 成功利用需要满足两个条件: /var/tmp/temp.xml 文件存在 haystack 指针不为NULL 4. 漏洞利用 4.1 利用思路 通过构造超长uid参数触发栈溢出 控制程序执行流 需要确保程序能正常执行到ROP链 4.2 两种利用方式 方式一:设置CONTENT_ TYPE 这种方式会: 使 sub_409A6C 处理请求数据 确保 haystack 不为空 需要设置REQUEST_ URI和CONTENT_ LENGTH环境变量 方式二:任意CONTENT_ TYPE 只需设置POST传参,其他参数无需控制: 避免进入 sub_402FFC 最终进入 sub_403794 -> cgibin_print_http_status 栈溢出偏移不同但同样可利用 4.3 ROP链构造 使用MIPSROP插件查找合适的gadget,考虑: 寄存器控制 栈布局 系统调用构造 5. 复现环境搭建 5.1 QEMU用户态模拟 5.2 QEMU系统态模拟 步骤1:下载内核和镜像 从 Index of /~aurel32/qemu/mipsel 获取 步骤2:创建网桥 安装依赖: 修改网络配置: 创建 /etc/qemu-ifup 并添加内容: 创建 /etc/qemu/bridge.conf : 重启系统 步骤3:配置QEMU网络 修改 /etc/network/interfaces ,将eth0改为eth1 启用接口: 检查网络连通性 步骤4:启动环境 将 squashfs-root 传到QEMU虚拟机的 /root 目录 创建 http_conf 文件启动HTTP服务 6. 漏洞复现 6.1 本地调试 使用gdbserver在QEMU中启动服务: 使用gdb-multiarch连接调试 6.2 远程攻击 方法一:上传payload 生成payload 通过scp上传到QEMU虚拟机 设置环境变量触发漏洞 方法二:发送HTTP报文 构造恶意HTTP请求,包含超长uid cookie触发漏洞 7. 参考链接 DIR-815 栈溢出漏洞(CNVD-2013-11625)复现-先知社区 从零到一:复现 DIR-815 栈溢出漏洞 [ D-Link DIR-815路由器溢出漏洞分析 ](ZIKH26's Blog) 8. 注意事项 退出仿真环境时执行 fini.sh 脚本,避免下次启动问题 若忘记退出导致问题,需重新下载内核和镜像 虚拟桥接网络可保持开启,如需关闭需重新配置