DEFCON 27 Conference。Buttplug:真正的渗透测试。第2部分

分析人士认为,目前大约有100亿来自物联网(IoT)的设备。有时,这些设备在市场上占有一席之地,从字面上讲是在攀登人类。事实证明,便宜,低功耗的无线电芯片不仅非常适合家庭自动化,而且还改变了人们与性玩具互动的方式。在本报告中,我们将深入探讨电视迪拉尼克世界,这是一种在两性之间通过双向通信线在伴侣之间传递触觉,温度和其他感觉的技术。演讲者将告诉您,Buttplug电子电子肛门性玩具的安全性可能与攻击者相对,后者发现并利用堆栈中每个级别的漏洞。最终,这使性玩具本身受到损害,以及它们连接的设备。



绰号为smea或Smealum的黑客开始了他的职业生涯,最初是为诸如Nintendo DS之类的游戏机开发视频游戏,同时试图破解它们。在某些时候,这些控制台获得了严格的安全系统,Smea从本地开发的软件转向了破解该软件的技术。 Smea以其在Nintendo 3DS和Wii U上的“工作”而闻名,尽管它也为最流行的Web浏览器和虚拟化堆栈的漏洞利用开发做出了贡献。大概,现在他对打入“智能”肛门塞感兴趣了。

DEFCON 27 Conference。Buttplug:真正的渗透测试。第1部分



当然,即使行长这么短,您也可以管理传入的消息。例如,30个字符足以执行恶意JavaScript。这张幻灯片显示了一个示例标签,该标签的长度为30个字符,用于来自不存在的源的图像<img src = a onerror ='alert(1)'>,这将导致应用程序显示错误消息。当确实无法加载图像时,将显示此消息。屏幕快照显示,通过受损的加密狗进行连接可以使您执行恶意JavaScript。



32个字符的限制很烦人,因为很难实现批量有效负载,但这很有可能。因此,您看到我们已经成功地使用USB密钥破坏了应用程序,并且现在正处于逆向黑客攻击的中途,也就是说,已经使用黑客自举程序破坏了应用程序。在加密狗计算机站点上的黑客攻击有两种发生方式:通过计算机,您可以破坏加密狗;通过加密狗,您可以破坏计算机。

加密狗充当引导插件和应用程序之间的小桥梁。问题出现了:是否可以使用相同的漏洞通过引导程序直接破坏计算机上的应用程序。不幸的是,这个问题的答案是否定的,原因是从启动插件到应用程序的消息字符的长度还有另一个限制。



加密狗仅打包启动插件的消息并将其发送到应用程序,在这一步,您可以将HTML代码插入其中。但是,它一次只能接收不超过20个字节长的消息,这不足以进行XSS攻击。但是,加密狗固件中存在一个错误:行末没有检查空终止符。因此,如果您可以将一些未初始化的数据放在20个字符的字符串的末尾,那么您将能够向应用程序发送20个以上的字符。不幸的是,我没有找到在实践中使用此漏洞的方法,但是值得牢记这样的机会。

因此,问题在于您可能无法利用此漏洞来强制应用程序执行直接从启动插件接收的代码。令人遗憾的是,但更可悲的是,如果您查看加密狗固件,则可以看到它原则上不会对接收到的数据执行任何操作,而只是将其复制到新行并进一步发送。因此,我们将无法利用其漏洞通过溢出内存缓冲区来进行攻击。但是,如果不可能直接从启动插件中破解应用程序,那么是否有可能通过启动插头加密狗计算机链来做到这一点?
好处是,加密狗芯片使您可以放置​​比原始Lovense Hush开发人员程序所需更多的代码。



加密狗的闪存包含一个为DFU加载器保留的区域,一个Lovense应用程序本身的区域以及一个用于Nordic Semiconductor BLE芯片的硬件驱动程序的封闭的SoftDevice区域。这是BLE协议本身的处理位置。例如,当应用程序想要向玩具发送BLE消息时,它通过SVC调用访问SoftDevice。除了这三个区域外,加密狗还具有足够大容量的闪存未使用区域。
要在BLE SoftDevice堆栈中找到漏洞,您需要使用逆向工程,因为它不是开源的。为了找到固件插件的漏洞,我做了同样的事情。在这种情况下,很容易跟踪数据流,因为那里也没有ASLR,并且很容易确定将处理这些消息的代码。



在幻灯片的右侧,您可以看到GATTC传入数据包处理程序(具有公共属性的配置文件),从本质上讲,它是一个加密狗。特别是,它是按响应数据包类型的读取处理程序。我不是蓝牙设备方面的专家,但是我认为这里的要点是,加密狗读取外围设备的类型,并使用处理程序处理与该类型相关联的所有属性类型。这意味着实际上您一次可以获得多个属性,并且一对属性数据的每个处理程序的大小都被编码为包内的字段,从而可以对其进行管理。



幻灯片显示了此类包装的示例。 GATT客户端可以发送按类型读取请求数据包,其中包含要读取的描述符的类型和范围。响应按类型读取的服务器返回与此类型对应的范围内的处理程序相关的数据。通过将剩余数据包的长度除以描述符/数据对的字段长度来确定描述符/数据对的数量,并且该字段始终为0x7或0x15。



幻灯片显示了我们感兴趣的功能的操作:您将看到如何用属性数组中的数据填充数据包,并为其分配固定的缓冲区长度。这是放置描述符值的位置,然后是与之关联的指针。属性数组是二进制数据,以十六进制格式放置在缓冲区中。数据以蓝色突出显示,其旁边是0D描述符及其关联的指针00,并以橙色突出显示。第二个和第三个处理程序的程序包看起来相似。

该漏洞如下。如果阅读右侧的代码,则可以看到放在紫色框中的attribute_data_length参数-传入消息的长度,其值完全由潜在的攻击者控制。如果在此处放置零值,则会出现无限循环。



循环变得无限,因为代码没有检查它写入输出缓冲区的数据是否在此输出缓冲区内。结果,由于该设备没有ASLR或DEP,并且代码立即执行,我们得到了经典的堆栈缓冲区溢出。

分配零值并获得无限循环,实际上您将所有RAM数据替换为垃圾。但是,这是不成功的解决方案,因为它很可能导致设备故障。但是,如果您使用的值为1,则它将限制传入消息中的字节数。这意味着以下情况-您可以稍微过量填充此缓冲区,然后基于堆栈的缓冲区将能够损坏其旁边的所有内容。



让我们看看堆栈在溢出之前是什么样的。我们讨论的缓冲区属性数组以黄色突出显示,保存的寄存器以蓝色突出显示,返回地址以橙色突出显示。通过将属性长度设置为0x01,我们可能导致许多句柄/数据指针对溢出。描述符由2个字节组成,但DWORD描述符的前两个字节未清除。我们溢出的缓冲区在没有cookie,没有ASLR,没有DEP的堆栈上。



接下来,我们测试系统:发送一个完整的0xDA字节的数据包,其属性长度为0x01。事实证明,我们使用指向属性数据的指针重写了返回地址。由于没有DEP,这意味着每次函数返回时,将执行包中的代码。唯一的限制是我们需要将返回地址的LSB设置为最低有效位,因此代码以Thumb模式运行,因为Cortex M0处理器不支持ARM模式。



我们还重写了几个局部变量,同时确保不重写返回中使用的任何内容。基本上,我们得到了经典的后门程序包。如果您注意此堆栈,您将看到重写的堆栈与边框不对应,这将导致程序崩溃。

关于存储的寄存器还有另一个要求。这些是局部变量,函数返回时也会被覆盖。



其中之一用于取消引用32位边界,并且内容与边界不匹配将导致程序崩溃。因此,您需要确保saved_arg_3 = 0,saved_arg_4对应于DWORD,即它在边界内并且设置了LSB。

因此,我们需要确保该程序包正在运行。幸运的是,这确实很容易,因为SoftDevice分发这些传入数据包的方式是一个环形缓冲区,没有任何强制性的对齐要求。 Whiteshark使得可以通过更改前一个数据包的长度来验证可以控制后一个数据包的对齐方式。



黄色和蓝色突出显示的2个程序包在发送漏洞利用程序包之前发送。这使我可以控制最后一个程序包的对齐方式,并使其不会导致程序崩溃,这正是我们的目标。

我注意到存在一定的工程障碍:Nordic SoftDevice不提供用于发送原始BLE数据包的接口。要绕开它,您可以使用2个选项:实现您自己的BLE堆栈或破解原始程序包中的某些挂钩。由于我很懒,所以我选择了选项2。

这些挂钩非常简单,但是需要一些反向工程。可以在github上找到黑客方法,界面相当“肮脏”,不能保证它会起作用,但是我做到了。使用BTLEJack还是更好。

void ble_outgoing_hook(uint8_t* buffer, uint8_t length);

每当发送BLE数据包时,都会调用此SoftDevice指针,因此可以预先对其进行修改:

int ble_incoming_hook(uint8_t* buffer, uint16_t length);

每当接收到BLE数据包时,此钩子SoftDevice就会调用。返回值确定是否应跳过正常的SoftDevice处理。

int send_packet(void* handle, void* buffer, uint16_t length);

这就是将原始数据包发送到此BLE连接的功能的样子。

如何一次处理超过4个字节的代码?需要发送一些包裹!在右侧,您会看到传入BLE数据包的环形缓冲区。第一个数据包以绿色显示:shell代码执行带有受控参数的函数调用,然后返回“ clean”。第二个数据包以黄色显示-这是一个数据缓冲区,可由函数调用使用。第三个数据包以蓝色显示-包含函数调用参数值的缓冲区,橙色-使用指令C1 E7启动漏洞的数据包。



返回纯函数后,我们可以重新发送该包。发送这4个数据包将执行加密狗中的任意代码,并且可以一遍又一遍地完成。



这很方便,因为通过这种方式,我实际上可以多次调用memcpy,以将较大的外壳代码二进制文件复制到RAM中。然后,我们调用此函数修补内存中的原始加密狗代码,并使用它来破坏计算机上安装的应用程序。由于XSS有效负载很大,因此我们不发送它,而是在加密狗自身的shell代码中生成它。外壳代码如下。



这些操作的结果是,可以获得以下内容:如果我们可以控制应用程序,那么我们可以控制加密狗和Bootplag。



在buttplag-dongle部分上有两种黑客攻击方式:加密狗可以破坏玩具,而buttplag可以破坏加密狗和计算机。额外的好处是,不仅在Lovense产品中,而且在使用SoftDevise S110,S120或S130作为BLE客户端的任何设备中都存在Nordic BLE漏洞。

因此,我们有机会使用Bootplag破坏应用程序。如何使用?我们仍然只是在Lovense应用程序中执行JavaScript代码,问题是,这给了我们什么?事实证明,lovense.exe应用程序在Medium IL上运行,并且在Windows上运行,提供了无限的可能性:即使没有管理员权限,您也可以访问计算机上的文件,可以执行任意代码,可以实现XSS并访问网络。等等



下一个问题:如果您可以创建一个不仅感染bootplag,而且感染用户计算机的勒索软件程序,是否有办法通过使其具有病毒性来进一步传播它?现在,我们已经在本地进行了黑客攻击,但是对于黑客来说,通过Internet获得对许多用户计算机的控制权将更为有用。我们如何做到这一点?玩具的社交功能,例如视频聊天,文字聊天,图像传输和遥控器本身,极大地扩大了攻击面。

远程控制是一个很好的目标,因为如果开发人员想要使用专有程序,则肯定会存在错误和漏洞。如何使用它?例如,您可以向伙伴发送包含命令的JSON对象,例如命令“ Vibrate:10”:

{
cate: "id",
id: {
DEADBABEBEEF: {
v: 10
}
}
}

在这种情况下,接收者分析传入的JSON,为玩具生成命令并将其进一步发送,这里有2种模式。第一种模式“ id:”向一个特定的性玩具发送命令,第二种模式“ all:”向所有远程玩具发送命令。
输入数据是否正确验证?由于JSON非常灵活,因此期待数字的代码可以获取整个字符串。如果我们可以控制发送给玩具的命令,则可能可以使用加密狗解析器错误。在下一张幻灯片上,橙色框显示输入数据的使用位置,蓝色框显示检查输入数据的位置。
该错误是应用程序未正确检查振动等命令的输入是否实际上是整数。在这种情况下,在“ id:”模式下,仅检查振动强度指数为n> = 0,并且如果传递的整数12大于零,则此参数将通过测试。即使您传递字符串,即引号“ 12”中的数字,系统也会接受它。它不会只接受数字和字母组合形式的字符串,例如“ 12test”。



如您所见,此检查不允许我们输入文本命令。但是,如果您查看代码的底部,则将看到相同的检查,只是这次应用程序检查条件n <0。现在,如果我们输入“ 12test”,那么我们将无法通过测试,因为应用程序将认为此表达式作为字符串不小于0。但是,如果我们输入形式不等式的字符串(“ 12test” <0),系统将认为它为true ,尽管实际上这不是整数,也不是数字,而是字母数字组合。从本质上讲,这意味着我们可以在此命令中输入一个任意字符串,该字符串将发送到加密狗。这使我们能够以与之前通过JSON解析器破坏加密狗相同的方式发送漏洞利用代码。唯一的区别是,现在可以通过Internet完成此操作。



因此,由于用于检查传入数据的筛选器实现中存在错误,我们有机会通过Lovense应用程序远程破坏加密狗,从而可以破解用户的计算机。窃听软件狗是一件好事,但成功的条件是伙伴同意将玩具的远程控制权转让给伪装的攻击者。这对于有针对性的攻击很方便,但完全不适合病毒式攻击。

但是,文本聊天和图片不需要任何权限,通过在聊天文本消息中发送恶意HTML代码,可以完美实现经典的XSS攻击。分发病毒变得微不足道:只需创建正确的JavaScript函数并向您的朋友发送垃圾邮件即可。



在这个阶段,我们只能通过发送一条消息来执行代码,并且基本实现了我们的目标。最终的XSS有效负载如下所示:

  1. 请执行受害者机器上应该发生的所有事情。
  2. 抓取一个允许您访问聊天的JavaScript对象。
  3. 发送一个XSS有效负载,该负载将此脚本下载到您所有朋友的计算机上。


因此,我们破坏了从启动插件到Internet的网络的每个节点。现在,您可以从任何设备入侵任何设备-我们创建了对接蠕虫或称为“ ass蠕虫”的病毒。



如我所言,现在我将向您展示一个实时视频。我将显示的第一件事是使用BTLE插孔拦截引导插件与加密狗所连接的常规Windows虚拟机之间的连接。现在,我将尝试打开行李箱-希望大家听到振动的声音! (笑声)。因此,它成功了,现在我将尝试将玩具添加到应用程序控制面板中。看到程序找到了Hush,请稍等!我忘了开始BTLE插孔过程。您需要在此模式下使用BTLE插孔的唯一原因是因为它使实时演示更加容易,但是实际上,您可以侦听现有的连接而无需监听。因此,我为了简化实验而启动了这个程序。让我们再重复一遍。您会看到与玩具的连接已建立。



左侧的嗅探器表明已找到此连接。因此,我们有一个与性玩具相关的应用程序。我不知道您是否真的可以控制启动插件(smea向上滑动滑块,然后听到放大的振动声)。现在,我关闭此设备(将滑块向下移动,振动声消失)。现在,我需要破解此连接。为此,我复制了几个参数,并将其粘贴到smea @ ubuntu行中,最后输入t参数-截取连接的命令。



如果可行,则将终止与应用程序的连接。如您所见,应用程序窗口中出现一条消息,指示与设备的连接已丢失。感谢BTLE插孔提供的出色工具!引导日志已与应用程序断开连接,现在可以通过ubuntu虚拟机进行控制。从理论上讲,我们应该能够使其振动。我输入了Vibrate 20小组,正如您所见,一切正常-我们能够在没有官方应用程序(观众的掌声)的帮助下远程控制Bootplag。现在,我将其置于DFU模式,如果可行,那么我将不得不停止此操作。输入适当的命令,振动停止。



现在,我带上智能手机,并检查是否可以通过应用程序重新连接玩具。在我的应用程序中,我找到了固件插件的更新,并选择了目标DfuTarg(必须在其上更新固件的设备,但实际上是将恶意软件引入其中)。



您会看到更新过程如何进行。屏幕上出现一条消息,表明设备固件已成功更新。现在,我将再次尝试将bootplag连接到计算机上安装的应用程序,您会看到发生了什么:勒索软件屏幕保护程序出现在屏幕上(听众鼓掌)!



“糟糕,您的屁股插头已加密!在3天内用50美元的比特币支付恢复对这个重要玩具的访问权,否则一周之内,您将永远失去它。”它是这样工作的!

因此,您在软件狗上执行了代码,然后在计算机上并通过Internet执行了启动插件。如您所见,就安全性而言,此对接插头非常薄弱,可能是朝鲜制造的。您看到我安装了一个虚拟机,该虚拟机运行该应用程序而未连接到加密狗或其他硬件。该虚拟机刚刚连接到Internet,并且似乎已连接到我朋友的计算机上。因此,我们已经成功实现了勒索软件的病毒传播。

我认为,从上述所有内容中,我们可以学到一些有用的教训。以该设备为例,我们研究了物联网世界的脆弱性。有些设备用于维持生命,人们并没有意识到这些新技术的脆弱性。黑客入侵一件“智能”物品,就可以通过互联网连接家里的其他“智能”设备。我希望我的研究结果不仅适用于性玩具。另外,我打算学习有关此内容的所有代码,因此请加入我的Twitter。如果您想开始破解自己的启动循环,我今天还将在GitHub上发布我的工具。



我要感谢所有帮助我进行渗透测试的朋友,并向我介绍了战斗中的极端同性恋者。我不会说名字,但是亚伦,你自己知道你是谁(笑声)。谢谢大家,太棒了!


一点广告:)


感谢您与我们在一起。你喜欢我们的文章吗?想看更多有趣的资料吗?通过下订单或向您的朋友推荐给开发人员的基于云的VPS,最低价格为4.99美元这是我们为您发明的入门级服务器 独特类似物:关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器?(RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗?在荷兰2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起!阅读有关如何构建基础设施大厦的信息。使用Dell R730xd E5-2650 v4服务器花费一欧元9000欧元的c类?

All Articles