D-Link Dir-815 sprintf溢出位置

下载固件版本为DIR-815 FW1.01

存在漏洞的文件是 /htdocs/web/hedwig.cgi

这是一个符号链接,指向的是 /htdocs/cgibin

idapro载入cgibin程序,main函数是一个switch结构,根据程序分析得知,需要判断的输入参数有

phpcgi/dlcfg.cgi/seama.cgi/fwup.cgi/fwupdater/session.cgi/

captcha.cgi/hedwig.cgi/pigwidgeon.cgi/service.cgi/

ssdgcgi/soap.cgi/gena.cgi/conntrack.cgi/hnap

以及对应的各个跳转函数

根据漏洞披露报告,漏洞原因在于cookie值过长,需要定位的是hedwig.cgi指向的hedwigcgi_main函数,并根据HTTP_COOKIE值找到调用位置,位于函数sess_get_uid中

此函数中有两处是从hedwigcgi_main函数调用来的

跳转到1c8地址处,程序调用有一个函数是sprintf,这是一个可能存在缓冲区溢出的危险函数

对sess_get_uid函数的分析,HTTP_COOKIE是uid=cookie的形式

根据分析编写测试bash文件

#!/bin/bash

INPUT="$1"
TEST="$2"
LEN=$(echo -n "$INPUT" | wc -c)
PORT="1234"

if [ "$LEN" == "0" ] || [ "$INPUT" == "-h" ] || [ "$UID" != "0" ]
then
	echo -e "\nUsage: sudo $0 \n"
	exit 1
fi

cp $(which qemu-mipsel) ./qemu
echo "$INPUT" | chroot . ./qemu -E CONTENT_LENGTH=$LEN -E CONTENT_TYPE="application/x-www-form-urlencoded" -E REQUEST_METHOD="POST" -E HTTP_COOKIE=$TEST -E REQUEST_URI="/hedwig.cgi" -E REMOTE_ADDR="192.168.197.142" -g $PORT /htdocs/web/hedwig.cgi 2>/dev/null

rm -f ./qemu

然后执行以下命令开启gdb调试

sudo bash ./pencgi.sh ‘uid=1234’ `python -c “print ‘uid=1234&password=’+’A’*0x600″`

idapro attach进程调试,运行后可以看到输入的uid拼接值,并造成了缓冲区溢出

再次调试,在sprintf处下断点

此时可以看到V0寄存器的值就是测试的uid值

当执行到返回RA时,其值被覆盖为AAAA,说明存在缓冲区溢出

另外,分析在sprintf下有一个fopen(/var/tem/temp.xml)的操作,根据是否存在此文件来选择不同执行路径

如果在路由器中存在此temp.xml文件,则在执行时还存在一处sprintf函数,此处函数也存在缓冲区溢出,但是需要根据实际情况先判断真实环境是否存在/var/tem/temp.xml文件,然后进行有针对性的溢出

如果不存在temp.xml文件,则执行之后会有如下提示

手动创建/var/tmp/temp.xml文件,然后再次测试,在第二处sprintf函数处下断点,执行程序会跳转到此处的sprintf,且测试参数已成功赋值

且执行到RA时,已经被覆盖为AAAA

两处sprintf函数都可以造成缓冲区溢出,在hedwig_main函数调用sess_get_uid时从HTTP Header中获取cookie值,未校验长度,用sobj_get_string函数获取cookie时,也未校验cookie长度,直接拼接调用sprintf,引发段错误segmentation fault

您可能还喜欢...