D-link DIR645 缓冲区溢出漏洞分析

IoT 12个月前 admin
329 0 0
前言
D-Link DIR-645在实现上存在命令注入及栈缓冲区溢出漏洞,攻击者可利用这些漏洞任意更改内存,以root权限执行任意shell命令或代码。该漏洞是CGI脚本在处理authentication.cgi请求,将请求头的CONTENT_LENGTH值作为read函数读取文件的内容大小,由于该值可控,因此造成read函数的缓冲区溢出。
固件模拟

首先通过attifyos虚拟机进行环境搭建,attifyos虚拟机中集成了常用的固件环境模拟工具。

attifyos虚拟机下载地址:https://pan.baidu.com/s/1Vracsnlt5uNbdmfYK4dp8Q  

密码:tvoh

DIR645固件下载地址:https://pan.baidu.com/s/1B7fDB4NETjdGWtlkiPULpw

提取码:5iaz

下载完成后,进入虚拟机目录/home/oit/tools/firmadyne,执行python fat.py

D-link DIR645 缓冲区溢出漏洞分析

此时会要求输入所需要模拟的固件地址,这里我将固件放置在桌面,因此目录为/home/oit/Desktop/firewalks/DIR645A1_FW103RUB08.bin

接下来会要求填写固件的品牌名,可任意填写

D-link DIR645 缓冲区溢出漏洞分析

然后便是根据要求不断填写firmadyne的用户密码,在attifyos1.3中,密码为firmadyne。

D-link DIR645 缓冲区溢出漏洞分析

过程中可能需要填写oit用户的密码,密码为attify123。最后当出现如下页面时,则表示固件模拟成功。

D-link DIR645 缓冲区溢出漏洞分析

此时访问http://192.168.0.1,可看到路由器登录页面

D-link DIR645 缓冲区溢出漏洞分析
漏洞复现

向路由器管理系统发现如下请求

POST /authentication.cgi HTTP/1.1Host: 192.168.0.1User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:50.0) Gecko/20100101 Firefox/50.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Content-Type: application/x-www-form-urlencodedReferer: http://192.168.0.1/Content-Length: 7044Cookie: uid=TjnCBrkNZjConnection: close
uid=A21G&password=AAAAAA1024*A

返回结果如下图所示,造成相关服务500,无法访问

D-link DIR645 缓冲区溢出漏洞分析

而正常的请求结果如下

D-link DIR645 缓冲区溢出漏洞分析

请求体的内容超长导致了dir645出现了缓冲区溢出,从而拒绝服务。

漏洞分析

首先通过binwalk解压固件

D-link DIR645 缓冲区溢出漏洞分析

进入到路由器系统目录下,发现请求的authentication.cgi路径,实际处理文件为cgibin

D-link DIR645 缓冲区溢出漏洞分析

接下来对cgibin进行反编译,将该程序导入到ida中,默认进入初始函数的main函数中

D-link DIR645 缓冲区溢出漏洞分析

F5查看伪代码,可以看到main函数主要是判断请求uri,根据不同的uri选择不同的函数进行处理

D-link DIR645 缓冲区溢出漏洞分析

如果为authentication.cgi,则进入authenticationcgi_main函数处理,并将请求的数据作为参数值传入该函数

D-link DIR645 缓冲区溢出漏洞分析

进一步进入authenticationcgi_main函数

D-link DIR645 缓冲区溢出漏洞分析

在这个函数里,根据请求方式的不同,进入不同的程序逻辑处理。我们的漏洞利用poc为post方法,查看post相关逻辑

D-link DIR645 缓冲区溢出漏洞分析

可以看到,当为post请求时,读取CONTENT_LENGTH和CONTENT_TYPE的值,若不为空,则将相关参数值传入到read函数里进行读取。函数为read(v21,v70,v20)

根据c语言的函数用法如下所示

D-link DIR645 缓冲区溢出漏洞分析

我们可以看到,该函数用于读取打开文件的内容。其中第一个参数为要读取的文件内容,第二个参数为读取到的内容保存的缓冲区,第三个参数指定所要读取文件的长度。这个函数如果使用不规范的话,当第三个参数指定的读取文件长度超过第二个参数所定义的缓冲区大小时,就造成了缓冲区溢出漏洞。

那么在这里漏洞案例中,我们来看下read(v21,v70,v20) 函数所对应的这三个参数值分别是什么。

v21=fileno(stdin) 为用户输入的值,即post请求体的中的body数据

D-link DIR645 缓冲区溢出漏洞分析

v70为函数定义的数据结构,大小为1024比特

D-link DIR645 缓冲区溢出漏洞分析

v20 = atoi(v18)= atoi(getenv(“CONTENT_LENGTH”),为CONTENT_LENGTH的值

D-link DIR645 缓冲区溢出漏洞分析

由于这里v20所代表的读取内容的长度是用户可控的,因此当设置CONTENT_LENGTH大于1024,请求体内容超长时,就造成了read函数出现缓冲区溢出漏洞

D-link DIR645 缓冲区溢出漏洞分析

美创科技旗下第59号实验室,专注于数据安全技术领域研究,聚焦于安全防御理念、攻防技术、威胁情报等专业研究,进行知识产权转化并赋能于产品。累计向CNVD、CNNVD等平台提报数百个高质量原创漏洞,发明专利数十篇,团队著有《数据安全实践指南》


原文始发于微信公众号(第59号):D-link DIR645 缓冲区溢出漏洞分析

版权声明:admin 发表于 2023年5月12日 上午8:31。
转载请注明:D-link DIR645 缓冲区溢出漏洞分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...