tplinksr20远程命令执行漏洞

注:如果qemu如下启动不成功,可以换种方式:
sudo tunctl -t tap0 -u whoami # 为了与 QEMU 虚拟机通信,添加一个虚拟网卡
sudo ifconfig tap0 10.10.10.1/24 # 为添加的虚拟网卡配置 IP 地址
qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append “root=/dev/mmcblk0p2 console=ttyAMA0” -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
qemu启动后给其配置ip
ifconfig eth0 10.10.10.2/24
之后涉及到ip地址都应相应的更换

从官网下载的固件是压缩文件,将其解压
在这里插入图片描述

使用binwalk提取
在这里插入图片描述

提取出来文件夹内容如下
在这里插入图片描述

squashfs-root就是我们需要的固件文件系统
寻找存在漏洞的tddp文件
在这里插入图片描述

查看文件类型
在这里插入图片描述

可以看到是arm架构32位小端elf文件
所以我们接下来模拟时需要用到qemu-system-arm,以及qemu需要的debian arm系统的三个文件
在这里插入图片描述
在这里插入图片描述

模拟环节待会儿再说,我们先来分析漏洞成因

将tddp文件载入ida
搜索关键字符串cmd
在这里插入图片描述

随便点击几个看看会发现都在同一个函数中
以最后一个为例
双击
在这里插入图片描述

点击x查看交叉引用,点击ok
在这里插入图片描述

来到了这个函数里,在左下角的graph view中可以很明显看到,这里是多分支的情况,使用了switch-case结构
定位到主函数名,f5查看伪代码
在这里插入图片描述

漏洞点出现在sub_9c24
我们在case 0xA中看到了
在这里插入图片描述

双击跟入sub_9c24
在这里插入图片描述

跟进sub_91dc
在这里插入图片描述

看到了execve系统调用,其参数就是传进来的参数a1
如果我们能控制传入的参数,就能实现命令执行
回到sub_9c24
在这里插入图片描述

看到传入sub_91dc的参数是getconfirm….字符串。这里是不受我们控制的
我们在sub_91dc处按x键查看交叉引用
在这里插入图片描述

看到sub_A580中会调用它
而我们刚好在case 0x31中看到了sub_A580
在这里插入图片描述

双击跟入
在这里插入图片描述

上面有一个sscanf,sscanf原型为:
int sscanf(const char *buffer,const char *format,[argument ]…);
buffer存储的数据
format格式控制字符串
argument 选择性设定字符串
sscanf会从buffer里读进数据,依照format的格式将数据写入到argument里。
可以说,参数s是由上面的sscanf经过处理赋值的
sscanf中%[^;]过滤了分号;
但是没有过滤|和&
对应着代码,接下来往上回溯,看看v20是什么
在这里插入图片描述

在第30行看到,v20是v9的45083位,而在第22行看到v9由a1赋值,也就说我们得向前跟传入这个函数的第一个参数
在sub_a580按x键查看交叉引用
在这里插入图片描述

回到了sub_15e74
继续按x键
在这里插入图片描述

来到sub_16418
在这里插入图片描述

第32行看到了recvfrom()函数,原型如下
ssize_t recvfrom(int sockfd,void *buf,size_t len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
recvfrom()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.
对应着32行代码,可知v14+45083就是原型中的buf,用于接收socket传来的数据。那么就定位到源头了,既然是从socket接收的,那么就是我们可控的。结合之前的分析,先回到sub_15e74
在这里插入图片描述

注意这里的45084
也就是说switch判断的是48084的位置,此处的值应为0x31
在sub_A580处
在这里插入图片描述

先让v14等于1,可以看到v14是在45083
所以发送的前两字节为\0x1\0x31
接着看到
在这里插入图片描述

v20指针会后移12位,因此中间需要填充,payload中对应部分如下所示
在这里插入图片描述

然后就是我们要注入的代码
在这里插入图片描述

上图中需要注意分号;之后还需要填充字符,因为在使用sscanf函数进行分割后会判断分号后面的内容是否为空
poc中没有其他特别的地方了,就是使用udp的socket通信,完整代码在poc.py
接下来进行复现

执行下面的命令即可启动
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append “root=/dev/mmcblk0p2 console=ttyAMA0” -net nic,macaddr=00:16:3e:00:00:01 -net tap –nographic
在这里插入图片描述

输入root/root登录
在这里插入图片描述

可以和宿主机(Ubuntu,192.168.1.107互通)
在这里插入图片描述

通过scp将文件系统传到debian
在这里插入图片描述

在debian这边看到上传成功了
在这里插入图片描述

使用chroot切换根目录固件文件系统
在这里插入图片描述

这里注意,使用 chroot 后,系统读取的是新根下的目录和文件,也就是固件的目录和文件。
chroot 默认不会切换 /dev 和 /proc, 因此切换根目录前需要现挂载这两个目录。
三条命令如下所示
在这里插入图片描述

输入tddp即可启动
在这里插入图片描述

直接使用nmap来扫
在这里插入图片描述

看到是扫不出tddp的1040端口的,不过如下命令可以扫到
在这里插入图片描述

我们就可以确认tddp服务启动了

运行poc,后面分别是debian的ip以及要执行的命令
在这里插入图片描述

然后在debian上可以看到命令执行后的效果

在这里插入图片描述

将命令执行结果回显在debian其实意义不大,我们尝试通过nc将结果回显在本地
再次启动tddp
在这里插入图片描述

在本地(kali)再开一个终端,nc监听本地6666端口
在这里插入图片描述

执行poc
在这里插入图片描述

可以看到已经将结果回显在本地了
在这里插入图片描述

成功复现漏洞。

参考:

  1. https://www.coresecurity.com/blog/story-about-tp-link-device-debug-protocol-tddp-research
  2. https://www.cybersecurity-help.cz/vdb/SB2019040101
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值