当前位置: 首页 > news >正文

技术研究 | 我所了解的物联网设备渗透手段(硬件篇)

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,武能示波器,软硬方面的技能兼备。

图片.png

废话说完了,接下来进入正题。

0×03.工具篇

推荐用树莓派吧。很多demo都是在树莓派上开发的,然后在后期出于成本等方面的考虑,联系专业的厂商进行硬件的定制,剪切了不必要的硬件。此外,树莓派自身就是ARM架构,与许多IoT设备相似,当然,还有相当一部分是MIPS、PowerPC等,这些架构的话,树莓派带起来可能会有困难,在计算机上装个QEMU或者FAT基本够用了。树莓派另一方面在于原生的raspbian,有许多的开源工具可以使用,比如OpenOCD、SPIFlash等等。

图片.png

此外,还需要一些硬件工具,比如SDR、万用表、烙铁、热风枪、烧录座等等,土豪可以再买个示波器、电子显微镜;一些使用的命令行级别的工具,如file、hexdump、strings、dd、lzma、7z等。

图片.png

0×04.接口调试篇

主要碰到的接口有UART、JTAG、I2C、SPI等,这儿详细讲讲UART的,因为我用到的最多,其次就是JTAG,相对来说,I2C、SPI比较少。

1.UART(通用异步接收器发送器)

是一种硬件组件,允许两个硬件外围设备之间的异步串行通信。它们可以位于同一块电路板上(例如微控制器与电机或LED屏幕通信),也可以位于两个不同的设备之间(例如设备微控制器与PC通信)。它可以允许通过串行读取/写入设备。

在许多物联网设备中,板上的UART端口保持打开状态,任何人都可以通过串口连接和访问以获得shell,日志输出等。设备通常会有一组引脚,连接到微控制器UART RX和TX引脚,用于发送和接收串行数据。

图片.png

在板子上找到相应的引脚后,连接计算机前,还需要usb转ttl:

 

图片.png

用于转换电气标准,即高低电平的转换。

连接好后打开xshell或者secureCRT,设置端口和波特率,就可以拿到shell了。

图片.png

当然大部分情况下没这么简单,可能只是进了busybox,还需要进一步地搜集、解密root的密码等操作,这里不再展开。

2.JTAG

JTAG属于微控制器调试接口。微控制器具有在运行期间使用指定引脚进行调试的规定,这些引脚连接到电路板上的引脚。这些引脚(端口)由开发人员和设计人员用于调试,读/写固件和微控制器内部存储器,生产后控制/测试微控制器引脚。这使得调试端口成为最关键的攻击面之一,因为它为攻击者提供了强大的功能和访问权限。除了JTAG之外,还包括cJTAG、SWD。

JTAG的接口在PCB上基本如下图:

图片.png

JTAG协议定义了可用于测试和调试微控制器的标准接口和命令。 JTAG定义了四个引脚接口(以及一个额外的可选引脚TRST)

开发者可以使用这些引脚与微控制器上实现的TAP(测试访问端口)进行通信。从安全角度来看,识别JTAG端口并与其连接允许攻击者提取固件,对逻辑进行逆向工程,并在设备上种植恶意固件。通过JTAG提取固件的技术在固件提取篇有具体例子。

3.I2C

内部集成电路是一种短距离通信协议,用于同一板上芯片之间的通信。

I2C的一个用例是EEPROM芯片,它连接到微控制器I2C引脚,通常存储数据或代码。 典型的攻击包括篡改数据,提取敏感信息,破坏数据等。我们分析EEPROM芯片上的静态数据,并通过嗅探I2C通信来执行运行时分析,可以了解安全隐患。

图片.png

4.SPI

串行外设接口也是一种短距离通信协议,用于同一板上芯片之间的通信。与I2C相比,具有更高的吞吐量。

它用于与各种外围设备通信。 闪存和EEPROM芯片也使用SPI。 测试和分析的方法与I2C类似。

图片.png

0×05.固件提取篇

常用的提取固件的方法有这么几种。

最简单的方法就是去官网下载,或者找技术售后索要,如果有的话网上一般都是可以找到的。

图片.png

第二简单的简单的方法就是在OTA升级时进行抓包,抓取并分析通信的流量,得出升级固件的具体流程,如果可以从通信过程中直接获取升级固件的目的地址,直接去下载就可以,或者可以模拟固件升级的过程,然后获取固件。一般来讲,ftp、http等方式进行固件升级的产品比较容易使用此种攻击手段。

图片.png

除去以上两种,接下来的方法是硬件安全研究人员常做的。

从编程器读取。分别连接芯片引脚和编程器,直接读取即可;有时候可能需要把芯片拆焊下来,通过烧录座编程器读取。

图片.png

利用调试接口导出。通过UART串口,读取uboot启动信息,串口输出中可以发现具体型号,然后使用编程器读取并保存,就获取到固件了。

图片.png

一些情况下,也会通过JTAG/SWD接口进行读取。将提取出的芯片固件在烧录座上,将仿真器与烧录座的JTAG接口连接,插入计算机,打开配套的客户端进行读取。

图片.png

获取到固件后,之后的技术涉及偏向于软件层面,这儿不再展开。

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/

转载于:https://www.cnblogs.com/h2zZhou/p/10364711.html

相关文章:

  • Exif xss
  • C语言复习1_变量与数据类型
  • linux操作文本三个命令awk、grep、sed
  • 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
  • 食用指南
  • ffmpeg 推送、保存rtmp 流命令
  • 记账软件——第三天
  • 通过域对象获取当前项目的文件路径
  • VBA中Option的四种用法
  • Mybatis获取Connection
  • WPF图形图像相关类
  • [清华集训2016]你的生命已如风中残烛——组合数学
  • MySQL--各版本DDL 操作总结
  • 将matlab数据保存为excel文件
  • 全程软件测试:软件测试的标准观点
  • 【css3】浏览器内核及其兼容性
  • 78. Subsets
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS 7 修改主机名
  • node学习系列之简单文件上传
  • PAT A1050
  • ReactNativeweexDeviceOne对比
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Theano - 导数
  • 基于webpack 的 vue 多页架构
  • 那些被忽略的 JavaScript 数组方法细节
  • 首页查询功能的一次实现过程
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​马来语翻译中文去哪比较好?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (九)One-Wire总线-DS18B20
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)程序员疫苗:代码注入
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Framework .NET Core与 .NET 的区别
  • .net 受管制代码
  • .net 托管代码与非托管代码
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net 知识杂记
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @angular/cli项目构建--http(2)
  • @Autowired自动装配
  • @Valid和@NotNull字段校验使用
  • [C#] 如何调用Python脚本程序
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [ESP32] 编码旋钮驱动