RFID入门:Mifare1智能洗澡卡破解分析

科普前置知识:

Mifare Classic card提供1k-4k的容量,我们经常见到的是Mifare Classic 1k(S50),也就是所谓的M1卡。M1卡有从0到15共16个扇区,并且每个扇区都有独立的密码,每个扇区配备了从0到3共4个段,每个段可以保存16字节的内容,反正从0开始数 就对了(和数组下标为0开始一样)。

每张M1卡都有一个全球唯一的UID号,这个UID号保存在卡的00扇区的00段,也称为厂商段,其中前4个字节是卡的UID,第5个字节是卡UID的校验位,剩下的是厂商数据。并且这个段在出厂之前就会被设置了写入保护,只能读取不能修改,当然也有例外,有种叫UID卡的特殊卡,UID是没有设置保护的,其实就是厂家不按规范生产的卡(我们在网上买的空白卡片一般都是这种可以修改UID号的卡)。

今天我们以破解一张洗澡卡为例:

用到的工具

读卡设备:ACCR122U一个

空白M1卡片两张

正常使用洗澡卡一张

上图:

41

平台:windows7

软件:NFCGUI-PRO.exe

M1卡服务程序

破解思路:在M1卡的16个扇区内的某一个扇区内的字段中存储着洗澡卡内的信息,例如使用时间、使用次数、水卡金额等信息,想要修改卡内的信息就要将卡片内的记录数据导出,每个扇区第一个字段的16个字节是扇区的秘钥对,我们要是想要导出数据就要通过穷举的方法测试出秘钥对,只有知道秘钥对后才可以导出卡片内文件(具体原因请百度M1卡工作原理或查看:http://www.hufubo.com/?p=202),幸运的是国内大部分的M1卡都是使用的默认密码或者弱密码(例如 FFFFFFFF  FFFFFFFF),我们可以使用比较傻瓜式的软件M1卡服务程序穷举秘钥对并导出卡内的dump文件(通过破解软件导出的数据文件都为xx.dump格式文件),然后通过一张卡多次消费并导出dump文件来对比不同金额情况下扇区内的信息来核算出具体的金额控制位,然后通过NFCGUI-PRO.exe程序将修改好的dump文件写入到空白的M1卡内。

具体实施:

声明:在实施过程中有可能我的步骤不是最简便和最有效的办法,但是作为科普入门级的文章,只希望更多的人能理解实施的过程,以更好的去防护这种方法。

  • 先去洗澡卡终端查看卡内的余额:

42

卡内余额为26.91元,然后将ACR122u插在机器上,使用M1卡服务程序破解得出卡内的DUMP文件

使用M1卡服务器程序破解:

43

破解成功:

44

由于这种M1卡秘钥对为弱密码所以大约几十秒的时间就会破解成功,dump文件会生成在文件目录下:

45

dumpfile 4da2e80e(2015-08-2523_4).dump文件就是生成的破解文件  可以看到生成的dump文件为1KB大小,但是具体写入M1卡的时候是需要写入4KB大小的dump文件的

ps:这些软件本来是基友linux开发的,移植到win平台上只能生成1kb的dump文件,我们可以使用修复工具:fixdump将1KB文件修复为4KB,也可以使用NFCGUI-PRO.exe

这个软件自带的修复功能修复为4KB文件,我是使用的NFCGUI-PRO.exe

修复,如图:

46

打开这个软件点击选择文件-选择刚才生成的1KB文件-就会提示“是否保存为4K文件格式”—选择“是”-就是自带修复成功

47

然后关闭软件,刚才的1kb的DUMP文件就会自带修复为4KB文件了。

通过上面的方法得出三个不同金额的dump文件。

2)通过十六进制编辑器进行dump文件的对比,找出金额控制位,我使用winhex进行编辑dump文件:

48

因为这两个文件都是同一张卡片不同金额的dump文件,所以假定有金额的数据不同,有刷卡次数记录的数据不同,刷卡时间的记录不同,(假定会有这些不同之处,也许只有记录金额的变化),通过对比两张卡片,发现在00000176 和00000192处有不同的数据块

如图;

余额为26.91:

49

余额为26.88:

50

发现这两张卡内的不同之处在于:

52

51

通过十六进制转换测试:

Hex(80 0A)=32778

HEX(7F F5)=32757

测试发现并不是这么简单的直接转换,于是将 800A 进行翻转为 0A80

HEX(0A80)=2688    2688符合卡内余额为26.88的实际情况。

HEX(0A83)=  2691   2691符合卡内月为26.91的实际情况。

可以总结得出金额位的加密方法为 金额转换十六进制后进行翻转存储。

接下来分析 7F F5代表的含义

根据M1卡了解 金额位置后面会有校验位数据,通俗讲就是当前面金额数据变了之后,校验位会根据另外的算法去改变值。

一般最简单的算法都是二进制取余后转换为16进制再加上金额位的加密方法

计算方法如下:

校验位7F F5-翻转为F5 7F转换二进制为1111010101111111  二进制取余为0000101010000000 转换为十进制为:

Hex(0000101010000000)=2688

可以得出金额校验位的加密方式为将金额转换为二进制后取余,取余后的二进制转换为16进制,将16进制翻转后得到的结果就是金额校验位的信息

例如金额为26.88—2688–0000101010000000—1111010101111111–F5 7F–7F F5

计算出金额校验位应填7F F5

53

计算出金额位和金额校验位的加密方式后可以进行金额的修改

修改金额为600元则计算

金额位:600—60000—EA60—60EA

金额校验位:600—60000—1110101001100000—0001010110011111—159F—9F15

则金额位填:60EA

金额校验位填:9F15

直接在winhex内修改dump文件:

54

直接保存文件为600.dump,dump金额就修改成功了

3)将文件写入到空白卡片中

通过NFCGUI-PRO.exe软件进行dump文件写入:

如图:

55

打开NFCGUI-PRO.exe软件后DUMP和Key文件选择加载文件600.dump

将ACR122U插入到电脑后将空白卡片放到读卡器上后选择写入文件

写入成功:

56

4)测试:

57

58

59

到这里就是M1卡破解的基本步骤,仅作科普文章,请勿做违法事件!

解决方案:

1)将卡片全部更换成CPU卡,CPU卡可以模拟M1卡结构,完全代替M1卡,安全性也比逻辑加密的M1卡更安全。

2)采用一卡一密系统,一卡一密可以免去升级硬件的麻烦,最大程度保护IC卡系统。

3)采用滚动码系统,增加效验,加大破解成本

软件工具链接:http://pan.baidu.com/s/1sjJuY3V

[via@胡付博] 注:本文系投稿文 转载请注明出处