IoT设备安全分析思路

IoT设备安全分析…

内容纲要

IoT设备安全分析思路

0x00.固件分析

固件提取

编码器读取固件(归根结底是利用设备自身flash芯片去解码读取固件)

  1. 在线读取,直接将导线连接到芯片的引脚,在通过飞线连接编程器,进行在线读取固件。
  2. 离线读取,flash 拆下flash芯片,把芯片拆焊下来,通过烧录座编程器,离线读取固件。
  3. 内部备份,指拿到了设备权限,从块设备备份数据,或者从I2C、SPI驱动接口读取数据。
  4. 官网下载
  5. OTA升级时抓包

固件解包

1)自动解压binwalk -e xxx.bin

2)对于无法自动解压的固件,可以尝试以下方法分析:

  1. 使用文件分析工具获得固件映像文件的基本数据类型010editor。
  2. 使用字符串打印工具(strings)提取文件中所包含的明码字段,寻找是否有引导装载程序以及操作系统内核的信息。
  3. 使用十六进制转储工具(如hexdump)分析为了对齐固件文件空间分段而放入的连续填充字节,文件系统标识有可能紧跟其后。
  4. 文件系统有可能使用非标准的特征符,如果发现可疑特征符字段,可以替换为标准特征符,再尝试由固件解压工具进行识别。

固件分析

固件解压之后的分析主要集中在对常见漏洞入口进行针对性的静态分析,包括:密码、默认开启的服务、端口、配置文件等。

分析方法如下:

1)尝试提取文件中包含的明码字段是否存在硬编码密码等。

2)发掘固件的关联性,包括分析固件作者、库使用、目录结构、配置文件关键字、定制默认密码等信息。

3)对二进制可执行文件进行反汇编分析,可以借用一些成熟的工具软件,如:IDA Pro、Capstone等。对特定的嵌入式系统(如VxWorks)的登录模块进行反汇编分析,获取其登录密码的哈希算法等信息。

4)如果发现包含密码哈希的文件,可考虑使用John the Ripper或Hash Suite等工具进行暴力破解。前者有版本支持GPU加速(支持CUDA和OpenCL)。使用暴力破解工具可以利用前述步骤中提取的关键字,显著加快运行效率。

0x01.协议分析

网络层

路由器抓包

树莓派刷openwrt

tcpdump

安卓抓包

当遇到使用了 ssl 的协议 例如 HTTPS ,抓包获取不到明文,这时可以通过如下方法进行抓包,例如 Android 下面伪造证书,然后 hook SSL Pinning ,也可以使用 Xposed 的 JustTrustMe 模块 ,然后配合 mitmproxy 抓包。

硬件通信

SPI

SPI 串行外设接口(Serial Peripheral Interface),以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。

通信原理:四根线:SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

  • SDI – SerialData In,串行数据输入;
  • SDO – SerialDataOut,串行数据输出;
  • SCLK – Serial Clock,时钟信号,由主设备产生;
  • CS – Chip Select,从设备使能信号,由主设备控制。

分析方式:逻辑分析仪采集 spi 总线数据,可以看到四个通道的波形变化,判断信号的时钟周期、时钟相位和极性,并能够解码获取实际传输的数据和指令。

I2C

双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。

通信原理:SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平。

分析方式:逻辑分析仪采集 I2C 总线数据,可以看到 SDA 和 SCL 的数据波形,查看每次的指令和数据、地址等。

CAN

控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。

通信原理:CAN总线使用串行数据传输方式,可以1Mb/s的速率在40m的双绞线上运行,也可以使用光缆连接,而且在这种总线上总线协议支持多主控制器。

USB

通用串行总线(英语:Universal Serial Bus,缩写:USB)

通信原理:USB总线属于一种轮询式总线,主机控制端口初始化所有的数据传输。每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)。

image-20210327155213507

分析方式:主要是Wireshark之类分析数据段。可tshark辅助,单提取数据段,较方便。

UART

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。

通信原理:计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输

image-20210327155405195

  • 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
  • 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
  • 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
  • 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
  • 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
  • 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960BIT/S。

分析方式:通过逻辑分析仪抓取 uart 总线数据。

无线电安全与侧信道攻击

类似当时信号与系统,时域与频域的概念。

比如openstack的那个延时测用户存在洞。

还有rwctf2019线下见到的独角兽团队的侧信道嗅探屏幕内容。https://www.freebuf.com/articles/wireless/246842.html

0x02.硬件调试

串口调试

协议与注意的小Tips

主要是用UART(通用异步收发传输器),也就是之前叫的TTL版。(UART 、COM 指的物理接口形式(硬件), TTL、RS-232 是指的电平标准(电信号)) UART有四个pin,VCC, GND , RX, TX(VCC电源电压 GND接地 TX发送 RX接收),用TTL电平(低电平为0(0V)、高电平为1(3.3V或以上))

RS232和TTL在软件协议层面是一样的

RS232和TTL,唯一的,最根本的不同在于:

硬件(机制)不同

(1)TTL

逻辑高电平==’1‘==Vcc==3.3V或5V

逻辑低电平==’0‘==0V==0V

(3)RS232:

逻辑高电平==’0‘==负电压== -3V~-25V==常为:-13V

逻辑低电平==’1‘==正电压== 3V~25V==常为:13V

UART 串口的 RXD、TXD 等一般直接与处理器芯片的引脚相连,而RS232串口的 RXD、TXD 等一般需要经过电平转换(通常由 Max232 等芯片进行电平转换)才能接到处理器芯片的引脚上,否则这么高的电压很可能会把芯片烧坏。在调试的时候, 多数情况下我们只引出RX、TX、 GND 即可,但是 UART 的数据要传到电脑上分析就要匹配电脑的接口,通常我们电脑使用接口有COM口和USB口(最终在电脑上是一个虚拟的COM口),但是要想连上这两种接口都要需要进行硬件接口转换和电平转换。

找UART口
  1. 板上有标就直接用。
  2. 无标就用万用表。用电势差去找GND和VCC,RX、TX用串口有效性判断。TTL电平模式下反接,线序为GND接GND,RXD接TTL板的TXD,TXD 接TTL板的RXD。其他RX对RX,TX对TX。

主要作用:拿shell

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

JTAG调试

JTAG(Joint Test Action Group;联合测试工作组)

标准的 JTAG 接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线,另外 ARM 还提供了 SWD 的调试接口,比 JTAG 所需要的线更少,高速模式下更稳稳定,部分厂商如TI,还支持2线制 JTAG 协议进行调试,称为 SBW 接口。 常见支持上述协议进行调试和仿真的设备如:Jlink、Ulink、ST-link 和 MSP430 仿真器等,jtag 既支持在线调试,又能直接获取固件,对于芯片的调试和分析是非常具有帮助的。

读写固件:电脑上安装好 Jlink 驱动,打开 J-Flash 客户端,设置好参数,主要在配置栏选择正确的芯片型号,然后点击连接,在点击 Target->Read Back->Entire trip 即可读写固件。

接口调试

  1. 预留JTAG接口。
  2. 飞线连上对应引脚进行调试。

主要作用:读写固件

识别JTAG端口并与其连接允许攻击者提取固件,对逻辑进行逆向工程,并在设备上种植恶意固件。

JTAGulator

JTAGulator是一个开源硬件工具,可用于识别目标设备上测试点、过孔或元件焊盘的OCD连接,进而可以使用Attify Badge接线并读取程序固件,是用于自动化识别JTAG接口的设备。

JTAGulator的官网可以下载制作JTAGulator所需的所有资料,GERBER光绘文件,BOM元件列表等等。

主要构成:板子加开源固件(烧录软件)

远程调试

可以通过串口命令开启 telnet 或者 ssh 服务,远程登陆设备。通过系统命令、程序的输出以及 gdb 进行 远程调试,提高调试的便捷性。

  • 使用 gdbserver 附加到 goahead 进程进行远程调试,验证我们的猜测是否正确。 telnet 连上路由器并使用 gdbserver 附加到 goahead 进程进行调试。

0x03.硬件修改

硬件层面对设备进行 diy 功能改造。例如针对传统路由器的硬件架构,替换大容量的内存和闪存芯片,使之能够刷 openwrt 系统;对某些设备进行配置层的升级,如 iPhone,小米等手机内存扩容,使之具有更大容量的存储空间和运行内存; 以及对设备的破解,例如 ps,xbox 等游戏主机系列的硬破、软破,还有对各种加密录音笔,摄像头,加密U盘和硬盘的破解。 研究硬件修改对硬件diy改造,以及厂商在硬件层的安全防护具有非常重要意义。硬件层修改分为硬改和软改两个部分,硬改是对硬件中芯片和电路的改造、替换等,软改是针对芯片固件的修改、重打包等。本节将用具体的几个实例展示如何对设备进行硬改。

硬改

  • 硬改路由器刷openwrt
  • 手机加内存等等

软改

在固件层面进行修改,如通过修改智能摄像头固件中的密码,绕过厂商在串口调试时的密码验证;如修改家用电视机主板固件中的用户信息,解决开机故障问题,如修改路由器固件,使低版本固件兼容高版本硬件。

嵌入式设备

对于嵌入式系统的固件,查看其文件系统,解压,找到对应的文件,直接修改,修改之后重打包刷入即可。

一例修改改路由root密码:

  1. binwalk解包
  2. 发现有多个 squashfs 文件系统,且解包后对应的文件系统根目录只有一个,其他几个是不完全的目录,猜测第一个 squashfs 对应文件系统根目录。将第一个 squashfs 文件系统从固件中 dump 出来,然后使用 unsquashfs 工具解压。
  3. 查看/etc/shadow,置空root密码字段。
  4. mksquashf工具打包,注意压缩格式选用和bin文件 相同的压缩格式,blocksize 设置为和和bin 相同的xxxxxxx bytes,将所有文件的所有者使用 -all-root 参数设置为 root,-nopad 指定不要进行4k对齐。
  5. 若重打包之后的文件系统比原文件系统要小,对bin文件末尾进行填充。
  6. 确认bin文件大小一致后,与其他解包出的bin文件按顺序拼接为新固件。

单片机

对于无操作系统的单片机固件,需要通过逆向出来,再来修改逻辑或字符串。

工控

协议分析

ModBus

  • 标准的Modicon控制器使用RS232C实现串行的Modbus。

  • Modbus的ASCII、RTU协议规定了通信数据的结构、命令和应答方式。数据通讯采用Master/Slave方式,Master端发出数据请求消息,Slave端接受正确消息后悔发送数据到Master端以响应请求。Master端也可以直接发送消息修改Slave端的数据,实现双向读写。

  • modbus TCP和modbus RTU基本相同,但是也存在一些区别

    • 从机地址变得不再重要,多数情况下忽略。从某种意
      义上说从机地址被IP地址取代
    • CRC校验变得不再重要,甚至可以忽略。由于TCP数
      据包中已经存在校验,为了不重复造轮子,modbuCP干脆取消了CRC校验。
    • TCP 模式是为了让Modbus 数据顺利在以太网上传产生的,使用TCP 502 端口。
    • 该协议物理层,数据链路层,网络层,传输层都是基
      于TCP 协议,只在应用层,将Modbus 协议修改后装进去; 接收端将该TCP 数据包拆封后,重新获得原
      始Modbus 帧,然后按照Modbus 协议规范进行
      析,并将返回的数据包重新封装进TCP 协议中,返回
      到发送端。
    • 与串行链路传输的数据格式不同,TCP 模式去除了
      加地址和校验,增加了报文头。
  • Modbus协议功能码

    • 功能码01为度内部比特量输出状态;如告警、变位、故障、异常等。
    • 功能码02为度外部开放量输入状态;如光耦输出、继电器输入等。
    • 功能码03为读内部输出量的寄存器;如一些配置参数、定值的读取等。
    • 功能码04位读外部输入量的寄存器;如外部电压电流模拟量,温湿度等。
    • 功能码05位写内部单个开关量状态;如光耦输出、继电器输出等。
    • 功能码06为写内部单个寄存器的值;如更改配置参数、定值等。
    • 功能码15位写内部多个开关量状态;如同05
    • 功能码16为写内部多个寄存器的值;如同06;对时是写多寄存器,用此功能码。

协议分析- S7-common

S7通信支持两种方式

  • 1)基于客户端(Client)/服务器(Server)的单边通信;
  • 2)基于伙伴(Partner)/伙伴(Partner)的双边通信;
    • 客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。
    • 在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要
      被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。
  • 由TPKT,COTP,S7 PDU三部分组成并且由TPKT和COTP为S7PDU通讯搭建链路
  • S7协议分析
    • 刚看到TPKT和COTP也许会很迷惑,其实在具体的报文中,
    • TPKT的作用是包含用户协议(5~7层)的数据长度(字节数);
    • COTP的作用是定义了数据传输的基本单位(在S7Comm中
      PDU TYPE:DT data);
    • S7Comm与标准TCP/IP比较:S7Comm是一个7层协议;
      TCP/IP是四层协议,用户数据在第四层TCP层完成;
    • 计算机与PLC进行通讯,可以连接102端口,这是西门子开放的一个通讯端口

MMS

MMS 的基本思想就是定义一种大家都能理解的公共语言。一些来自不同生产厂家的智能装置,这些装置可能运行着不同的操作系统和程序,硬件结构也可能存在千差万别,设置同一厂家不同时期生产的不同型号的装置在硬件和软件上也可能存在差异。

要达到互操作的目的,就必须先考虑“屏蔽”叼各装置的具体技术细节(如 CPU 型号、操作系统、程序编程语言、开关量子系统),
使各装置在网络通信方式上遵守同一的规定,具有相同或相近的外部接口。
MMS 采用构建虚拟设备(即 VMD)的方法来达到隐藏各类装置技术细节的目的。虚拟设备由实际设备映射得到,它和装置的具体细节无关,具体通信时信息交互在客户端和虚拟设备之间进行。这样就 “屏蔽”掉了装置的技术细节,客户端就可以和不同厂家、不同型号的多种装置进行通信。

IEC61850 与 MMS 的对象映射

编号 IEC61850 对象 MMS 对象
1 服务器(Server) 虚拟制造设备(VMD)
2 逻辑设备(Logical Devices) 域(Domain Objects)
3 逻辑节点(Logical Nodes)
4 数据(Data)
5 报告控制块(RCB)
6 定值组控制块(SGCB)
7 日志控制块(LCB)
8 控制(Control)
9 数据集(Data Set)
10 日志(Logs)
11 文件(Files) 文件

参考资料

IoT安全Wiki https://iot-security.wiki/

harmoc

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注