Mifare Classic card(M1卡)破解过程记录(准备+理论+获取扇区密钥+数据分析)

首先认识一下一卡通的类型,市面上常见的一卡通是IC卡的一种,IC卡即集成电路卡,也是广义上的智能卡,准备篇介绍一些智能卡的基础知识,帮助我们确定卡的类型和使用的设备,目前淘宝上提供了设备和全套软件,确定好方法就可以自动化破解,下面的内容比较详细,不用全部看完也能破解,但了解一下可以提高效率

按照使用方式分类:

·接触式IC卡:符合ISO 7816标准,卡片表面包含金属触点,读写需要IO线路接触,即需要插卡使用,如手机的SIM卡模块

·非接触式IC卡:符合ISO/IEC 14443标准,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分,通过RFID感应使用,校园卡及身份证都是这一类型。

·双界面卡IC:又称组合卡/双端口卡,是同时兼备接触和非接触两种界面通信的多功能卡,将非接触IC卡的方便性和接触IC卡的安全性融为一体,使之成为一卡多用的极佳载体,代表着未来IC卡的主要发展方向,银行卡就是这一类型。

需要注意的是我们平时见到的某些门禁卡虽然也是通过感应使用,但不一定是IC卡,现在有相当一部分便宜的门禁使用的是磁卡和ID卡,ID卡使用RFID射频技术,但其频率一般较低,一般为125KHz,如爱特梅尔的T5577卡,不可写入用户数据,其记录内容仅限卡号只可由芯片厂一次性写入,开发商只可读出卡号加以利用,所以只用于身份识别,不能用于消费,其成本相对非接触式IC卡较低,一般使用字典攻击的方式就能复制。

智能卡按照工作频率分类:

区分ID卡和IC卡——读卡判断法

读卡判断法是判断卡智能卡类型最准确的方法,这需要可识别多类型卡的设备支持,例如手机NFC或者pn532开发板、ACR122U读卡器以及Proxmark3。使用手机NFC是最为便捷的方法,在支持全功能NFC的手机上下载MIFARE Classic Tools,给予权限后将卡片贴在NFC感应区根据提示读取标签后查看标签信息。下面是两种不同容量的IC卡的显示,如果RF技术这栏显示ISO/IEC 14443,说明就是典型的13.56MHz的非接触式IC卡,这也是生活中使用最多的类型。

                                       

绝大多数的高校一卡通都属于M1卡这种类型,M1卡式恩智浦公司(现在已经被飞利浦收购)根据ISO14443-A非接触式智能卡标准设计的一种IC卡,是目前世界上使用量最大的非接触式IC卡,在2013年前它被广泛应用于一些国家和地区的交通系统,如香港的八达通、台湾的悠游卡、伦敦的牡蛎卡和荷兰的OV卡等。2007年12月K.Nohl和H.Plot利用显微镜观察M1卡逻辑电路并对其逆向工程,从而发现其加密算法的设计缺陷。而在2008年3月,荷兰内梅亨大学的三位工程师自制了读卡设备并利用其Crypto-1算法的缺陷成功复制了一张M1卡,所以现在M1卡一般用于对安全需求不是特别高的场景中,如校园和企业一卡通,社区门禁等。

可以看到上图中标签类型为MIFARE Classic的就是M1卡,左边的为S50型号,右边的为S70型号,对应的SAK分别为08和18,知道这些参数一般就可以确定攻击方案了。

如果有其他读卡设备的话也可以通过相应的输出结果判断卡的类型,但一般最好先用手机NFC判断好卡的类型,这些读卡器不一定适用于所有类型的卡。

区分ID卡和IC卡——经验判断法

一般来说,判断电子标签是接触式卡还是非接触卡可以观察卡片表面是否包含触点,如果有一小块裸露在外的金属区域,则说明该卡是接触式卡或双界面卡;没有金属触点且可与读卡器感应识别的为非接触式卡。在没有读卡设备情况下我们可对非接触式薄卡使用强光穿透卡片观察,ID(身份识别)卡芯片周围一般为线径为3-8mm的粗圆线圈,IC卡通常是1-2mm宽的细圆线圈或方形线圈。我们也可通过电子标签的功能来区分这两种卡,ID卡的芯片只能读不能写,一般只用于身份识别,IC卡可反复擦写,既能身份识别也可用于小额支付,所以校园一卡通显然为IC卡。经验判断法不一定准确,但能帮助我们在有限的条件下判断电子标签类型,迅速确定攻击方法及所需设备。下图来自淘宝的IC卡商品介绍,结合卡的使用类型,一般可以判断出是IC卡还是ID卡。

 

银行卡和身份证虽然都可以感应使用,但其不是M1卡,M1卡是逻辑加密卡,使用私有加密算法Crypto-1,而银行卡和身份证是CPU卡,内置一个微型CPU,可以进行多种加解密运算,有些银行卡和身份证还使用了国密算法,相比Crypto-1更新,尚未爆出安全漏洞,目前很难破解,如图是银行卡的标签信息,可以看到其SAK为28,只要SAK为28的都为CPU卡,有些学校比较变态使用了CPU卡这种解决方案,看到是这种卡的可以放弃了,暂时还没有对应的破解方案。

                                                  

M1卡的特性和存储结构

M1卡即NXP推出的MIFARE Classic卡,内部由一个卷绕天线和特定用途的集成电路模块组成,其中模块由一个高速(106KB波特率)的RF接口一个控制单元和一个EEPROM组成。读卡器向M1卡发出一组固定频率的电磁波,片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使谐振电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到模块存储电容内储存,当所积累的电荷达到2V以上时,此电容可作为电源向模块电路提供工作电压,将卡内数据发射出去或接收读写器的数据

 

常见的M1卡多为S50型号的1k卡,EEPROM的存储容量为8k位,分成16个扇区,每个扇区为4块,每块16个字节,以块为存取单位;还有更大容量的S70型号4k卡,EEPROM容量为32k位,分为40个扇区,前32个扇区为小扇区,每个扇区为4块,每块16个字节,后8个扇区为大扇区,每个扇区有16块,每块16个字节。

                                            

第0扇区相比其他扇区稍有特殊,块0为绝对地址块,在卡片出厂时被锁死不可更改,前4个字节为整个RFID系统中唯一的UID号,第5个字节为BCC校验位,数值由UID的4个字节异或运算得出,第6字节为卡片的SAK值,第7到8字节时智能卡的ATQA值,剩余的部分时制造商出厂时设定好的信息,不会影响到卡的使用。块2和块3一般为空,不存放用户数据,在大部分RFID系统中读卡器需首先验证0扇区0块数据的正确性,如果验证失败将不会访问其他扇区。

选择合适的白卡和读卡器

确定好卡的类型后,现在要去购买对应的白卡和设备了,目前淘宝卖的比较多的有以下几种卡:

ID白卡:一般为125KHz的低频卡,针对低频门禁系统,读取原卡有效的10位或18位识别码,将其复制后写入白卡中一般即可通过门禁验证。

IC标准白卡:一般为M1卡,这类卡是严格按照M1卡标准制作,0扇区0块发卡时便锁死不可修改,其他扇区可自由操作,不推荐购买,如果你需要4Kb的读写容量那只能购买标准的S70卡,目前淘宝还没有S70型号的其他版本卡。

UID卡:国人魔改的M1 S50卡,又名中国魔术卡,是最常见的IC复制卡,与标准白卡不同的是可以反复擦写0扇区。

CUID卡:UID卡的升级版本,UID卡出现的比较早,会响应后门指令,可被使用后门指令检测是否为克隆卡的机器发现,而CUID卡不会响应,一般可绕过读卡器防火墙,推荐购买这种卡。

FUID卡:CUID卡复制没有用的情况下的备选,只能改写0块1次,改写后就锁死该块,针对一些更高级的读卡器防火墙。

UFUID卡:UID卡和FUID卡的结合版,可以手动控制0块锁死,0块锁死前为UID卡,锁死后就变成了FUID卡。我们一般使用CUID卡即可,不必购买更高成本的FUID和UFUID,除非你确信自己操作无误且CUID卡无法通过验证。

在购买设备之前先确定好需求,如果仅仅复制只用于门禁的M1卡,可以先不用购买设备,因为一般门禁的原理是验证0扇区的UID号,如果该UID在系统中存在,则验证通过,而有些发卡商为了便利让0扇区使用了默认密钥FFFFFFFFFFFF,所以可以先用手机NFC测试复制0扇区0块,这里可以使用前面读卡用的MCT,但推荐国产的MTools https://github.com/whywilson/mtools

按照软件的帮助文档尝试读取原卡0扇区,如果成功了直接把UID号复制到CUID白卡通常就能通过门禁验证了,这款软件也可以OTG读卡器使用,手机没有NFC又没电脑的可以用它。

目前淘宝可以用来破解的读卡设备主要有3种:

PN532:最廉价的方案,30多块钱就可以搞定,仅仅一块单薄的电路板,但可以满足常规的M1卡的读写操作,但是配套软件较差,配合mfoc和mfcuk软件使用,在Linux下bug比较少,目前也有国产的GUI软件,但功能能比较单一,可以用于破解M1卡中1K容量的S50卡,不能破解全加密卡(找不到使用默认密钥的扇区),适合搞定门禁,钥匙扣型的卡去小区物业办一般要20块,如果你想做很多张门禁卡的还是自己制作更划算,不用看这篇文章根据淘宝客服的教程来成功率都很高。

ACR122U:读写的主芯片为PN532,相对PN532软件更加完善,使用稍微简单一些,厂家还提供了一款官方的M1卡破解软件,配合mfoc和mfcuk使用更加稳定,但同样不能用来破解全加密卡,对于加密了部分扇区的S70卡也较难破解,性价比一般,卖一百多块适合小白使用,能找到比较多的教程。

Proxmark3:我主要使用的设备,是Jonathan Westhues 在2007年就读硕士期间设计并开发的RFID读卡器,它是一款开源的RFID研究平台,设计图被公布在Proxmark3官方网站,在GitHub上可以找到配套的软件及WIKI,另有社区可获取对应的固件及技术支持,同时支持Linux、Windows、Mac OS多平台。最新版本的pm3整合了nested authentication攻击,darkside攻击,PRNG漏洞扫描,以及随机数采集和无卡嗅探功能,能够有效破解M1卡扇区密钥,可破解低频卡、S50和S70全加密卡和部分特殊卡,可以说相当强大,但是价格比较贵,目前淘宝山寨的pm3都要200多块。

变色龙侦测卡:可以用来模拟M1卡,也可配合其他读卡器侦测获取扇区密钥来破解卡,主要针对全加密卡,但是价格也要100多块,所以一般购买pm3即可,pm3还有一款RDV2升级版本就是集成了变色龙侦测卡,嗅探的能力更强并且可以模拟卡,用于一些比较变态的M1卡系统。

购买好白卡和设备就可以直接开干了,想一下把一卡通数据复制进钥匙扣和手机岂不是又方便又有逼格【手动滑稽】,破解一卡通需要耐心,要反复试错,千万不要轻易放弃


理论篇参考了国内外的一些文献,写的比较杂乱,如有错误请指正,有条件的推荐去谷歌一些外文文献了解其原理,如《Attack.MIFARE》、《Dismantling_MIFARE_Classic》、《Pickpocketing.Mifare》、《The-MIFARE-Hack-1》和《A Practical Attack on the MIFARE Classic》等。

M1卡扇区密钥及控制属性

M1卡的块3数据直接决定了M1卡的访问权限,在使用M1卡之前我们需要设定好合适的控制块,从而使M1卡可以在一个RFID系统下的多台读卡器上正常工作。在M1卡设计之初为了保障其兼容性,恩智浦公司对控制块的设置有着统一的规范,而在M1卡发卡后RFID系统管理者根据实际需要设定每个扇区各自的密码及存取控制字节在后续的对一卡通的攻击过程中,我们需要使用正确的控制属性来修改数据并确保其能在其他读卡器上被正常识别。

大部分情况下我们只需要知道每个扇区的块3(即第4块)掌握整个扇区的控制权限,想要对扇区操作需先获取块3内容,对块3内容操作务必要小心,如果错误操作了控制块就会导致卡被锁死。如果使用的是PHILIPS原始芯片的卡片,且控制字 = FF078069时,通过某台读卡器进行B密钥验证后可读写卡片,说明这台读卡器有BUG。最大的可能性是这个读卡器并不区分AB密钥。
我们可以做个简单的实验,将AB密钥设为不同的值,例如先将密钥BLOCK改写为如下:111111111111FF078069222222222222此时KeyA = 111111111111, KeyB =  222222222222然后用可以通过B密钥读写的读卡器进行操作,就会发现问题所在。

                    FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
                                 密钥A             存取控制           密钥B  

块3存取控制字节中共有三个控制位对应不同数据块或控制块的读写条件,定义为:"CmXn",其中Cm代表每块控制位号(C1~C3),X代表某块所属扇区号(0~15), n代表该扇区内某块号。例如C173 表示7扇区内块3的第1控制位,其他扇区和块的控制位表示法以此类推。

  控制位表示方法

存储块

控制位1

控制位2

控制位3

存储块属性

块0

C1X0

C2X0

C3X0

用户数据块,(0区0块除外)

块1

C1X1

C2X1

C3X1

用户数据块

块2

C1X2

C2X2

C3X2

用户数据块

块3

C1X3

C2X3

C3X3

密钥存取控制块

各扇区数据块0~块2的三个控制位以正反两种形式存在于块3的存取控制字节中,它决定该块的访问权限(例如进行减值及初始化值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制位在存取控制字节(6~9字节)中的对应位置表所示,其中“_b”表示按位取反。  

  控制位在控制字节的对应位置

位号

字节号

7

6

5

4

3

2

1

0

所属

块3

控制位

块2

控制位

块1

控制位

块0

控制位

块3

控制位

块2

控制位

块1

控制位

块0

控制位

字节6

C2x3_b

C2x2_b

C2X1_b

C2X0_b

C1x3_b

C1x2_b

C1X1_b

C1X0_b

字节7

C1x3

C1X2

C1x1

C1X0

C3x3_b

C3x2_b

C3x1_b

C3X0_b

字节8

C3X3

C3X2

C3X1

C3X0

C2x3

C2x2

C2x1

C2X0

字节9

BX7

BX6

BX5

BX4

BX3

BX2

BX1

BX0

 

针对M1卡不同权限的控制位如表所示,其中M1卡的制造初始值为000;字节9为备字节,默认值为69例如,某区块的3个存取控制位C1Xn,C2Xn,C3Xn设置为000时,只需验证密AB其中之一即进行取、写入加值减值及初始化操作。该初始值主要供制造商和发卡商卡片功能及修复卡片使用,确认所有读写加密功能均正常(存取控制默认初始值为"FF078069")后,再依据使用需设置新的存取控制权限值,进行用户数据操作和修改新的用户密码

  块0、块1、块2的存取控制权限

C1Xn C2Xn C3Xn

取权限

入权限

加值

减值初始化

0 0 0

KeyAB可用

KeyAB可用

KeyAB可用

KeyAB可用

0 1 0

KeyAB可用

不可用

不可用

不可用

1 0 0

KeyAB可用

KeyB可用

不可用

不可用

1 0 0

KeyAB可用

KeyB可用

KeyB可用

KeyAB可用

0 0 1

KeyAB可用

不可用

不可用

KeyAB可用

0 1 1

KeyB可用

KeyB可用

不可用

不可用

1 0 1

KeyB可用

不可用

不可用

不可用

1 1 1

不可用

不可用

不可用

不可用

再如当某区块0的存取控制位C1X0,C2X0,C3X0设置100时,验证密码A或密码B正确后可读出其数据;只有验证密码B正确后才可允许改写数据;不能进行加值,减值等操作

以厂商初始值"FF 07 80 69"为例,说明存取控制条件对数据块的影响。对控制字节取厂商默认值C1X0,C2X0,C3X0C1X1,C2X1,C3X1C1X2,C2X2,C3X2设置为000;C1X1,C2X2,C3X3设置为001密钥A,密钥B默认值由厂商提供,通常为FFFFFFFFFFFF

  厂商初始存取控制值

位号

字节号

7

6

5

4

3

2

1

0

字节6

1

1

1

1

1

1

1

1

字节7

0

0

0

0

0

1

1

1

字节8

1

0

0

0

0

0

0

0

控制位

CmX3

CmX2

CmX1

CmX0

CmX3

CmX2

CmX1

CmX0

 

对于存取控制值的设置一定要合理,不能为了确保智能卡的保密性需求一味地锁死权限,这样将会丧失智能卡的可用性。例如发卡商将X扇区块2设置为存放卡金额的数据区,此时的存取控制C1X2C2X2C3X2必须设置为000这样用户才能通过校验密钥 A或密钥 B后2的内容,否则,M1读卡机会因校验区密码出错而无法读取和传送数据刷卡时也就不能获取和变更卡的金额了以此类推,发卡商可以根据用户需要的不同合理分配存取控制值从而限制用户的操作权限对于不联网的RFID系统,M1卡数据如果出现异常无法校验通过,读卡器可以通过修改存取控制块的方式将该卡拉黑。同样的,当块3的存取控制位110或者111时,只有验证密钥A或密钥B正确可读取存储控制位的内容,其它如存取控制值的改写,密钥A密码B的读写权限均被锁死而无法访问此时发卡商同时将块0、块1、块2也分配好权限,设置复杂的密钥A和密钥B,即可最大程度的确保该扇区数据的安全性。

 M1卡的认证流程

在前文中简述了M1卡与读卡器的通信过程,下面将详细介绍M1卡如何与读卡器建立认证并实现基本功能。读卡器首先发送电磁波,呼叫感应范围内的标签,标签将自身的UID号按位传送给读卡器,如果感应范围内有多张标签就会产生冲突,此时读卡器可指定冲突位为0(或1,可自由设定)的标签优先激活,然后进行三轮认证,根据读卡器需求数据的扇区位置对指定扇区认证,不通过会读卡出错,通过认证后可依据控制属性对扇区数据操作并转存,若读卡器还需要使用其他的扇区则切换扇区循环操作,直到所需扇区操作完毕后发送指令使卡进入休眠状态,开始呼叫下一张标签。

                        

 

M1卡的三轮认证是保障M1卡安全的重要手段,读卡器要对M1卡的读写操作就必须通过三轮验证,在该过程中M1卡和读卡器相互发送验证信息来验证密钥,要说明的是该过程也是同样被加密,并且使用了恩智浦公司私有的Crypto-1流密码算法,2008年内梅亨大学的研究人员发现了该算法伪随机数生成的漏洞,使得加解密所用到的伪随机数可被正确预测,从而逆向计算出了三轮认证中的扇区密钥。

M1卡与读卡器的三轮认证流程如图所示,读卡器首先向标签发送身份验证请求,标签响应后生成一个4字节随机数Nt并以明文的方式发送给读卡器,读卡器接收Nt后生成的随机数Nr,并将两个随机数一起加密为8个字节的数据回复给标签。标签解密后将得到Nt和Nr,如果读卡器使用了错误的算法,认证将被中断读卡出错,若解密得到的Nt与原来发送的一致,则将读卡器生成的随机数Nr的用自己的算法加密并回复给读卡器,以证明自己为合法标签,读卡器收到后解密如果得到Nr为原来发送的Nr,则三轮认证通过,读卡器开始发送命令给标签,标签响应后执行。

                   

 

 

一般淘宝卖的pm3都送比较高级的windows下的GUI软件,这个软件使用比较傻瓜化而且一般附带教程,我在这里不再介绍详细的使用过程,假设你的pm3是自己组装的或者没有附带国产软件,那你可以在Proxmark3的Github找到配套的命令行软件,Linux下编译好用Terminal运行即可

半加密M1卡攻击方法

现在我们已经确定智能卡类型为M1卡,根据M1卡的存储结构可知其每个扇区的块3中存放了密钥,这些密钥控制着M1卡其他数据的读写权限,因此我们的首要任务是获取卡内扇区的密钥。目前国内大部分M1卡都只加密了部分扇区,为半加密卡,对半加密卡的攻击方法相对简单,因此拿到M1卡后我们首先测试半加密M1卡的攻击方法。

暴力破解法

M1卡属于被动式智能卡,电源由读卡器提供,与读卡器断开连接后就无法保存数据,也不存在尝试多次密钥错误后锁死卡片的可能,所以针对这一特性我们可以使用暴力破解法,更换密钥循环测试直到扇区验证通过。但是读卡器与卡片的通信有延时,枚举某一扇区的密钥A或密钥B共有248即281474976710656种可能性?,假设每次验证密钥需要1ms时间,也需要8296年才能暴力破解出一个扇区的一种密钥,在M1卡的加密算法被公开之前,穷举每一位去暴力破解M1卡密钥是不可能的。当M1卡的算法被攻破后,很多发卡商的M1卡都受到了攻击,攻击者利用获得密钥构建了密钥库,而由于M1卡的密钥不能像网络账户一样随时更换,很多发卡商又使用了统一的密钥,因此可以通过遍历已有密钥库中密钥的方式来解开一部分M1卡的密钥。对于那些未受到密钥泄露影响的M1卡,即使知道了Crypto-1算法,再配合高性能计算机辅助运算,仍需要几十个小时的时间才能解开非典型密钥,所以一般只用暴力破解的方式扫描扇区默认密钥或弱密钥作为其他攻击方法的辅助。

默认密钥扫描

M1卡出厂时使用统一的默认密钥,密钥A和密钥B的值均为FFFFFFFFFFFF,控制位为FF087069,也有一部分制造商使用自己的简单密钥作为出厂密钥。发卡商为了便利通常使用厂家提供的默认密钥,或者仅仅将包含重要数据的扇区修改密钥。对M1卡的扇区进行默认密钥扫描有助于我们提高破解的效率,并且可用来判断该卡是否为全加密卡,若未扫描到默认密钥则直接使用嗅探手段获取密钥。

使用“hf mf chk *4 ? t”命令开始扫描,该命令使用12个全球通用的默认密钥扫描0-39扇区,若事先知道所用数据在多少扇区及对应的密钥类型,可以修改指令来缩短扫描时间。扫描大概需要1分钟时间,完成后可以看到除了10-15扇区外其他扇区的密钥均为FFFFFFFFFFFF,这说明10-15扇区存放了一卡通的关键数据,这6个扇区就是后续数据分析研究的重点对象。

                                   

嵌套认证攻击

嵌套认证攻击即验证漏洞攻击,是获取M1卡密钥的最常用方法,它利用M1卡与读卡器三轮认证过程中的漏洞来实现知一密而求全密。三轮认证的过程中读卡器与M1卡使用的是对称加密算法,读卡器与M1卡中均存有相同的密钥,加解密过程也是一致的,这就给我们提供了还原密钥的可能性。

 

当进行三轮认证时,卡片和读卡器在会生成伪随机数并对其加解密,如果使用错误密钥对伪随机数的验证就会失败,这说明数据的加解密与扇区密钥是相关的。而在M1卡中每个扇区的密钥又是独立的,一次三轮认证通过后处理完扇区数据后就会转到另一个扇区重复三轮认证,此时使用新扇区的密钥参与加密运算出伪随机数。国外研究人员测试后发现了该过程中M1卡的重大缺陷,标签在通过第一次三轮认证后就会将其他扇区的数据加密后发送给读卡器,扇区中块3用来存放密钥,获取了加密后的扇区数据就等于获取了加密后的密钥信息。此时,我们可以使用获得的加密信息辅助暴力破解,大大降低了对48位密钥的搜索空间,缩短了获取密钥的时间成本。

该方法实施的前提是已知某扇区密钥A或密钥B的一种,否则M1卡无法与读卡器完成三轮认证。在默认密钥扫描过程中我们已经得知了除10-15扇区外的所有扇区密钥,此时通过Proxmark3执行“hf mf nested 1 0 A FFFFFFFFFFFF”,使用已获得的0扇区密钥A进行嵌套认证攻击。桂电一卡通使用的M1 4k卡扇区结构与1k卡不同,Proxmark3难以预测到认证过程的随机数,因此无法一步被nested攻击方式破解所有扇区,必须使用单已知密钥对单未知密钥的Hardnested方式。执行“hf mf hardnested 1 0 A FFFFFFFFFFFF 40 A”,即使用已知的0扇区密钥爆破40块所属扇区,结果“a1fbf4d6489b”就是10扇区的密钥A。对其他扇区的爆破也同理,爆破期间会占用大量CPU资源来运算,不同的电脑配置所需时间也不同,一般来说,爆破单扇区未知密钥的时间应在5分钟内,在这期间还未成功就应尝试通过其他方式获取密钥。

                    

全加密M1卡的攻击方法

目前市面上也存在一些安全性相对较高的M1卡,发卡商在发卡前对M1卡的每个扇区都做了加密处理。若我们使用半加密M1卡的攻击方式未获取到任何扇区的密钥,说明该卡是各扇区使用强密钥的全加密卡。对全加密M1卡我们可用针对性地攻击方法获取其某扇区密钥,然后便可以使用半加密卡的攻击方式获取密钥。

Darkside攻击

M1卡的数据被分为若干个1bit位的块加密传输给读卡器,当读卡器发送或接收1条信息时,密钥流会位移相应的大小来和卡片保持同步。研究人员截取并重放M1卡与读卡器之间交互的部分数据发现其存在这样一个漏洞:当读卡器发送的加密数据中的某8bit部分全部正确而其他内容出错时,M1卡会给读卡器发送一个加密的4bit的数据作为NACK,而在测试其他任何情况下都会直接停止会话。

我们知道在M1卡通信数据的加密过程中使用了M1卡对应扇区的密钥,因此获取到这个4bit的否定应答就相当于获取到了该扇区密钥的相关信息,结合算法的漏洞可以破解出某个扇区的密钥,知道一个扇区的密钥,就可以使用其嵌套认证攻击得到其他扇区的密钥了。

          

终端执行“hf mf mifare”指令,Darkside攻击结果显示卡片无法使用Darkside攻击,因为其不返回NACK。这说明桂电一卡通使用的M1卡芯片是修复了这一算法缺陷后的版本,其去除了流密钥算法设计中本不该有的反馈机制,此时我们只能通过使用其他方法获取扇区密钥。

嗅探还原密钥

嗅探是破解全扇区加密卡的主要方法,原理是使用硬件对M1卡与已授权的读卡器的交互过程窃听获取数据。如图所示,将嗅探设备方式M1卡和已授权读卡器之间,对M1卡嗅探设备伪装为已授权读卡器,发送身份验证请求,同时对读读卡器伪装为M1卡,发送从M1卡获取的信息,这样嗅探设备便同时与M1卡和已授权的读卡器建立了会话,从而达到窃听交互信息的目的。

                                               

我们使用Proxmark3嗅探时先将桂电一卡通固定在设备的高频天线上,终端输入“hf 14a snoop”命令开启对ISO-14443 A型卡的嗅探功能,此时将Proxmark3放在自动贩卖机的识别区域,待自动贩卖机成功识别后拿开设备,重复几次确保收集到足够多的数据后结束嗅探,此时终端已获取到嗅探的结果。我们浏览M1卡开发文档可知基于M1卡的RFID系统在工作时会使用一套专业指令,如图所示。

                                 

嗅探的目的是为了获取一卡通的扇区密钥,所以我们首要关注其身份验证指令。用于身份验证的指令有两个,一个以60开头表示使用密钥A验证,另一个以61开头表示使用密钥B验证。我们可以直观的看到嗅探结果中哪些数据是由标签发出的,哪些数据是由读卡器发出的。三轮认证中的读卡器首先像标签发送身份验证请求,因此在所有读卡器发出的数据中筛选好以60和61开头的部分,这部分即为读卡器发出的身份验证请求指令,如图所示。

               

观察“60 2c 9b 90”的前几行数据,标签首先发送“0200”,根据前面的卡类型测试可知这是M1 4k卡的AQTA值,告诉读卡器标签类型,读卡器接收后发送一个“9320”请求标签返回UID值,标签发送4个字节的UID“4d b0 1c eb”及其BCC校验值“0a”,读卡器使用“93 70”命令选择卡片UID,“0b 87”是该指令的CRC校验位,用于卡片判断接收到的命令是否正确。标签核验通过后同意命令,读卡器执行“60 2c 9b 90”,“60 2c”即验证0x2c块的密钥A,“9b 90”为该命令的CRC校验位。此时M1卡与读卡器开始三轮认证,标签发送的“98 64 de 8a”为随机数Nt的明文,“90 d6 81 88 6d 38 1d 00”是读卡器对随机数Nt及Nr加密得到的结果,标签收到加密Nr返回给读卡器。

现在我们得到了一卡通与读卡器对2c块进行三轮认证的数据,M1卡在生成密钥时会混合卡片UID计算,因此我们将卡片UID和三轮认证过程的数据对应填入Crypto-1逆向工具箱中运算。因为认证成功的2c块属于10扇区,这样我们就得到了10扇区的密钥A“A1FBF4D6489B”。

                                               

在得到10扇区密钥后该卡便由全加密卡变为了半加密卡,此时可以继续使用嗅探的方式获得更多扇区的密钥,也可以使用前文中对半加密M1卡的嵌套认证攻击来获取其全卡密钥。

导出M1卡扇区数据

入侵M1卡扇区的意义在于获取其中的数据,M1卡的数据是其中最有价值的部分,使用Proxmark3获取到全卡密钥后,我们就可以导出卡的数据分析研究。终端使用“hf mf dump”指令,此时Proxmark3将使用前面破解扇区密钥过程中生成的dump.key 文件读卡并将数据生成为一个名为“dumpdata.bin”的二进制文件,但Proxmark3并不能直接识别该文件,为了分析数据及改写一卡通的便利性,我们将此文件放到Windows系统下使用WinHex进行后续操作,自此我们已成功完成对于M1卡扇区的入侵,利用前文的方法可以获取市面上任何一种M1卡的扇区密钥,也就是说,只要我们拥有M1卡的短期控制权,就可侵入卡扇区获取所有数据。


到这一步时,一卡通的破解可以说已经成功了。一般来说,为了便于读卡器使用固定算法验证金额,一所学校下所有的一卡通在某一金额时的数据应是相同的,这也就导致了对一卡通数据的重放攻击可以被简单的实现。重放攻击是指将一卡通使用之前的数据保存下来,当一卡通余额用完时,将之前的数据重新写入到卡中,将同一个数据重复使用,达到无限次消费的目的。但我们不要仅仅止步于此,研究出数据的作用和校验算法以实现自由更改金额会更有成就感。

我校学生宿舍的水卡机是不联网的,所以可以确定重放一卡通水卡区的数据时不会因为与服务器端数据对账不通过而无法使用。经过反复测试,可以确定水卡系统安全性非常低,攻击者可以通过重放数据随意使用。

我校一卡通的饭卡消费机是联网的,但在实际的测试中,对数据重放后仍可还原金额值并通过卡机验证。重放数据生效说明饭卡机在认证身份时并未上传饭卡金额数据到服务端验证,消费完原有金额重新导入数据仍可正常使用。而在饭卡充值时就安全的多了,其在充值后会与服务器端比对卡中的数据,如果信息异常,则会将卡拉黑,此时需要补办卡才能正常使用。对于饭卡联网却不比对金额的原因,我推测是因为在用餐高峰期间实时校验信息的会导致网络的拥塞,几千人的不间断消费会频繁的读写数据,加重数据库的负担,如果产生延迟的话就会影响到饭卡的正常交易。

使用WinHex软件打开导出的dump数据,观察到其有256行数据,即该卡有256块,符合M1 4k卡的设计标准。第64行之后的数据只包含各扇区的默认密钥及控制位,说明该卡实际使用容量不到1kb,而在前16个扇区中0-9扇区同样使用了默认密钥及控制位,如图5-1所示,0扇区0块的数据依次为4字节的UID、1字节的BCC校验位、1字节的SAK、2字节的ATQA和16字节的制造商信息,关于0块的各值作用已在前文介绍,此处不再赘述。

   0扇区数据

  

11-15扇区使用自定义的密钥,其中的数据用以实现校园一卡通的各种功能。如图所示,在15扇区右方的显示区域出现了我的一卡通对应的学号和姓名,可知该扇区用于存放学生信息,姓名使用GBK编码存储,每两个字节对应一个汉字,学号使用ASCII码存储。

15扇区数据

   

现在对一卡通数据重放,在热水机上多次消费并导出不同余额时的一卡通数据到WinHex,使用其自带的比对功能比对后发现只有块56和块57部分的数值发生了变化。14扇区的数据部分如图所示,可以看出变化的两块数据完全一致,因此水卡的金额必定与这两行数据有关。

14扇区数据

导出消费0.02元和消费0.04元后的数据,其水卡金额部分的内容如图所示,可以看到前2个字节的值每次减少0002,除以一百即为0.02元,所以前2个字节应该为水卡的金额值,将“01C8”转换为10进制并除以100,得到的结果为4.56,与此时一卡通的实际金额4.56元吻合。倒数第3个字节的变化也很有规律,每刷一次卡递加1,显而易见为一卡通的刷卡次数。最后两个字节的变化没有规律,但可以看出两两相加后的结果都为1D8。一卡通金额的部分一般都会设置校验位,校验位是通过和金额进行某种特殊运算核验数据,从而使篡改后的数据不可用。经过试错后得知该卡中所有数据都参与运算,也就是说除了“01 C6”外其他的数据都为校验位,修改整行数据的某一值都会导致卡机识别错误。设置了两行一样的金额数据是为了保证可用性,两行中有一行能通过校验即可读卡成功,读卡时先测试第一行数据,如果成功第二行就不进行校验,消费后将两行数据改为读卡器运算出的新数值。

 消费0.02元后的水卡金额

  

消费0.04元后的水卡金额

  

 0元卡的数据

RFID系统中小块数据的校验运算一般采用按位取反、CRC冗余校验、BCC异或运算及LRC和校验计算方法。难点在于确定运算的数据块,尽管你能通过比较找到变化的行数,但是很难判断出一行中哪几个字节是直接参与运算的。参照一张0元卡的数据,我们看到其最后两位比较独特,相加的结果为D8,而前面的几个数据中这两位的结果为1D8,舍弃进位后4张卡的倒数两个字节相加都为D8。这说明在校验运算中这部分的其中一个字节应该是分离出来的。我们用前14个字节与后四个字节中的两个分别尝试校验运算,最后发现使用前15个字节两两异或后的结果都为AA,AA是校验运算的一个特殊值,此时我们可以推测前15个字节使用了BCC校验运算。

 修改后的水卡金额数据

水卡金额位只占前2个字节,也就是其数值最大为FFFF,转换为10进制除以100得出其最大金额为655.35。我们将存储刷卡次数的数值保持不变,与FFFF及AA每两字节异或运算得到校验位数值并填入对应的位置,然后用D8减去第15字节的值后填入第16字节,如图所示。导入卡片测试被卡机识别,此时金额显示为655.35,与修改后的值一致,至此我们已经得到了水卡金额的校验算法。

前面我们测试得知了一卡通中饭卡时联网的,水卡数据是不联网的,水卡的数据校验不匹配热水机就会读卡出错,但此时在饭卡机上是可以正常使用的这说明在不同的功能中验证的数据有可能是相互独立的。因此我们导入同一卡下不同的扇区数据到CUID白卡中测试,从而找到不同功能使用的相应扇区。

   

在水卡测试中读卡器只验证14扇区的水卡金额部分,修改其他扇区的数据不会影响水卡的使用。在饭卡测试中读卡器首先会验证0扇区部分,因为0扇区部分存放卡片UID,在正常情况下卡片UID是不可修改的,所以通过将UID与数据库中的UID,就可以在一定程度上保证卡片的真实性,防止他人克隆卡片使用,消费信息的同步也通过UID来实现,消费完成数据库端会查找该UID对应的信息修改。但这种方法对于可重复修改UID的CUID卡片是无效的,CUID卡可将自身的UID修改为其他卡的UID达到伪装的效果。

但仅仅使用UID来验证是不够的,因为UID信息不加密,只要用读卡器识别一下就可以读取到卡片的UID,如果仅用卡片的UID验证,那么我可以使用读卡设备在校园里扫描,一般一卡通放在口袋中,只要使用读卡器在4cm的范围内感应就可获取到他人的UID,而拿到UID后若将金额扇区重放,就可以冒用别人的身份信息消费,这样就算服务器对账出现问题追查时也难以找到实际责任人,一卡通系统显然不能让这么大的漏洞存在,因此又在44块的位置存放了一个卡号,如图所示,自动贩卖机显示本人一卡通卡编为66809,在44块找到对应数据为104F9,修改该数据后读卡就会出错。发卡编号与学生信息对应,就算补办新卡仍不会变化,学号每加1位这个卡号就会加1,并且与卡片的UID号对应,通过这联网验证该数据在一定程度上保障了卡的真实性。但使用这种方法仍有弊端,在自动贩卖机前排队时可先用设备感应到他人卡片UID,然后在他人刷卡时观察贩卖机上显示的卡号,即可将UID号和卡号对应起来,冒用他人信息重放饭卡金额来使用。

44块包含了发卡编号参与联网校验

13扇区存放饭卡数据,其中前3个字节"0022C4"代表金额,转换为10进制为8900,也就是我此时的余额89元。0155为消费次数,代表我已消费了341次,这个数据存放在卡中,每消费1次就会加1,补办新卡就会清零,但同时服务器数据库中也会记录你的消费次数,但不进行核验,我在智慧校园查到的消费次数是1088,而这张卡只有341次是由于这张卡是后来补办的新卡。

消费5.7元

块2前6个字节是上笔消费的时间,如图消费时间为5月17日16点03分21秒17毫秒,右边的0003E8出现了两次,代表消费的金额,转换10进制后为1000,对应我消费的金额10元。我学校的饭卡系统虽然联网,但可能考虑到高并发的情况没有和服务器实时对账,刷卡时先验证44块处的发卡编号是否与卡片UID在数据库中对应,如果对应,读卡器进入13扇区通过校验算法校验金额部分数据的真实性,若通过校验,则将读卡机设置的消费金额与已存在数据运算,同时传输消费金额给数据库去运算,因此我们可以使用重放攻击来篡改金额消费。将我的卡内余额150元时的13扇区数据保存下来,等到卡内只剩50元时重新写入回去,此时在卡机上读取到的余额为150元,但服务器端数据库中的实际值只有50元,此时消费10元,读卡器会直接运算150-10=140元后写入卡,同时将10元的消费记录通过内网传送给数据库,数据库运算后余额为40元然后保存。尽管卡中余额与数据库中的余额不相同,但仍然可以消费不会被拉黑。充值饭卡的过程中会进行实时核验,如果卡的金额被篡改过,充值后金额会与数据库中金额对应不上,就会直接在数据库中把该卡对应的UID去除,之后刷卡就会读卡失败。

消费10元

图书馆管理系统同样联网,但相比饭卡管理安全性更差,门禁和借还书均不验证发卡号,只验证卡片对应UID,知道别人卡片的UID号即可冒充别人出入图书馆,这种也是社区门禁最常用的验证方式。即使不知道卡片UID号,我们可以在借书机前用手机NFC修改卡片的UID号,若该UID在系统中存在,就能通过验证并将学号和姓名显示出来,如图所示。我在自己UID号的基础上修改第一位数字,8次尝试中成功识别出来了4个同学的身份信息,由于借书使用的密码是出生年月日,我们可以根据已经获取的学号姓名在学校的QQ群中查找到其社交帐号,并根据社交帐号的信息确定其出生年月日,这样我们就利用社会工程学的方法获取了他人的借书密码,从而冒用他人信息借书。

    

M1卡技术的安全漏洞早在08年已被公布,但时至今日仍然有大量的酒店门禁卡、校企一卡通使用这种老旧技术,很容易被破解造成经济损失。我校一卡通使用了M1 4K容量卡,相对1K容量卡较为少见,需使用Proxmark3方可破解,而很多地方的RFID系统用的是1K容量的卡,针对这种卡的破解方案太多了,绝大多数使用百元的设备即可破解。有能力是用CPU卡设备的需要尽快更新设备,有些地方因为设备较多,老用户基数较大的情况不能立马使用新设备的要加强管理,例如我校的一卡通除了饭卡扇区使用一卡一密外,其他扇区均使用了统一的密钥,如果有人将统一的密钥泄漏出去,那么其他人使用手机NFC通过该密钥读取水卡扇区,篡改水卡金额,几乎没有任何成本。另外我校的自动贩卖机会显示消费验证身份时使用的发卡编号,这就存在着冒充别人身份消费的风险,特别是很多卡机附近没有监控,一旦出现这种情况,就很难找到直接责任人。

来源:https://sixgolden.blog.csdn.net/article/details/95463919

评论

Unknown说…
Hhgfyihdhkoflockckcvlckvkckckciciix

此博客中的热门博文

Blogger搭建国内可正常访问博客(超详细教程)

近期折腾 tailscale 的一些心得

个性化推荐从入门到精通

使用GPG Key来证明github每次commit的所有权

Java 认证考试 OCAJP 经验总结

打造一个可国内访问的Blogger(Blogspot)方法

高可用用户中心设计

群晖硬软件的的各种坑及解决方案

黑群晖硬件选用与兼容列表

Cloudflare免费版设置说明