以Ewon IoT 200 Flexy路由器为例
Ewon所生产的设备已在全世界范围内被广泛使用,以下是Ewon给出的统计数据:
eWON公司成立于2001年,在过去的十几年里,eWON已成为智能互联网远程访问产品市场的领导者。2016年年初eWON成为瑞典HMS工业网络公司旗下品牌,为自动化设备和系统连接到工业网络提供相关产品。HMS eWON主要产品:工业VPN路由器、工业VPN LAN路由器、工业VPN ADSL路由器。
进入Web界面
直接接上电源,即可使用Ewon IoT 200 Flexy路由器。默认情况下,设备的IP地址被设置为10.0.0.53,默认帐户为:
用户名:adm;
密码:adm;
WEB——基本身份验证
Ewon Web应用程序会对其用户进行基本身份验证:
验证是通过HTTP进行通信的,而不是HTTPS。 不过我们在测试时,验证过程并不顺利,设备返回了以下警告:
“基本认证不安全,请不要登录此设备”
WEB——XSS
以下就是认证过程发生的事情:
所以,我们盗用了一些身份认证信息,因为基本身份验证的base64 cookie太差了!
获取主解密密钥(Master Decryption Key)
事实证明,无论是通过XSS进行网络钓鱼,还是将其保留为默认值(adm:adm),一旦你成功访问了该设备,就可以为所欲为了。不过,我们忽略了一件事,就是管理员帐户和较低级别用户帐户之间的授权分离。
在查看Web应用程序或访问存储敏感数据的文件(如VPN私有证书和密钥甚至用户密码)时,它们似乎是以我们以前从未见过的自定义方式加密的。这引起了我们的兴趣,所以我们进行了仔细的分析。
下图是经过身份验证的用户在输入值后,并将其存储在配置中后看到的内容:
或者你可以只做一个简单的post请求,并获取加密的VPN私人证书(记住获取的认证信息):
现在,就让我们开始破解这些存储的字符串。
我们将使用密码字符串,因为它现在要小得多,但同样适用于更大的VPN证书和密钥。
这是输出的管理员用户(我们的用户)的用户名和存储的密码:
[“ptp”,”#_1_EHyXHCXlKSnkcW2f7kthnIg=”]
现在,敏锐的人将立即看到一个有前缀和一个经过base64编码的值。
“#_1_” = Prefix “EHyXHCXlKSnkcW2f7kthnIg=” Base64 Encoded data.
如下所示,解码后的数据无法使用:
如果这个问题不解决,我们就无法知道实际的密码。
由于我们已经知道XSS /不安全HTTP通信中的密码,但是如果可以解密数据,则是否意味着我们也可以解密VPN私钥呢?
首先,我们将另一个用户添加到Ewon路由器,并将密码设置为可接受的最小长度——“aaa”。
测试用户密码被加密为“#_1_BXWfyGY =”,然后我们删除前缀“BXWfyGY =”并解码base64数据。它为我们提供了一些随机查看数据“.u.Èf”。
由于我们只输入3x“a”作为密码,但在解码后的字符串的末尾却添加了一些额外的字符,这是为什么呢?
在没有完全理解加密方法的情况下,我们决定将密码修改为“aba”,以查看它是如何更改的?结果密码被修改为“#_1_BXafyJY=”。
显然以下两个输出的密码之间有一些相似之处:
“BXWfyGY =”= aaa “BXafyJY =”= aba
由于前两个字符是相同的,这是否意味着它是按每个字符加密的?
于是我们再次将输入的密码改为“aab”,进行输出结果验证:
“BXWfyGY=”-> “.u.Èf” = “aaa” “BXafyJY=” -> “.v.È.” = “aba” “BXWciGc=” -> “.u..g” = “aab”
经过分析,确实是对每个字符进行了加密,然后在最后添加一些内容。我们猜想,可能是使用了XOR方法。
现在,让我们启动CyberChef,CyberChef是英国情报机构政府通信总部(GCHQ)发布了一款新型的开源Web工具,为安全从业人员分析和解密数据提供了方便。
GitHub链接:https://github.com/gchq/CyberChef
由于我们知道了密码“3”的长度,也知道它的明文变体是“aaa”,所以我们用CyberChef来进行进一步分析,分析结果如下。
以上的分析结果部分验证了我们刚刚的猜测,之所以说是部分,是因为最后仍然有两个结尾的字符无法符合我们的猜想。现在让我们先忽略这些问题,看看是否可以获取完整的22个长度的密码。
虽然可以,这对CyberChef(计算9.578097130411805e+52个值)来说是非常费力的,所以我们编写了一个python脚本来让这个过程自动化,并让它继续运行:
那么这个密钥也适用于PTP用户的原始密码吗?
经过测试,确实可以,它也会执行私有证书数据:
另外,我们还在众多Ewon Flexy设备上尝试过这种方法,在所有设备上都能运行。
这就是说,我们可以通过XSS从有效用户窃取凭证,或者如果我们在同一个LAN上(无论出于何种原因),也可以获取加密的敏感数据并对其进行解密(其他用户的密码,VPN密钥和配置)等,我们可以使用存储在配置中的私钥和密码进入现有的VPN连接。
目前,我们向Ewon披露了这个漏洞。因为从理论上讲,必须通过身份验证才能进入设备。此外,这些设备都不应连接到互联网。
WEB——默认认证
现在让我们说说默认的认证,这些机制在Ewon的产品中被广泛使用。对于初始设置,这是理想的。但是,当你进入设置向导时,用户名和密码都是默认填写的:“adm:adm”!
Ewon应该在这里设置一些检查,来阻止人们接受默认值,只有进行了修改才能点击“下一步>”。
如果你看看第一幅图中,Ewon产品使用的广泛程度,以及之前的Shodan.io搜索,你就可以知道,有多少人因为没有改变默认值而遭殃了吧!
此外,默认的认证还会被用于在同一主机上运行的FTP服务。
默认情况下,Web Portal和ftp分别设置在端口80和21上,并且在端口81上为Web门户设置了一个辅助端口,稍后我们将对此进行详细介绍。
路由硬件分析
路由硬件分析,由于Ewon设备是一个具有许多可用功能的物联网设备,所以攻击面会很多。
把Ewon Flexy拆卸后,就可以很清晰地看到其中的电路板。它看起来像是外围电路设备/子板的单个控制器以及后开槽的操作系统板:
共有四个插槽可供连接电路子板,以及一个SD卡插槽和4个ETH端口:
背面有一个操作系统板插槽和一些可用的测试板:
我们感兴趣的是操作系统板上的NAND闪存,操作系统板上的测试板(左上2行5列圆形测试板)和墨盒插槽旁边的主板上的3个测试板(靠近TP12)。
JTAG接口分析
当我们看到左上2行5列圆形测试板时,我们立即想到“JTAG”,但说实话,知道这个是没有任何意义的。你可以在左上角看到有一个2-20个插槽连接器,我们怀疑它可以用来快速连接到JTAG编程器并闪存设备。
我们将电线焊接到测试焊盘上并启动一个JTAGulator(它是个自动化寻找 JTAG 引脚的工具),测试图如下:
经过测试,这就是JTAGulator所说的引脚
获取设备的ID得到如下输出:
JTAG > d TDI not needed to retrieve Device ID. Enter TDO pin [1]: Enter TCK pin [4]: Enter TMS pin [2]: All other channels set to output HIGH. Device ID #1: 0000 0001001010000001 00000100001 1 (0x01281043) -> Manufacturer ID: 0x021 -> Part Number: 0x1281 -> Version: 0x0
经过一些搜索,我们发现它像一个莱迪思半导体公司生产的设备,而不是ATMEL公司生产的设备。
我们不确定到底发生了什么,但它确实停止了JTAG枚举和其余部分的连接:
> halt halt Halt timed out, wake up GDB. timed out while waiting for target halted
串行接口分析
接下来,让我们用另一组看起来很有趣的测试板来接着测试。对我们来说,一排三个既可以表示串行接口,也可以表示串行调试(SWD)接口,所以首先要做的是将Saleae逻辑分析仪连接到三个引脚上,看看发生了什么。
这三个引脚可通过设备底部接入,甚至在塑料外壳上有一个切口。
我们把一些电线焊接到板子上,并将它们连接到Saleae,看看是否能读到可以帮助我们的东西:
为了清晰起见,来一个放大图:
可以看到,BOOTLOADER过程开始了!BOOTLOADER一般分为2部分,汇编部分和c语言部分,汇编部分执行简单的硬件初始化,C部分负责复制数据,设置启动参数,串口通信等功能。在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
现在我们需要把注意力放在如何让设置具有交互性。我们打开USB >串口,把电线接上,用一个通用终端连接到设备上:
可以看出,是Linux 3.2.11版本(2012年的版本,太老了)。不过,我们也可以停止启动过程,希望是一个shell:
MMC: mci: 0 In: serial Out: serial Err: serial Net: macb0 Hit any key to stop autoboot: 0 Net: enable eth switch U-Boot> help U-boot console is locked U-Boot> ? U-boot console is locked U-Boot>
以上并不是我们想要的,继续:
U-Boot> unlock pw Var pw not def U-boot console is locked
以上的内容才是我们想要的!
本文,我们讲了IoT路由的设备在理论上的安全性和可能的安全漏洞。下篇,我们就来实测一下。