0×01.前言
本科所学专业就是IoT,面试安全岗位时大部分面试官都会问我写IoT安全相关的东西,虽然最后拿到offer定的岗位都是侧重web的。前几天接到科恩的面试通知(IoT安全硬件方向),就花了半天的时间整理了下本科期间做过的有关IoT安全的技术、demo等。
0×02.废话连篇
先说下我个人对IoT的看法,物联网关键的在于“网”这个字,万物互联,靠的就是“网”,至于这个“网”,实现的方式多种多样,这也是前些年的物联网的“碎片化“问题的一部分原因,协议、标准不同,很难有一套成熟的框架或者说是体系可以用于标准、安全地给开发者使用,开发出来的东西漏洞百出,甚至同样的一种功能实现,不同厂商的产品漏洞的危害点却在不同的层面,比如说同样是智能锁的远程开关功能,可以怎么做?
典型的应该是有两种思路,和近场还是远场有关系,近场的解决方案应该是直接蓝牙控制或者厂商私有的协议,针对这种方案可以抓包重放等,就我接触到的产品而言,重放攻击针对大部分都是有效的;远场的解决方案都离不开”云“,可能是app端与云端验证,然后云端下发指令,这种上云的操作,攻击可以从app端做,也可以从web端入手。App端可能需要hook不同的方法了解如何与IoT设备进行交互,也需要关注交换格式的方法,比如JSON、XML等,有些app会固化编码自己的密钥,攻击者以此伪造消息传送给云端来伪造开关的指令,云端基本上和传统的web安全攻击思路都是相同的,OWASPtop10的那些漏洞,在IoT的云端甚至更加广泛,平行越权、RCE、未授权访问等都是非常常见的。
像智能锁这一类的由传统产品改造后的IoT设备是目前应用最典型的,应该说也是存在漏洞最多的层面。为什么?还是以智能锁为例,本来锁具面临的攻击只是物理攻击而已(拿一些工具撬开),现在它成IoT了,增加了其他功能,比如说用app控制了,攻击者可以从app端下手,控制了app就控制了智能锁,再进一步,上云了,攻击面就更大了,web的攻击技术也可以用来控制锁具了。功能越多,漏洞的攻击面越多。就像安全从业者很喜欢引用的木桶理论一样,木桶能盛多少水,取决于最短的一块木板。
IoT安全从业者,必然要求是文能IDA,武能示波器,软硬方面的技能兼备。
废话说完了,接下来进入正题。
0×03.工具篇
推荐用树莓派吧。很多demo都是在树莓派上开发的,然后在后期出于成本等方面的考虑,联系专业的厂商进行硬件的定制,剪切了不必要的硬件。此外,树莓派自身就是ARM架构,与许多IoT设备相似,当然,还有相当一部分是MIPS、PowerPC等,这些架构的话,树莓派带起来可能会有困难,在计算机上装个QEMU或者FAT基本够用了。树莓派另一方面在于原生的raspbian,有许多的开源工具可以使用,比如OpenOCD、SPIFlash等等。
此外,还需要一些硬件工具,比如SDR、万用表、烙铁、热风枪、烧录座等等,土豪可以再买个示波器、电子显微镜;一些使用的命令行级别的工具,如file、hexdump、strings、dd、lzma、7z等。
0×04.接口调试篇
主要碰到的接口有UART、JTAG、I2C、SPI等,这儿详细讲讲UART的,因为我用到的最多,其次就是JTAG,相对来说,I2C、SPI比较少。
1.UART(通用异步接收器发送器)
是一种硬件组件,允许两个硬件外围设备之间的异步串行通信。它们可以位于同一块电路板上(例如微控制器与电机或LED屏幕通信),也可以位于两个不同的设备之间(例如设备微控制器与PC通信)。它可以允许通过串行读取/写入设备。
在许多物联网设备中,板上的UART端口保持打开状态,任何人都可以通过串口连接和访问以获得shell,日志输出等。设备通常会有一组引脚,连接到微控制器UART RX和TX引脚,用于发送和接收串行数据。
在板子上找到相应的引脚后,连接计算机前,还需要usb转ttl:
用于转换电气标准,即高低电平的转换。
连接好后打开xshell或者secureCRT,设置端口和波特率,就可以拿到shell了。
当然大部分情况下没这么简单,可能只是进了busybox,还需要进一步地搜集、解密root的密码等操作,这里不再展开。
2.JTAG
JTAG属于微控制器调试接口。微控制器具有在运行期间使用指定引脚进行调试的规定,这些引脚连接到电路板上的引脚。这些引脚(端口)由开发人员和设计人员用于调试,读/写固件和微控制器内部存储器,生产后控制/测试微控制器引脚。这使得调试端口成为最关键的攻击面之一,因为它为攻击者提供了强大的功能和访问权限。除了JTAG之外,还包括cJTAG、SWD。
JTAG的接口在PCB上基本如下图:
JTAG协议定义了可用于测试和调试微控制器的标准接口和命令。 JTAG定义了四个引脚接口(以及一个额外的可选引脚TRST)
开发者可以使用这些引脚与微控制器上实现的TAP(测试访问端口)进行通信。从安全角度来看,识别JTAG端口并与其连接允许攻击者提取固件,对逻辑进行逆向工程,并在设备上种植恶意固件。通过JTAG提取固件的技术在固件提取篇有具体例子。
3.I2C
内部集成电路是一种短距离通信协议,用于同一板上芯片之间的通信。
I2C的一个用例是EEPROM芯片,它连接到微控制器I2C引脚,通常存储数据或代码。 典型的攻击包括篡改数据,提取敏感信息,破坏数据等。我们分析EEPROM芯片上的静态数据,并通过嗅探I2C通信来执行运行时分析,可以了解安全隐患。
4.SPI
串行外设接口也是一种短距离通信协议,用于同一板上芯片之间的通信。与I2C相比,具有更高的吞吐量。
它用于与各种外围设备通信。 闪存和EEPROM芯片也使用SPI。 测试和分析的方法与I2C类似。
0×05.固件提取篇
常用的提取固件的方法有这么几种。
最简单的方法就是去官网下载,或者找技术售后索要,如果有的话网上一般都是可以找到的。
第二简单的简单的方法就是在OTA升级时进行抓包,抓取并分析通信的流量,得出升级固件的具体流程,如果可以从通信过程中直接获取升级固件的目的地址,直接去下载就可以,或者可以模拟固件升级的过程,然后获取固件。一般来讲,ftp、http等方式进行固件升级的产品比较容易使用此种攻击手段。
除去以上两种,接下来的方法是硬件安全研究人员常做的。
从编程器读取。分别连接芯片引脚和编程器,直接读取即可;有时候可能需要把芯片拆焊下来,通过烧录座编程器读取。
利用调试接口导出。通过UART串口,读取uboot启动信息,串口输出中可以发现具体型号,然后使用编程器读取并保存,就获取到固件了。
一些情况下,也会通过JTAG/SWD接口进行读取。将提取出的芯片固件在烧录座上,将仿真器与烧录座的JTAG接口连接,插入计算机,打开配套的客户端进行读取。
获取到固件后,之后的技术涉及偏向于软件层面,这儿不再展开。
0×06.彩蛋
前几天面了科恩,确实一面问的都是非常底层、基础的东西,把我记得的给列出来吧:
1.TTL和RS232区别?
2.眼图中“眼睛”张的越小表明什么?
3.串口通信中起始位和停止位的意思
4.IDApython的一些用法
5.SSL握手过程及其中的一些细节
0×07.参考(包括图片来源)
https://os.mbed.com/users/4180_1/notebook/i2c-debug-for-realterm/
https://payatu.com/iot-security-part-2-101-iot-attack-surface/
https://www.avrfreaks.net/forum/debugging-spi
https://iot-security.wiki/