D-Link-DIR815路由器缓冲区是一个已经被大家多次分析复现的漏洞,相关文章也比较全面,这里感谢 xmzyshypnc大哥的文章。所以选择这个漏洞作为我 IOT漏洞分析的入门实践。作为入门学习,本文可能会包含更多IOT的基础知识。
提取固件
一般拿到路由器内部固件,都是以bin
形式打包,所以需要使用 binwalk
对其进行提取。使用如下命令:
1 | binwalk -Me Dir.bin |
这里如果报错提示 WARNING: Extractor.execute failed to run external extractor 'sasquatch -p 1 -le -d '%%squashfs-root%%' '%e'': [Errno 2] No such file or directory
,那么就是 未安装 sasquath
。可以从此处下载安装,按照提示即可。
然后,就能将路由器内部的文件系统给提取出来。
漏洞分析
Buffer overflow on “hedwig.cgi”
Another buffer overflow affects the “hedwig.cgi” CGI script. Unauthenticated remote attackers can invoke this CGI with an overly-long cookie value that can overflow a program buffer and overwrite the saved program address.
官方漏洞公告如上所示,可以看到是位于 hedwig.cgi
中的缓冲区溢出漏洞。所以我们现在文件系统内使用如下命令查找 该程序:
1 | find ./ --name="hedwig.cgi" |
然后,使用如下命令查看其链接的真实程序:
1 | ls -l ./htdocs/web/hedwig.cgi |
最后找到 hedwgi.cgi
程序,使用 Ghidra
查看伪代码如下:
1 | undefined4 main(undefined4 param_1,char **param_2,undefined4 param_3) |
main
函数实现的功能,就是根据启动时传入的参数,去执行相应的功能的 main
函数。那么 hedwigcgi_main
就是漏洞存在的函数,其获取数据的方式基本是通过 getenv
从环境变量中获取,比如 REQUEST_METHOD
这个字段。
1 | int hedwigcgi_main(void) |
这段代码的总体逻辑如下:
- 从环境变量中获取
REQUEST_METHOD
的值,若为空则退出;若不为空,则比较是否有POST
字段,若无该字段则清空参数退出; - 若有该字段,则解析请求;然后创建了两个字符对象,调用
sess_get_uid
函数获取环境变量中的uid
,到字符对象中。sess_get_uid
函数实现的功能是从环境变量中获取HTTP_COOKIE
和REMOTE_ADDR
字段的内容,将两个字段拼接,随后返回
1 |
|
- 将
sess_get_uid
返回的字符串通过sptintf
输出到栈上,这里没有限制输出的长度,所以其存在缓冲区溢出漏洞; - 随后打开了
/var/tmp/temp.xml
文件,并赋予写权限。 - 在下面还有一处调用了
sprintf
函数,也存在栈溢出漏洞。
漏洞利用
本以为只是一个简单的IOT漏洞入门,可是却活生生把我心态搞崩了。碰到各种问题,一路踩过来。
环境搭建
由于没有真机,所以这里采用 qemu
进行模拟调试,启动脚本如下:
1 | #!/bin/sh |
解释一下该脚本,主要是 qemu
的启动参数,其中 -E
是用来添加环境变量的,因为在 上面固件分析中可以看到 都是利用 getenv
来获得参数的,所以这里需要添加环境变量。
漏洞调试
首先既然是缓冲区溢出漏洞,需要先确定一下溢出偏移量
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2001/03/25/D-Link-DIR815路由器缓冲区溢出漏洞复现分析/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!