以“AI+数据安全”领雁!祝贺美创牵头项目入选浙江省科技厅“尖兵领雁”计划 !
2025-12-22
美创AI灾备专家:引领灾备领域迈入“智能化”时代
2025-12-15
热点观察|美创科技丁斐:数据安全 × 价值共创?可信数据空间的 “双向奔赴”
2025-12-03
美创科技高校供应链数据安全方案斩获 2025 年度 “金智奖”
2025-12-03
每周安全速递³⁶⁷ | ShinyHunters 开发新型勒索软件ShinySp1d3r
2025-11-21
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务首先通过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
此时会要求输入所需要模拟的固件地址,这里我将固件放置在桌面,因此目录为/home/oit/Desktop/firewalks/DIR645A1_FW103RUB08.bin
接下来会要求填写固件的品牌名,可任意填写
然后便是根据要求不断填写firmadyne的用户密码,在attifyos1.3中,密码为firmadyne。
过程中可能需要填写oit用户的密码,密码为attify123。最后当出现如下页面时,则表示固件模拟成功。
此时访问http://192.168.0.1,可看到路由器登录页面
向路由器管理系统发现如下请求
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: closeuid=A21G&password=AAAAAA1024*A
返回结果如下图所示,造成相关服务500,无法访问
而正常的请求结果如下
请求体的内容超长导致了dir645出现了缓冲区溢出,从而拒绝服务。
首先通过binwalk解压固件
进入到路由器系统目录下,发现请求的authentication.cgi路径,实际处理文件为cgibin
接下来对cgibin进行反编译,将该程序导入到ida中,默认进入初始函数的main函数中
F5查看伪代码,可以看到main函数主要是判断请求uri,根据不同的uri选择不同的函数进行处理
如果为authentication.cgi,则进入authenticationcgi_main函数处理,并将请求的数据作为参数值传入该函数
进一步进入authenticationcgi_main函数
在这个函数里,根据请求方式的不同,进入不同的程序逻辑处理。我们的漏洞利用poc为post方法,查看post相关逻辑
可以看到,当为post请求时,读取CONTENT_LENGTH和CONTENT_TYPE的值,若不为空,则将相关参数值传入到read函数里进行读取。函数为read(v21,v70,v20)
根据c语言的函数用法如下所示
我们可以看到,该函数用于读取打开文件的内容。其中第一个参数为要读取的文件内容,第二个参数为读取到的内容保存的缓冲区,第三个参数指定所要读取文件的长度。这个函数如果使用不规范的话,当第三个参数指定的读取文件长度超过第二个参数所定义的缓冲区大小时,就造成了缓冲区溢出漏洞。
那么在这里漏洞案例中,我们来看下read(v21,v70,v20) 函数所对应的这三个参数值分别是什么。
v21=fileno(stdin) 为用户输入的值,即post请求体的中的body数据
v70为函数定义的数据结构,大小为1024比特
v20 = atoi(v18)= atoi(getenv(“CONTENT_LENGTH”),为CONTENT_LENGTH的值
由于这里v20所代表的读取内容的长度是用户可控的,因此当设置CONTENT_LENGTH大于1024,请求体内容超长时,就造成了read函数出现缓冲区溢出漏洞