-
Notifications
You must be signed in to change notification settings - Fork 91
Jam&Detection
上面这则新闻也是我们通常能见到利用干扰器做坏事的一个经典的案例了,因为汽车遥控所使用的频段为315Mhz
和433Mhz
,通常不法分子在这几个频段上发射白噪声
或者是普通的ASK调制无任何意义的信号
使原本的射频频段被占用
,遥控器就无法发送数据给汽车然后汽车没有收到上锁的指令,等车主走后不法分子进行行窃等等的行为了,然后我们站在研究的角度谈一谈如何去识别
这类的干扰行为或者是干扰攻击衍生出来攻击手段
首先先介绍一下汽车小偷常用到的干扰器,原理很简单利用两个频段的PT2262遥控板
在打开电源后一直发射
遥控信号,和我们一直按着遥控器一样,还有些是用两个频段的超再生发射模块
作为干扰源使用的,这两种方式的干扰成本都在50左右,技术门槛也不高
这是另外一种干扰器,但是目的主要的阻断手机2/3/4G/WIFI/蓝牙/GPS定位
使用的,原理是使用NE555
芯片产生三角波
信号在通过电源芯片进行升压放大然后传入银色的压控振荡器最后通过射频功放芯片将信号发射出来达到干扰通信的目的
那我们怎么去识别
这种干扰攻击行为,我们可以通过软件无线电的方式观察这个频段上的频谱
,如果用人在使用着干扰器的话在频谱图上会有很明显强度的一个变化,我们来举个例子吧
这个是正常频谱没有任何信号在发射
然后我们可以这个频谱上发现一段信号,可以这个识别为正常的遥控信号非干扰信号,然后我们来看下这个干扰信号是怎么样的?
这个就是打开了两种干扰器的频谱图,然后我们观察出市面上干扰器普遍干扰的频宽都特别宽并且在信号都是无任何变化持续的三角波
信号或是如右图那样不间断
的射频信号,我们可以根据这两点来区分出是正常通信信号还是有人在进行恶意的干扰攻击,但是要在户外的环境中抱着电脑和软件无线电设备通过频谱仪找到恶意的干扰特别引人耳目,也十分不便携,那有没有一款设备可以解决这个问题呢?这时候就轮到HackCubeSpecial
登场了
然后我们来说下如何去找到
干扰者或者干扰源
,我们可以通过配合定向天线
持续对天线的角位进行变化,来观察频点的信号强度
关系来确定干扰源的角位,或者我们通过HackCubeSpecial
的全向天线不断的移动探测点
的位置来找到信号最强的位置就能定位
干扰源了,并且我们还可以通过这种方式确定
手上的遥控是315
还是433
的,要确认是正常的通信行为和恶意的干扰行为,只要判断信号是有间隙
的还是持续性
的发射信号就能确定了
我们的HackCubeSpecial
已经封装好了函数,并且可以在多个频点同时工作
上面进行检测,这里我选择是两个遥控常用
的频点315/433
我们判断的依据就是CC1101
的RSSI
的寄存器(0x34 (0xF4))
,我们可以通过这个寄存器得到目前频点的信号强度
,有点像频谱仪,或者是空闲信道评估(Clear Channel Assessment,CCA)
都是类似的原理实现的
void DetectionJam(){
if (a)//不断的切换Freq1和Freq2频率
freq = freq1;
else
freq = freq2;
a = !a;
cc1101.cmdStrobe(CC1101_SIDLE);//射频芯片切换频率先进入IDLE状态
setfreqx(freq);//将频率写入射频芯片寄存器
cc1101.cmdStrobe(CC1101_SRX);//让射频芯片进入RX状态
delay(2);//预留芯片进入RX状态时间
int rssi = cc1101.readrssi();//读取RSSI寄存器
if (rssi > 128)//根据公式算出RSSI寄存器对应的dBm
RSSI_db = ((rssi - 256) / 2) - 75;
else
RSSI_db = (rssi / 2) - 75;
if (RSSI_db > Jam_RSSI ) { //假如射频信号dBm(信号强度)大于我们预设的值(Jam_RSSI=-73)进入该函数
Cube_PRINT.print("[RF][Jam]RSSI:");//在串口打印该频点信息
Cube_PRINT.print(RSSI_db);
Cube_PRINT.print("dB,FREQ:");
Cube_PRINT.print(String(freq).substring(0, 3));
Cube_PRINT.println("Mhz");
}
}
这个程序就是在这几个射频常工作的频点上进行RSSI的读取,就是不断的切换
这几个设备常工作的频点上,每个频点读取RSSI寄存器,然后我们根据RSSI值计算出去信号强度
来判断这个频点上是否有设备正在发射信号,如果信号强度大于我们设置的阈值(Jam_RSSI)
就打印出来在网页上进行显示
然后我们打开检测功能后就能检测到在那个频点上面有多强的信号正在发射,我们可以通过这个功能检测我们遥控的频点
,并且可以根据RSSI
移动检测的位置来找到射频的干扰源位置!
上面提到了怎么溯源干扰源的方法,那如何保证我的干扰不被这种方式给溯源到呢?或者说这样的检测方法可以那些缺陷
呢?现在讲如何用HackCubeSpecial
智能干扰测试
和刚刚检测类似可以同时在多个频点上进行工作
case 1: { //智能干扰函数
if (a)//不断的切换Freq1和Freq2频率
freq = freq1;
else
freq = freq2;
a = !a;
cc1101.cmdStrobe(CC1101_SIDLE);//射频芯片切换频率先进入IDLE状态
setfreqx(freq);//将频率写入射频芯片寄存器
cc1101.cmdStrobe(CC1101_SRX);//让射频芯片进入RX状态
delay(2);//预留芯片进入RX状态时间
int rssi = cc1101.readrssi();//读取RSSI寄存器
if (rssi > 128)//根据公式算出RSSI寄存器对应的dBm
RSSI_db = ((rssi - 256) / 2) - 75;
else
RSSI_db = (rssi / 2) - 75;
if (RSSI_db > Jam_RSSI ) { //假如射频信号dBm(信号强度)大于我们预设的值(Jam_RSSI=-73)进入该函数
cc1101.cmdStrobe(CC1101_SIDLE);
setfreqx(freq);
cc1101.cmdStrobe(CC1101_STX);//进入TX状态
digitalWrite(RF433_GDO0, HIGH);
delay(5);
digitalWrite(RF433_GDO0, LOW);//在捕获到高强度的信号频点上发送5MS的干扰信号,污染接收端的接收数据
Cube_PRINT.print("[RF][Jam]RSSI:");//在串口打印该频点信息
Cube_PRINT.print(RSSI_db);
Cube_PRINT.print("dB,FREQ:");
Cube_PRINT.print(String(freq).substring(0, 3));
Cube_PRINT.println("Mhz");
}
}
就是在刚刚检测的函数中加发射一段5MS干扰信号
代码,只干扰有效数据中的一部分
数据,因为接收端会因为这一段数据无法和自己匹配的凭证而不进行响应
因为没有信号的时候我们是不会去发射干扰信号的,所以如果是采用刚刚我们所说的识别方式是无法对这种干扰模式进行识别的,因为我们干扰时候同时是存在两个发射源
的,一个是我们的干扰设备一个是正常的遥控信号
视频:https://unicorn.360.com/hackcube/video/hackcube_jam.mp4
我们来在说说干扰衍生出来的攻击方式吧,通过两个射频芯片,一个芯片进行干扰
,一个进行对汽车遥控信号进行嗅探
,然后设置好嗅探的射频芯片的频宽使其不在干扰的频率范围内,然后遥控在发射信号时候对其干扰,另外一个射频芯片因为设置了接收信号的频宽所以可以正常的接收遥控的数据,然后汽车因为接收频宽较大所以是会被这种攻击方式影响的无法正确的接收完整的数据,所以黑客可以通过这种方式将汽车的滚动码数据嗅探下来
没有将功能码进行加密,如图所示,上面是Keeloq的编码格式,而下面的话就是存在问题的编码格式,功能码在Keeloq定义标准格式中出现了两次,一个是在固定码区域28Bit序列号后面4Bit(蓝色框),一个代在加密数据中4Bit(红色框),前面也有提到即使是修改了蓝色框功能码4bit的话还是不会影响汽车原本的打开或者关闭,只有解密后在修改了加密数据中的红色框的4Bit功能码,汽车才会执行对应功能码的功能函数,所以说如果是非Keeloq定制的标准的话可能就会出现下面这种被攻击的风险。也就是下面哪种格式,可以发现这种格式中的功能码是没有被进行任何加密的操作的直接是以明文的方式发出的,只要捕获足够的样本就能推测出功能码代表的操作,而这个操作是可以被任意修改的,前提是这个滚动码没有被使用过,意思就是如果我们在远离汽车的地方捕获到遥控发出的这个信号的话我们可以通过修改信号中功能码 ,然后在汽车前面发出这个信号就能改变原始信号的打开或者关闭的执行结果,可以通过干扰+重放攻击的方式使汽车收不到遥控的信号而我们能正常将数据捕获下来。
要有两个射频模块,一个用来干扰信号一个用来接收遥控信号。已上图为例,蓝色的是汽车接收的窗口范围,红色的是我们射频模块发射出来的干扰信号,而绿色的则是遥控发出来的信号。 可以发现只要我们在汽车接收的频宽内发出出来干扰信号的话我汽车是没有办法正常接收到遥控的信号的。意思就是我们通过在汽车接收的频宽范围内发射出干扰信号使汽车不能够正常的接收的遥控发射出来的信号,然后我在修改另外一个射频模块的接收频点宽度使其不受我们另外一个模块的干扰,让我们射频模块能正常接收到遥控发出的数据,汽车因为干扰的原因无法正常的收到遥控的数据自然而然的也不会有任何的动作,而我们的射频模块呢就能够正常接收到了最新的一个滚动码数据。 我们假设这个滚动码中同步计数值为0x0AA1,然后车主因为按下遥控任何反应通过来说会以为其他的原因在按多一次,这时候我们模块也像之前那样一个干扰,一个进行接收,然后我们再次捕获的下一个滚动码数据,假设这个滚动码中的同步计数值为0x0AA2,这时候汽车一样是没有任何动作的,然而我们的射频模块已经捕了同步计值0x0AA1,和0x0AA2这个两个滚动码信号了,这时候我们只要发射出0x0AA1。然后汽车正常上锁,车主也以为没有问题的离开了,然后汽车现在保存的是0x0AA1这个同步计数值,而我们射频模块还有0x0AA2这个同步计数值,这个时候我们只要修改0x0AA2这个遥控信号,修改其中的功能码例如把原来的关修改成了开,然后在发射我们修改后的信号,汽车就能够被正常的打开了!但是因为有同步计数值所以捕获到的信号只能够被使用一次,并且这个利用的条件非常苛刻,首先要确定的是遥控发出的信号中功能码的位置是没有被进行加密并且是可以被修改的,关键就在于功能码有没有被进行加密,像Keeloq的话是会发射两部分功能码,只有解开密文数据修改功能码才会起作用,而如果能解开密文也没有修改功能码的意义了
https://electronicsprojectshub.com/make-cell-phone-signal-jammer/
https://www.andrewmohawk.com/2016/02/05/bypassing-rolling-code-systems/