TP-Link IP43AN仿真及漏洞测试

固件安全
2021-11-29 17:47
31108

前言

偶然看到了这篇文章,想复现这个漏洞,作者用的是真实设备进行研究,想试试用qemu进行仿真来复现这个漏洞,本篇文章主要是通过qemu-system仿真TP-Link IP43N实现动态调试uhttpd并测试栈溢出漏洞,由于参考文章已经详细介绍了漏洞原理,本篇只讲固件仿真和漏洞测试分析,想了解漏洞细节的话可以看看漏洞参考文章。

固件仿真

用binwalk解开固件,查看文件是32bit ARM架构的,查看文件保护发现开了NX

image.png

将squashfs-root和gdbserver上传到虚拟机中

$ chroot squashfs-root sh

image.png
image.png

查看httpd文件用的是uhttpd,存在openwrt_release等文件知道用的是openwrt系统,根据漏洞描述知道dsd是存在漏洞的,直接用dsd启动即可,然后在用命令启动uhttpd

# dsd
# uhttpd -p 80 -h /www/ -f

image.png

发现程序卡住了,无任何字符串显示,也没有错误信息,端口也没有opend将uhttpd拖入IDA当中进行分析,发现少了jffs2_ready文件

image.png

只要没有这个文件就一直陷入循环当中,创建一个jffs2_ready文件

# touch /tmp/jffs2_ready

再次尝试启动,发现端口已经开启,可直接访问

image.png

但测试用户名和密码发现只能用admin进行登陆

image.png

但用admin用户进行登录时提示没有admin这个用户

image.png

查看登陆逻辑,验证username是否是admin,如果是则验证是否用户名在uci配置文件当中

image.png

image.png

这时候要对配置文件进行构造,根据网上查到的消息uci配置文件的用法,然后在/etc/config下创建一个user_management文件,然后写上username和password,就可以实现登录了,

image.png

登陆的目的只是获取一个token,但登陆之后发现系统sessions(/tmp/luci-sessions)没有token
需要手动添加token(token值随意),就可以进入dsd了

image.png

##漏洞测试分析
我们知道这是个栈溢出函数,那需要查看的是这个漏洞能带给我们怎样的效果,如何劫持
我们可以看到最后溢出变量是在v17这里,刚好是最底部的变量位置,我们能够控v17+0x10的地址
image.png

image.png

在返回地址处点下断点,运行exp

image.png

image.png

可以看到我们能控制r4-r10以及pc寄存器,但由于有nx保护,导致无法返回到栈上执行shellcode,只能达到拒绝服务的效果
##总结
文章主要涉及的点还是如何仿真httpd和dsd进行调试和测试,其实这个仿真花了我挺长时间的,遇到一些坑如何通过逆向解决,还有一些特有的函数(uci)如何去构造配置文件都是一些可以学习的点。就目前来说路由器漏洞主要还是在web中,只要web启动起来再仔细地逆向一下说不定就会有很多漏洞,同时通过仿真模拟的话就可以自己构造一些Fuzz来进行测试和优化。
由于目前主要研究车联网漏洞,在物联网研究的时间比较少, 最近想尝试模拟仿真TBox,所以找了几个项目练练手,才做了这个分享,希望能给大家带来一点收获,如果有问题或建议欢迎留言。

漏洞参考:漏洞参考
固件下载地址:固件下载地址## 前言

偶然看到了这篇文章,想复现这个漏洞,作者用的是真实设备进行研究,想试试用qemu进行仿真来复现这个漏洞,本篇文章主要是通过qemu-system仿真TP-Link IP43N实现动态调试uhttpd并测试栈溢出漏洞,由于参考文章已经详细介绍了漏洞原理,本篇只讲固件仿真和漏洞测试分析,想了解漏洞细节的话可以看看漏洞参考文章。

固件仿真

用binwalk解开固件,查看文件是32bit ARM架构的,查看文件保护发现开了NX

image.png

将squashfs-root和gdbserver上传到虚拟机中

$ chroot squashfs-root sh

image.png
image.png

查看httpd文件用的是uhttpd,存在openwrt_release等文件知道用的是openwrt系统,根据漏洞描述知道dsd是存在漏洞的,直接用dsd启动即可,然后在用命令启动uhttpd

# dsd
# uhttpd -p 80 -h /www/ -f

image.png

发现程序卡住了,无任何字符串显示,也没有错误信息,端口也没有opend将uhttpd拖入IDA当中进行分析,发现少了jffs2_ready文件

image.png

只要没有这个文件就一直陷入循环当中,创建一个jffs2_ready文件

# touch /tmp/jffs2_ready

再次尝试启动,发现端口已经开启,可直接访问

image.png

但测试用户名和密码发现只能用admin进行登陆

image.png

但用admin用户进行登录时提示没有admin这个用户

image.png

查看登陆逻辑,验证username是否是admin,如果是则验证是否用户名在uci配置文件当中

image.png

image.png

这时候要对配置文件进行构造,根据网上查到的消息uci配置文件的用法,然后在/etc/config下创建一个user_management文件,然后写上username和password,就可以实现登录了,

image.png

登陆的目的只是获取一个token,但登陆之后发现系统sessions(/tmp/luci-sessions)没有token
需要手动添加token(token值随意),就可以进入dsd了

image.png

##漏洞测试分析
我们知道这是个栈溢出函数,那需要查看的是这个漏洞能带给我们怎样的效果,如何劫持
我们可以看到最后溢出变量是在v17这里,刚好是最底部的变量位置,我们能够控v17+0x10的地址
image.png

image.png

在返回地址处点下断点,运行exp

image.png

image.png

可以看到我们能控制r4-r10以及pc寄存器,但由于有nx保护,导致无法返回到栈上执行shellcode,只能达到拒绝服务的效果
##总结
文章主要涉及的点还是如何仿真httpd和dsd进行调试和测试,其实这个仿真花了我挺长时间的,遇到一些坑如何通过逆向解决,还有一些特有的函数(uci)如何去构造配置文件都是一些可以学习的点。就目前来说路由器漏洞主要还是在web中,只要web启动起来再仔细地逆向一下说不定就会有很多漏洞,同时通过仿真模拟的话就可以自己构造一些Fuzz来进行测试和优化。
由于目前主要研究车联网漏洞,在物联网研究的时间比较少, 最近想尝试模拟仿真TBox,所以找了几个项目练练手,才做了这个分享,希望能给大家带来一点收获,如果有问题或建议欢迎留言。

漏洞参考:漏洞参考
固件下载地址:固件下载地址

参与评论

0 / 200

全部评论 2

Hacking_Hui的头像
学习了
2023-02-01 14:20
tracert的头像
前排学习
2022-09-17 01:29
投稿
签到
联系我们
关于我们