前言
偶然看到了这篇文章,想复现这个漏洞,作者用的是真实设备进行研究,想试试用qemu进行仿真来复现这个漏洞,本篇文章主要是通过qemu-system仿真TP-Link IP43N实现动态调试uhttpd并测试栈溢出漏洞,由于参考文章已经详细介绍了漏洞原理,本篇只讲固件仿真和漏洞测试分析,想了解漏洞细节的话可以看看漏洞参考文章。
固件仿真
用binwalk解开固件,查看文件是32bit ARM架构的,查看文件保护发现开了NX
将squashfs-root和gdbserver上传到虚拟机中
$ chroot squashfs-root sh
查看httpd文件用的是uhttpd,存在openwrt_release等文件知道用的是openwrt系统,根据漏洞描述知道dsd是存在漏洞的,直接用dsd启动即可,然后在用命令启动uhttpd
# dsd
# uhttpd -p 80 -h /www/ -f
发现程序卡住了,无任何字符串显示,也没有错误信息,端口也没有opend将uhttpd拖入IDA当中进行分析,发现少了jffs2_ready文件
只要没有这个文件就一直陷入循环当中,创建一个jffs2_ready文件
# touch /tmp/jffs2_ready
再次尝试启动,发现端口已经开启,可直接访问
但测试用户名和密码发现只能用admin进行登陆
但用admin用户进行登录时提示没有admin这个用户
查看登陆逻辑,验证username是否是admin,如果是则验证是否用户名在uci配置文件当中
这时候要对配置文件进行构造,根据网上查到的消息uci配置文件的用法,然后在/etc/config下创建一个user_management文件,然后写上username和password,就可以实现登录了,
登陆的目的只是获取一个token,但登陆之后发现系统sessions(/tmp/luci-sessions)没有token
需要手动添加token(token值随意),就可以进入dsd了
##漏洞测试分析
我们知道这是个栈溢出函数,那需要查看的是这个漏洞能带给我们怎样的效果,如何劫持
我们可以看到最后溢出变量是在v17这里,刚好是最底部的变量位置,我们能够控v17+0x10的地址
在返回地址处点下断点,运行exp
可以看到我们能控制r4-r10以及pc寄存器,但由于有nx保护,导致无法返回到栈上执行shellcode,只能达到拒绝服务的效果
##总结
文章主要涉及的点还是如何仿真httpd和dsd进行调试和测试,其实这个仿真花了我挺长时间的,遇到一些坑如何通过逆向解决,还有一些特有的函数(uci)如何去构造配置文件都是一些可以学习的点。就目前来说路由器漏洞主要还是在web中,只要web启动起来再仔细地逆向一下说不定就会有很多漏洞,同时通过仿真模拟的话就可以自己构造一些Fuzz来进行测试和优化。
由于目前主要研究车联网漏洞,在物联网研究的时间比较少, 最近想尝试模拟仿真TBox,所以找了几个项目练练手,才做了这个分享,希望能给大家带来一点收获,如果有问题或建议欢迎留言。
偶然看到了这篇文章,想复现这个漏洞,作者用的是真实设备进行研究,想试试用qemu进行仿真来复现这个漏洞,本篇文章主要是通过qemu-system仿真TP-Link IP43N实现动态调试uhttpd并测试栈溢出漏洞,由于参考文章已经详细介绍了漏洞原理,本篇只讲固件仿真和漏洞测试分析,想了解漏洞细节的话可以看看漏洞参考文章。
固件仿真
用binwalk解开固件,查看文件是32bit ARM架构的,查看文件保护发现开了NX
将squashfs-root和gdbserver上传到虚拟机中
$ chroot squashfs-root sh
查看httpd文件用的是uhttpd,存在openwrt_release等文件知道用的是openwrt系统,根据漏洞描述知道dsd是存在漏洞的,直接用dsd启动即可,然后在用命令启动uhttpd
# dsd
# uhttpd -p 80 -h /www/ -f
发现程序卡住了,无任何字符串显示,也没有错误信息,端口也没有opend将uhttpd拖入IDA当中进行分析,发现少了jffs2_ready文件
只要没有这个文件就一直陷入循环当中,创建一个jffs2_ready文件
# touch /tmp/jffs2_ready
再次尝试启动,发现端口已经开启,可直接访问
但测试用户名和密码发现只能用admin进行登陆
但用admin用户进行登录时提示没有admin这个用户
查看登陆逻辑,验证username是否是admin,如果是则验证是否用户名在uci配置文件当中
这时候要对配置文件进行构造,根据网上查到的消息uci配置文件的用法,然后在/etc/config下创建一个user_management文件,然后写上username和password,就可以实现登录了,
登陆的目的只是获取一个token,但登陆之后发现系统sessions(/tmp/luci-sessions)没有token
需要手动添加token(token值随意),就可以进入dsd了
##漏洞测试分析
我们知道这是个栈溢出函数,那需要查看的是这个漏洞能带给我们怎样的效果,如何劫持
我们可以看到最后溢出变量是在v17这里,刚好是最底部的变量位置,我们能够控v17+0x10的地址
在返回地址处点下断点,运行exp
可以看到我们能控制r4-r10以及pc寄存器,但由于有nx保护,导致无法返回到栈上执行shellcode,只能达到拒绝服务的效果
##总结
文章主要涉及的点还是如何仿真httpd和dsd进行调试和测试,其实这个仿真花了我挺长时间的,遇到一些坑如何通过逆向解决,还有一些特有的函数(uci)如何去构造配置文件都是一些可以学习的点。就目前来说路由器漏洞主要还是在web中,只要web启动起来再仔细地逆向一下说不定就会有很多漏洞,同时通过仿真模拟的话就可以自己构造一些Fuzz来进行测试和优化。
由于目前主要研究车联网漏洞,在物联网研究的时间比较少, 最近想尝试模拟仿真TBox,所以找了几个项目练练手,才做了这个分享,希望能给大家带来一点收获,如果有问题或建议欢迎留言。