曲速未来 表示|对家庭自动化的“洞察力”揭示了简单物联网产品中的漏洞区块链

曲速未来安全区 2018-09-06 02:49
分享到:
导读

据区块链安全咨询公司曲速未来表示:发现软件和硬件中的安全问题,用以帮助他们的开发人员为企业和消费者提供更安全的产品。对WemoInsightSmartPlug的研究导致在libUPnPHndlr.so库中发现了未报告的缓冲区溢出。

物联网有望让我们的生活更轻松。想要远程打开和关闭灯和设备并在线监控它们?“智能插头”是一种Wi-Fi连接的电源插座,是一种简单的方法。但是,如果物联网设备没有得到妥善保护,它们就会变成攻击媒介。


据区块链安全咨询公司 曲速未来 表示:发现软件和硬件中的安全问题,是用以帮助他们的开发人员为企业和消费者提供更安全的产品。根据最近调查的Belkin生产的消费品。对Wemo Insight Smart Plug的研究导致在libUPnPHndlr.so库中发现了未报告的缓冲区溢出。此缺陷CVE-2018-6692允许攻击者执行远程代码。


此漏洞是否可以导致有用的攻击?智能插头本身的影响很小。攻击者可能会关闭交换机,或者最坏情况下可能会使交换机过载。但如果插头与其他设备联网,则潜在威胁会增加。插件现在可以成为更大攻击的入口点。


发现漏洞 


网络或远程漏洞比本地漏洞更危险,因此仔细研究了在本地网络上监听的UPnP端口。用一个正在开发的UPnP模糊器工具,开始模糊打开的UPnP端口,同时监控Wemo上的UART接口。过了一会儿,就可以看到了UART界面的崩溃。


11:37:16.702 stuntsx0x46ac6 STUN客户端事务销毁

将发送SIGSEGV发送到wemoApp以获得对

464d4945的无效写访问(epc == 2ac1fb58,ra == 2ac1fccc)

Cpu 0 

堆栈:2a0000d0 FFFFFFFE 31d2e6f0 31d2e770 31d2e76f 31d2e6f0 31d2e6f0 31d2e770 

00000000 31d2e604 00000000 00000000 2ac77d40 00000000 4f464751 4a484d4c

4e444241 47454f49 50464658 45414d42 43445044 464d4945 5552414c 46495048

4b524141 41445a4f 44534e4a 4e4e494c 44434357 494a4855 44515455 44494b45 

55584a44 584e4f52 545a5247 51545954 595a4c42 4e594a45 484f5158 46474944 


呼叫追踪:


在多次重复并密切观察实验后确定崩溃是由以下数据包引起的:


POST/upnp/control/basicevent1 HTTP/1.1

主机:192.168.225.183:49154

User-Agent:python-requests / 2.9.1

接受:* / *

连接:keep-alive

SOAPAction:“urn:Belkin:service:basicevent:1 #UpdateInsightHomeSettings“

Content-Type:text/xml

Accept-Encoding:gzip,deflate

Content-Length:3253



由于空间原因,一些有效载荷已被删除。(“EnergyPerUnitCostVersion”中的原始数据为2,828个字符。)在检查崩溃数据和数据包之后,这似乎是标准缓冲区溢出,其中数据被覆盖到堆栈上。接着继续模糊测试,现在专注于“EnergyPerUnitCost”字段,发现只需要32个字符就可以使应用程序崩溃。


虽然崩溃转储可以提供了很多好的信息,但仍然有很多是不知道的。例如,崩溃发生在“WemoApp”中并可以提供了一个偏移量,但这个库的基地址是什么?什么被覆盖在堆栈上?如果在运行期间无法访问应用程序,则很难回答这些问题。因为在这之前获得了文件系统,所以就可以静态分析WemoApp二进制文件;但仍然无法轻易确定崩溃的确切位置。


要回答这些问题,需要采取两种途径之一。可以虚拟化Wemo固件或二进制文件以继续测试;或者如果可以确定UART接口上的root密码,就有可能在设备上进行调试。通常,虚拟化固件并不简单,有时会导致测试结果不准确。最好在设备上进行调试。通过我们在侦察过程中发现的所有信息,发现似乎可以绕过root密码。(也有尝试虚拟化WemoApp-但没有成功。)


绕过root密码


从提取的文件系统中,我们了解到Wemo运行嵌入式Linux系统OpenWRT,用户帐户信息保存在标准的/etc/passwd或/etc/shadow文件中。我们从/etc/passwd中提取了root密码的哈希值,并将其提交给了一个破解平台。这种方法在合理的时间内证明是无效的。


使用“dd”和binwalk提供的信息来提取固件二进制文件的正确部分以进行重新打包。


有了新的固件二进制文件,将使用XI Breakout板和flashrom将固件写入板上的闪存芯片。重启设备后,就可以使用新密码登录。


分析崩溃


通过Wemo上的root访问,可以在UPnP模糊测试期间收集有关崩溃的更多信息。首先,是需要编译为此特定体系结构执行更深入分析所需的工具。使用GPL,首先为设备编译了gdbserver和gdb。Wemo有大量已安装的工具,例如“wget”,这使得添加文件变得简单。从/tmp目录下载并执行了这些工具。


经过大量尝试后,但无法直接或远程使用设备运行gdb。因此,将gdbserver与Interactive Disassembler Pro结合使用,进行所有调试。连接调试器后,又发送导致崩溃的数据包并查看崩溃的确切位置。地址0x2AC15B98发生分段故障。从Linux“proc”目录的内存布局中,可以确定他的内存地址位于库libUPnPHndlr.so中。

2abf3000-2ac4d000 r-xp 00000000 1f:02 82/rom/lib/libUPnPHndlr.so

由于崩溃是由UPnP数据包引起的,因此在此库中查找崩溃是合乎逻辑的。使用基址0x2abf3000,最后计算出IDA中静态分析的偏移量为0x22b98。


因为开发人员将二进制文件保留为未剥离状态,所以可以将此函数命名为TokenParser。分段错误发生在分支指令处;但是,在MIPS中,延迟指令在分支发生之前执行。因此,0x22B9C处的指令导致崩溃。这里,应用程序尝试加载存储在$ v1中的地址,并将其放在$ v0中。看一下寄存器,还发现XML标签“EnergyPerUnitCostVersion”中的数据包在$ v1中,导致“无效写访问”分段错误。

在静态分析函数之后,它似乎将数据从一个部分复制到另一个部分,对于0x7C或“|”字符看三次。如果它永远不会找到“|”,它会一直复制到静态定义的缓冲区中。为了完全理解为什么会发生覆盖,逐步完成函数时看一下堆栈:



当函数将数据复制到堆栈时,它最终会复制原始缓冲区的地址。一旦该地址被覆盖,该函数就会尝试以新值写入下一个字节,在这种情况下是无效地址。这种溢出为攻击者提供了两个可利用的向量:写入什么地方条件允许攻击者将数据写入内存中的任意位置;通过继续覆盖堆栈上的数据,攻击者可以覆盖$ RA寄存器或返回调用函数的地址,从而为攻击者提供对执行流程的控制。


编写漏洞利用


了解了漏洞那怎么利用它呢?因为这是一个标准的缓冲区溢出,只需要回答两个问题。堆栈上有多少可用空间,是否有任何“坏”字节无法进入堆栈?了解到只有91个字节可以写入堆栈。


下一步是确定是否存在任何“坏”字节。在运行一些测试之后,注意到了只有ASCII字符才能进入堆栈。在执行易受攻击的代码之前,数据包由开源XML解析器“mxml”解析。该库遵循允许标记之间仅存在ASCII和Unicode字符的标准。


这个标准对于shellcode和面向返回的编程(ROP)技术都是非常有问题的,因为内存地址和shellcode都倾向于使用大多数不可读的字符。我们可以使用几种技术来对抗堆栈中的房间; 但是,由于对将通过XML清理过程的字符进行严格限制,最好使用已加载到内存中的函数。一种不需要广泛shellcode的方法是使用“return to libc”攻击来执行系统命令。由于系统调用通常将字符串作为参数,因此可能会通过过滤器。因为Wemo不使用地址空间布局随机化,所以如果使用ROP,理论上可以调用系统而无需通过XML过滤器传递额外的shellcode。


这仍然是一个重大挑战:只有包含完全ASCII字符的地址才能通过XML过滤器。这极大地限制了寻找可用小工具的可能性。使用IDA来查看libc和系统加载到内存中的位置,并找到了两个实现:在地址0x2B0C0FD4的libuClibc-0.9.33.2.so中; 在libpthread-0.9.33.2.so中,地址为0x2AD104F4。但是,这些地址都不符合通过XML过滤器的要求。因此,即使可以创建ROP链,也无法仅在数据包中发送系统地址。


具有错误字符的地址不是利用开发的新问题。最常见的旁路之一是使用加法或减法ROP小工具在寄存器中创建所需的地址并调用该寄存器。然而,再次,由于XML过滤器,我们面临着可以将哪些操作数用于此加法或减法方程的限制。


在研究了内存布局之后,发现了libuClibc-0.9.33.2.so位于一个内存位置,其地址可以绕过XML过滤器。很幸运,这是一个大型库,提供了一个不错的地址列表,因为它是这样一个空间中唯一的库。使用工具使可用的内存地址提取所有可能的ROP小工具,并确定加法或减法公式是否可以仅使用将绕过过滤器的值调用内存中找到的两个系统调用之一。libuClibc-0.9.33.2.so中的系统地址0x2B0C0FD4没有任何可用的操作数。但是,0x2AD104F4确实如此。还发现了几个“防过滤”操作数,当加在一起时等于0x2AD104F4。



使用工具输出来绕过过滤器以构建ROP链的所有可能的ROP小工具,它使用加法指令为系统创建最终地址并将其存储在$ s0中。添加后,另一个小工具将系统地址移动到$t9并调用system。最后一个小工具还将可以从堆栈控制的地址移动到保存系统调用参数的寄存器中。整个ROP链只包含三个小工具,可轻松适应缓冲区溢出提供的堆栈空间。



有效载荷 


通过发现可以调用系统的有效ROP链,但必须决定应该调用哪个系统。因为系统以root身份执行,所以是可以完全控制设备。区块链安全咨询公司 曲速未来 研究表明该设备安装了许多Linux命令。之前使用wget将gdbserver复制到设备。攻击者还可以从系统调用wget来下载并执行任何脚本。更进一步探索了已安装的应用程序并发现了NetCat,它可能允许攻击者编写脚本来创建反向shell。攻击者可以使用wget下载脚本,并执行包含NetCat命令的脚本以创建反向shell。测试并证明这是一种简单有效的方法,以root身份打开反向shell。攻击者可以选择许多其他方法来利用此漏洞并执行代码。


结论 


诸如CVE-2018-6692之类的发现强调了所有设备上安全编码实践的重要性。从安全角度来看,物联网设备经常被忽视;这可能是因为许多用于看似无害的目的,例如简单的家庭自动化。但是,这些设备运行操作系统并且需要与台式计算机一样多的保护。根据发现的漏洞可能成为攻击者进入并破坏整个业务网络所需的立足点。


区块链安全咨询公司 曲速未来 的一个目标是在当今复杂且不断发展的环境中识别和阐明各种威胁。通过分析和负责任的披露,引导产品制造商采取更全面的安全态势。




使用 设备 地址 发现 系统
分享到:

1.TMT观察网遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2.TMT观察网的原创文章,请转载时务必注明文章作者和"来源:TMT观察网",不尊重原创的行为TMT观察网或将追究责任;
3.作者投稿可能会经TMT观察网编辑修改或补充。