物联网是一个术语,用于指代连接到网络的嵌入式设备。一些设备被改装以包括连接它们到网络的模块,而其他一些是为特定需求而创建的尖端设备。在每种情况下,这些设备都对企业、国家和个人的安全构成风险。无论您是新手渗透测试人员还是经验丰富的渗透测试人员,《物联网渗透测试食谱》都包含了帮助安全专业人员全面评估和保护物联网生态系统的食谱。
以下是本书的软件要求:
以下是本书的硬件要求:
本书适用于希望熟悉发现和利用物联网系统中的漏洞的软件开发人员、质量保证专业人员和安全专业人员,以及那些有兴趣采用积极的防御性安全控制的人员。
在本书中,您将经常看到几个标题(准备好了,如何做...,它是如何工作的...,还有更多...,以及另请参阅)。为了清晰地说明如何完成食谱,我们使用以下部分:
本节告诉您在食谱中可以期待什么,并描述了为食谱设置任何软件或任何先决设置所需的步骤。
本节包含了遵循食谱所需的步骤。
本节通常包括对上一节中发生的事情的详细解释。
本节包括有关食谱的其他信息,以使读者更加了解食谱。
本节提供了其他有用信息的链接。
在本书中,您将找到许多文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。文本中的代码词,数据库表名,文件夹名,文件名,文件扩展名,路径名,虚拟URL,用户输入和Twitter句柄显示如下:
“如果我们通过双击打开preferences文件,我们将看到存储在未受保护存储中的OAuthaccess_tokens和refresh_tokens(CVE-2017-6082)。”
代码块设置如下:
adbpulldata/data/com.skybell.app/files/default.realm/path/to/store/realdb新术语和重要单词以粗体显示。您在屏幕上看到的单词,例如菜单或对话框中的单词,会以这样的方式出现在文本中:“单击查看类转储以列出应用程序的类详细信息。”
警告或重要说明会以这种方式出现。
提示和技巧会以这种方式出现。
尽管IoT这个术语据信是由麻省理工学院的Auto-ID实验室于1999年创造的,嵌入式设备在技术领域已经存在了几十年。新IoT和嵌入式设备世界之间的区别在于设计决策和配置的遗留问题,这些决策和配置从未打算公开在互联网上。由于制造公司没有考虑后果,目前正在发生对IoT设备的广泛利用,导致了有史以来一些最大的分布式拒绝服务(DDoS)攻击。我们将涵盖IoT渗透测试的各个方面和实际的安全指导,以提供针对当前市场上出现的攻击的预防措施。
要了解IoT的起源,您可以访问此链接:
在本章中,我们将涵盖以下主题:
本章的目标是为IoT渗透测试奠定基础,然后将在接下来的章节中使用。
本章重点介绍进行IoT渗透测试时所需的基础知识。它提供了关于IoT内部许多攻击面的基本概念,并为协助测试人员启动IoT测试实验室奠定了基础。
我们将讨论当前IoT渗透测试的状态以及可能的攻击面的每个领域,以解决测试在多年来的进展。然后我们将介绍固件安全、Web应用程序安全、移动应用程序安全、硬件安全和无线通信的基础知识。
最后,我们将指导您如何设置所需的软件工具和硬件工具进行测试。
现在这些法律已经通过,这就是我们介入的地方;我们将进行设备固件、Web应用程序、移动应用程序、硬件和无线通信的评估。首先,我们需要了解物联网的全部范围,包括渗透测试方法和生命周期,以识别所有的攻击面。让我们讨论每个物联网组件的基础知识,以便了解攻击。
对应用程序、网络和设备进行安全漏洞测试对于保持互联网更安全更重要。无论是由制造商、第三方咨询公司、企业安全团队还是安全研究人员进行测试,方法都会根据测试人员获得的信息而有所不同。理想情况下,全面的测试应该包括整个物联网系统及其基础设施,而不仅仅是设备本身,但由于价格或技术能力的原因,测试通常只包括物联网系统的一个子集也是常见的。
黑盒评估是常见的,通常以相对较低的成本进行。这些类型的评估是在没有关于所使用的技术或设备实施的先验知识的情况下进行的。往往情况下,黑盒评估是由安全研究人员或第三方咨询公司进行的,但也可以由内部安全团队进行风险评估。
负责任的披露说明
白盒评估是指测试人员被允许完全访问源代码、网络图、架构图、数据流图以及目标设备所使用的其他详细信息。通常情况下,测试人员事先获得的目标设备或应用程序的信息越多,测试结果就会越好。白盒评估成本更高,但也确保了对设备安全控制及其实施的更彻底审查。
灰盒评估是在测试人员有限或部分了解的情况下进行的,组织内部人员知道这些情况。这些评估可能包括测试人员只知道应用程序堆栈和所使用的库,但没有关于API的详细文档。
固件是一种写入硬件设备以控制用户应用程序和各种系统功能的软件。固件包含低级编程代码,使软件能够访问硬件功能。运行固件的设备被称为嵌入式系统,其硬件资源有限,例如存储能力和内存。运行固件的嵌入式设备的例子包括智能手机、交通信号灯、连接的车辆、某些类型的计算机、无人机和有线机顶盒。
您可以在此链接了解更多关于固件的信息:
以下图表代表了固件包含的内容:闪存内容、引导加载程序、内核和根文件系统:
图1.1:固件内容
让我们首先看看引导加载程序。引导加载程序的责任是初始化RAM以用于易失性数据存储,初始化串行端口,检测机器类型,设置内核标记列表,加载initramfs(初始RAM文件系统)并调用内核映像。引导加载程序通过板支持包(BSP)初始化硬件驱动程序,通常由第三方开发。引导加载程序位于单独的可擦写可编程只读存储器(EEPROM)上,这种情况较少见,或直接位于闪存存储器上,这种情况较常见。可以将引导加载程序视为PC启动时的BIOS。详细讨论每个引导加载程序的责任超出了本书的范围;但是,我们将强调引导加载程序如何对我们有利。一些常见的ARM和MIPS架构引导加载程序包括:Redboot、u-boot和barebox。一旦引导加载程序启动内核,文件系统就会被加载。
固件中使用了许多文件系统类型,有时甚至会根据设备使用专有文件类型。然而,一些最常见的文件系统类型是SquashFS、cramFS、JFFS2、YAFFS2和ext2。在设备中(尤其是消费者设备)使用最广泛的文件系统是SquashFS。有一些实用工具,如unsquashfs和修改后的unsquashfs,用于从压缩的文件系统中提取数据。当供应商更改SquashFS以使用不受支持的压缩(例如LZMA,SquashFS4.0之前,唯一官方支持的压缩是.zlib)时,将使用修改后的unsquashfs工具,并且文件系统的起始偏移量将与常规SquashFS文件系统不同。我们将在本书的后面部分讨论定位和识别偏移量。
Sasquatch是一个方便的工具,可用于提取修改后的SquashFS文件系统。Sasquash可以在以下链接找到:
在文件系统中,特定设备的代码存放在C、C++或其他编程语言(如Lua)中。特定设备的代码,甚至整个固件本身,可以是第三方开发者承包的,称为原始设计制造商(ODM),或者是与原始设备制造商(OEM)合作的内部开发者编写的。ODM是嵌入式设备开发供应链中的重要组成部分。它们通常是亚洲的小公司,数量众多。一些OEM与他们信任的ODM合作生产产品线,而另一些则会与只有一个产品的ODM合作,费用最低。根据行业的不同,ODM也可以被称为供应商。需要注意的是,ODM可以自由地与许多不同的OEM合作,甚至可以分发相同的代码库。您可能对这个概念很熟悉,甚至想知道为什么一个关键的公共警告会影响十多个设备制造商的软件漏洞。这是由于ODM缺乏安全的开发生命周期流程,以及OEM的验证不足。一旦ODM完成他们的应用程序交付物,可能是SDK或固件,交付给OEM,OEM将把自己的代码库合并到固件中,这可能只是在Web界面上放置OEM标志。实施方式取决于ODM和OEM如何合并他们的代码;然而,ODM向OEM提供二进制文件并不罕见。OEM负责分发固件,管理固件,并支持设备本身。这包括第三方研究人员报告的固件安全问题,如果ODM保留源代码,而OEM只能访问二进制映像,这会给OEM带来压力。
在第三章中,《分析和利用固件》,我们将学习如何通过识别文件系统、识别压缩和模拟二进制文件进行测试,来逆向工程固件二进制映像,以利用常见的固件问题。
网站,又称为网络应用程序,无需介绍。至少,网络应用程序包含前端HTML,JavaScript,后端Web服务器,应用服务器和数据库。随着网络应用程序的发展,对前端代码(如JavaScript)的重度依赖越来越多,以便将计算负载从后端基础设施或设备上卸载。在更大范围的互联网上,网络应用程序与通过嵌入式设备提供的网络应用程序略有不同。
今天在物联网领域使用的Web应用程序有两种不同的模型,例如混合云模型和嵌入式服务器独立模型。混合模型是供应商或制造商提供软件即服务(SaaS)Web应用程序,并连接到运行在固件上的嵌入式设备的Web应用程序的混合。然后,数据从制造商的云与设备上的设备在设备的本地网络上同步。对于一些物联网设备,会利用物联网云服务提供商的SDK,例如AWS的物联网SDK和Azure的物联网SDK,并内置到设备的Web应用程序堆栈中。识别混合模型对于遵守公司的服务条款以及您所在地区的法律范围非常重要。许多利用混合模型的物联网公司通常使用第三方软件开发公司或ODM代表OEM托管其Web应用程序。这些ODM的Web应用程序通常会为特定的OEM产品重新打包,而在没有代理通信的情况下可能不会被注意到。
具有互联网功能的物联网设备的混合云模型可能如下图所示。用户访问设备的界面,供应商的云和用户设备之间的Web服务在幕后进行更改或收集数据:
图1.2混合Web模型
以下图示演示了用户通过Web浏览器连接到嵌入式独立Web应用程序,而无需外部系统依赖:
图1.3:本地嵌入式Web应用程序
浏览器、嵌入式服务器和Web应用程序服务器之间的通信通常通过Web服务进行,例如简单对象访问协议(SOAP)/XML或基于表述状态转移(REST)的API,通过HTTP/HTTPS进行。SOAP请求包括一个信封元素,一个xmlns:soap命名空间,一个encodingStyle属性,以及诸如SOAP主体元素之类的各种元素。有关SOAP的更多详细信息,请访问以下链接:
一个查询账户余额的HTTPSOAP请求示例如下所示:
一个订阅test@example.com电子邮件地址到电子邮件分发列表的REST请求示例如下所示:
POST/rest/email/subscribeHTTP/1.0Host:example.comUser-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10.12;rv:49.0)Gecko/20100101Firefox/49.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Content-Type:application/jsonContent-Length:160Connection:close{"subscriberId":"12345","emailAdress":"test@example.com","confirmed":"Y"}为了查看SOAP或REST请求,需要使用中间人代理。诸如BurpSuite和/或OWASPZAP之类的工具被用作Web代理,以查看从浏览器和移动应用程序到应用程序的Web后端基础设施发出的所有请求。我们将在第四章中后面的设置配置来代理应用程序流量。
就物联网而言,Web应用程序是控制设备的常见方式,也是内部和外部网络角度的攻击入口之一。在第四章中,《嵌入式Web应用程序的利用》,我们将学习如何识别常见的物联网Web应用程序缺陷和漏洞。
在物联网领域,移动应用程序与先前讨论的Web应用程序模型类似。虽然讨论移动设备平台的安全模型的具体细节超出了本书的范围,但对移动应用程序开发模型有基本的了解将有助于在前进时进行测试。
安装在Android、iOS或Windows手机设备上的移动应用程序可以是混合应用程序或本机应用程序。虽然混合和本机这两个术语在移动应用程序的意义上与Web应用程序有所不同,但原则是相似的。混合应用程序利用Web技术(如HTML/HTML5、CSS和JavaScript)以及一些本机平台硬件(如GPS或蓝牙)。对硬件资源的访问仅通过混合框架提供的插件。将混合应用程序视为打包到本机平台可以使用的包装器中的Web应用程序。这意味着Web开发人员现在可以编写移动应用程序,而无需学习新语言。
混合应用程序为多个平台使用一个代码库,例如WindowsPhone、Android和iOS,这在考虑首次推出物联网设备时是一个巨大的优势。应用程序通过嵌入的Web浏览器(称为WebView)在Web上调用。市场上有许多混合框架,如ApacheCordova、AdobePhoneGap和Xamarin等,这些都是目前最受欢迎的应用程序使用的框架。
每个移动混合框架都包含一个第三方市场,其中包含各种功能的插件。一些框架,如Xamarin,是用一种编程语言(C#)编写的,并被翻译成本机语言(ObjectiveC和Java)以实现快速开发。这些移动框架已知存在许多安全警报,从本机平台上的关键远程代码执行问题到隐私问题。如果您注意到某个特定的移动混合框架正在被使用,那么查看漏洞数据库可能是一个不错的主意。
为了让您更好地了解运行混合应用程序所需的架构,以下图表显示了应用程序代码、WebViews、插件和移动设备本身之间的不同组件。请记住,大多数包装器代码和插件是由混合框架或为框架做出贡献的第三方开发人员开发的:
混合应用程序示例
本机应用是为特定操作系统构建的,并在设备平台的本机语言内编写,例如Java、ObjectiveC、Swift,甚至Windows手机的C#。本机应用使用各自平台的SDK,使应用程序可以访问摄像头、蓝牙和GPS等硬件。本机应用的性能和安全性更好,但依赖于懂得本机语言的经验丰富的开发人员。在某些情况下,这可能对开发人员的人员配备造成困难,因为平台API经常更新和废弃语言类或方法。越来越多的平台,如iOS和Android,正在开发本机安全API,开发人员可以利用这些API,而无需使用第三方库。这对于安全通信和安全数据存储非常重要。
本机架构比混合应用架构简单得多。以下图表显示了本机应用在设备上直接运行本机代码,无需第三方组件来访问硬件资源:
本机应用示例
了解每种移动应用模型的优缺点对于有效的测试非常重要。由于设备控制被委托给移动应用程序,它们是设备的另一个攻击入口点,有时比其他入口点更容易。在第五章中,对物联网移动应用程序的利用,我们将深入研究物联网移动应用程序中一些最常见的漏洞,同时剖析物联网设备。
设备硬件从印刷电路板(PCB)开始,由玻璃纤维、铜、焊膜、丝印、走线和焊盘组成。电阻、电容、Wi-Fi芯片、EEPROM和串行和微控制器等组件被焊接到PCB上。PCB有各种薄铜箔层,使其导电,也有绝缘层,使其不导电。在查看PCB时,识别感兴趣的组件非常重要。感兴趣的组件包括直接或间接成为设备固件输入源的组件。EEPROM、NAND闪存、通用异步收发器(UART)和联合测试行动组(JTAG)等组件是测试的重点。
这是数字视频录像机(DVR)的PCB板的样子:
PCB板
EEPROM
NAND闪存存储器以块的形式写入和读取,通常在USB驱动器中找到,但也存在于物联网设备以及游戏机中。NAND闪存通常包含设备的引导加载程序,遵循各种指令启动操作系统,并且可以被操纵;我们将在本书的后面为您详细介绍这一点。
物联网设备最常见的连接和交互方式是通过无线射频(RF)通信。在当今市场上使用了许多不同的无线频率、调制和协议。一些无线协议是专有的,而其他一些是标准的。打开设备将揭示一个或多个执行无线通信的芯片。这对于需要接收各种不同无线通信协议和频率的物联网网关和中心非常常见。无线技术的优势之一是能够远程控制设备。这也是利用具有无线通信的设备时的情况。重要的是要了解每种无线技术的距离能力。一个无线协议可能有105英尺(约32米)的距离,而另一些可能只有20厘米。在物联网生态系统中有许多无线协议,其中一些最常用的协议包括Wi-Fi(802.11)、ZigBee(802.15.4)、Z-Wave、蓝牙(802.15.1)和蓝牙低功耗。
Wi-Fi是多年来许多设备中使用的最常见的无线技术。它在2.4GHz和5GHzISM频段上运行。目前有许多正在使用的Wi-Fi标准,如802.11a、802.11b、802.11g、802.11n和802.11ac。802.11b和802.11g在2.4GHz频段上运行,而802.11a、802.11n和802.11ac使用5GHz频段。有14个无线信道,它们在不同的频率上运行。根据地区,Wi-Fi路由器可以在特定信道上进行广播。
ZigBee基于IEEE802.15.4规范,支持低功率无线网状网络的物理和媒体访问控制层。ZigBee根据地区在不同的ISM频段上运行,但在全球范围内主要在2.4GHz上运行,美国为915MHz,欧盟为868MHz。ZigBee由协调器(ZC)、路由器(ZR)和终端设备(ZED)组成。协调器自动启动网络的形成。网络中只有一个协调器,通常是用于验证和验证加入网络的每个设备的信任中心,并具有唯一的网络密钥。路由器从其他设备传递数据,并将路由关联到终端设备。
路由器必须持续供电,以便正确地将消息传递到网络。终端设备是物联网设备,如开关、传感器、摄像头或监视器。它们无法在网络内路由数据,但可以在不传输数据时进入低功耗模式。ZigBee网络基于两个安全密钥,即网络密钥和链接密钥。网络密钥用于安全传输通信,是一个与网络中所有设备共享的128位密钥。链接密钥用于安全地传输ZigBee应用层中的单播通信。链接密钥也是一个128位密钥,仅在两个设备之间共享。链接密钥可以预先安装在设备上,也可以通过密钥交换进行分发。在设备配对期间的易受攻击的密钥交换是消费者级ZigBee网络中已知的缺陷,这使得攻击者可以窃听交换网络密钥并破坏整个网络。
关于ZigBee安全漏洞的良好幻灯片可以通过2015年在Blackhat上举行的ZIGBEEEXPLOITED演讲找到。
Z-Wave是另一种低功率无线通信协议,支持主从模式的网状网络。它使用不同地区的次1GHz频段(美国为916MHz,欧盟为868.42MHz)。其物理和媒体访问层在ITU下被批准为国际标准G.9959。两个设备之间的Z-Wave范围为328英尺或100米,但当流量通过其网状网络中的Z-Wave产品时,可以达到600英尺或200米。Z-Wave网络由4字节(32位)的HomeID标识,这是控制器或主节点的唯一ID。同一网络中的所有节点共享相同的HomeID。每个节点由1字节(8位)的NodeID标识,这是控制器在加入网络后提供的。具有不同HomeID的节点无法相互通信。Z-Wave可以使用AES加密,由Z-Wave中心支持,但对于制造商来说,这纯粹是可选的。Z-Wave确实包括一个很好的信号干扰检测功能,可以防止拒绝服务(DoS)攻击。
蓝牙是一种常用的无线技术标准(IEEE802.15.1),用于短距离数据通信。蓝牙在2.4至2.485GHz广播,最远可达100米,但更常用于10米或30英尺以下。本书将包含蓝牙和蓝牙低功耗(BLE)测试技术,因为许多物联网设备确实使用了蓝牙作为主要通信手段。有关蓝牙的更多阅读,请访问以下链接:
现在,所有基础物联网技术都已涵盖,让我们开始设置物联网渗透测试实验室。由于物联网设备采用了一套技术,因此需要软件和硬件测试的多种工具。我们将使用一些付费商业工具以及免费工具。硬件和无线电分析工具需要一些前期购买。Web应用程序代理工具需要适度的许可费,但我们将尽量保持价格低廉,并在可能的情况下提供免费工具。
幸运的是,大多数固件分析工具都是免费且开源的。一些工具正在积极更新,而其他一些可能已经过时但仍然有效。以下是一些可以分析固件图像、反汇编图像并在运行时连接到固件进程的固件软件工具:
对于Web应用程序测试,最常用的工具是BurpSuite和OWASPZedAttackProxy(ZAP)。BurpSuite有免费和专业版本可供选择。ZAP完全免费且开源,可能是保持成本低的一个好选择。可以使用附加插件或附加组件来帮助进行Web服务和API测试。不幸的是,要在BurpSuite中安装插件,需要专业许可证。这里列出的所有工具都是跨平台的,因为它们要么是基于Java的,要么是在您的浏览器中:
与固件工具一样,大多数移动应用安全工具也是免费且开源的。将使用的移动工具根据以下移动平台进行了拆分。
截至本书撰写时,有许多Android测试工具和虚拟机可在网上找到。一些工具专注于静态分析APK的代码,而其他工具专注于运行时的应用程序分析。大多数Android测试虚拟机分发是免费的,并包含测试Android应用程序所需的必需品,如Android的SDK。尽管在这里列出了Android测试工具,但建议您下载适合您测试需求的Android测试虚拟机分发,并在该虚拟机中安装任何补充测试工具。
虽然不是必需的,但将Android测试工具与主机计算机分开将会导致更稳定的移动测试工作台,并防止依赖问题。
iOS测试工具是独特的,因为测试需要OSX计算机和越狱的iDevice。如果没有这两个先决条件,将无法测试iOS应用程序。以下是可能用于iOS移动测试的一些工具:
OSX计算机
以下列出的项目是要安装在主机计算机上用于测试和/或评估iOS应用程序的软件工具:
越狱的iDevice
以下列表包括需要安装到您的越狱设备上以开始测试的软件包:
硬件工具因被分析的特定设备而异;但是,对于所有硬件甚至电气要求都适用基本工具。制造商将使用不同类型的螺丝、外壳和安全位作为硬件拆卸的临时措施。有时,螺丝会隐藏在标签或橡胶脚下。识别螺丝类型很重要。我们将列出可绕过供应商使用的这种混淆技术的工具包。以下图片应该有助于了解一些不同类型的螺丝类型:
以下列出了本书中将使用的硬件工具和硬件分析软件的选项。
硬件测试工具需要一些前期投资才能开始。这里列出了拆卸设备、找到接地点和访问设备接口所需的必需和可选工具:
有关更多信息,您可以访问以下链接:
以下是一些免费的硬件分析工具。这些工具使我们能够访问硬件接口,例如控制台访问或将固件侧加载到设备上:
为了开始嗅探无线技术,需要特定的无线芯片组。在本书中,我们将专注于嗅探来自ZigBee和Z-Wave协议的流量。无线网卡或dongle需要配备特殊软件。这里提供了使用哪种无线网卡和分析软件的建议。
以下是将用于分析无线电频率的硬件列表:
以下是常见的软件定义无线电分析软件列表。大多数列出的项目将在本书中使用。
在本章中,我们将涵盖以下配方:
本章将讨论威胁建模的基本原则以及它如何帮助我们利用物联网设备中的缺陷。将执行有关如何对固件、Web应用程序、移动应用程序、设备硬件和无线通信进行基本威胁建模的配方,以帮助您正确入门。
一旦绘制出物联网设备的攻击面,就必须使用诸如STRIDE之类的方法来识别威胁使用案例,这将在后面讨论。这些威胁将需要使用评级系统进行评级,以确定发现威胁的风险。根据行业,有几种威胁评级系统;然而,最常见的是DREAD和通用漏洞评分系统(CVSS)。
DREAD评级系统代表以下内容:
DREAD具有从1到3的风险评级系统。1是低风险,2是中等风险,3是高风险。
以下表格描述了每个评级类别的每个评级数字:
STRIDE模型将威胁分为六类,以便提出问题来发现可能的威胁。这六种威胁类别源自缩写STRIDE,描述如下:
有关使用STRIDE的更多详细信息,请参阅以下链接:
微软提供的一种很好的威胁建模方法使用了一个多步骤的过程来确定新应用程序或系统引入的威胁的严重程度。威胁建模过程的步骤如下图所示:
有关微软威胁建模过程的更多阅读,请参阅以下链接:
我们将应用STRIDE和DREAD来从黑盒的角度进行威胁建模练习,并在每个步骤中分解物联网设备的组件。在开始任何类型的安全测试时,最好先进行威胁建模,以确保测试的覆盖范围已经到位。想象所有潜在的威胁可能性并将它们分类作为一种大脑锻炼也是很有趣的。
在这个步骤中,我们将使用微软的威胁建模工具,因为使用它可以很容易地绘制网络图表:
2016年,我们目睹了由IP摄像头和数字视频录像机(DVR)组成的大规模IoT设备的大规模利用,这导致了有史以来最大的分布式拒绝服务(DDoS)。这次DDoS是由于供应商的疏忽造成的,这本可以通过基本的威胁模型练习来防止。考虑到这些类型的设备在互联网上的普遍存在以及它们对互联网的风险,我们将进行威胁建模练习,并走过连接的DVRIP摄像头安全系统的威胁建模过程。这些连接的安全系统可以通过电子商务网站以及许多电子商店以相对较低的价格购买。连接的DVR是IoT系统的一个很好的例子,因为它们包含许多进入设备的入口,以便查看摄像头视频,并可以连接到第三方提供商以利用远程查看而无需在您的网络上打开端口。从黑盒的角度收集有关IoT设备及其应用程序的详细信息可能有些棘手。然而,可能有很多在线产品资源可用于帮助进行这项练习。
要开始威胁建模连接的DVR,我们将遵循前面提到的微软多步骤威胁建模方法。
创建架构概述有助于可视化我们如何攻击DVR以错误使用系统。在创建物联网设备架构概述时,我们的目标是记录DVR的功能及其应用程序以及从我们已经收集或在过程中学到的数据中的物理架构。我们希望发现DVR设计和实施中的缺陷。这还包括识别不同的技术。让我们分解如何创建架构概述为三个任务:
要开始记录DVR功能和特性,让我们创建一些用例。
用例1:用户通过本地Web应用程序在其本地网络中查看摄像头源
用例2:用户通过移动应用程序远程查看摄像头视频
前述列出的用例的以下架构图提供了DVR生态系统组件的详细信息:
一旦绘制了架构图,就需要识别和检查不同的技术。某些操作系统、协议和低级库具有固有的漏洞。重要的是记录所使用的技术,以进一步分析和定义可能的威胁案例:
接下来,我们将分析应用程序和协议数据流通过DVR环境,以找到设备或客户端应用程序的易受攻击的入口点。我们将寻找可能具有更高特权访问的位置,并记录每个可能的入口点。一个危害DVR机密性和完整性的入口点将使我们作为攻击者占据上风。
这些入口点将根据所使用的平台、技术和协议而变化,但在本节中,我们将保持在较高水平。还要检查技术和功能之间的各种信任边界。一旦分解DVR架构完成,您应该对攻击面有更好的了解,以及数据可能如何被威胁。
以下图表是分解物联网DVR环境数据流的示例:
在映射数据流并完成后,进行入口点的文档记录:
在这个阶段,我们已经绘制出了DVR系统的数据流,并确定了入口点。现在我们必须确定每个入口点的风险,因为它涉及用户、网络和应用程序,以及编写应用程序代码的供应商。从攻击者的角度来看,我们希望确定影响网络、应用程序和主机的威胁,这些威胁可能是可利用的,并造成以下影响:
为了帮助辨识威胁并对其进行分类,让我们将STRIDE模型应用于我们的DVR物联网系统。在下表中,我们将添加一些威胁类型,以代替物联网特定问题。这张表并不是详尽无遗的,但应该有助于思考可能影响整体DVR环境的威胁时提供一些想法:
或者,我们可以简单地列出高层次的威胁,然后在本章后面,我们将深入研究每个组件的威胁。一些威胁可能是未知的或完全理论的,因为我们可能没有所有的见解,但重要的是要进行头脑风暴。为了更好地识别威胁,可以与伙伴配对或与其他人一起进行小组练习,他们正在攻击您感兴趣的特定物联网系统。以下是我们DVR系统的高级威胁的示例,攻击者可能执行的:
接下来,我们将记录我们在第4步中识别的一些威胁用例,包括描述、威胁目标、攻击技术和可能存在的任何对策。
既然我们已经确定并记录了DVR的威胁,让我们使用DREAD评级系统对威胁进行评级,以及它们可能的影响。在本章的前面,我们介绍了DREAD评级系统,但需要注意的是,还有其他可用的评级系统。DREAD中每个字母的评级值范围为高3,中2,低1。
对于DREAD,最终风险是使用以下评级进行排名的:
我们的DVR系统中威胁案例的威胁评级示例如下:
最初,对整体DVR系统进行威胁建模可能会更加困难,因为需要考虑所有不同的组件的威胁案例。尽管如此,一旦完成,您将已记录了许多潜在的高风险漏洞,以便进行测试时专注于重点。这将使得在测试物联网系统时更容易优先处理漏洞。
在上一节中,我们对DVR系统进行了威胁建模,并对一个威胁案例进行了评级,这有助于优先处理要测试的漏洞。在本节中,我们将对相同的DVR系统的固件进行威胁建模。
要开始绘制图表,请执行以下步骤:
对于固件,我们可以通过设备包装、基本端口扫描或各种在线资源来确定正在运行的操作系统的类型。我们应该对嵌入式物联网设备上的固件功能有一个大致的了解,如第一章中所讨论的。本节不会像前面的内容那样详细,但我们仍然希望确定我们对固件的所有了解,并绘制其组件以确定测试的潜在威胁。我们将合并一些威胁建模步骤以简洁起见。
根据我们对固件和DVR提供的服务的了解,让我们使用以下表格来记录一些固件资产:
现在让我们根据我们的图表和对固件内容的了解来记录威胁。请记住,在这个阶段我们还没有对固件图像进行反汇编或定位。图表的内容是基于DVR宣传的服务和在线文档的假设。以下是攻击者可能利用的固件的可能威胁:
接下来,我们将挑选几个威胁案例,并记录它们的描述、威胁目标、攻击技术和可能存在的任何对策,以便评估它们的风险。
就像我们在上一个步骤中所做的那样,我们需要使用DREAD对每个可能的威胁进行评分。使用以下表格,我们将选择一个威胁并找出其风险评级:
大多数嵌入式设备操作系统通常以root或管理员身份运行。这意味着通过设备固件可能被利用的任何漏洞都应该给您所需的最高访问权限。没有必要进行特权升级。更受监管的行业可能会推迟,但如果您正在测试消费者设备,固件很可能已经以root身份运行。
在为我们的DVR进行威胁建模练习时,我们将继续分解其Web应用程序。我们的DVR包含两种类型的Web应用程序。一个Web应用程序是嵌入式的,从DVR本身运行。第二个Web应用程序是供应商提供的用于远程访问DVR及其摄像头视频的SaaS应用程序。
SaaS应用程序访问局域网中的嵌入式DVR。我们对在DVR上本地运行的嵌入式Web应用程序有更清晰的了解,而对供应商SaaS应用程序了解较少。在本章的前面,我们提到了供应商Web应用程序使用的一些技术,但目前没有其他信息。我们将从绘制嵌入式Web应用程序的架构开始,并在威胁部分涉及供应商SaaS应用程序,而不是绘制其未知的架构。
此时,我们应该对如何从头到尾进行威胁建模有一个很好的想法。考虑到这一点,我们将跳过威胁建模过程中的一些步骤,转向一些更重要的方面。
正如前面提到的,我们将绘制我们对嵌入式Web应用程序的了解,并致力于识别和评估其架构数据流中的威胁。以下图表说明了嵌入式Web应用程序的一些基本功能:
应用程序的流程很简单,因为流量只停留在局域网中,不会到达面向公众的流量。识别嵌入式应用程序的威胁不应该太困难。
由于嵌入式Web应用程序内的数据流具有简单性质,记录威胁应该很容易,尽管我们将添加一些额外的情景以考虑供应商SaaSWeb应用程序。
攻击者可以利用DVR嵌入式Web应用程序和/或供应商SaaS应用程序来执行以下操作:
接下来,我们将选择类似于以前的案例的威胁案例,并记录它们的威胁案例描述、威胁目标、攻击技术和可能存在的任何对策,以评估它们各自的风险。
使用以下表格,我们将选择一个威胁并找出其风险评级:
在我们的下一个威胁建模练习中,我们将检查DVR系统的IoT移动应用程序。这个DVR系统(像许多其他IoT系统一样)由经销商和不同的OEM开发了几个可用的移动应用程序。为了演示目的,我们将只对一个Android和一个iOS应用程序进行威胁建模。
由于我们已经从以前的配方中创建了大部分数据流图,我们将继续使用相同的Microsoft威胁建模工具进行此配方。
与我们上几个配方类似,我们将立即创建一个包含移动应用程序所有已知资产的数据流图。以下是移动应用程序的数据流图:
我们可以看到应用程序每次都会联系第三方供应商的云环境,以查看帐户详细信息和摄像头回放。当用户与DVR处于同一网络时也会发生这种情况。远程访问DVR需要用户名和密码,这也存储在移动设备中。在这一点上,我们不知道在与供应商后端系统通信时如何存储或发送这些数据。这引出了我们的下一步,识别威胁。
攻击者可以利用移动应用程序执行以下操作:
接下来,我们将选择与以前的配方类似的威胁案例,并对其进行评分。
使用以下表格,我们将选择一个威胁并找出其风险评分:
在移动领域,常见的威胁涉及数据及其存储和传输方式。因此,除非利用影响了大量用户或许多用户的数据被暴露,否则移动漏洞的风险相对较低。在应用程序测试期间,移动漏洞很少会导致服务器或移动设备上的shell。
现在是时候分析我们目标DVR的硬件威胁了。大多数消费级DVR都很容易打开和拆解,以检查它们的各种输入以及外围设备。这是因为需要扩展存储空间,或者仅仅是因为它们不像生产硬件安全模块(HSM)那样设计成重型设备,后者具有防篡改保护措施。
以下是DVR硬件的示意图:
根据图像描述,DVR上有八个用于摄像头的BNC连接器,两个USB端口,一个以太网端口,一个电源端口,一个VGA和一个面向DVR外部的HDMI端口。DVR内部有各种芯片,其中一个是EEPROM,可能在PCB板上有UART的输入。
攻击者可以利用DVR硬件输入来执行以下操作:
接下来,我们将挑选类似于之前的案例,并记录它们以评估各自的风险:
转向无线/无线通信,我们的DVR在无线通信方面并没有太多的活动,除了从客户端应用程序或摄像头传输到DVR的数据。大多数物联网设备和环境在不同频率上使用不同协议进行广播。幸运的是,我们只需要担心Wi-Fi和蜂窝供应商进入DVR的入口。
对于我们的无线电通信威胁建模练习,我们可以简单地更新先前绘制的图表,以反映设备和应用程序内发生的无线电通信。
DVR系统内无线通信使用的架构概述示例如下:
正如您可能已经注意到的那样,无线通信仅限于用户通过客户端设备(如浏览器和应用程序)访问DVR以及可选的无线IP摄像头。还要注意的是,我们的图表已经迭代,因为通过先前的威胁模型已经获得了有关DVR的更多信息。
攻击者可以利用无线通信来做以下事情:
接下来,我们将挑选类似于我们在以前的案例中所做的威胁,并记录它们以评估其各自的风险:
DVR环境中的无线威胁可以使用常见的无线中间人技术,相当简单。其他威胁,如添加假IP摄像头,可能会更加困难,对于寻求更大影响的攻击者来说可能不值得。
在本章中,我们将涵盖以下内容:
到目前为止,我们已经介绍了物联网生态系统的基础知识,并通过威胁建模识别了其相应的风险,以帮助我们的测试。一些漏洞和威胁可能更容易通过对正在使用的技术进行侦察来识别。在本章中,我们将把精力完全集中在逆向工程固件上,以分析其内容以在运行时进行操纵。我们将讨论如何分解固件,如何分析固件内容,其架构,使用常见固件工具,以及如何修改固件以进行恶意用途。与其他软件逆向工程方法一样,分析固件绝对是一门艺术。您将了解到一些工具将帮助我们寻找常见的缺陷;然而,分析固件二进制镜像的安全性在很大程度上是一个手动过程。
在开始分析固件之前,重要的是讨论获取固件的一般方法以及哪些数据对我们来说是重要的。这一步可能已经在之前对固件进行轻量级威胁建模的过程中完成,但让我们从讨论固件分析的目标开始。
固件是控制物联网设备的中心,这就是为什么我们可能希望在分析设备的其他部件之前先分析其内容。根据您的物联网设备所制造的行业,获取固件镜像并分解其内容可能是微不足道的。同样,一些行业领域需要特定的保障措施,这可能会使逆向工程变得更加困难和/或耗时。然而,在分析固件时,我们将寻找一些常见的模式。通常,评估者的最常见目标是定位以下内容:
在接下来的内容中,我们在分析固件时将有相同的目标。本篇将向您展示固件分析和逆向工程的概述方法。
以下是分析物联网固件的基本方法论列表:
为了开始审查固件内容,我们首先必须获取固件二进制文件。本节将介绍获取给定目标的固件的各种技术。
要获取固件,我们需要安装一些工具。我们将使用KaliLinux,默认情况下已安装了大部分我们需要的工具。以下是您需要的工具:
有几种方法可以从物联网设备获取固件。我们将在本教程中介绍大多数方法。固件图像可以通过以下方法获取:
获取固件的最简单方法是通过供应商的网站。
以下截图演示了如何从供应商网站获取固件图像:
有时,通过供应商的网站获取固件可能不是一个选择,您将不得不执行步骤2,在设备更新期间代理流量,或步骤3,直接从设备中转储固件。为了在设备更新期间代理流量,您必须是中间人(MITM)或在更新功能期间镜像设备流量。另外,也可以代理Web或移动应用程序,以便获取固件下载的URL。
您可能还需要调整用户代理标头,因为供应商已知会验证固件下载的这个值。以下是在KaliLinux、Ettercap、Wireshark和SSLstrip上执行设备MITM的基本步骤:
有几种方法和工具可以用于MITM流量到目标设备和从目标设备。下面的示例只是一种捕获设备流量的方法。
如果我们无法通过供应商网站或代理其流量获取固件,我们可以开始通过UART、SPI或JTAG转储设备固件。直接转储固件需要访问设备并拆卸设备以找到其闪存存储器。一旦找到闪存存储芯片,您可以直接连接您的UART引脚,或者使用8引脚SOIC芯片夹通过flashrom和SPI启用的硬件板(如Shikra)转储固件。以下是SOIC夹和Shikra如何连接到设备的方法:
用于将固件内容转储到bin文件的命令如下:
$flashrom-pft2232_spi:type=232H-rspidump.bin如果我们使用flashrom或之前描述的任何方法获取了设备的固件,现在我们需要分析固件二进制文件。
在这个教程中,我们通过从供应商的网站获取固件映像以及设置MITM测试平台来捕获设备流量,直接从设备中转储固件以及作为最后手段进行谷歌搜索。在这里,我将解释为什么我们要通过这些方法获取固件。
接下来,我们将介绍如何使用KaliLinux、SSLstrip、Ettercap和Wireshark设置MITM测试平台,以捕获设备更新期间的设备流量。
一旦我们拥有了固件,现在的主要步骤是分析固件。这涉及查看固件内部并尝试识别尽可能多的安全问题,这就是我们将在本节中进行的工作。
在这一部分,我们将了解一旦获得固件二进制包,如何分析固件。我们可以使用几种不同的技术来查看固件并识别其中的安全问题,我们将在本节中介绍如何入门并识别一些常见的安全问题。
如前所述,固件对于渗透测试人员来说包含许多有趣的东西,包括API密钥、私人证书、硬编码凭据、后门等。
为了分析固件,我们必须对其进行逆向工程,以查看其内部组件。固件的内部组件涉及引导加载程序、内核、文件系统和其他资源等内容。在这些内容中,我们最感兴趣的是文件系统,因为这将为我们保存所有的秘密。显然,你可以玩弄引导加载程序并查看它所保存的内容,或者修改它并创建新的固件(我们将在接下来的部分讨论),但在这个时候,我们只关心如何对固件进行逆向工程并从中提取文件系统。
固件,正如我们所知,是一个二进制文件包,文件系统只是可以存储在二进制文件中特定偏移量处并具有特定大小的组件之一。但是,此时我们尚不知道固件内部文件系统的任何信息,包括偏移量和大小。要找出这些信息,我们需要使用诸如hexdump和grep之类的工具来查找我们正在寻找的各种内容的签名。以下是Squashfs文件系统的示例:
让我们继续运行unsquashfs,看看我们是否可以查看整个文件系统:
这就是我们如何反向工程固件并从固件二进制映像中提取文件系统。我们还可以使用Binwalk等工具自动执行前面提到的所有步骤。由CraigHeffner编写,它允许我们仅使用一个命令从固件二进制映像中提取文件系统。
这就是我们如何从固件二进制文件中手动和自动提取文件系统。
您还可以手动向Binwalk实例添加更多签名并编译它以检测这些额外的文件系统。
您还可以使用Binwalk执行许多其他操作,例如检测给定固件映像的熵。这可以帮助您确定固件映像是否被压缩或加密。为了执行熵分析,请像下面的截图中所示,使用带有-E标志的binwalk,后跟固件名称:
正如您在前面的截图中所看到的,这个特定的固件似乎没有加密,因为在加密固件映像中会找到的大量变化缺失。
现在我们知道如何对固件进行逆向工程并从中提取文件系统,本节中我们将查看文件系统内容,并对其进行额外的漏洞分析。这将帮助我们更深入地了解如何在固件映像中找到安全问题,借此我们将能够破坏物联网设备。
有两种分析文件系统内容的方法:
在固件文件系统内容中寻找漏洞的方法中,我们对文件系统中存在的各种文件和文件夹进行分析。这可能涉及查看配置文件、web目录、密码文件、寻找后门等。这是发现给定固件中漏洞的理想方式,也是我们本节的重点。
在撰写本书的日期之前,除了一些脚本外,没有一个完整的套件框架或工具可以帮助我们发现固件中的漏洞。因此,如果您熟悉Web应用程序安全或网络安全,就没有类似于Arachni、w3af、Metasploit或类似工具。
让我们开始分析固件,看看我们是否能够识别出任何敏感信息或后门。
我们将用于此练习的固件是版本为DWR-932_fw_revB_2_02_eu_en_20150709的D-LinkDWR932B。这些漏洞是由安全研究人员GianniCarabelli和PierreKim发现的:
这就是我们如何在固件中找到隐藏的敏感信息。您显然可以继续寻找更多,并在固件文件系统中识别更多敏感信息。
现在我们知道如何对固件进行手动分析后,我们将继续通过自动化方法来识别漏洞。为此,我们将使用一个名为Firmwalker的工具,这个工具是由CraigSmith编写的,它通过静态分析帮助识别固件中一些常见的敏感信息。
一旦我们有了Firmwalker生成的报告,我们可以逐个查看所有不同的文件并进一步分析它们。在某些情况下,您还需要对ARM和MIPS架构的二进制文件进行逆向工程,以更好地理解它们并识别漏洞。
分析和理解文件系统及其内部内容完全取决于您的手动评估技能。这就是您能够识别漏洞的方法。即使在使用各种工具时,您也会意识到,最终归根结底是手动分析二进制文件或文件,并找出其中的漏洞。
要更深入地分析固件文件系统内容,您还可以使用固件差异技术,通过它您可以比较一个固件与其先前版本,并查看其中的差异。这将使您能够了解新版本中进行的安全修复和修改,并识别以前版本中甚至未公开的安全问题。
我们还可以对固件文件系统内容进行的另一项操作是查看已使用的各种库和组件,看看这些组件是否是带有漏洞的过时版本。
在使用物联网设备时,其中一个限制是我们无法在没有实际设备访问权限的情况下进行大量测试和利用。然而,在本节中,我们将讨论一种方法,您可以模拟您的固件,并与模拟设备进行交互,就像它是实际放置在您的网络上的设备一样。
为了模拟固件,我们将使用一种名为固件分析工具包(FAT)的脚本,这个脚本是由本书的作者编写的。FAT使用Firmadyne来执行固件映像的模拟。
让我们继续克隆FATGitHub存储库并设置它,使实验室准备好进行模拟。强烈建议在基于Ubuntu的系统上执行此操作,以避免在模拟过程中出现任何问题。
以下是步骤:
一旦您设置好了一切,就该是我们选择固件并模拟它,看看我们能够用模拟的固件执行什么了。
对于这个练习,我们将使用D-Link为其无线PoE接入点提供的固件DWP2360b。
这就是我们如何在没有访问设备的情况下使用FAT来模拟固件。
前面的模拟是基于QEMU和NVRAM模拟器的。NVRAM是固件访问以获取设备信息的组件。然而,由于没有物理设备存在,这将导致错误或服务崩溃。这就是NVRAM模拟器发挥作用的地方。Firmadyne工具包还修改固件以进行调试,以便用户访问控制台。
以下是FAT脚本中正在发生的事情:
所有这些步骤都可以手动执行,但是拥有像FAT这样的脚本可以加快速度。
现在我们知道如何模拟固件并进行基本分析,您经常会发现自己遇到需要进行额外分析的各种二进制文件。在一本书中不可能涵盖嵌入式设备可能的所有不同架构,我们将专注于两种流行的架构-ARM和MIPS。
然而,我们只会研究MIPS的利用,并稍微了解ARM的逆向工程。从利用的角度来看,ARM和MIPS非常相似,学习一种架构将为您提供另一种架构的基础知识和基本理解。
我们将从对D-Link固件中发现的后门进行非常基本的分析开始我们的二进制分析之旅。这个后门是由PierreKim发现的。要识别这个后门,需要对基于ARM的二进制文件有一个基本的逆向工程概念。尽管我们不会深入讨论寄存器和体系结构(因为我们将在MIPS体系结构中进行讨论),但这一部分将帮助您了解分析二进制文件并识别低悬漏洞的过程。
在这种情况下,我们将使用D-LinkDWR932B设备的固件。一旦我们使用Binwalk提取了这个固件,我们注意到有一个名为appmgr的二进制文件,这就是我们感兴趣的内容。
我们可以使用您熟悉的任何反汇编器-Radare2、IDA、Hopper等。在这种情况下,我们将使用Hopper来反向工程appmgr二进制文件,这是一个ARMLittleEndian二进制文件。
我们将使用Hopper的伪代码生成功能来更好地理解它。以下是步骤:
在字符串中查找telnet实例
从反汇编中访问伪代码
正如我们从前面的截图中所看到的,它对字符串HELODBG进行了strncmp。您可能已经知道,strncmp用于字符串比较,在这种情况下是检查二进制文件所需的字符串,以启动Telnet,这一点从高亮的框中可以看出。
因此,我们可以自信地说,appmgr后门寻找字符串HELODBG,一旦接收到该字符串,就会启动带有bin/shshell的Telnet。
这就是我们对ARM二进制文件进行非常基本分析的方式,可以用来查找敏感信息或漏洞,以及后门。
现在您知道如何对ARM二进制文件进行基本分析,我们还建议您阅读更多关于ARM汇编和其体系结构的内容。对汇编指令和底层体系结构的知识和理解将帮助您更好地理解反汇编,即使在伪代码无法帮助的情况下也是如此。
进行MIPS利用,我们主要会使用QEMU和chroot技术,这是我们在本章前面简要介绍过的。我们将研究如何在MIPS二进制文件上执行缓冲区溢出利用,并改变程序执行流程,使其执行我们想要的操作,而不是二进制文件原本应该执行的操作。目前我们不会涉及返回导向编程(ROP)等概念,保持简单。
对于这个练习,我们将需要并使用以下工具和实用程序:
DVRF是由b1ack0wl编写的固件,适用于基于MIPS的平台。尽管该固件是为LinksysE1550设计的,但可以在使用QEMU的模拟环境中运行,也包括执行利用:
如前面的截图所示,buf缓冲区容易受到缓冲区溢出的影响,我们的溢出目标是修改程序流程,使其指向dat_shell的地址,以便从中利用此漏洞获得shell。
如果您熟悉一些指令,您会发现这些指令很有用。反汇编以地址、指令和操作数的格式呈现。
MIPS共有32个通用寄存器,包括$zero、$at、$v0-$v1、c、$t0-$t9、$s0-$s7、$k0、$k1、$gp、$ra、$fp和$ra。在所有这些寄存器中,$a0-$a3用于存储函数的参数,$t0-$t9用于临时数据存储,$gp是全局区指针(我们在利用过程中尽量不修改GP),$sp是堆栈指针,$fp是帧指针,$ra是返回地址。还有一个额外的特殊目的寄存器称为程序计数器(PC),它存储下一条指令的内存地址,即当前正在执行的指令的下一条指令。
要控制基于MIPS的二进制程序的执行流程,我们只关心两个寄存器-RA和PC。当处理基于MIPS的二进制文件时,您会意识到控制PC通常比RA更困难。因此,在这个练习中,我们将专注于控制RA。
GEF还显示了在捕获异常时堆栈和寄存器的整个状态。在我们的情况下,我们可以看到RA被0x63616162覆盖,这只是baac的十六进制表示。
现在我们有了上述信息,让我们使用模式搜索功能来找到覆盖RA的字节的偏移量。有了这个,我们将能够找出我们应该放置恶意地址的位置,并控制程序的执行流程。
从前面的屏幕截图中可以看到,我们能够找到溢出寄存器RA的字符的偏移量,在这种情况下是204。这意味着我们需要204字节的垃圾来填满RA之前的所有内容,接下来的4字节将是用来覆盖RA的值。
从前面的屏幕截图中可以看到,dat_shell函数从0x00400950地址开始。然而,前三条指令使用了全局指针(GP),这不是我们此刻想要处理的。这就是为什么我们会跳转到0x0040095c而不是0x00400950的原因。
从前面的屏幕截图中可以看到,二进制文件现在已经按我们的要求执行了dat_shell函数。这就是我们在基于MIPS的平台上执行基于堆栈的缓冲区溢出的方法。
缓冲区溢出的整个基本概念是能够在缓冲区中放入比预期输入更多的字符,并以这种方式控制可能存在于堆栈上的寄存器。这也可以用于跳转到shellcode的位置或系统的libc库,并执行额外的有效载荷。
尽管我们可以在这个有漏洞的二进制文件中执行利用,但在现实世界的情况下,您可能会遇到更复杂的情况。其中之一是有趣的函数不会位于二进制文件内,您将不得不跳转到系统以执行bin/sh,或者创建一个ROP链来执行您的shellcode。
在利用过程中经常有用的技术之一是修改固件的能力。这可以通过从固件中提取文件系统,修改内容,然后将其重新打包成新的固件来实现。然后可以将这个新的固件刷入设备。
为了修改固件,我们将使用一个名为FMK的工具,由JeremyCollake和CraigHeffner编写。FMK利用Binwalk和其他工具从固件中提取文件系统,并为我们提供重新打包修改后的文件系统到新固件二进制文件的能力。
一旦我们提取了固件,它将为我们包含一个新目录,其中包括rootfs、image_parts和logs文件夹。对于大多数后门和固件修改目的,我们只关心rootfs文件夹。
rootfs文件夹包含固件的整个文件系统。我们所需要做的就是为固件的架构创建一个后门,然后找到一种在固件启动时自动调用它的方法。
./mipsel-buildroot-linux-uclibc-gccbindshell.c-static-obindshell下一步是寻找我们可以将这个二进制文件放置在文件系统中的位置,以及如何在启动时自动启动。这可以通过查看其中一个在启动时会自动调用的脚本来完成。
一旦完成构建过程,它将创建新的固件,并将其放置在firmware-name/位置,命名为new-firmware.bin。
正如我们从前面的截图中看到的,它给了我们一个IP地址192.168.0.1,我们现在可以尝试访问。但更有趣的是,让我们看看我们放置在固件中的后门bindshell是否激活。
现在,由于我们修改并放置在固件中的后门,我们在设备上有了完整的rootshell。从这里,我们可以修改其他设备配置,或者简单地使用它来远程访问运行我们修改后的恶意固件的任何设备。
修改固件的能力对攻击者来说是非常强大和有用的。这使得攻击者能够绕过保护机制,移除安全功能等。由于诸如FMK之类的工具,攻击者可以非常容易地向任何物联网设备固件中添加自己的恶意软件或后门,然后用户可以在世界任何地方使用它。
这也是固件签名和校验和验证非常重要的原因之一,以防止因恶意或修改的固件而引起的攻击。
Web应用程序和Web服务用于执行远程访问功能以及管理设备。Web应用程序和IoT设备可以赋予大量的权力,使攻击者能够远程执行控制。某些产品,如连接的车辆或具有远程可执行漏洞的智能门锁,可能会对用户造成伤害和个人安全风险。在测试IoT产品的上述类别时,首先要针对对用户造成最高风险和影响的漏洞进行定位。在本章中,我们将展示如何选择Web应用程序测试方法论,设置您的Web测试工具包,以及讨论如何发现和利用一些最常见的嵌入式Web应用程序漏洞。
除了网络渗透测试方法之外,还有许多其他的渗透测试方法。并不存在绝对正确或错误的方法论;然而,建立测试应用程序的方法对于成功发现软件缺陷至关重要。最常见的方法论是渗透测试执行标准(PTES)和OWASP的Web应用程序渗透测试方法论。开放式Web应用安全项目(OWASP)是一个非营利性慈善组织,提供工具和文件,并在国际上倡导软件安全。如果您曾经测试过一个应用程序或不得不修复软件漏洞,您可能已经熟悉OWASP。如果您曾经进行过渗透测试,您可能也遇到过PTES。PTES旨在为渗透测试提供一个基准。PTES将渗透测试定义为包括以下七个阶段的测试:
有许多可用于测试Web应用程序的工具。组装用于评估Web应用程序的工具箱的第一步将是选择浏览器并自定义其配置以进行测试。由于其许多可用的测试附加组件,常用于测试的浏览器是Firefox。也可以使用其他浏览器,并且可能需要一些应用程序,例如使用ActiveX或Silverlight的应用程序,需要InternetExplorer浏览器才能运行。一些附加组件使测试变得更加轻松和高效。常用的有用附加组件包括以下内容:
选择浏览器后,必须配置代理设置,以便在Web应用程序代理工具中查看应用程序的请求和响应。在接下来的步骤中,我们将介绍配置代理设置和Web应用程序代理工具。
BurpSuite是用于评估Web应用程序的最流行的Web代理工具之一。Burp是基于Java的跨平台工具。使用BurpSuite,可以中间人攻击HTTP请求和响应,以便篡改并监视应用程序行为。此外,应用程序可以进行蜘蛛爬行,主动扫描漏洞,被动扫描和模糊处理。
Burp有两个版本:免费版和专业版。专业版的价格适中(349.00美元),考虑到Burp的功能集。还有一个为期2周的专业版试用版。免费版允许代理HTTP请求和响应,以及下载BApp商店中的一些扩展插件。专业版允许使用更高级的功能和专业的扩展插件。
我们将介绍BurpSuite的基本用法,以开始测试嵌入式Web应用程序。以下示例将使用BurpSuite专业版;但是,相同的设置步骤也适用于免费版:
现在我们可以查看HTTP/HTTPS请求和响应。
将会弹出一个单独的窗口,攻击结果将可见:
在我们的设置步骤中,我们配置了Burp代理设置和浏览器设置,并学习了将用于测试的BurpSuite的基础知识。我们使用FoxyProxy配置了浏览器代理设置,安装了Burp的CA证书,扫描了一个请求,并展示了如何使用其他可能有助于更多目标攻击的Burp工具,比如Repeater、decoder和Intruder。
有了这些知识,我们现在可以开始使用BurpSuite访问嵌入式Web应用程序,以查找目标设备上的漏洞。
OWASPZedAttackProxy(ZAP)是一个免费的跨平台Web代理测试工具,用于发现Web应用程序中的漏洞。ZAP在Web应用程序代理测试工具领域是BurpSuite的紧密竞争对手,当你的预算可能不足以购买商业产品的许可证时,ZAP绝对是一个不错的选择。ZAP旨在供具有广泛安全经验的人使用,因此也非常适合开发人员以及对渗透测试新手的功能测试人员。借助ZAP的API,扫描可以自动化,并在开发人员的工作流程中用于在生产之前扫描构建。ZAP有许多不同的有用附加组件,具有强大的扫描引擎,其中包括引擎内的其他经过验证的测试工具,如Dirbuster和SQLmap。此外,ZAP还有一种名为ZEST的图形化脚本语言,可以记录和重放类似于宏的请求。本教程将介绍用于Web应用程序安全测试的基本ZAP功能。
ZAP下载页面包含额外的Docker镜像,以及利用新功能的ZAP每周版本,这些功能在官方版本中尚未引入。每周版本非常稳定,如果您希望获得更多的可扩展性,我建议您尝试一下。
以下步骤将介绍ZAP的设置和基本用法:
选择了XSS扫描策略,现在扫描将开始,并且扫描的输出将显示在ZAP的“主动扫描”选项卡中。
在嵌入式系统中,OS命令注入是一种常见的漏洞,通常通过Web界面或调试页面留下来自开发固件构建的方式来执行任意操作系统命令。用户通过Web界面在Web服务参数中提供操作系统命令,以执行OS命令。动态且未经适当清理的参数容易受到此漏洞的利用。通过执行OS命令的能力,攻击者可以上传恶意固件,更改配置设置,获得对设备的持久访问权限,获取密码,攻击网络中的其他设备,甚至锁定合法用户对设备的访问。在这个步骤中,我们将演示如何利用命令注入来获取对设备的shell访问权限。
对于这个步骤,我们将使用tcpdump、BurpSuite和一个易受攻击的IHOMECAMICAM-608IP摄像头。Tcpdump包含在大多数*Nix操作系统中,但也可以使用Wireshark来观察数据包。
在嵌入式Web应用程序中查找可注入命令的页面的过程相当简单。我们要检查的应用程序中的第一个地方是使用系统命令的诊断页面,比如ping或traceroute,还有守护程序的配置设置页面,比如SMB、PPTP或FTP。如果我们已经获得了固件或者访问了目标设备的控制台,最好是静态分析设备执行的易受攻击脚本和函数,并验证通过动态分析发现的潜在发现:
成功利用XSS的攻击者可以做到以下几点:
要成功攻击受害者,攻击者需要执行某种社会工程技术,以使用户执行恶意请求。XSS攻击的常见社会工程方法包括以下几种:
在每种情况下,初始URL将链接到受信任的受害者网站,并且将在用户不知情的情况下异步执行恶意JavaScript代码。在这个教程中,我们将介绍发现和利用反射型XSS漏洞,从而完全控制受害者浏览器。
在尝试查找反射型XSS漏洞时,我们首先观察参数输入行为,看数据是否反射回用户。OWASPZAP和BurpSuite等Web代理可以帮助自动化发现过程,使用它们的扫描引擎:
根据响应,我们似乎破坏了一些JavaScript代码。这可能与负载的编码或可能的长度有关。我们需要调整编码字符并审查JavaScript代码,确保我们的代码开始或结束一个可能正在使用的函数。
太棒了!我们现在知道我们可以在这一点上进行一些基本的XSS负载。幸运的是,我们还没有遇到任何字符限制或任何类型的过滤。让我们看看我们是否可以造成更多的损害,并将BeEF钩负载插入到易受攻击的参数中。毕竟,警报框会带来什么风险呢?
BeEF是一个利用Web浏览器和客户端攻击向量的工具,通过易受攻击的应用程序参数和社会工程技术在受害者环境中钩取一个或多个Web浏览器。当受害者执行了它的负载时,BeEF将钩取一个或多个Web浏览器,然后可以利用多个命令模块进行进一步的利用。接下来的部分将扩展我们发现的XSS漏洞,使其执行BeEF钩,并介绍一些基本用法。
BeEF很强大,展示了XSS的影响力:
以下是钩住受害者时BeEF的基本使用:
以下屏幕截图说明了BeEF捕获的内容:
BeEF的我最喜欢的功能之一是能够使用受害者作为代理,代表用户发送伪造请求:
在这个示例中,我们演示了如何发现易受攻击的XSS参数,审查编码考虑因素,解剖JavaScript代码,讨论了基本XSS有效负载的使用,并利用了BeEF钩的跨站脚本漏洞。当BeEF钩住受害者时,有许多可能性和利用技术可供使用。
为了利用CSRF,我们将使用BurpSuite和易受攻击的IHOMECAMICAM-608IP摄像头。
我们发现应用程序是否容易受到CSRF攻击的第一步是观察请求参数和HTML表单值,这些值会改变应用程序的状态。如果每个参数都没有发送一个随机令牌,或者HTML表单中没有硬编码的令牌,那么应用程序很可能容易受到CSRF攻击。我们要么改变对我们作为攻击者有利的敏感配置,要么对设备进行持久化,比如添加用户。
我们现在可以创建一个概念验证(PoC)CSRFHTML页面,代表受害者创建三个用户。
在本章中,我们将介绍以下内容:
在消费者和一些商业的物联网设备中,通常会配备一个移动应用程序来实现某种目的。例如,移动应用程序可能会向车队管理基础设施的服务器报告分析数据,或者该应用程序可能被授予委托控制启动汽车发动机。在每种情况下,数据很可能存储在移动应用程序中,并且可以被操纵以执行意外的操作。为了开始发现漏洞并逆向工程移动应用程序,可以将第三章中讨论的类似方法应用于移动空间。首先必须获取应用程序;之后,可以对应用程序进行静态分析、动态分析,并在适用的情况下重新打包。本章将帮助评估物联网移动应用程序,以便利用在该领域发现的常见漏洞。
在移动应用程序安全测试中,有一个四阶段的方法论,可以按以下方式分类:
这些常见的漏洞可能是由于应用程序的类型(原生或混合)而产生,但也可能是由于糟糕的编码实践引入的。在本章中,将演示许多常见漏洞在两个移动平台上的情况。虽然本书不涵盖这些方法和检查表,但在攻击物联网移动应用时,使用它们作为参考是个好主意。为了简单起见,我们将选择静态分析移动应用的路径,然后逐步向运行时动态分析移动应用。要开始,我们需要目标应用的二进制文件来开始测试物联网移动应用的过程。
虽然在本章中我们将更加强调静态和动态测试,但也有运行时分析测试,包括对目标应用进行插装和断点设置。
在接下来的步骤中,我们将讨论获取安卓和iOS应用的方法。
有了目标IoT应用程序和下载的APK文件,现在可以对应用程序进行反编译以查看其内容。对于Android应用程序,这个任务可以在几分钟内完成。稍后,将更详细地介绍静态分析应用程序的自动化测试技术。反编译应用程序是逆向工程应用程序以操纵其功能的第一步。应用程序也可以在修改后重新编译和打包,但这超出了我们的范围。
要反编译Android应用程序,我们将使用Enjarify和JD-GUI。Enjarify将Dalvik字节码转换为Java字节码,然后使用JD-GUI进一步分析。JD-GUI是一个用于查看Java代码的Java反编译器。这两个工具都包含在附带的虚拟机中:
Enjarify确实需要Python3作为依赖项。
由于iOS应用程序由苹果的FairPlayDRM加密,因此无法通过第三方应用商店下载未加密的版本。要查看iOS应用程序的内容,必须首先对其进行解密和提取。尽管可以直接从iTunes下载加密的IPA文件,但是使用otool、lldb和dd等工具手动解密应用程序是一个手动过程。幸运的是,使用一个名为Clutch2的工具已经自动化了这个过程。
对于这个步骤,将使用otool,它包含在XCode的命令行工具中。可以通过在OSX终端中执行以下命令来安装XCode命令行工具:
$mvMySubaru.ipaMySubaru.zip$unzipMySubaru.zip$cdPayload/MySubaru.app/$otool-lMySubaru|grep-A4cryptidcryptid1cryptid1现在已经确定应用程序已加密。手动解密应用程序超出了范围,但是可以利用Clutch2自动化应用程序解密过程。运行Clutch2而不带任何参数时,将列出所有已安装的应用程序:
通过对应用程序的类和方法有额外的了解,可以通过动态或运行时分析来操纵和测试应用程序的功能。动态测试将在本章后面进行介绍。
鉴于已获取了Android和iOS的应用程序二进制文件,我们可以使用自动化技术进行进一步分析。一个非常好的开源Python工具,可以用于Android和iOS的是移动安全框架(MobSF)。MobSF可以为我们自动化执行多项功能和能力,特别是对于Android应用程序。本步骤将演示MobSF对Android和iOS的自动静态分析功能。静态分析通常需要访问源代码,但是反编译Android和iOS应用程序可以为我们提供接近原始源代码的伪代码形式。
确保已获取目标APK和解密的iOSIPA应用程序。MobSF不会自动解密iOS应用程序。MobSF需要解密的IPA文件来分析应用程序,而不是应用程序Payload中的解密二进制文件,当将IPA文件重命名为ZIP时,MobSF会自动执行此步骤(MobSF是开源的,可以修改为使用原始二进制文件而不是IPA)。Clutch2可以在iOS设备上使用-d标志转储IPA文件。
MobSF允许灵活使用不同的Java反编译器和Dex到JAR转换器。查看MobSF/settings.py配置文件,了解如何修改这些设置。
2016年,三星成为了在其SmartThings移动应用程序中硬编码他们的client_secret的受害者,使攻击者能够获得访问门锁的令牌。有关此事件的更多详细信息可以在以下论文中找到:
确保您在MobSF的设置文件MobSF/settings.py中调整class-dump-z路径,并查找CLASSDUMPZ_BINARY。在我的情况下,class-dump-z的路径是/opt/iOSOpenDev/bin/class-dump-z,但是使用常规的class-dump也应该可以,以及/opt/iOSOpenDev/bin/class-dump。
查看字符串选项卡中的类内容
硬编码的秘密值
不幸的是,iOS开发人员倾向于忽略苹果提供的数据存储API控制。这导致数据通过明文数据库(包括realmDBs)、plist文件(属性列表)、缓存、键盘和其他存储位置泄漏。有时,应用程序使用的混合框架会鼓励这种行为以提高应用程序性能,但未列出安全后果。根据混合框架和自定义模块的不同,可能需要插件来清除缓存等位置,这增加了开发人员的复杂性。本节将帮助您分析IoTiOS应用程序的数据存储。
在撰写本文时,idb不支持iOS10应用程序。
越狱iDevices的默认用户名和密码是alpine。
导航到Cache.dbs选项卡,选择刷新按钮,并双击打开Cache.db条目:
可以通过指定编辑器路径来利用自定义SQLite外部编辑器,例如通过idb的设置(例如,~/.idb/settings.yml)。
有了这些知识,可以在不代理连接的情况下查看会话管理控件和API数据。可以根据前述的移动应用程序安全检查表来分析会话过期和随机化测试。可以修改plist文件或Cache.db中的数据,并将其上传回设备,以观察应用程序与这些文件的信任关系。
在运行时,有几种测试Android数据存储的方法。提供了免费和商业的Android测试发行版,以帮助自动查看和修改常见的数据存储文件位置。在手动方法中,我们希望在应用程序运行时分析以下常见的存储位置:
在Android中,应用程序的文件结构不会改变,这使得手动分析更加容易。这个步骤将帮助您分析IoTAndroid应用程序的数据存储。
此步骤需要以下物品:
在这个阶段,我们已经静态分析并评估了示例IoT移动应用程序中数据的存储方式。我们还没有查看应用程序和服务器之间发送的API流量。在运行时查看和篡改应用程序通信被称为动态分析。动态分析测试侧重于评估应用程序在执行过程中的情况。动态分析既在移动平台层进行,也针对移动应用程序的后端服务和API进行,其中可以分析请求和响应。在本示例中,我们将为iOS设置动态分析测试环境,并为您介绍一些测试用例。
对于此示例,将使用BurpSuite和/或OWASPZAP来观察应用程序通信。还需要访问iDevice和Android设备来执行此示例。iDevice和Android设备不必经过越狱或root,这是查看应用程序通信的好方法。尽管这些步骤适用于两种移动平台,但本示例中的示例仅适用于iOS。
以下截图显示了如何配置iOS设备的代理设置,以指向您的Burp代理侦听器。在这种情况下,我的Burp代理正在监听IP地址192.168.2.183和端口8080:
以下截图显示了从我们的移动设备通过Burp套件代理的HTTPS请求。
通过Burp套件代理的HTTPS请求
无需用户名或密码即可下载MP4视频
一旦在浏览器中请求复制的URL,浏览器应自动询问在本地计算机上保存下载视频的位置:
现在视频已经以.mp4的格式下载,并且可以像以下截图中所示查看:
任何物联网(IoT)解决方案的关键中心组件是嵌入式设备。它是与物理环境互动并与网络端点和周围其他设备通信的设备。了解如何利用这些硬件设备对于进行物联网渗透测试非常关键。
在物联网解决方案中使用的设备类型可能因产品而异。在某些情况下,它可能是一个网关,允许各种设备与其互动,同时与网络端点通信,或者它可能是一个医疗设备实用程序,其唯一目的是从患者的身体收集数据并在智能手机上显示。
硬件利用与软件利用之间的差异非常显著,最重要的是,要找到硬件的漏洞和利用,你需要拥有物理设备。这意味着除非你拥有两个或更多的设备,否则要有效地对物联网设备的硬件进行渗透测试是相当复杂的。
在基于硬件的漏洞方面,还有一件事需要注意的是,它们相对更难修补,在某些情况下,甚至无法在不完全更换设备的情况下修补。这意味着如果硬件设备本身存在关键的安全问题,制造商唯一的选择就是召回设备并用更安全的设备替换它们。
最后,对于我们作为渗透测试人员来说,最显著的区别之一是,对于硬件利用,我们需要一些硬件工具和设备来有效地评估和利用最终设备的安全性。
然而,不要感到沮丧,因为我们将涵盖许多硬件利用的工具和技术,这将让你迅速进入硬件黑客的世界。
硬件黑客方法论涉及的步骤如下:
让我们逐个深入了解每一个步骤。
一旦我们获得了这些信息,我们就可以进入下一步,即使用外部和内部分析来分析设备。
一旦你从上一步获得了信息,下一步就是开始与设备本身进行交互。在这里,目标是从攻击者的角度查看设备,并通过视觉检查-包括外部和内部-尽可能多地识别信息。
外部分析非常直接,可以通过查看设备并找出所有你能看到的各种组件来进行。在这里,你可能会问自己以下问题:
一旦我们完成了外部分析,下一步就是进行设备的内部分析。这需要你打开设备,查看印刷电路板(PCB)。在这一步中,我们将识别设备中的各种芯片组件,查阅它们的数据表,并了解每个特定组件的功能,以及记录从数据表中找到的各种信息。
在这个阶段,我也喜欢绘制各种组件之间的基本连接的框图,以便更清楚地了解整个设备的内部情况。
一旦我们查看了PCB并找到了关于整个电路和其中涉及的各种组件的足够信息,下一步就是寻找与设备进行接口的所有可能选项。
在某些情况下,它可能非常明显并且直接摆在你面前,而在其他情况下,可能更难以识别,可能分散在整个电路板上,或者在某些情况下,你将不得不直接连接到给定芯片组件的引脚上。
一旦我们确定了正在使用的通信协议/接口,我们可以使用一组特定的工具来通过给定的协议与目标设备通信,并与目标交互或读/写信息到给定的芯片。
根据受审查的接口,我们将使用不同的技术来连接并获取有用的渗透测试数据。一些常见的接口包括UART、JTAG、SPI、I2C和1-Wire。
一旦我们通过给定的硬件接口访问了目标设备,下一步将是通过硬件利用执行各种软件利用技术。这包括执行诸如转储固件、在给定的内存区域写入新内容、对运行进程进行修改等操作。
正如你现在可能已经了解的那样,大多数利用硬件技术的攻击将使你获得对敏感资源的访问,然后可以以多种方式进行利用。
现在我们对整体硬件渗透测试方法论有了了解,让我们深入了解如何对硬件设备进行侦察。
除了视觉外部分析之外,侦察包括两个步骤-打开设备并查看各种芯片的存在,并从其数据表中获取信息。
让我们逐一深入了解。
硬件侦察过程的第一步是打开设备。这个过程的复杂性取决于你所使用的设备,可以从非常简单到非常复杂不等。
在一些设备中,你会发现螺丝隐藏在腿部的橡胶垫下,而在其他情况下,它们会大部分暴露出来,而在其他情况下,两个不同的部分可能会被焊在一起。
根据设备的组装方式,使用适当的工具拆卸不同的部分。建议在整个硬件利用过程中携带一套好的螺丝刀,因为不同的设备会使用许多不同种类的螺丝。
一旦你打开了设备,下一步是查看PCB并识别所有各种芯片的存在。使用USB显微镜或智能手机的手电筒来读取芯片的标签,同时倾斜芯片。建议使用支架,可以在读取各种芯片的名称时稳定地固定设备。
一旦你弄清楚了芯片的名称,就去谷歌搜索它的制造商,然后加上型号和“数据表”这个词。这也是我们将在本章后面做的事情。
一旦你有了数据表,你可以利用其中的信息来找出目标芯片的各种属性,包括引脚布局,在硬件利用过程中这将非常有用。
现在我们知道如何对目标设备进行侦察,我们可以继续深入硬件利用。为了确保我们非常了解我们的目标,并确保我们的攻击成功,我们需要更好地了解电子学,这将使我们在进行利用时更容易理解。
正如前面提到的,电子学是要理解的最重要的事情之一,如果你想进行硬件黑客攻击。你可能能够在不了解电子学的情况下捕捉一些低悬漏洞;然而,要擅长这个领域,你需要了解设备上发生了什么,以及如何利用给定的组件。在本节中,我们将介绍一些电子学的基本概念,这将帮助你在开始研究嵌入式设备内部时获得更多的信心和理解。
这对你来说可能看起来非常基础;然而,把这一节当作你将在后面的章节和实际生活中所看到的东西的一个复习,当你开始使用嵌入式设备时。
电阻器是电子元件,它们阻碍电流流动,或者更深层次地说,阻碍电子的流动。电阻器,用R表示,是被动元件,这意味着它们根本不产生任何电力,而是通过散热的方式降低电压和电流。
电阻的单位是欧姆(Ω),电阻通常使用碳或金属线制造。你还会发现电阻器被编码颜色,以帮助传达它们提供的电阻值。
这就是电阻器的样子:
现在你知道了电阻器是什么,值得注意的是,电阻器可能有两种不同的类别-固定和可变。顾名思义,固定电阻器的电阻是固定的,不能改变,而在可变电阻器中,电阻可以使用某些技术进行变化。可变电阻器最流行的例子之一是电位器。
在电子学中,电压简单地是两个不同测量点之间的电势能差。在大多数情况下,用来测量给定点电压的参考点是地(GND),或者电池或电源的负极。举个现实生活中的例子,如果你使用了一个9V电池,这意味着两点之间的电势差为9伏特。
为了更深入地了解,让我们假设在导体的两端,比如铜线,你有大量的电子(负电荷),在另一端你有质子(正电荷)。这意味着这两点之间的电势存在差异,最终导致电流的流动。
为了测量电压,我们使用一种叫做电压表的设备,它告诉我们它连接的两点之间的电势差。例如,9V电池的正极电压为+9V,负极电压为-9V。
正如我们在前面的情景中讨论的,电流流动(在前述情况下是因为介质是铜导体)当两端的电压存在差异时,它将继续流动,直到两侧的电子和质子数量相等。
电流以安培(A)为单位进行测量,并在方程和公式中用字母I表示。用于测量电流的设备称为安培表。
你可能会认为这三个组件-电流、电压和电阻似乎是相互依赖的。总结一下,电压引起电流流动,电阻阻碍电流流动。
这种关系就是著名的欧姆定律,它规定电流(I)=电压(V)/电阻(R)。
这也证实了电流与电压成正比,与电阻成反比的事实。
电容器是几乎所有嵌入式设备中最常见的组件之一。顾名思义,它们的主要任务之一是以电荷的形式储存能量。
电容器内部有两个带有相反电荷的板,当连接到电源时,它们储存电荷。电容器的其他用途包括作为滤波器,减少影响设备上其他芯片的电噪声,分离交流和直流组件(交流耦合)等。
电容的单位是法拉,用F表示,可以使用以下公式计算:
C=Q/V
这里,C是电容,Q是电荷,V是电压。
所有前述值都以法拉第(F)、库仑(C)和伏特(V)为标准单位进行测量。
晶体管是电子元件,通过充当开关和放大器来发挥多种作用。
作为放大器,它可以接收小电流并放大它以产生更大的输出电流。其中一个例子是麦克风连接到扬声器,麦克风接收到小声音输入并放大后通过扬声器输出更大的声音。
同样地,作为开关,它可以接收小电流输入并用它来允许更大的电流流动,从而激活新的电流流动。
这是晶体管的外观:
以下是NPN晶体管(另一种类型是PNP,箭头指向基)的示意图:
嵌入式设备中一些最重要的组件与数据存储有关,可以被设备用于多种目的。这是您可以找到固件和应用程序编程接口(API)密钥等内容的地方。嵌入式设备中的三种主要存储器类型及其细分如下:
例如,SRAM只在接收到电源供应时保存数据,而DRAM将每个数据位存储在单独的电容器中。此外,由于DRAM具有刷新周期(因为电容器最终会被放电),因此SRAM相对于DRAM来说速度更快。
同样地,根据数据可以被写入的次数,ROM被分类为PROM或EPROM。对于PROM,一旦写入数据就无法修改,而在EPROM中,数据可以通过紫外线(UV)射线擦除,紫外线可以通过一个小窗口到达芯片,通过重置芯片并将其带到初始状态来擦除芯片。
然而,我们将遇到的两种最重要的存储器类型是EEPROM和Flash,或者基于读取、写入和擦除周期的差异而言的NOR和NANDFlash-取决于是否可以一次在整个块上执行操作(Flash),以及是否需要一次在单个位上执行操作(EEPROM)。
现在我们对一些电子元件有了基本的了解,让我们进入嵌入式设备中使用的不同种类的通信介质。
嵌入式设备中的数据通信方法有串行和并行通信。顾名思义,串行通信按顺序逐位发送数据。这意味着如果要传输8位,它将一个接一个地发送,只有当所有8位都接收到时,数据传输才完成。
然而,在并行通信的情况下,多个位将同时传输,因此使数据传输过程比其串行对应物更快。
您可能会认为并行通信会更好,并且由于数据传输速率更快,它会被广泛使用。然而,这并不是事实,因为我们没有考虑并行通信在电路板上所需的实际空间。
嵌入式设备的物理空间非常有限。因此,在数据传输方面,更快并不总是更好的选择,尤其是考虑到并行数据传输需要比串行数据传输更多的数据线。
一些并行数据传输通信的示例是PCI和ATA,而串行通信是使用USB、UART和SPI进行的。
此时您还可以执行的一项工作是查看任何给定嵌入式设备的电路板,并尝试识别涉及的各种组件以及它们使用的通信机制是什么样的。
现在我们对嵌入式设备中的不同组件有了很好的了解,让我们看看如何识别设备中存在的不同总线和接口。
为此,第一步是打开设备并查看PCB。请注意,在本节中,我们只关心识别特定引脚、标头或芯片的用途,而不是实际连接到它,这是我们将在下一节中介绍的内容。
如何做...我们将首先寻找UART,这是黑客最喜欢用来访问设备的接口之一。我们将首先查看UART的内部结构,然后是如何识别引脚排列,最后是如何连接到目标设备。
在嵌入式设备中,我们首先要寻找的是通用异步收发器(UART)接口。UART是嵌入式设备中最常见的通信协议之一。UART基本上将其接收到的并行数据转换为串行数据流,这样更容易进行交互。
由于这里的另一个重点是减少线路的数量,因此在UART通信中没有时钟。相反,UART依赖于波特率,即数据传输速率。UART通信中的两个不同组件将同意指定的波特率,以确保数据以正确的格式接收。
此外,在UART通信中,还会添加另一个称为奇偶校验位的位,以便进行错误检测。因此,典型的UART通信顺序如下:
如果您想自己尝试并了解UART数据流,可以使用逻辑分析仪并连接到UART端口(我们将在稍后识别),然后在逻辑分析仪软件中查看结果。可以使用的一种流行的逻辑分析仪是SalaeLogic,它有8通道和16通道两种选项。
以下屏幕截图显示了逻辑分析仪中数据的样子:
让我们继续看看实际设备中的UART端口是什么样子。以下是一些已在设备中识别出的UART端口的示例。请注意,要进行UART通信,两个引脚是必不可少的-发送(Tx)和接收(Rx)。此外,在大多数情况下,您还会发现另外两个引脚用于地线(GND)和Vcc:
如您在上图中所见,有四个相邻的引脚,这在这种情况下是UART引脚。在关于获取和接口化串行通信的下一节中,我们将看看如何识别确切的引脚布局-哪些引脚对应于Tx、Rx和GND,并且还要接口化这些引脚/端口以访问设备。
SPI和I2C的识别类似于我们刚刚在UART通信识别中看到的。识别正在使用的通信协议是SPI还是I2C的一种方法是使用逻辑分析仪,并查看在通信中传输的各种位。
SPI和I2C都属于串行通信,主要用于Flash和EEPROM。正确识别正在使用的确切协议以及更多细节的一种方法是查看芯片名称并从数据表中获取信息。
以下是SPI闪存芯片的外观:
上图中的闪存芯片标签为WinbondW25Q80BV,这意味着现在我们可以查阅其数据表并识别其各种属性-即使不知道它是SPI闪存芯片。
如果我们搜索芯片编号,我们将得到以下结果:
让我们继续打开搜索结果中找到的任何数据表PDF。在数据表的开头,我们将找到以下内容:
这意味着我们的芯片是一颗带有8MB存储空间的SPI闪存芯片。随着我们在数据表中的进一步了解,我们还发现了其引脚布局,如下截图所示,告诉我们给定SPI闪存芯片的确切引脚布局:
因此,我们已经能够正确识别芯片的用途、其属性以及其引脚布局。
有了这些信息,我们可以使用AttifyBadge连接到SPI闪存芯片,这是一种用于处理各种硬件协议和标准(如UART、JTAG、SPI和I2C)的工具。或者,您也可以使用FTDIMPSSE电缆。
将数据输出(DO)和数据输入(DI)分别连接到AttifyBadge的MOSI和MISO,或者,如果您使用FTDI电缆,则芯片的DI连接到电缆的DO(黄色),芯片的DO连接到电缆的DI(绿色)。此外,还将电缆的Vcc、GND、WP和CS连接到芯片上的相同引脚。
下图中的表格将帮助您在此阶段进行连接:
上述语法中的大小是从闪存芯片的数据表中获取的,并且闪存芯片的整个内容被放入名为new.bin的文件中。
因此,现在您可以查看SPI闪存芯片,找出其引脚布局,并从中转储数据,这可能是固件、硬编码密钥或其他敏感信息,具体取决于您正在使用的设备。
为了识别设备上有趣的暴露接口,我们将寻找的最后一件事是联合测试动作组(JTAG)。
与以前的针床测试相比,JTAG是一种更简化的测试引脚和调试引脚的方式。它使设备开发人员和测试人员能够确保设备上各个芯片中的每个引脚都能够按预期功能、互连和正常运行。
对于渗透测试人员来说,JTAG有很多用途,从使我们能够读/写数据,甚至调试运行中的进程,到修改程序执行流程。
当我们寻找JTAG时,最重要的四个焊盘是测试数据输入(TDI)、测试数据输出(TDO)、测试时钟(TCK)和测试模式选择(TMS)。然而,在识别这些单独的焊盘之前,我们必须首先确定设备上JTAG头部的位置。
为了简化事情,JTAG有几种标准接口选项,如13针、14针、20针等。以下是一些真实设备中JTAG接口的图像:
以下是Experiav8Box上的JTAG接口,带有焊接的JTAG头部:
这里还要注意的一点是,即使你可能能够在标准的头部格式中找到JTAG,但在一些真实设备中,你会发现JTAG焊盘分散在整个电路板上,而不是集中在一个位置。在这种情况下,你需要在焊盘上焊接排针/跳线,并将它们连接到JTAGulator上,以便确定它们是否是JTAG焊盘,以及哪个焊盘对应于哪个JTAG焊盘。
由于我们已经在前一节中介绍了UART的基础知识,让我们直接进入如何与UART接口进行交互。
一旦连接好,我们将看看如何在设备上找到UART焊盘后如何识别这些焊盘。
我们要找的四个焊盘如下:
为此,我们将使用万用表,它可以测量电压和电流,因此既可以作为电压表又可以作为电流表,因此得名为万用表。
以下是万用表的外观。按照以下图像所示连接探针:
连接好后,让我们继续找到不同的UART焊盘,就像下面的步骤描述的那样。
确保你的设备已关闭。将黑色探针放在一个接地表面上——这可以是设备上的任何金属表面。
既然我们已经确定了GND焊盘,让我们继续确定其他剩下的焊盘。
在此阶段,重新启动设备并打开它。在您看到恒定高电压的引脚处是我们的Vcc引脚。
因此,我们已经确定了UART通信所需的所有引脚-Tx和Rx,以及GND和Vcc。
目标设备的发送(Tx)将连接到AttifyBadge的Rx(D0),并且目标设备的Rx将连接到AttifyBadge的Tx(D1)。IP摄像头的GND将连接到AttifyBadge的GND。
一旦我们完成了所有连接,下一步就是找出设备运行的波特率。将AttifyBadge连接到系统并启动目标设备。
因此,我们能够利用暴露的UART接口,找出引脚和接口,并最终获得rootshell。
您可以在嵌入式设备上执行的另一件事情是利用基于故障的攻击来绕过安全措施(例如UART控制台上没有rootshell)。
故障,顾名思义,是一种在您正在使用的系统中引入故障的方法。这可以通过多种方式完成,有专门的书籍和研究论文专门讨论这个主题。
因此,如果短接成功,内核将无法启动,从而导致您陷入默认的引导加载程序提示,使您能够更改引导加载程序参数。
NAND故障是利用故障攻击的技术之一。然而,您也可以使用电源和电压故障技术来执行诸如绕过加密等操作。
以下是一些其他有用的资源:
现在我们已经介绍了硬件设备上的各种利用技术,是时候介绍一种最重要的妥协设备的方法-JTAG了。我们已经看到了JTAG是什么,JTAG引脚通常是什么样子。
让我们开始识别给定目标设备上的JTAG引脚。为此,我们将使用JTAGulator,这是由JoeGrande制作的硬件工具,用于识别JTAG引脚。
一旦您将所有JTAGulator通道连接到目标设备上预期的JTAG引脚,另外连接GND到GND。
正如您所看到的,JTAGulator能够识别JTAG引脚,并告诉我们各个引脚对应的是什么。
在这一步,您可以执行各种OpenOCD命令,以及针对您的特定芯片的命令,以便妥协设备。
通过使用mdw命令从给定内存位置读取数据,您可以利用通过JTAG访问设备的能力做一些事情,如下所示:
另一个例子是通过连接到端口3333上运行的实例,使用我们在前几章学到的技能来连接到GDB以调试运行中的进程,并进行ARM/MIPS利用。
几乎所有当前物联网设备与其他设备进行交互以交换信息并采取行动。了解物联网设备使用的无线协议以及影响它们的安全问题对于有效地对物联网设备进行渗透测试至关重要。
无线通信或无线电简单地是通过空气这种通信介质使用电磁波从源到目的地传输数据的一种方式。无线电信号是在常见设备中使用的信号,如微波、光和红外线;只是在每种情况下,信号的波长和频率不同。在无线通信的情况下,需要传输的数据首先通过电势差转换为电信号,然后由载波波传输,最后在另一端解调以获取源发送的实际数据。我们不会详细讨论电磁概念以及如何从数据生成电信号,因为这超出了本章的范围。
物联网设备使用各种无线通信协议,从蜂窝到Wi-Fi不等,取决于产品要求和设备制造商的偏好。不可能在单一章节或书籍中涵盖所有各种无线通信协议,但是,我们将专注于整体渗透测试方法论,并涵盖两种最常见的协议——ZigBee和蓝牙低功耗(BLE)。
不同的无线协议有各自的目的和优缺点。它们每个都在指定的频率(或频率范围)上运行,并且需要不同的渗透测试硬件和软件设置,以便能够分析该通信协议的数据包。
在进入各个协议之前,我们将深入研究软件定义无线电(SDR),这是无线电逆向和物联网设备黑客的最重要概念之一。我们还将熟悉各种基础概念,以便更好地理解无线电黑客和SDR。
SDR是一种极其有用的技术,我们可以通过它改变给定无线电设备的用途。正如其名称所示,这种情况下的无线电是软件定义的,这意味着无线电的功能或操作可以根据我们的需求进行更改和修改。这与传统无线电不同,传统无线电设备根据其硬件设计只能服务于单一目的。
这为我们打开了大量机会,因为我们可以开始使用SDR,并不断重新定位以满足我们的各种需求。重新定位在这里简单地意味着,假设我们正在分析FM频谱,我们可以让设备来做,如果以后我们想要分析433MHz的物联网设备发送的数据,我们可以使用同一设备来捕获数据,处理数据,并提取其中发送的文本。
到目前为止,你应该对SDR是什么以及它可以服务于什么目的有一个相当好的理解。在进行实际的SDR实践和分析不同事物之前,在本节中,我们将熟悉一些基本概念和术语,这些术语可能在你深入研究无线电黑客和SDR时会遇到。
让我们快速了解一些你在SDR中经常遇到的术语。
一个简单的无线电系统将包括几个组件,如发送器、接收器、载波波和介质。这些组件基本上就是您所期望的。发送器是发送信号的组件,由传输介质传输到接收器。
在大多数实际情况下,需要发送的数据波会与载波波调制,然后发送到接收器,接收器会解调调制波以恢复原始数据波。
有许多调制类型,如频率调制、幅度调制和相位调制。此外,还有许多数字调制技术,如开关键控(OOK)、相移键控(PSK)、频移键控(FSK)和幅度键控(ASK)。
在使用无线电系统时,您将遇到一些常见术语,如下所示:
现在我们对各种无线电术语有了很好的理解,让我们开始看一些工具,用这些工具我们可以玩SDR并将其用于安全研究目的。
在本节中,我们将介绍用于SDR和无线电信号分析的最常用工具。我们将从最基本的工具开始,然后使用它来从无线电数据包中提取更多信息。
要进行基于SDR的安全研究,需要以下工具:
要安装这些工具,以下存储库具有最佳的构建说明。
确保构建GNURadio伴侣,而不是从apt-get安装,以获得更好的SDR工作体验。
SDR安全研究也取决于您系统的性能。确保为您执行这些任务的虚拟机分配了足够的RAM。如果可能的话,使用Ubuntu实例作为主机以获得最佳体验。
RTL-SDR是SDR世界中最好的设备之一。它最初是一种带有Realtek芯片组的电视调谐器,可用于许多基于无线电的活动。这些设备的频率各不相同,通常在22MHz-1.7GHz范围内。
在顶部部分,你可以使用上下箭头键或输入你想要调谐RTL-SDR的频率。
在频率部分之后,我们有频谱部分。在这里,你可以看到哪些频率最活跃,当你使用基于无线电的物联网设备时,也可以注意到它们的尖峰。我们稍后会更深入地讨论这个问题。
在右侧部分,我们有接收器选项、输入控制和FFT设置,这些是各种配置,将帮助你更好地分析你的数据。然而,为了简单起见,我们不会详细介绍它们。所有的窗格都可以根据需要进行修改和定制。
在这个第一个练习中,我们将通过调谐到一个当地的FM电台并在GQRX中接收音频来听取其中的内容。
如果你调谐到一个有效的FM电台后现在从扬声器中听到声音,你将能够在那个频率听到FM广播。
你也可以使用RTL-SDR进行许多其他用途。其中一个用途是进行蜂窝分析,如下所示。我们将使用RTL-SDR来查找各种手机用户的确切位置详细信息。然后可以使用单向天线来增加范围并收集大量信息。
这就是你可以使用RTL-SDR进行各种不同目的的方法,以及分析从正常FM到飞行交通甚至到蜂窝交通的许多事物。
现在,在以前的情况下,一切都只是关于查看频率和分析它,然而,并不是太深入。如果我们有一个传输原始无线电流量的物联网设备,并且我们想要了解幕后发生了什么,并找出它实际传输了什么数据,该怎么办。
为此,我们将使用一个名为GNURadio-companion的实用程序,它允许我们构建无线电块以处理各种无线电信号。在这个实用程序中,你可以选择一个输入源(如RTL-SDR源、Osmocom源、HackRF源和信号发生器),并在其上应用无线电块,最后将输出存储在原始wav文件中或在图表中绘制出来。
在这个练习中,我们正在研究一个气象站,我们将使用RTL-SDR源捕获数据,然后执行解调和时钟恢复,以找到气象站实际发送的数据。
要找出设备操作的频率,我们可以使用GQRX,并在它传输数据时寻找频率峰值。另一个选择是寻找FCCID——制造商在美国销售设备所需的标准——它执行重要的放射性。这些信息通常位于设备的标签之一上。
一旦我们有了FCCID,我们可以去fccid.io并输入FCC-ID,这将向我们显示设备正在使用的确切频率:
既然我们知道了频率,让我们去GNURadio-companion并创建一个处理来自气象站的数据的工作流程。我们不会深入研究GNURadio-companion及其各种属性,但我们强烈建议您自行探索,并尝试使用各种其他无线电捕获。
以下是我们要添加的块:
双击Osmocom源以更改其属性,并设置我们之前确定的频率。
还要双击Wav文件接收器并给它一个输出文件名。
现在我们准备运行这个。一旦我们运行这个,我们将有一个名为monitor.wav的新文件。将文件作为原始文件导入audacity。在这一步,这看起来像是OOK;我们需要将这些数据转换为可理解的实际数据。其中一种方法是让较短的脉冲间隔表示数字零,较长的脉冲间隔表示数字一。这也显示在以下截图中:
如果我们进一步分析数据,现在可以看到气象站发送的确切数据,包括温度和湿度数据:
还有许多围绕RTL-SDR和整体SDR黑客技术构建的其他实用程序,可以用于许多目的。例如,ADS-B项目允许您实时跟踪飞行,RTL-433用于处理433MHz信号,还有其他实用程序可用于利用诸如钥匙扣之类的东西。
ZigBee是物联网设备中常用的无线协议之一,因为它能够形成网状网络并以低功耗和资源消耗执行操作。它已经在许多垂直领域中得到应用,包括智能家居、工业控制系统(ICS)、智能建筑控制等。在大多数国家,它在2.4GHz运行,在美国和澳大利亚是902到928MHz,在欧洲是868到868.6MHz。
在本节中,我们将研究ZigBee,看看我们如何识别周围的ZigBee设备,并嗅探和重放流量以识别安全问题。
要使用ZigBee,需要以下设置:
完成设置后,将RzUSB棒插入系统。您应该能够看到LED呈琥珀色发光。如果颜色是蓝色,这意味着您的RzUSB棒未刷入KillerBee固件。我们不会详细介绍刷写固件的说明-因为它在GitHub存储库中有很好的文档,并且有许多在线商店可以购买预刷写了KillerBee固件的RzRaven。
以下是我们如何开始分析我们周围的ZigBee设备并最终使用RzRaven和KillerBee实用程序嗅探ZigBee流量的步骤。
正如我们所看到的,我们能够看到在通道12上广播的设备。
您还可以执行其他攻击,例如使用KillerBee工具套件中的Zbreplay等实用程序修改捕获的流量后进行重放攻击。
Z-Wave是无线传感器网络和家庭自动化中的流行协议之一,在美国的频率是908.42MHz,在欧洲是868.42MHz。Z-Wave就像ZigBee一样支持网状网络,这使其免受节点故障等问题的影响。
它由SigmaSystems开发,与ZigBee和其他协议相比,它是一个封闭的协议。这也是安全社区对Z-Wave的安全研究倡议相对较少的原因之一,与其他流行的物联网协议相比。还有一些项目,如OpenZWave提供开源替代方案;然而,它们仍处于非常早期的阶段。
就像典型的无线通信协议一样,Z-Wave设备遭受相同一组安全问题的影响。Z-Wave设备中最常见的漏洞之一是通信中缺乏加密,这使其容易受到敏感信息明文传输和基于重放的攻击的影响。然而,还要注意的是,诸如Z-Wave中的S2安全等项目大大增加了设备中Z-Wave实现的安全性,此外还保护免受针对密钥交换和设备认证的攻击。
EZ-Wave工具包包括三个工具,如下所示:
评估Z-Wave协议的一种方法是捕获传输中的数据包,并查找明文传输的敏感信息:
使用所有前述的构建模块,我们的最终流程图如下所示:
完成后,我们可以选择重放数据包,或者根据我们想要实现的目标修改然后重放。另一类针对Z-Wave系统的攻击是从网络中分离/取消配对Z-Wave设备节点的攻击,欺骗攻击,干扰和拒绝服务攻击等。
BLE或蓝牙低功耗是许多智能设备中最常见的平台之一,从智能家居到医疗设备工具,甚至健身追踪器和可穿戴设备都有。BLE日益受欢迎的原因之一是我们今天使用的几乎所有智能手机都支持BLE,因此更容易与基于BLE的物联网设备进行交互。
BLE设计用于资源和功耗受限的设备,BLE通过提供短暂的远程无线连接有效解决了这个问题,从而显著节省了电池消耗。
BLE最初是在蓝牙4.0规范中引入的,专注于需要极低功耗通信模式的设备,BLE声称可以在单个纽扣电池上持续几个月到几年。
基于其当前连接和操作阶段,BLE设备可以以四种不同的模式运行:
BLE还执行频率跳频扩频,这意味着它在每个事件上不断改变通道。然而,在接下来的部分中我们将要使用的工具将能够跟踪设备通过跳频,并能够嗅探BLE通信的数据。
为了更好地准备好自己,了解蓝牙低功耗的基本概念,这是BLE堆栈的外观:
如您所见,这里有三个主要层:应用程序、主机和控制器。此外,主机和控制器通过所谓的主机控制器接口(HCI)进行交互。
主机层包含我们在BLE开发中将直接使用的一些最重要的东西。这些包括通用访问配置文件(GAP)和通用属性配置文件(GATT)。
GATT直接位于ATT之上,ATT负责主/从之间的数据交换,并执行一些操作,如读取、写入和错误处理。GATT在ATT之上添加了一个整体的数据组织层,使其更易于理解。在GATT中,整个数据按照给定的图表进行分类:
接下来,整个服务都包含在一个配置文件中,这可以是一个通用配置文件,例如心脏健康配置文件,其中包含各种服务,如heart-rate-service和heart-oxygen-service。
如前所述,在嗅探期间,我们的目标是找到正在读取和写入的特征值。这些特征通常被称为句柄,一旦我们捕获到流量,就会看到这些句柄。
接下来,BLE堆栈的另一个重要组件是L2CAP。L2CAP代表逻辑链路控制和适配协议,主要负责从其他层获取数据并将数据封装在适当的BLE数据包结构中。
这就是我们开始BLE利用所需要知道的全部。现在,让我们开始动手吧。
要开始进行BLE利用,我们需要以下工具:
在处理BLE时,我们的方法是首先找出目标设备的地址,同时在执行目标BLE设备的操作时嗅探该特定地址的流量。
这将使我们能够找到正在设备上写入以执行某个操作的特定BLE句柄。为了更好地了解BLE句柄是什么,它们只是对BLE特征具有的各种属性的引用。
在本节中,我们将确保我们已经正确设置了一切,如下所示。
确保蓝牙适配器插头连接到您的虚拟机,并且您能够看到hci接口,如下截图所示:
接下来,从它们的官方GitHub存储库安装以下工具:
一旦您安装和配置了所有这些,我们就准备好开始与周围的BLE设备进行交互了。
如您所见,我们能够识别出我们周围的许多设备以及它们的地址。接下来,我们可以使用Ubertooth来嗅探给定设备的流量,如下所示。
UbertoothOne是由MichaelOssman的GreatScottGadgets开发的设备,用于评估蓝牙设备的安全性。它由CC24002.4GHz射频收发器和带有USB端口的NXPLPC1756微控制器组成。
对于我们作为安全研究人员和渗透测试人员,它可以帮助识别诸如明文数据传输之类的安全问题,还可以识别在网络通信期间正在被写入和读取的句柄。
sudoubertooth-btle-f-t[address]-c[capture-output][capture-output]可以是文件,也可以是管道,以便进行主动流量拦截。
让我们使用/tmp/pipe作为捕获接口,其中一个管道的一端从Ubertooth获取输入数据,另一个管道的另一端在Wireshark中显示数据。
在前面的屏幕截图中,我们还应用了一个过滤器btl2cap.cid==0x004,以确保我们获得具有有用数据的数据包。正如您在图像中也可以看到的,我们收到了许多读/写请求,以及句柄的详细信息和写入该特定句柄的值。在这种情况下,句柄0x0037和值1对应于解锁基于BLE的智能锁。
现在我们知道为了执行特定操作而写入句柄的值是什么,我们可以自己写入该特定句柄,而无需Ubertooth。为此,我们将使用BLE适配器和一个名为gatttool的实用程序。
这就是您可以与基于BLE的物联网设备进行交互,找出哪些句柄正在被写入,然后自己写入这些句柄的方法。
此外,您可以尝试一些其他工具:
本章将讨论前述的几种最佳实践,主要针对POSIX环境,但原则上设计为平台无关。
在使用C等低级语言时,如果开发人员没有正确检查和验证边界,就有很高的可能性出现内存损坏错误。防止使用已知的危险函数和API有助于防止固件内的内存损坏漏洞。例如,已知的不安全C函数的非穷尽列表包括:strcat、strcpy、sprintf、scanf和gets。常见的内存损坏漏洞,如缓冲区溢出或堆溢出,可能包括堆栈或堆的溢出。利用这些特定的内存损坏漏洞的影响因操作系统平台而异。例如,商业RTOS平台如QNXNeutrino将每个进程及其堆栈与文件系统隔离,最小化攻击面。然而,对于常见的嵌入式Linux发行版可能并非如此。在嵌入式Linux中,缓冲区溢出可能导致恶意代码的任意执行和对操作系统的修改。在本教程中,我们将展示工具如何帮助检测易受攻击的C函数,并提供防止内存损坏漏洞的安全控制和最佳实践。
对于这个教程,将使用以下工具:
常见的Linux实用工具对于搜索C/C++代码文件非常有帮助。尽管商业上可用的源代码分析工具可以比常见实用工具更好地防止内存损坏漏洞,并且开发人员可以使用IDE插件。为了演示目的,我们将展示如何使用grep和flawfinder搜索代码文件中的预定义函数易受攻击的调用和规则。
$grep-E'(strcpy|strcat|sprintf|strlen|memcpy|fopen|gets)'code.c这个表达可以调整得更智能一些,或者包装成一个脚本,可以在每次构建时执行,或者按需执行。
还可以使用其他内存安全控件来防止内存腐败漏洞,例如以下控件:
利用地址空间布局随机化(ASLR)和其他堆栈控件的内存漏洞需要攻击者付出大量努力才能利用。尽管在某些情况下仍然可能发生。确保代码具有弹性,并采用深度防御方法,以便将数据放置在内存中有助于嵌入式设备的安全姿态。
注入攻击是任何Web应用程序中最严重的漏洞之一,尤其是在物联网系统中。事实上,自2010年以来,注入一直是OWASP十大漏洞中排名前两位。有许多类型的注入攻击,如操作系统(OS)命令注入、跨站脚本(例如JavaScript注入)、SQL注入、日志注入,以及其他类型的表达式语言注入。在物联网和嵌入式系统中,最常见的注入攻击类型是操作系统命令注入;当应用程序接受不受信任的用户输入并将该值传递以执行shell命令而没有输入验证或适当的转义时,以及跨站脚本(XSS)。本文将向您展示如何通过确保所有不受信任的数据和用户输入都经过验证、经过清理,并使用替代安全函数来减轻命令注入攻击。
当物联网设备运行时,注入攻击的静态和动态测试并不难。固件可以调用system()、exec()和类似的变体来执行操作系统命令,或者调用从解释语言(如Lua)运行OS调用的外部脚本。命令注入漏洞也可能由缓冲区溢出引起。以下步骤和示例显示了易受命令注入攻击的代码,以及如何减轻命令注入攻击。之后,我们将列出常见的安全控制措施,以防止常见的注入攻击。
#include
前面提到的控制措施在生产环境中使用固件之前都需要进行测试。在注入攻击中,设备和用户面临被攻击者接管的风险,以及流氓设备。我们在2017年看到了物联网Reaper和Persirai僵尸网络发生的事件。这只是开始。
在为嵌入式物联网设备实施安全更新生态系统时,需要考虑许多变量和因素。某些架构、SoC或引导加载程序可能无法执行所有必需的操作,以实现弹性固件更新系统。由于实施安全更新系统的复杂性和变化,我们将讨论制造商应该将哪些高级操作纳入其固件更新设计中。为简单起见,我们将以嵌入式Linux作为平台,并提供安全更新系统所需的要求。再次强调,并非所有以下要求都可能可行,但对于设备制造商来说,进行尽职调查并了解实施安全更新系统时的风险是很重要的。以下是用于保护固件更新的安全控制和要求。
有两种类型的标签可用:
在有限的存储空间和薄利多销的情况下,保护敏感数据对于IoT设备来说可能是一个挑战。通常,敏感数据存储在客户端应用程序或设备上,以便IoT服务可以在没有互联网连接的情况下运行。在保护设备上的敏感数据时,应遵循一些安全原则。首先,永远不要将秘密硬编码到固件图像中,比如密码、用户名、令牌、私钥或类似的变体。这也包括写入磁盘的敏感数据。这些数据将在提取固件文件系统时对攻击者可见,也会在运行时访问操作系统时对攻击者可见。如果有硬件,如安全元素(SE)或可信执行环境(TEE)可用,建议在运行时使用这些功能来存储敏感数据。否则,应评估使用强大的密码学来保护数据,使用服务器端计算来弥补硬件限制。
如果可能,所有明文中的敏感数据应该是短暂的,并且只驻留在易失性内存中。这个配方将为您提供一些数据被不安全使用的场景,以及如何在IoT设备中减轻不安全的C代码。
使用编程示例,我们将展示数据如何被不安全地存储以及如何纠正存储漏洞。
char*key;/*Initializesecret*/char*new_key;size_tsize=strlen(key);if(size==SIZE_MAX){/*Handleerror*/}new_key=(char*)malloc(size+1);if(!new_key){/*Handleerror*/}strcpy(new_key,key);/*Processnew_key...*/free(new_key);new_key=NULL;char*key;/*Initializesecret*/char*new_key;size_tsize=strlen(key);if(size==SIZE_MAX){/*Handleerror*/}/*Usecalloc()tozero-outspace*/new_key=(char*)calloc(size+1,sizeof(char));if(!new_key){/*Handleerror*/}strcpy(new_key,key);/*Processnew_key...*//*Sanitizememory*/memset_s(new_key,'\0',size);free(new_secret);new_key=NULL;在设备没有硬件安全芯片用于分离操作系统进程和内存位置的情况下,可以使用上述示例。没有硬件安全芯片(例如TPM或SE),或者ARM架构的TEE环境,对于嵌入式设备来说,安全存储数据是一个挑战。有时开发人员可能会将敏感数据存储在对平台操作系统不可用的不同存储分区中,但这也不是一个安全的存储位置。通常,闪存芯片可以从PCB板上取下,并带到离线位置进行审查或数据外泄。
正在创建新的框架和操作系统平台,以帮助解决存储敏感数据的问题。如果使用ARMMbedOS,则可以利用名为uVisor的设备安全层,通过硬件安全功能限制对内存的访问,从而隔离代码块。尽管Mbed还处于起步阶段,但它得到了大型半导体公司的大力支持,并包含了一个平台,不仅包括其操作系统,还包括云服务。
设计和构建嵌入式固件可能会很复杂,因为它涉及所有的依赖关系和几十年未被触及的混乱makefile。尽管存在这些常见的复杂性,但建立安全软件的基础始于加固平台和工具链。许多嵌入式Linux设备使用包含常见GNU实用程序的BusyBox。对BusyBox需要进行某些配置,也需要进行更新。除了BusyBox,嵌入式框架和工具链应该被修改为只包括在配置固件构建时使用的库和函数。RTOS系统通常也有POSIX实用程序可用,但由SoC、MCU和芯片供应商进行配置,他们拥有修改版本的常见实用程序。嵌入式Linux构建系统,如Buildroot、Yocto等,执行设置和配置工具链环境的任务。删除已知的不安全库和协议,如Telnet,不仅可以减少固件构建中的攻击入口点,还可以提供一种安全设计的方法来构建软件,以防范潜在的安全威胁。在本教程中,我们将展示如何使用Buildroot来选择和取消选择网络服务和配置。
在本教程中,将使用Buildroot来演示加固。
Buildroot是通过交叉编译生成嵌入式Linux系统的工具。可以通过以下网站下载Buildroot:
我们将首先使用Buildroot,并打开其菜单选项进行配置。
只有在要使用TLS时才启用FTP。对于Pure-FTPd,这需要通过传递./configure--with-tls进行自定义编译。
选择所有选项后,保存配置,并选择退出以离开menuconfig选项。然后,从Buildroot文件夹输入make来构建您的配置和工具链。
在使用Yocto构建系统时,可以采取类似的步骤,确保食谱已更新并配置为仅包含所需的软件包。还有其他几个配置可以用来加固Linux构建环境,包括以下内容:
在设置工具链之后,重要的是确保软件包和第三方上游库保持更新,以防止在物联网设备投入生产后出现已知的公开漏洞。黑盒第三方软件,如RomPager、NetUSB和嵌入式构建工具,如Buildroot,也应该根据漏洞数据库以及它们的变更日志进行检查,以决定何时以及是否需要更新。使用上游BSP驱动程序并不是一件容易的事;在发布构建之前,开发团队应该测试库和上游BSP驱动程序的更改,因为更新可能会导致意想不到的依赖问题。
嵌入式项目和应用程序应该维护一个包含固件镜像中包含的第三方库和开源软件的清单(BOM)。这在世界某些受监管地区和GPL中有时是一个要求,同时维护BOM也有助于改善资产和库的管理。应该检查这个清单,以确认其中没有包含任何未修补的漏洞或已知问题的第三方软件。最新的漏洞信息可以通过国家漏洞数据库(NVD)、OpenHub或类似的第三方网站找到。
在固件发布到所有市场细分之前,确保删除所有不必要的预生产构建代码,以及死代码和未使用的应用程序代码非常重要。这包括但不限于可能由原始设计制造商(ODMs)、供应商和第三方承包商留下的用于测试或客户支持目的的后门代码和根权限帐户。通常,这是原始设备制造商(OEMs)的职责,通过使用第三章中描述的方法对二进制文件进行逆向工程,即分析和利用固件。为了防止OEMs的额外劳动力开销,ODMs应同意主服务协议(MSAs),确保不包括后门代码或用户帐户,并且所有代码都已经过审查,以查找软件安全漏洞,并追究第三方开发公司对大规模部署到市场上的设备的责任。此外,还要考虑要求ODMs有信息安全人员,并建立服务级别协议(SLA)来修复关键的安全漏洞。这个食谱将向您展示如何使用免费可用的工具来保护第三方代码和组件。
这个食谱需要以下工具:
npminstall-gretirenpminstall-gnsp如何操作...许多物联网设备运行各种JavaScript代码,以帮助减轻硬件资源消耗。有时,当设备需要作为某些用例的服务器时,这些代码也会在设备上运行。有一些很好的工具可以扫描项目目录,查找项目中使用的已知有漏洞的JavaScript版本。首先,我们来看一下RetireJS。
移动应用程序中的敏感数据取决于物联网设备的性质。许多设备可能在移动设备上存储个人数据,收集个人数据,患者健康信息(PHI),信用卡信息,并存储用于对物联网设备进行身份验证的帐户凭据。泄露的凭据或长期的会话令牌可能对智能门锁和连接的车辆产生重大影响。这些敏感数据必须通过控件和验证来进行保护。许多时候,敏感数据会无意中暴露给在移动设备上运行的第三方应用程序,用于操作系统的进程间通信(IPC)。此外,丢失移动设备,或在旅行时被盗或被扣押也并非罕见。在这些情况下,应用程序必须采用适当的安全控件来保护敏感数据,并使获取数据变得更加困难。在本章中,我们将讨论安全存储敏感数据的方法。
在这个配方中,将使用SQLCipher来演示安全数据库存储的方法。
SQLCipher可以从以下网页下载:
Android和iOS平台都有本地方法来安全存储敏感数据。对于Android,敏感数据可以存储在KeyStore中。对于iOS,敏感数据可以存储在Keychain中。重要的是要注意,如果设备被root或越狱,Android的KeyStore和iOS的Keychain内容可以被转储。但是,如果Android设备具有可信执行环境(TEE)或安全元素(SE),则KeyStore对操作系统不可直接访问,保存的数据也将无法访问。除了本地平台API可用于安全存储数据外,还有第三方库可用于加密磁盘上的数据或整个SQLite数据库,如SQLCipher。SQLCipher适用于Android和iOS,如果SQLite数据库用于IoT设备,则应该用于安全存储数据。
publicclassSQLCipherExampleActivityextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);InitSQLCipher();}privatevoidInitSQLCipher(){SQLiteDatabase.loadLibs(this);FiledatabaseFile=getDatabasePath("EncStorage.db");databaseFile.mkdirs();databaseFile.delete();SQLiteDatabasesecureDatabase=SQLiteDatabase.openOrCreateDatabase(databaseFile,"PacktDB",null);secureDatabase.execSQL("CREATETABLEIFNOTEXISTSAccounts(UsernameVARCHAR,PasswordVARCHAR);");secureDatabase.execSQL("INSERTINTOAccountsVALUES('PacktUser','EncPassword');");secureDatabase.close();}}Android常见的不安全存储位置是SharedPreferences.xml,开发人员经常用来存储设置和配置。存储在SharedPreferences.xml中的数据是明文可读的,除非使用第三方包装器来加密偏好设置的值。
对于iOS,数据不应存储在应用程序容器内的文件中,也不应存储在明文plist文件中。Keychain应该用于所有凭据和令牌数据,并根据应用程序运行的上下文使用适当的KeychainAPI属性。例如,如果应用程序不在后台运行,则使用最严格的属性,如kSecAttrAccessibleWhenUnlockedThisDeviceOnly,这可以防止Keychain项目被iTunes备份,或者使用kSecAttrAccessibleWhenUnlocked。如果应用程序需要在前台运行,则使用kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly属性。
有时,平台安全API(如KeyStore和Keychain)可能不足以确保敏感数据的保密性和完整性。在这些情况下,建议使用应用级加密来增强保护,然后将加密数据存储在平台的安全存储位置中。
移动应用程序的身份验证可以同时发生在服务器端和客户端。IoT移动应用程序可以利用这两种设计模式,尽管在生产中实施时每种都有自己的风险考虑。本节将讨论一些这些风险以及服务器端和客户端身份验证的最佳实践设计实施。
前述项目适用于Web应用程序、混合移动应用程序,甚至本机移动应用程序。以下项目是特定于移动设备的身份验证最佳实践,可实施到应用程序中:
Android特定的身份验证实践如下所示:
要使用SafteyNetreCAPTCHAAPI,必须执行以下步骤:
2.RECAPTCHA_INVALID_KEYTYPE
3.RECAPTCHA_INVALID_PACKAGE_NAME
4.UNSUPPORTED_SDK_VERSION
5.TIMEOUT
6.NETWORK_ERROR
7.ERROR
有关每个状态代码的详细信息,请参阅以下参考页面:
接下来列出了特定于iOS的身份验证实践:
TouchID是一种常见的用户身份验证方法;但是,有几种方法和工具可以绕过仅使用本地身份验证框架的应用程序。如前所述,使用钥匙串ACL可以防止攻击者在运行时覆盖LAContextevaluatePolicy:localizedReason:reply方法或对应用程序本身进行打补丁。
保护物联网移动应用的端到端通信一直是一个难题。通常,数据会通过明文协议泄露,比如HTTP或UDP(SIP)用于音频传输到移动应用。偶尔,物联网制造商被发现向第三方泄露数据,这些第三方只通过HTTP通信或者使用较不安全的加密配置进行内容识别或崩溃报告分析服务。保护数据在传输中的目标是确保移动应用、物联网设备和API端点之间交换的数据的机密性和完整性。移动应用必须使用TLS建立安全加密通道进行网络通信,并配置适当的密码套件。对于智能锁或连接车辆等设备,这是必须的。本文将介绍保护物联网移动应用中传输数据的最佳实践。
保护移动应用中传输数据有共同的要求和最佳实践。保护传输数据的最佳实践包括但不限于以下内容:
实现在安卓和iOS之间有所不同。两个平台都有本地的加密API;但是,也有第三方封装库可用,但可能没有证书固定等功能。
在上面的示例中,一个安卓应用程序创建了一个包含CA(受信任证书)的KeyStore,初始化了TrustManager,其工作是仅验证KeyStore中的证书:
类似的操作可以用于在iOS中将证书和/或证书的公钥指纹固定。固定是通过NSURLConnectionDelegate执行的,其中必须在connection:didReceiveAuthenticationChallenge:中实现connection:canAuthenticateAgainstProtectionSpace:和connection:didReceiveAuthenticationChallenge:,并调用SecTrustEvaluate执行X509验证检查。在部署此类检查时,可以使用OWASP提供的iOS固定应用程序示例作为参考。可以通过以下链接下载示例程序:
不幸的是,由于缺乏加密和/或PKI知识,这在物联网应用程序中非常普遍。ATS还可以提供针对每个域或全局的异常,而不是完全禁用ATS。以下是可以应用于以下配置的非详尽列表的异常:
苹果提供了一个检查应用传输安全问题的工具,名为nscurl。可以通过执行以下命令来使用nscurl:
当物联网移动应用程序执行或检索来自第三方应用程序的命令时,内部平台API用于进程间通信(IPC)。IPC可用于集成应用程序,使其调用费用跟踪应用程序、IFTTT等第三方服务应用程序,或亚马逊的Alexa等个人助手。Android等平台提供了丰富的IPC功能,而iOS只提供了几个选项。大多数物联网应用程序使用平台和硬件功能与物理世界进行交互,这反过来会在对手成功利用漏洞时产生更大的影响。在本教程中,我们将讨论如何在IPC周围应用安全控制以及如何安全地使用平台API。
大多数列出的做法都可以应用于Android和iOS平台;但是,根据应用程序的功能,应该审查特定的考虑因素,如Android权限、自定义权限和保护级别。
以下是一个名为IOT_COOKBOOK_ACTIVITY的自定义权限的示例,当启动MAIN_ACTIVITY``Activity时需要该权限。
在iOS应用程序中,由于iOS的封闭生态系统,权限不适用。但是,iOS和Android共享WebViews,这使得可以在应用程序内加载网页。与Web应用程序类似,恶意代码可以在WebViews中执行。在减少IoT应用程序的攻击面时,这一点很重要。
与所有软件一样,移动应用程序大量使用第三方库和包装器来执行诸如发出HTTP请求或加密对象之类的功能。这些库也可能会给应用程序引入弱点,暴露机密信息或影响应用程序本身的完整性。因此,应该审查第三方代码以发现漏洞,并在适用的情况下进行更新和测试。对于依赖第三方混合框架和库来发送、接收和保存数据的混合应用程序来说,这一点尤为重要。本文将讨论确保第三方代码不会给物联网应用程序引入漏洞的方法。
在第八章中,固件安全最佳实践,讨论了使用NSP和Retire.js扫描JavaScript库的方法,这些方法仍然适用于移动应用程序。为确保第三方代码不会给移动应用程序引入安全漏洞,应考虑以下建议:
最常见的移动混合框架之一是Apache的Cordova。Cordova可以通过以下命令更新到iOS和安卓:
当存在内部和外包团队的代码库用于用户体验(UX)、特定功能集(例如在应用启动期间查找设备、确保规则设置正确执行等)时,编写安全代码可能会很困难,还有其他一些功能,例如确保应用更新不会对网络中的物联网设备产生负面影响。对于一个应用来说,存在这样的复杂性,错误很可能会被发现,并且安全控制可能会被攻击者绕过。是的,这对于任何软件来说都是不可避免的,尽管有技术可用于使反向工程对攻击者更加困难,以便攻击者不会妥协应用程序并窃取公司的知识产权(IP)。
这些技术可以内置到应用程序逻辑中,以防止运行时修改,通过对应用程序类进行混淆来进行应用程序二进制文件的静态分析,并对数据进行分段以准备潜在的妥协。重要的是要注意,应用程序仍然需要在应用程序中构建安全控制,而不是用第三方软件保护替换控制。本文将介绍使应用程序更具抵抗力的做法。这些做法不仅会使应用程序更具抵抗力,还将作为应用程序反滥用系统的一部分,为应用程序提供深度防御。
在实施应用程序反向工程控制和代码修改技术时,应遵循以下做法:
/Applications/Cydia.app/Applications/FakeCarrier.app/Applications/Icy.app/Applications/IntelliScreen.app/Applications/MxTube.app/Applications/RockApp.app/Applications/SBSettings.app/Applications/WinterBoard.app/Applications/blackra1n.app/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist/Library/MobileSubstrate/DynamicLibraries/Veency.plist/Library/MobileSubstrate/MobileSubstrate.dylib/System/Library/LaunchDaemons/com.ikey.bbot.plist/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist/bin/bash/bin/sh/etc/apt/etc/ssh/sshd_config/private/var/lib/apt/private/var/lib/cydia/private/var/mobile/Library/SBSettings/Themes/private/var/stash/private/var/tmp/cydia.log/usr/bin/sshd/usr/libexec/sftp-server/usr/libexec/ssh-keysign/usr/sbin/sshd/var/cache/apt/var/lib/apt/var/lib/cydia此外,iOS应用程序可以尝试执行根级系统API调用或通过向应用程序沙盒之外的文件写入数据来检测设备是否已越狱。
/system/xbin/busybox/sbin/su/system/bin/su/system/xbin/su/data/local/su/data/local/xbin/sucom.thirdparty.superusereu.chainfire.supersucom.noshufou.android.sucom.koushikdutta.superusercom.zachspong.temprootremovejbcom.ramdroid.appquarantine此外,检查自定义的AndroidROM版本可以指示已root设备,尽管这不是一个确定的方法。
应该使用多种检查和防御方法来确保弹性。总体目标是确保攻击者无法篡改、修改代码、执行运行时修改和逆向工程应用程序包以防止滥用。前述实践中的一些可以在应用程序启动时和整个运行时引入到应用程序逻辑中。商业解决方案可用于执行一些早期列出的实践以及更多内容;但是,在集成到应用程序之前,应该经过审查。
在本章中,我们将介绍设备开发人员和制造商可以采取的各种步骤,以保护物联网设备中使用的嵌入式设备硬件。尽管使设备100%安全几乎是不可能的,但本章提到的步骤将有助于确保你所工作的设备遵循了一个非常良好的安全姿态,这对攻击者来说是很难突破的。
但在深入讨论可以用来保护硬件的各种细节之前,让我们简要讨论一下保护嵌入式设备所需采取的方法。
在构建嵌入式设备时需要考虑的一点是,一旦产品上市,大多数基于硬件的漏洞就无法修复。这意味着在与硬件打交道时,你需要从一开始就非常小心。
在为物联网解决方案构建硬件设备时需要注意的另一点是,始终要考虑如果攻击者能够接触硬件,他将获得哪些资源。这意味着如果攻击者能够打开物联网设备,他将在PCB上看到哪些可见的组件。此外,如果攻击者进一步并通过shell访问硬件接口,他能做些什么。
在构建嵌入式设备时应考虑这些事项。
以下是在嵌入式设备的硬件设计和开发过程中应遵循的一些最佳实践:
硬件攻击者的第一步是打开设备,查看PCB上的芯片和各种暴露的接口。可以通过使用不常见的螺丝或使用超声波焊接或高温胶封闭多个硬件外壳来一定程度上保护这一点。
以下图显示了一些常见的螺丝类型:
如果你决定使用独特/不常见的设备螺丝,将使攻击者更难打开你的设备,在大多数情况下唯一的选择将是强行打开。通过添加组件来抵抗开启设备的行为,甚至普通的打开行为,这将在下一节中讨论。
防篡改意味着使用专门的组件来防止对给定设备的篡改。实施防篡改的一种常见且有效的方式是在设备中添加防篡改检测开关、传感器或电路,可以检测某些动作,如打开设备或强行破坏设备,并根据此采取行动,如删除闪存或使设备无法使用。
除此之外,强烈建议通过去除它们的标签、用环氧树脂隐藏它们,甚至将芯片封装在安全的外壳中来保护敏感芯片和组件。
实施防篡改的其他技术包括整合紧密的气流通道、安全螺丝和硬化钢外壳,所有这些都会使对设备的篡改变得极其困难。
电源插座中的安全螺丝
大多数设备制造商还实施了一些无效的防篡改保护措施。以下是TP-LinkMR3020的图片,它使用胶水来保护和隐藏UART端口,但显然没有成功:
在这种情况下,可以使用纸刀非常容易地去除胶水,然后暴露出底层的UART接口。
保护硬件的明显机制之一是实施和启用加密。然而,存在攻击可以绕过加密,或者密钥可以非常容易地获得。
侧信道攻击是一种高级的硬件利用技术,攻击者利用不同的信息源,如功耗变化、时序分析、电磁数据变化和声音信息,提取更多信息,这些信息可以用来破坏目标设备。
这些攻击很难防范,然而,以下是一些可以采取的措施来防范这些类型的攻击:
在物联网设备中保护硬件最重要的事情之一是在设备上市时禁用和移除UART和JTAG接口,以及硬件中的任何其他诊断功能。
这里需要注意的一点是,基本的保护机制,如切断轨道,效率极低,并且可以被一名技能适中的攻击者绕过。
然而,通过使用焊接桥,切断的轨道可以重新连接以重新启用JTAG,并利用其他技术进一步利用它。
尽管加密将成为固件安全的一部分,攻击者通常可以嗅探两个不同硬件组件之间传递的数据。为了确保您的敏感信息不会落入攻击者手中,请确保您加密了传输中以及静止状态下的数据。
在谈论嵌入式设备中的加密时,另一个重要考虑因素是执行某种加密功能所需的资源量。
由于设备资源有限,执行极强的加密可能不可行-因此,在硬件中应该提前考虑并实施加密和可用性之间的良好平衡。
如果可能,并且芯片支持,利用TPM存储各种加密密钥,这也可以提供诸如信任根之类的功能,防止对启动过程的修改。大多数TPM支持有效的硬件随机数生成器和在200毫秒内计算2048位RSA签名的能力。
如果基于TPM的安全不可行,另一种选择是使用复制保护加密狗或硬件安全模块(HSM),在那里存储加密密钥。这也可以在设备运行时使用,以防止固件修改和后门攻击,从而增强设备安全性。
为了利用物联网的漏洞并能够保护自己免受攻击,需要自动化来开发武器化的概念证明,并为防御安全团队提供可扩展性。如果安全团队无法跟上代码推送和开发的速度,就会引入漏洞。此外,安全团队需要适应开发团队的速度,不要阻碍他们当前的安全测试和审查流程。本章将介绍高级物联网利用技术,以及以自动化方式发现和防止物联网漏洞的方法。
在利用嵌入式设备的过程中,最重要的事情之一是能够利用易受攻击的二进制文件,使用返回导向编程(ROP)等技术,这正是我们将在本节中讨论的内容。
我们需要这种技术的原因是,在利用过程中,我们经常需要将最终结果作为shell或执行后门,这可以为我们提供额外的信息或访问敏感资源。
ROP的概念在ARM和MIPS(甚至x86)中是相同的;然而,我们需要记住一些平台级别的差异。简单来说,ROP涉及从各个位置拾取特定指令(小工具),并将它们链接在一起构建完整的ROP链,以执行特定任务。
如前所述,要执行ROP,我们需要能够识别可以链接在一起的有用ROP小工具。要找到这些特定的小工具,我们可以手动查看libc或其他库中的各个位置,或者使用自动化工具和脚本来帮助我们完成相同的工作。
为了简化问题,我们将以ARM上的易受攻击程序为例,并稍后查看一些其他示例,以帮助我们加深对基于ROP的利用的理解。
我们需要的一些组件如下:
目前我们不打算使用任何自动化工具,而是专注于手动方法,以便理解基本原理。如果您以后想使用自动化工具(我建议这样做),您可以查看另请参阅部分,了解一些有用的链接。
在本节中,我们将看看如何开始利用ARM环境中的简单堆栈缓冲区溢出。
#include
一旦溢出了buff,我们需要找到一种方法来覆盖pc或lr寄存器,以控制程序执行流。这可以通过在strcpy地址设置断点,然后分析复制前后的堆栈来完成。
我们还添加了-g参数,以便将调试器附加到运行的实例上,这里是端口12345,现在我们可以使用GDB连接,如下所示。
让我们在main处设置一个断点(bmain)并继续(c)程序。
现在来看寻找gadgets的有趣部分。要找到有用的gadgets,我们需要寻找一些指令,这些指令允许我们设置某些值,我们可以跳转到这些值,比如说system(在我们当前的情况下),同时在跳转时,将地址作为/bin/sh的参数,这将给我们提供shell。
这意味着我们可能需要将system的地址放在pc或lr中,将/bin/sh的地址放在r0中,这是ARM中的第一个寄存器,也是作为被调用函数的参数。一旦我们找到了允许我们执行所有这些操作的指令,我们还需要确保在我们之前提到的有用指令之后的指令中有一个这些内容,即要么跳转到我们控制的地址,要么pop{pc}或pop{lr}。
以下是我们感兴趣的三条指令:
现在我们需要找到两件事,它们分别是:
突出显示的指令将从堆栈中弹出两个双字(doublewords),分别放入fp和pc。如果我们在这里查看堆栈中的第二个值,它是0x61616165('eaaa'),这意味着这个值将放入pc。
我们可以使用以下Python代码生成新的字符串:
16+4+0+12=32
这意味着在偏移量32处,我们需要放置系统的地址,这是我们之前找到的。
另外,让我们继续在偏移量36处放置/bin/sh的ASCII字符串,并在偏移量20处引用它。因此,栈上字符串的地址将是0x407fff18。
因此,我们能够利用基于堆栈的缓冲区溢出,并使用ROP跳转到系统,并使用我们期望的字符串作为参数,利用erand48函数中的指令,最终获得一个shell。
然而,这只是一个在基于ARM的架构上开始使用ROP的非常简单的例子。类似的技术可以应用于MIPS上的ROP,如下所示。我们在这里展示的另一件事是如何解决缓存不一致的问题,这通常在利用过程中出现。
正如我们所看到的,通过这个小工具,除了设置$a0之外,这是第一个寄存器(就像ARM中的r0一样),我们还能够控制返回地址(RA)和一些其他寄存器,比如$fp,$s7,$s6...$s0,最后跳转到$ra。
在上面的截图中,id就是我们想要执行的命令。
这就是ROP利用的全部内容,我们将介绍ARM和MIPS的示例。在现实世界的场景中,应用是一样的——可能不仅仅是几条指令,你需要一些指令来形成你的ROP链。
您可以查看一些自动化工具,这些工具将帮助您在各种平台上进行基于ROP的利用过程。建议您查看的一些工具如下:
当对手针对某种IoT设备时,通常会利用多个漏洞来武装攻击。这些漏洞本身可能在严重性上较低;然而,当结合在一起时,攻击的影响就会更大。多个低级漏洞组合成一个严重漏洞并不罕见。这在IoT设备方面尤为重要。在IoT设备中发现的一个严重漏洞可能会危及设备的完整性。本文将介绍如何将Web安全漏洞链接在一起,以在没有钥匙、车钥匙或凭据的情况下访问Subaru连接的车辆。
进行任何评估的第一步是威胁建模;在这种情况下,从黑盒的角度对2017年SubaruWRXSTi连接车辆进行威胁建模。首先确定车辆的入口点,这将提供一个已识别的攻击面,可以在此基础上构建。
每辆车都不同,有些型号比其他型号拥有更多的功能。研究Subaru连接车辆和不同型号和年份之间的功能之间的公开资源。例如,我们知道连接车辆可以通过蜂窝4G/LTE连接访问互联网,但其他车辆可能通过手机连接或其他方式(如Wi-Fi)获得互联网访问。让我们从这里开始,在执行任何主动攻击阶段之前记录我们对目标车辆的了解:
现在我们已经列出了连接车辆的入口点,我们对首要攻击目标有了更好的了解。我们还可以根据我们的技能和舒适度来评估努力的程度。
由于我们将精力集中在应用程序上,我们需要对所有三个应用程序进行一定程度的侦察。让我们先从移动应用程序开始,然后再转向网络应用程序。
在执行动态测试之前,Android应用程序很容易进行静态拆解和分析。反向Android应用程序需要一定程度的努力,但如果我们能发现低hangingfruit,那么我们就能轻松获胜。我们首先需要通过第三方市场获取MySubaru应用程序,并确保它与GooglePlay版本相同。验证后,应采取以下步骤对MySubaruAndroid应用程序进行基线侦察:
确保为Android通信进行颜色编码的高亮显示和注释。这将有助于在编译用于识别Android漏洞的不同API调用时,以及其他Subaru应用程序时使用。
应该注意iOS和AndroidAPI调用之间的差异。数据存储也应该注意,重点放在个人详细信息和凭据上。应根据对两个应用程序执行的侦察来确定潜在的障碍。例如,两个移动应用程序都通过POST请求发送远程服务调用,其中包含一个sessionId参数值,对于每个请求都是唯一的。
这可能会妨碍我们伪造远程服务请求的能力,因为这个值是唯一的,而不是硬编码的值。在iOS应用程序中发现的一个关键观察是将所有HTTP请求和响应缓存到Cache.dbSQLite数据库中。Cache.db中的所有数据都是明文,包括车辆详细信息、个人所有者详细信息、帐户令牌和API请求,攻击者可以在备份iOS设备或使用iFunbox等免费工具时提取这些数据。
以下截图显示了URL中带有handoffToken令牌的缓存请求:
应该注意网络应用程序和移动应用程序之间的所有差异。到目前为止,网络应用程序和移动应用程序之间的一个主要区别是远程服务API请求如何发送到Subaru服务器。API端点对所有应用程序保持不变,如果我们发现漏洞可以利用,这将是有用的。
以下屏幕截图显示了BurpSuite中所有应用程序的HTTP历史记录,并进行了颜色编码:
在我们的Web代理中记录了所有应用程序功能和API调用后,我们现在可以开始识别设计中的漏洞,并测试逻辑缺陷以寻找漏洞。以下是观察到的漏洞列表:
以下是不需要身份验证或先前了解设置即可进行更改的PIN和安全问题更新配置部分的屏幕截图:
这现在是一个经过身份验证的跨站脚本(XSS)漏洞,可能对我们有用(漏洞#10)。以下是XSS的屏幕截图:
接下来,我们可以检查其他API逻辑缺陷,例如是否执行了速率限制,或者API请求是否可以在不修改的情况下重放。这可以通过将HTTP请求发送到BurpSuite的重放器并重放请求来完成。我们将发现在进行远程服务调用时没有重放或速率限制安全控制(漏洞#11)。尽管在API请求之间需要一个短暂的5秒间隔,以便车辆执行请求。
通过被动和主动分析已经确定了至少11个漏洞。一些漏洞可以直接利用,而其他一些可能间接利用,因为应用程序的逻辑和设计。为了访问车辆而无需钥匙、车钥匙或凭据,我们应该有所需的东西。
通过查看已识别的安全漏洞,需要用户干预才能成功利用MySubaru所有者的账户和车辆。我们可以通过几种方式来做到这一点。我们可以尝试以下攻击场景,这依赖于一种社会工程学形式:
可以用于获得有效的handoffToken的其他攻击场景包括:
您可能已经注意到,这些都是基本的网络安全漏洞,而不是突破性的零日漏洞利用。对于利用基本漏洞的影响,对于物联网连接的设备和车辆来说要高得多。
访问以下网页,阅读本配方中讨论的研究:
为C/C++编写的固件构建可能对具有复杂Makefile的传统产品构成挑战。然而,在部署生产构建之前,所有源代码都应该进行静态分析,以检测安全漏洞。本配方将展示如何在持续集成环境中为固件配置基本的C/C++静态分析。
对于本配方,我们将使用以下应用程序和工具:
pipinstallflawfinder如何做…要设置固件的持续集成测试,请使用以下步骤创建您的环境。
现在,Jenkins已经构建了我们的工作空间,我们可以在其中传输我们的代码文件。目录结构因所使用的操作系统而异。对于Ubuntu,工作空间文件位于/var/lib/Jenkins/workspace/,对于OSX,工作空间文件位于/Users/Shared/Jenkins/Home/workspace/。将fuzzgoat文件传输到新创建的工作空间目录中,该目录以项目名称命名。在这种情况下,它是/var/lib/Jenkins/workspace/PacktTestFirmware/。
构建步骤可以定制以警报工程或安全经理根据结果执行操作。但是,并非所有来自flawfinder的命中都是漏洞,但应该对其进行审查,以确保没有引入软件安全漏洞。请记住,flawfinder是一个简单的工具,提供了最少量的C/C++代码检查。它只是检查常见的缓冲区溢出问题和其他众所周知的问题,比如使用被禁止的函数。商业SAST工具包括依赖图以及调用图,以检查依赖软件漏洞和应用程序数据流。此外,许多商业SAST工具还包括IDE插件,用于实时检查软件安全漏洞。对于C/C++,XCode的Clang静态分析器有免费的IDE插件;但是,在OSX环境中编译此类代码需要自定义配置。Clang不会分析无法编译的文件。在配置移动应用程序的持续集成测试部分,我们将讨论如何使用IDE插件来静态分析代码。
有关Clang静态分析器的更多信息,请访问以下链接:
有关各种编程语言的更多源代码分析工具列表,请参阅以下网址:
无论物联网设备使用Web应用程序还是Web服务进行消息传递,其代码都应该进行静态和动态分析,以查找软件安全漏洞。在这个示例中,我们将演示如何在生产部署之前配置Web应用程序构建的动态扫描。
在这个示例中,我们将使用Jenkins作为我们的自动化构建服务器,OWASPZAP作为我们的动态扫描器。我们将使用OWASPZAPJenkins插件和可以通过以下链接下载的OWASPZAP工具:
要为Web应用程序设置持续集成测试,请使用以下步骤创建您的环境。
OWASPZAP插件下载
可以配置多个ZAP主机以允许多个并发构建扫描。这可以在各个项目的构建步骤中配置,这将覆盖系统设置。
如果您使用ZAP的每周版本,请使用/Users/
由于我们将使用加载的会话执行ZAP,我们必须创建一个会话并将其保存在项目工作空间目录中。为此,请导航到正在运行的目标应用程序构建,并通过浏览器将应用程序流量代理到ZAP。确保点击所有链接,并爬行页面并执行应用程序功能。在以下示例中,我们正在使用在本地端口8888上运行的TheBodgeITStore,并通过导航到文件|持久会话...将会话保存到项目工作空间中:
PacktZAPscan在工作空间项目目录中
请注意,此API密钥可以完全禁用,或者在创建构建步骤时通过ZAP插件命令行参数部分进行更改。如果API密钥与Jenkins插件API密钥值不匹配,则扫描将失败。
确保权限设置正确,以便Jenkins和ZAP可以扫描您的工作区目录。
控制台输出应该类似于以下图像:
控制台输出
自动化扫描非常适合捕捉低挂果和可扩展性,但它们不应该取代手动的Web应用程序安全评估。自动扫描程序无法执行上下文业务逻辑测试,也无法智能地捕捉手动评估可以发现的未报告的发现。应该使用自动化和手动测试的组合。
要了解有关JenkinsOWASPZAP插件的更多信息,请参考以下链接:
在之前的示例中,自动化分析的趋势相同,这个示例将展示如何在生产部署之前配置Android应用程序构建的依赖扫描和动态分析。
在这个示例中,我们将使用Jenkins自动化构建服务器和以下工具:
要为移动应用程序设置持续集成测试,请使用以下步骤创建您的环境。
在这种情况下,我们工作空间的路径是/Users/Shared/Jenkins/Home/workspace/PacktTestAndroid。
如果这是一个现有的项目,您可能已经知道构建完成后输出APK将被放置的位置。对于新项目,请确保您的构建编译为APK。知道在运行构建时APK存储的位置是扫描构建APK的下一步的关键。
请注意MobSF的API密钥,因为我们需要它来从Jenkins构建服务器执行RESTAPI调用。
当通过clean.sh脚本删除所有扫描和MobSF数据库信息时,API密钥会更改。
确保权限正确设置,以便Jenkins和Dependency-Check可以扫描您的工作空间目录。