步步为营:探寻诺顿安全路由器任意命令执行漏洞(CVE-2018-5234)

阅读量    51398 |   稿费 200

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

最近,有关黑客入侵物联网的设备不断在媒体中出现,同时关于物联网设备安全性的话题也不断被引出。近期,Trustwave发布了他们的报告( https://www.trustwave.com/Company/Newsroom/News/New-Trustwave-Report-Shows-Disparity-Between-IoT-Adoption-and-Cybersecurity-Readiness/ ),报告中指出,使用物联网设备的企业数量正在增长,因此设备所存在的安全性问题产生的潜在影响也越来越大。另外,卡巴斯基实验室也发布了一份关于新型APT的报告,他们将其称为Slingshot( https://d2538mqrb7brka.cloudfront.net/wp-content/uploads/sites/43/2018/03/09133534/The-Slingshot-APT_report_ENG_final.pdf ),犯罪嫌疑人可能会以路由器作为目标,将其感染后再利用路由器连接到网络上的其他计算机,发起进一步的攻击。

 

一、基本介绍

在目前的环境之下,相当一部分公司(甚至是防病毒软件生产商)都相继开发并推广物联网设备的硬件安全解决方案。Embedi的研究人员已经对其中一部分进行了安全检查,从而向广大用户提供这些设备存在的安全缺陷和最新信息。此前,我们已经对Bitdefender BOX进行了全面的分析( https://embedi.com/wp-content/uploads/dlm_uploads/2017/11/box-of-illusion.pdf )。由于这一网络安全领域是开发者的最新趋势,所以我们决定继续进行研究,希望这些“网络监护人”产品能够更有效地执行其功能,并能够保护物联网设备和其自身。
在本篇文章中,我们详细分析了Symantec的Norton Core Secure WiFi Router(诺顿核心安全无线路由器)。我们将挖掘该产品中的漏洞,并描述它目前存在的安全缺陷。尽管该产品存在一些漏洞,但作为一篇客观的文章,我们还会谈论赛门铁克在物联网安全领域的成功之处以及他们已经推向市场的设备的强大之处。

 

二、设备描述

该设备是一款高性能安全双频WiFi路由器,配备了双核CPU和扩展内存。根据官方说明,与普通的WiFi路由器相比,该产品能够支持高速广播Internet连接。诺顿核心安全无线路由器的主要亮点在于,它还可以保护连接到网络之中的物联网设备的安全。

与其他设备相比,该设备具有较多的优势,它还支持各种其他功能(部分功能需要订阅):
1、内置防火墙;
2、防范病毒数据挖掘、恶意软件和其他网络威胁;
3、对身份信息和转账交易的保护;
4、全面的家长控制(包括时间限制、内容过滤、禁止网络中特定设备访问互联网);
5、网络级安全(DPI、IDS、IPS、安全DNS、加密用户连接);
6、设备远程配置(通过智能手机APP);
7、安全评分;
8、自动检测连接的设备。
该设备在宣传中声称,只要激活订阅功能,就不再需要使用其他的防病毒软件。根据官方提供的信息,该设备仅在美国销售并运营。

 

三、设备行为

如果启用了Internet访问和蓝牙功能(支持蓝牙低功耗),设备的初始设置就可以通过相应的智能手机应用程序(iOS、Android)进行。在此过程中,可以配置WAN接口,并进行设备的固件更新(如果需要)。随后,路由器会在云中被识别并分配给特定用户(智能手机应用程序中授权的用户)。随后,只要用户连接到互联网,设置程序就可以在应用程序中远程执行。路由器将依次同步其配置中的更改。因此,由于该设备可以远程管理,所以用户与路由器之间的交互达到了最小化。
同时,该设备还具有流量分析系统。该系统包含各种插件,其中一些插件将发送检查信息到云上(例如Mobile Insight)。因此,如果路由器上没有互联网接入,就无法对设备的配置进行修改(甚至是更改WiFi网络密码)。此外,一些对于防止网络中的恶意设备至关重要的安全相关子系统将被禁用。
如果用户访问了恶意网站或禁止访问的网站,网页会被更改为与威胁类型相关的信息页面。例如“包含成人内容的网站已被阻止”或者“当前的互联网访问受到限制”。这也意味着,要有一台WEB服务器在路由器上运行。
路由器还配备了持续固件更新系统LiveUpdate。在设备每次启动时都会进行固件更新检查,此外在设备使用期间,也会定期检查固件更新。

 

四、访问文件系统

如果要进行详细的系统分析,就需要访问存储在设备内部存储器中的文件。我们有几种方法可以实现,让我们首先从最简单的开始。

4.1 通过UART

我们要尝试的第一种方法是连接到UART(如下图)。理论上,我们通过连接,可以获得对文件系统的访问权限(可能是非特权的访问权限)。

正如预期的那样,在设备的加载期间,显示了关于U-Boot和Linux内核加载状态的信息。根据日志显示的内容,3个串行接口已经初始化完成,应该是两个常规接口和一个高速BLE接口。其中一个应该通过UART授予对系统的完整I/O访问权限:

...
[    0.000000] Kernel command line: console=ttyMSM0,115200n8 root=/dev/mmcblk0p10 rootwait
...
[    1.242535] msm_serial_hsl_probe: detected port #0 (ttyMSM0)
[    1.242734] 16340000.serial: ttyMSM0 at MMIO 0x16340000 (irq = 184, base_baud = 115200) is a MSM
[    1.242872] msm_hsl_console_setup: console setup on port #0
[    1.934480] console [ttyMSM0] enabled
[    1.938436] msm_serial_hsl_probe: detected port #1 (ttyMSM1)
[    1.943913] 16540000.serial: ttyMSM1 at MMIO 0x16540000 (irq = 188, base_baud = 115200) is a MSM
[    1.952800] msm_serial_hsl_init: driver initialized
[    1.958433] 16640000.hs_uart: ttyHS0 at MMIO 0x16640000 (irq = 190, base_baud = 460800) is a MSM HS UART
...

在系统初始化后,我们就无法进入了,因为Shell输出默认被禁用。因此,getty就不能完成其工作,也就无法访问文件系统。但是,我们还是通过这种方法看到了路由器的加载状态。

4.2 获取固件

第二种方法是通过从设备的固件中提取文件,来获取存储在内部存储器中的文件。通常,我们可以从开发者的官方网站下载固件,也可以从安装了应用程序的智能手机中获取固件。另一种选择是,还可以在设备尝试从Internet获取更新时拦截通信。
我们最一开始尝试在Symantec Norton网站上寻找资源,也尝试了从智能手机和应用程序中寻找,但均以失败告终。最后,我们决定在固件更新期间尝试对其进行截获。我们已经知道,LiveUpdate系统会在设备上运行,并且路由器在初始设置阶段会进行更新的检查。

NB: Another reason to prevent the router from updating its firmware by
restricting its access to the Internet was that it limits our chances on
taking hold of the device and getting full access to the system, which
is indispensable for detecting vulnerabilities. So, at this stage of
our research, we analyzed the router with only a limited set of its
functions initialized. The out-of-scope functions, however, might
contain vulnerabilities of their own.

为了在更新过程中获得固件,我们通过代理服务器将设备连接到互联网。我们使用一台Linux系统的计算机作为代理服务器,NAT使用iptables设置,以便设备可以通过代理服务器的DHCP获得IP地址:

$ iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE
$ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -A FORWARD -i net0 -o internet0 -j ACCEPT
$ iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT

通过使用WireShark对通信进行分析,我们发现其DNS是199.85.126.15和199.85.127.15。
获取固件的整个过程没有采用任何形式的加密。其算法如下:
1、通过上述DNS获取liveupdate.symantecliveupdate.com的地址;
2、向包含0x20的minitri.flg文件发出GET请求,该文件作为是否能够进行更新的有效指示:

$ curl -H "Host: liveupdate.symantecliveupdate.com" -X GET "152.195.132.156//minitri.flg"

3、获取包含更新相关信息的nortoncore_core.r1_symalllanguages_livetri.zip压缩包,其中包括名称、版本、创建时间戳、校验和以及签名等内容:

$ curl -H "Host: liveupdate.symantecliveupdate.com" -X GET "152.195.132.156//nortoncore_core.r1_symalllanguages_livetri.zip" --output nortoncore_core.r1_symalllanguages_livetri.zip

4、根据收到的数据,下载固件压缩包。

 

五、固件分析

固件压缩包中包含两个文件:install.sh和emmc-ipq806x-single.img。
其中,install.sh是固件更新脚本,该脚本会启动sysupgrade实用程序,将固件分为多个部分,借助内置证书和散列函数检查其完整性,并在通过完整性检查之后对固件进行更新。
而emmc-ipq806x-single.img是由几个部分组成的固件FIT映像,包括设备树文件、加载程序设置、rootfs、GPT布局、加载程序(SBL1、SBL2、SBL3、TrustZone、U-Boot)、initramfs和其他内容。
在我们对固件的所有部分进行解压缩和分析(研究的版本为v207)之后,我们得出结论:该固件基于带有Linux 3.14.77内核的OpenWrt Chaos Calmer 15.05.1。供应商提供的软件是用C ++编写的,使用了许多开源库和框架:
1、PF_RING确保高速数据包处理( https://github.com/ntop/PF_RING );
2、lwip负责高效地使用TCP/IP协议栈进行操作( http://savannah.nongnu.org/projects/lwip/ );
3、libnet框架用于创建和注入数据包( https://github.com/sam-github/libnet );
4、NSS-QCA-ECM – Qualcomm网络子系统(NSS)、增强型连接管理器(ECM)支持网络的低级操作;
5、Bluetopia据说被用作蓝牙协议栈。
该设备有一个集成的加密芯片——ATM ATECC508A,该芯片允许生成随机数,提供循环计数结果以实现安全回滚预防、生成密钥和哈希以及存储敏感数据等。rootfs_data分区用于存储系统配置以及采用LUKS加密的内容(密钥存储在加密芯片中)。
此外,还有一个收集特定数据和日志并发送到网络的系统。主要将收集如下数据:
系统时间和时区;
固件版本;
关联客户;
风扇和其他设备的状态;
恢复出厂设置原因。

另外,还有许多系统负责过滤和分析固件中的数据包,这包括上面提到过的Mobile Insight移动系统。对于插件进行特定数据的收集,可以有效帮助开发人员改进插件。下面是对插件进行操作的列表:

    IDSPlugin
    UserAgentPlugin
    WBListPlugin
    ContentPlugin
    WhitelistPlugin
    MobileInsightPlugin
    TitaniumPlugin
    WebPulsePlugin
    NetworkSecurityPlugin

该设备已经启动了lighttpd/1.4.45,并且使用PHP 5.6.17。该Web服务器上的网页部分用于对网页欺骗行为的告警,例如恶意域名指向的网页。还有一部分是在设备启动后10分钟开始工作的服务页面。这种类型的页面只能使用norton.core域名。

 

六、诺顿核心安全Wi-Fi路由器的攻击向量

目前,我们掌握了其固件,并准备通过分析来检测它的潜在弱点、漏洞和攻击向量。我们需要确保用于为物联网设备提供安全保障的诺顿核心安全WiFi路由器它本身是安全的。

1、人们可以想到的最明显的攻击向量之一,就是在更新期间进行设备固件欺骗。听起来不错,但实际上并不起作用。由于设备会对更新服务器进行检查,因此即使我们试图欺骗官方服务器,也无法上传修改后的固件(更多细节请继续阅读下文)。另外,开发人员只将其固件的一个版本放在了网站上,因此我们也很难对最新版本进行分析。
2、该设备配备两个用于将打印机连接到路由器的USB3.0端口。由此看来,似乎有一种方式可以通过连接恶意设备来影响路由器的工作。然而,连接设备后该设备的行为在(udev)设置中未进行配置。由于我们已经停止了设备的更新,所以我们也不能完全对其进行配置。它们是由默认的Linux软件进行管理的。
正如在“访问文件系统”那一章中所说的,我们拥有一些关于Das U-Boot加载的信息。在信息之中,有一行引起了我们的关注,这一行表示设备曾尝试从USB设备启动(尽管最后失败):

(Re)start USB...
USB0:   Register 2000240 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus 0 for devices... 1 USB Device(s) found
USB1:   Register 2000240 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus 1 for devices... 1 USB Device(s) found
      scanning usb for storage devices... 0 Storage Device(s) found

** Invalid boot device **

在这种方法的研究过程中,我们了解到了U-Boot引导文件的格式和名称。在尝试启动时,发现这一错误是由于错误的证书链导致的。于是,我们对固件的格式进行了深入了解,发现其使用了Secure Boot Qualcomm( https://www.qualcomm.com/news/onq/2017/01/17/secure-boot-and-image-authentication-mobile-tech )。所以,在没有私钥的情况下,我们就无法加载第三方固件。此外,rootfs是由initrd执行的专项检查,所以就又降低了这一攻击向量的可用性。
3、分析设备上已启动的开放端口和网络服务:

lighttpd
samba(旧版本固件)
zebra
quagga
dnsmasq

在这些服务中,唯一容易受到攻击的就是dnsmasq了。然而,我们并不能利用这一点,因为利用它我们需要IPv6,而IPv6实际上已经在内核级别上被禁用了:

$ cat /etc/sysctl.conf
...
# disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

此外,开发人员在软件重编译阶段,也会为每个固件更新并修复已知的漏洞。
4、接下来要做的是分析设置和Web服务器目录,在这里服务器会作为代理启动并返回提醒页面。不过,值得注意的是其中的服务页面。其中存在一个info.php,当设备启动10分钟之后,未经授权的用户可以访问该页面,并阅读到路由器的常规信息,其中包括固件版本、路由器序列号、装配日期、设备温度、MAC地址等。更严重的是,用户还可以通过该页面重新启动设备、将设备恢复出厂设置或对固件进行更新(见下图)。

对于这里的固件更新,如果想要上传经修改后的固件并不是那么简单,其原因在于,需要进行证书的验证。这一次并不是在引导程序的级别运行,而是在负责更新的软件上执行。我们还尝试了启动PHP Shell,也没有成功,因为更新后设备就立即重新启动。另外,我们也无法访问加载后的Shell,原因在于它存储在一个临时目录中,重启后会被删除。
此外,我们可以下载到包含内核状态、服务、启动进程、连接等内容的日志。然而,这些日志是用公钥加密的,我们目前还没有找到相应的私钥。
5、在能够分析和过滤数据包及网站的软件中,我们进行了逆向工程和查找错误,最终发现低级数据包的处理是由CPU(网络操作采用IPQ8064)和内核模块完成的。路由器使用了由Qualcomm或其他公司开发的开源软件,这些软件采用了一些流行的嵌入式机制。
至此,我们想要考虑更高的数据包处理级别,实际上有很多Symantec的插件会执行这样的功能。这些插件也会在其他解决方案中运行,包括Mobile Insight和反病毒软件。分析过程的一部分是在云上进行的,所以我们即使发现了错误所在,也无法对其进行利用。
6、为了确保能够有效地对可执行文件进行分析,我们必须要获得对系统内部的访问权限。在这里,我们决定尝试重写存储固件的内存。然而不幸的是,我们又遭遇了失败。由于存储设备配置的内存内容被加密,如果我们尝试修改固件的其他部分,会导致证书验证错误,最终设备根本无法正常启动。
上述的六个攻击向量都没有让我们成功地访问路由器内部,也没有让我们能够执行任意代码,然而这是我们的一个完整攻击思路,希望提供给大家参考。到现在,我们必须继续研究诺顿核心路由器的其他方面。

 

七、最后的希望:蓝牙低功耗

我们尝试了之前的所有向量,目前只剩下一个最后的希望,就是通过蓝牙低功耗(BLE)的应用程序路由器交互系统。如果通过有线连接到设备的WAN端口(不需要Internet访问),那么就会启动负责通过蓝牙传输和接收数据的可执行文件。
当路由器第一次启动或恢复出厂设置时,可以在智能手机应用程序中配置Internet设置,以便让设备连接到云端并进行进一步设置。在默认情况下,路由器会尝试通过DHCP自动获取IP,或者尝试手动获取静态IP、子网掩码、网关IP地址以及DNS服务器IP地址(可选)。
静态分析的结果表明,只有Bluetopia被用作蓝牙系统。初步看来,Bluetopia不存在安全问题。
关于设备的设置功能,还有几个地方需要关注。首先,除了DHCP和静态IP地址的连接之外,还有可能会建立PPPoE连接。这一功能在论坛上被广泛讨论,许多用户都强烈要求添加这一功能,而官方表示未来将会引入这一功能。然而,事实证明,设备已经支持了这一功能,并且完全可操作。其次,我们发现与设置相关的控制台命令是由系统函数执行的,这一点非常奇怪,因为用C++编写的系统的其他部分都使用安全执行的命令解析器。第三,是以root用户启动了通过BLE进行通信的程序。考虑到上述几点,我们要更详细地分析一下这个“将在未来引入”的功能。
我们发现,当PPPoE连接建立时,就已经设定了用户名和密码。反过来,用户名和密码比IP更容易被利用,因为IP经历了初步解析阶段(inet_aton)。我们可以通过执行以下命令来设置用户名和密码:

$ uci set network.wan.%s='%s'

其中的第一个%s是用户名或密码,第二个%s是要传递的值。这一行在执行前被检查,其中的;^|负责搜索是否有类似于&&和…这样的行出现,如果没有找到,则检查通过(见下图)。

然而,该检查遗漏掉了一些应该被限制的符号,所以我们可以执行下面的命令:

'& cat /etc/passwd > /dev/kmsg'

路由器会执行下面的命令作为输出结果:

$ uci set network.wan.username=''& cat /etc/passwd > /dev/kmsg''

这样一来,设置命令会发送到后台,并且我们能成功执行了如下命令:

$ cat /etc/passwd > /dev/kmsg

在这行命令的帮助下,我们将/etc/passwd文件中的内容通过内核调试输出。如果我们通过UART方式连接,那么就能够读取输出的内容。最后,我们使用一个单引号标记来实现配对。如果我们错过了,那么命令就不会被执行,会等待语法组关闭。
这样一来,我们就发现了BLE中的一个漏洞,借助该漏洞我们可以进行命令注入攻击。利用此漏洞,攻击者可以在设备上执行任意命令。

7.1 研究BLE服务的协议

要通过BLE向设备发送命令,我们必须要分析通信协议。
在这里,WireShark派上了用场。我们打算采用以下方式收集流量:在智能手机上启用蓝牙调试,尝试通过BLE在应用程序中配置路由器,从而获得流量的转储。
为了简化分析过程,我们对应用程序进行了逆向工程。我们发现该应用程序并没有进行混淆,因此成功反编译了大部分代码。
在对协议进行了逆向工程后,我们确定了关键的GATT服务及其相关特性(见下表)。

所有发送的命令均以ROVER_CHARACTERISTIC_USER_COMMAND写入,通过ROVER_CHARACTERISTIC_COMMAND_RESPONSE从设备读取。
此外,我们还确定了可能的请求/响应类型、传递数据的类型以及WAN接口设置的可能类型(见下表)。
请求/响应类型:

传递数据类型:

WAN接口设置类型:

路由器通过ROVER_CHARACTERISTIC_STATUS_NOTIFICATION来显示路由器的状态,其可能的状态如下表所示:

其中,允许传递的数据最大为18字节,如果请求超出了这一大小,就会将消息拆分为多个部分。请求/响应的形式取决于传递/接收数据的类型。由于发送协议的过程比较简单,我们就不在这里详述。
该设备使用基于AES的CBC加密技术对数据传输进行加密,并使用6个单元的序列号作为密钥,初始化向量是在通信过程开始时由路由器接收到的生成数据。
我们可以在路由器的包装盒上找到序列号,也可以在启动路由器10分钟后从info.php服务页面上找到,我们选择了后者。
因此,我们的攻击场景基本如下:
1、通过利用该设备的一个DoS漏洞或通过物理访问设备的方式重新启动路由器,也可以等待用户重新启动路由器;
2、从服务页面norton.core/info.php获取设备的序列号;
3、从路由器上获取一些随机数据,也就是初始化向量;
4、基于获得的数据和序列号生成HMAC,发送HMAC进行检查;
5、在完成对HMAC的检查后,发送配置数据,设置一个用户名及密码,其中包含我们需要执行的命令,这个命令应该用相同的序列号进行加密。
这样一来,我们就可以以root用户的身份,执行几乎任何命令。

 

八、漏洞利用

为了展示漏洞的利用过程,我们使用以下工具:
OS GNU/Linux;
蓝牙适配器(Bluetooth dongle adapter,如下图所示);
BlueZ实用程序(用于测试蓝牙连接);
使用Python3编写的PoC脚本。

在使用脚本之前,我们首先需要设置依赖关系:

$ pip install -r ./requirements.txt

在BlueZ实用程序的帮助下,我们应该确保蓝牙已经启用并能够正常运行。
1、重新启动路由器以访问工程师页面;
2、以root用户(需要使用蓝牙进行操作)使用带参数执行的命令启动PoC:

$ ./ble_norton_core.py "/etc/init.d/dropbear start"

在脚本成功执行之后,我们可以通过SSH连接访问设备。我们这里的用户为root,密码为admin:

$ ssh root@norton.core

现在,通过访问已启动系统的“内部”,我们不仅可以查看固件文件,还可以动态分析系统,研究该设备的各种行为以及路由器执行各种操作的方式,从而可以研究设备本身并对发现的漏洞进行调试。
之所以我们发布这篇报告,其原因非常清晰简单,我们希望像Norton Core、BitDefender Box和F-Secure Sense这些神奇的设备能够有效保护物联网设备,并防止对设备漏洞进行利用。然而,这些设备自身的安全性也并不是十全十美。由于这些设备都具有复杂的功能,因此对其进行的安全分析工作也非常复杂。此外,我们所使用的小工具无法对物联网设备与开发者的云之间传输数据的安全通道进行分析。
目前,对于物联网世界来说,最佳的选择还是让设备免疫,而不是为充满漏洞的设备创建一些“保护伞”、“安慰剂”和“万金油”。我们花费了大量时间,并将所有可用资源都投入在创建免疫基因(防范漏洞利用)的尖端解决方案,以确保广大用户的安全。

 

九、披露时间表

2017年12月27日 发现漏洞
2018年1月26日 向Symantec提交漏洞并提供PoC
2018年2月23日 在v229的固件更新中未发布修复程序
2018年3月29日 在v237的固件更新中发布了漏洞修复程序
2018年4月30日 修复漏洞,并分配了漏洞编号CVE-2018-5234

 

十、结论

根据我们已有的经验,漏洞是一件非常常见的事情。通过对诺顿核心安全无线路由器的分析,我们发现开发人员已经努力从硬件、软件甚至组织层面上使这台路由器尽可能安全。但是,他们仍然犯了一些错误,例如:
1、在获取固件时没有使用HTTPS协议,这直接导致我们可以分析设备的内部。
2、具有隐藏的调试功能,该功能存在被非法利用的风险。例如,如果设备重新启动,网络中的任何用户都可以对设备进行重置。
3、将序列号作为BLE通信协议中的加密密钥。显然,序列号并不难找到。
4、当设备没有连接到互联网时,一些旨在抵御恶意流量的功能停止工作,移动应用程序中进行的设置不会被加载。
5、在BLE服务中存在命令注入(CWE-78)漏洞。
如果本文中描述的漏洞被成功利用,那么任何访问诺顿核心安全路由器的用户(甚至是蓝牙范围内的用户)都可以向设备的内存中写入数据、获取敏感数据、更改设备的配置使流量通过特定服务器传输。同样,恶意的经销商也可以实现上述攻击。

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