RFID ACR-122U M1射频卡破解分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36169781/article/details/86762533

最近接触到Arduino的RFID模块,一直在思考怎么给手中的RC522模块做应用拓展,恰好Arduino库更新了有关RFID Cloner的相关源码,连接上模块烧入程序,预想是读出手头上的洗衣卡内信息。但是后来由于M1卡扇区加密的情况,遂想尝试破解读数据。

材料

  1. 校园一卡通
  2. 洗衣卡
  3. UID白卡
  4. ACR122U以及配套软件
  5. Windows平台 RFID RadioEye、M1服务程序。

关于M1卡

M1卡全称Mifare classic 1K卡,属于无源被动式射频卡,又称为S50卡、复旦卡。工作原理简单的说读卡器向卡片发送一定频率的电磁波,使卡片内部电路共振产生电荷,电荷积累到一定量的时候就会使卡片芯片工作,从而向读卡器反馈数据。M1卡内部有编号为0-15的16个储存扇区,每个扇区内又有编号为0-3的4个数据块,每个扇区0号数据块储存卡片ID和制造商预先写入数据,3号数据块钱储存着对扇区读写操作的两段密钥KeyA和KeyB,密钥中间是控制位。M1卡的0扇区是出厂预置的,所以在后续操作中不能进行写入操作。所以不能对M1卡进行全卡的复制,如果想复制M1卡,则新卡可以选择0扇区可写的UID白卡。

Arduino+RC522

构成很简单,RC522模块对应针脚正确连接,基本就是个读写器的雏形了,烧入程序,开始读卡,但是RC522读到后面几个扇区时出现了连接超时的情况,以为是模块连接问题,后来换了公交卡(同为M1卡),发现全扇区均不可读,所以应为扇区加密的缘故。

前期分析

本次着手的洗衣卡读卡设备为离线读卡,与之不同的是,一卡通这种关键性的卡片应该为数据中心统一管理,卡中仅存有学生的学号对应的卡片ID,每次刷卡读卡器均会向数据服务器请求对应数据然后进行扣费操作,这种关键操作我们不再去触碰。而一卡通具有刷热水的功能,上次丢卡补办后,热水的余额并没有回来,所以其中的热水功能和洗衣机卡一样,同为离线刷卡不记名原理,而我们只能对这种离线卡进行后面的操作。
  上一部分,Arduino+RC522模块并不能对加密过的卡片扇区进行读写操作,我们用市面上已经很成熟的ACR122U读卡设备进行后期读写。

ACR122U

ACR122U仅具有对射频卡的读写功能,也就只是一个功能十分单一的读写设备,但是它读写的速度非常高,这对扇区密码枚举非常有利。装好设备的驱动程序后,用配套的M1卡服务程序就可以对扇区密钥快速枚举,也就是平常所说的“跑字典”,M1的卡每个扇区分别拥有KeyA和KeyB,也就是32个密钥,枚举完成的快慢取决于密钥的复杂程度,而大多数的卡片仅加密了关键的数据区,其他扇区均为默认密钥,M1卡有很严重的验证漏洞,通过不断地发送验证信息以及卡片信息的返回,从而很快的得到密钥。例如手中的这张洗衣卡,只在15扇区加密,枚举过程不到5秒就完成。

M1服务程序

连接设备后,放上洗衣卡,开始破解,程序开始快速枚举各个扇区密钥,这张卡0-14扇区几乎一秒左右就全部拿下,后面的15扇区密钥也很快被破出。运行结束后,会在根目录产生一个1KB大小dump文件,里面记录了各个区块的数据。可以用WinHEX直接打开查看,为了更直观的阅读,我将dump转为txt,直接分析15扇区数据。

15 扇区
0区块:00 00 27 10 00 00 00 01 73 11 75 13 99 99 99 6B
1区块:00 00 22 C4 16 12 03 01 00 00 00 00 00 22 C4 DB
2区块:00 00 22 C4 16 12 03 01 00 00 00 00 00 22 C4 DB
3区块:4D 2A D0 67 72 05 7F 07 88 69 4D 2A D0 67 72 05


下面这张图大概表明了M1卡数据的存储格式

数据分析

得到这张卡的数据以后就可以对卡进行复制操作,这种离线不记名卡最大的BUG就在于无限复制而且读卡器还不会对ID查重,可以达到次数无限的效果,但是我们的目的不在于利益,仅对卡内数据进行分析。阅读15区块,这张卡对应的次数是89次,但是区块数据中没有89,可以理解其中的数据应该是用另一种形式表现的,所以我准备去楼下刷几次卡,记录每次刷卡后的数据,观察变化。经过记录发现,每次1、2区块的值都在发生变化,而1、2区块数据又完全相同,我摘出了89、88、87、86次对应的1区块数据。

1区块:000022C416120301000000000022C4DB 89
1区块:000022601612030100000000002260FF 88
1区块:000021FC16120301000000000021FC0A 87
1区块:00002198161203010000000000219871 86

可以发现,每次仅有3、4字节,14、15、16字节在发生变化,而且3、4字节的变化和14、15字节变化一致,而16字节单独变化。由此可以推断,3、4字节应该为次数数据字节,而后面的16字节为校验码字节。在这说一下校验码字节,校验码的算法不同于前段变化数据,它是根据前段数据变化而变化,有着自己相应的算法。我们将89次的数据样本3、4字节22C4转换为10进制得到8900,这正是次数的100倍,也就是在读卡机上显示89.00,继续将其他样本226021FC2198转换为10进制,同样得到了次数×100的结果。那么可知次数×100然后转换为16进制就是这个区段的数据。将次数数据复制到14、15字节,那么现在就只有16字节校验码没有得出了。这个校验码我算了大概十几个小时也没有找到算法,最后在知乎上找到大神的提示,然后又算了1个多小时很快得到答案,考虑到加密的安全性,算法步骤不再列出,大致涉及 二进制、十进制、十六进制的四则运算、二进制取反、偏移计算、十六进制做异或运算。

Mifare Recovery Tools写卡

数据段的算法写出来以后直接做计算写数据就好了,丧心病狂写了CB20(520.00),用Mifare Recovery写入UID白卡。
  满心激动又怕监控发现,我提了一桶衣服下去刷卡,然后读卡机显示ERR-003,直接报错。回来又将0-15扇区数据挨个对比检查,并没有发现其他变动的数据,观察到对应位置的15扇区0块16进制数值为2710,十进制10000,也就是说,上次洗衣大妈卡机写数据的时候将这张卡的最高次数限制到了100次,果断改为CB20,这次改的时候留了个心眼,没改最后两位,将除了最后两位以外的字节加入校验码算法,果然得出了不同的数值,代表着15扇0块16字节采用和上文相同算法的校验码。
 继续下去读卡,次数写入成功。

校园卡读取

继续放上一卡通进行破解,导出dump,分析数据,热水卡余额为8.07,观察12扇区数据直接得出十进制结果。

12 扇区
0区块:00000000000000000000000000000000
1区块:0000080700000000000000000000000F
2区块:00000000000000000000000000000000
3区块:E07004123870FF078069E07004123870

相同,最后两位猜测为校验码,实验计算0x8 Xor 0x7 == 0xF,直接得出校验码结果,安全系数实在太低。将0807改为9999,计算0x99 Xor 0x99 = 0,校验位填入00,重复写卡步骤。一次到位。

总结

很多年以前,M1卡就爆出了验证漏洞,可以说是M1卡的致命漏洞,通过验证漏洞配合读卡器很容易就可以获取扇区数据。另外,从校园卡的扇区中读出了银行卡卡号以及其他信息,这关乎到学生的隐私,如果学校能将这些信息都像学校餐厅刷饭那样存入学校数据库,只有在验证卡片ID匹配的时候才能读取,就能避免不必要的信息泄露。虽然说M1卡具有的漏洞不可避免,但是做好扇区数据的加密或者采用更复杂的校验算法同样可以保护卡片信息不被篡改。抛弃默认的扇区Key,哪怕是没有数据的扇区也写入自己的密钥,不用通用的校验算法,这样才能给试图破解者增加难度,更好的保护卡片信息和商家利益。


文中分析涉及到的两张UID白卡已经销毁。此文仅作技术分析用,如有非法操作本人不负任何责任,请遵守相关法律法规。


猜你喜欢

转载自blog.csdn.net/qq_36169781/article/details/86762533