DIR-815 栈溢出漏洞
字数 1538 2025-08-29 22:41:24

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

1. 漏洞概述

DIR-815路由器中的hedwig.cgi组件存在栈溢出漏洞,该漏洞位于/htdocs/web/hedwig.cgi(实际是/htdocs/cgibin的软链接)中。漏洞源于sess_get_uid函数处理用户可控的cookie值时,使用sprintf进行格式化输出时未进行长度检查,导致栈缓冲区溢出。

2. 环境准备

2.1 复现环境

  • 操作系统:Ubuntu 22.04 TLS
  • 工具需求:
    • binwalk(固件分离)
    • IDA Pro(逆向分析)
    • QEMU(用户模式和系统模式模拟)
    • gdb-multiarch(调试)

2.2 固件分析

  1. 使用binwalk分离固件:
    binwalk -Me DIR815_FIRMWARE.bin
    
  2. 定位漏洞文件:
    • /htdocs/web/hedwig.cgi → 软链接到/htdocs/cgibin
    • cgibin进行逆向分析

3. 漏洞分析

3.1 漏洞触发路径

  1. 请求方式:POST请求
  2. 关键函数调用链:
    main → hedwigcgi_main → cgibin_parse_request → sess_get_uid
    

3.2 关键漏洞点

  1. sess_get_uid函数:

    • 从环境变量获取cookie值
    • 解析格式:uid=用户可控值
    • =后的值(v4)进行sprintf格式化输出到固定大小(0x400)的栈缓冲区
  2. 溢出条件:

    • 用户可控的v4长度超过0x400字节
    • 绕过两个关键检查:
      • /var/tmp/目录存在
      • POST请求内容不为空

3.3 绕过检查

  1. 目录检查:
    • 在测试环境中创建/var/tmp/目录
  2. POST内容检查:
    • 确保POST请求包含有效内容
    • 使用application/x-www-form-urlencoded格式

4. MIPS架构特性

4.1 函数调用约定

  • 非叶子函数:返回地址保存在栈中
  • 叶子函数:返回地址保存在$ra寄存器
  • 参数传递:
    • 前4个参数:$a0-$a3
    • 额外参数:通过栈传递

4.2 分支延迟槽

  • MIPS的流水线效应导致跳转指令的下一条指令会先执行
  • 例如:
    jalr $t9
    move $a2, $t2  # 这条指令会在跳转前执行
    

5. 漏洞利用

5.1 偏移计算

  1. 使用cyclic模式确定偏移:
    • 发送cyclic长度为0x1000的payload
    • 通过gdb查看崩溃时的PC值
    • 计算偏移:cyclic -l [PC值] → 结果为1009字节

5.2 ROP链构造

  1. 寻找gadget的注意事项:

    • 避免包含\x00字节(会被sprintf截断)
    • 常用gadget类型:
      • 寄存器控制:move $a0, $sX
      • 栈控制:lw $a0, X($sp)
      • 系统调用:jalr $t9
  2. libc基地址定位:

    • 通过memest等函数的GOT表项确定
    • 用户模式下使用vmmap查看
    • 系统模式下使用gdbserver附加调试
  3. system函数处理:

    • 直接地址可能包含\x00 → 使用system-1地址配合加1gadget

6. 复现方法

6.1 用户模式复现

  1. 使用QEMU用户模式模拟:
    qemu-mipsel -L ./extracted_fs ./htdocs/cgibin
    
  2. 发送精心构造的HTTP请求:
    • 包含超长cookie值(uid=AAAA...
    • 确保POST方法和内容正确

6.2 系统模式复现

  1. 准备环境:

    • 下载Debian MIPS镜像和内核
    • 配置网络桥接:
      sysctl -w net.ipv4.ip_forward=1
      apt-get install bridge-utils uml-utilities
      
  2. 启动脚本示例:

    #!/bin/bash
    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,ifname=tap0,script=no,downscript=no \
    -nographic
    
  3. 文件传输:

    scp -o HostkeyAlgorithms=ssh-rsa payload root@qemu_ip:/tmp
    
  4. HTTP服务启动:

    • 在QEMU虚拟机中启动web服务
    • 从外部发送恶意请求

7. 参考资源

  1. 原始漏洞报告和分析
  2. MIPS架构手册
  3. QEMU模拟器文档
  4. 相关安全社区讨论(看雪、先知等)

8. 注意事项

  1. 调试时注意MIPS架构特性
  2. 确保测试环境隔离
  3. 真实设备测试需获得授权
  4. 注意不同固件版本间的差异

通过以上步骤,可以完整复现DIR-815路由器的栈溢出漏洞,并深入理解MIPS架构下的漏洞利用技术。

DIR-815 栈溢出漏洞分析与复现指南 1. 漏洞概述 DIR-815路由器中的 hedwig.cgi 组件存在栈溢出漏洞,该漏洞位于 /htdocs/web/hedwig.cgi (实际是 /htdocs/cgibin 的软链接)中。漏洞源于 sess_get_uid 函数处理用户可控的cookie值时,使用 sprintf 进行格式化输出时未进行长度检查,导致栈缓冲区溢出。 2. 环境准备 2.1 复现环境 操作系统:Ubuntu 22.04 TLS 工具需求: binwalk(固件分离) IDA Pro(逆向分析) QEMU(用户模式和系统模式模拟) gdb-multiarch(调试) 2.2 固件分析 使用binwalk分离固件: 定位漏洞文件: /htdocs/web/hedwig.cgi → 软链接到 /htdocs/cgibin 对 cgibin 进行逆向分析 3. 漏洞分析 3.1 漏洞触发路径 请求方式:POST请求 关键函数调用链: 3.2 关键漏洞点 sess_get_uid 函数: 从环境变量获取cookie值 解析格式: uid=用户可控值 对 = 后的值(v4)进行 sprintf 格式化输出到固定大小(0x400)的栈缓冲区 溢出条件: 用户可控的v4长度超过0x400字节 绕过两个关键检查: /var/tmp/ 目录存在 POST请求内容不为空 3.3 绕过检查 目录检查: 在测试环境中创建 /var/tmp/ 目录 POST内容检查: 确保POST请求包含有效内容 使用 application/x-www-form-urlencoded 格式 4. MIPS架构特性 4.1 函数调用约定 非叶子函数:返回地址保存在栈中 叶子函数:返回地址保存在 $ra 寄存器 参数传递: 前4个参数: $a0 - $a3 额外参数:通过栈传递 4.2 分支延迟槽 MIPS的流水线效应导致跳转指令的下一条指令会先执行 例如: 5. 漏洞利用 5.1 偏移计算 使用cyclic模式确定偏移: 发送cyclic长度为0x1000的payload 通过gdb查看崩溃时的PC值 计算偏移: cyclic -l [PC值] → 结果为1009字节 5.2 ROP链构造 寻找gadget的注意事项: 避免包含 \x00 字节(会被 sprintf 截断) 常用gadget类型: 寄存器控制: move $a0, $sX 栈控制: lw $a0, X($sp) 系统调用: jalr $t9 libc基地址定位: 通过 memest 等函数的GOT表项确定 用户模式下使用 vmmap 查看 系统模式下使用gdbserver附加调试 system函数处理: 直接地址可能包含 \x00 → 使用 system-1 地址配合加1gadget 6. 复现方法 6.1 用户模式复现 使用QEMU用户模式模拟: 发送精心构造的HTTP请求: 包含超长cookie值( uid=AAAA... ) 确保POST方法和内容正确 6.2 系统模式复现 准备环境: 下载Debian MIPS镜像和内核 配置网络桥接: 启动脚本示例: 文件传输: HTTP服务启动: 在QEMU虚拟机中启动web服务 从外部发送恶意请求 7. 参考资源 原始漏洞报告和分析 MIPS架构手册 QEMU模拟器文档 相关安全社区讨论(看雪、先知等) 8. 注意事项 调试时注意MIPS架构特性 确保测试环境隔离 真实设备测试需获得授权 注意不同固件版本间的差异 通过以上步骤,可以完整复现DIR-815路由器的栈溢出漏洞,并深入理解MIPS架构下的漏洞利用技术。