我们团队之前也有用USRP和GNUradio对其他的胎压设备进行的安全检测,我不使用这套环境的原因是软件无线电的设备和笔记本已经算体积不小的一套设备,通常测试环境都在户外,在这种环境下对这个胎压系统做安全检测实在不方便,并且一套无线电设备也不是一般入门小白能消费的起的,所以这也是为什么我想打造一套低成本便携性无线电攻防设备的原因。
首先我们要观察这个设备的工作频点,通常这类的胎压设备都工作在433.92Mhz
这个频点上,传感器会在安装和卸下时候发送无线数据,否者就要等待数分钟传感器才会再次发送胎压数据,因为低功耗的原因考虑。
然后我们可以通过观察频谱(Fosphor)
方式得到该信号工作在433.92Mhz
上,调制方式为2-FSK
,两个主瓣之间的频率偏差20.5Khz(Deviation)
,然后我们通过软件无线电的方式将胎压的原始信号接收下来进行分析。
然后这个就是我通过软件无线电的方式采样到的原始信号导入到dspectrum
的频谱图,然后我们通过这一幅频谱图来讲讲2FSK
调制方式:
2FSK
调制方式简单来说就是两种频率来表示 Bit 0
,Bit 1
,如图所示假如我们要发射11100101
,这段数据在要发送Bit 1
数据时候频率切换成了载波频率F1
,要发送Bit 0
数据时候切换到载波频率F2
,最后的调制输出就是我们用软件无线电接收到的结果了,然后我们可以通过这种方式将信号数据解调
下来了进行分析了。
这个就是整一段胎压传感器发射出来的信号了,前面是前导码用于唤醒接收端使用的,前导码后面一个特别长的脉冲信号是同步引导码用于发射端和接收端同步时钟使用的,后面就是胎压的有效数据
了,我们可以对这个有效数据进行分析了。
我们先得到胎压的数据NRZ
速率为9.08k
,数据如果采用曼彻斯特
或者类似编码
的话速率要除于2,得到速率为4.5K
。
最开始分析信号时候以为数据是通过曼彻斯特
进行编码的,发现用曼彻斯特方式怎么解码都不对,后来分析很久之后查了一下芯片的datasheet
才发现是自有编码协议
,这个就是传感器的编码规则
,下一个Bit的波形是会根据上一个Bit波形结尾的电平来决定的,知道编码规则后通过这个我们对数据进行进行解码,以一个字节的信号的波形举例吧,从开头的Bit 0
开始讲吧,可以看到前面的脉冲是高电平
波形,这时候如果要发送Bit0
的数据就需要输出NRZ"01"
,如果之前是低电平
的话则输出NRZ"10"
,如果是要输出Bit1
同理,上一个波形结尾为高电平
输出NRZ"00"
,如果是低电平
的话输出NRZ"11
,就可以通过这种方式得到一个字节的数据,二进制01011100
,然后转成十六进制
,这一段的波形就表示0x5C
的数据内容了:
通过多次对多台胎压监测设备以及多个传感器器的信号进行行行采样、逆向分析得到其信号的数据结构为:
ID识别码 (4 Byte)+ 电压 (1 Byte) + 压感 (1 Byte)+ 温度 (1 Byte) + 气阀 (1 Byte) + CRC (2 Byte)+停止码(1.5Bit)
首先我们来说一下这里的参数,ID
是每个传感器的序列号
类似的标识符,一套胎压系统配备四个传感器所以出厂时候会绑定四个ID
,然后就是气压
,温度
,气阀(漏气检测)
的数据,通常低于或高于设置的数值就会进行报警
,每家胎压设置的阈值
都不一样我们就不过多的说了.然后就是数据中CRC校验
.将所有发射的数据进行CRC16
得出两个字节的校验数据附加到数据结尾。
需要注意是这里采用的CRC16的校验方式,并且CRC16
有多套标准,经过重复的分析得出使用是CRC16_CCITT
这套的标准,最后的停止码没有任何意义就是代表数据已经发射完了。
假如说要发射出TPMS_data其中的数据,最后会发射出来的就是20959185A0406300528C
这串数据,数据的结尾528C
就是算出来的CRC
这个就是算出结尾两个字节校验码的代码,接收端会先判断这两个字节的校验码,如果是不对,接收端是不会去响应的。
之后我们就可以根据这个去发射伪造传感器的数据了,这里我使用的TI的CC1101
射频芯片,我们通过Atmega32u4
通过SPI(MOSI,MISO,SCK,CS)
配置射频芯片CC1101
的相关射频寄存器,然后通过CC1101
的GDO0
引脚将射频数据发出,也可以采用数据包模式将数据发射出来,但是因为数据包模式不方便兼容其他的类型的胎压设备。
这个是根据胎压传感器信号生成的CC1101
寄存器的配置,可以通过SmartRF Studio
配置完参数后导出,不过有些寄存器是不支持IDE去进行设置
的,必须是根据芯片的datasheet
去修改的,比如说让射频芯片处于异步模式
,切换射频芯片的工作状态
等等。
在cc1101.init()
函数中将刚刚的射频配置写入CC1101的相关寄存器中,然后我们挑几个关键的讲讲,setfreq
函数用于将CC1101设置在胎压的工作频率
上,MDMCFG2
设置芯片的调制模式为2FSK
,我们这里使用的芯片的异步模式,就是通过引脚
去将数据发射出来,不是通过SPI
方式将要发射的数据写入到芯片的发射缓存区中。
left_back这个数组里面存着的就是待发射的数据,CRC通过Transmit_TPMS自动算出来附加到数组结尾。我们接下来看看Transmit_TPMS发射数据操作函数。
然后这个是发射数据操作函数,算出CRC数据后根据Transmit_data的数据内容在GDO0这个引脚上输出对应的波形。
然后我通过这种方式就能够对这个传感器进行伪造攻击了:
这个就是我们伪造出来的引脚波形:
因为胎压数据没有经过任何的加密
的操作,完全是明文传输仅仅只有CRC
进行校验,只要知道其中使用的编码规则或者协议数据就可以很简单的对这个胎压传感器进行伪造攻击!并且其中传感器id是明文传输
的,只要在一个城市中部署足够多的嗅探节点可以对安装了胎压的汽车进行轨迹分析
,从而分析出每个车主的生活轨迹。
目前只是对2FSK的胎压信号进行伪造并发射,并没有对2FSK进行解调解码的操作,后面有时间的话会对这一块进行升级吧,增加嗅探解码的功能。
然后在我们的HackCube-Special 上已经封装好了这个伪造胎压传感器的功能,各位对这块感兴趣的小伙伴可以看下我们HackCube-Special有任何问题的欢迎在我们的社区上交流。
我们的硬件产品预计会在12月份年底左右上线,在我们社区上提交质量不错的文章是有机会拿到第一时间产品的哟~
*本文作者:mobier,转载请注明来自FreeBuf.COM