发布于

校园卡破解

作者

本文只作技术交流分享研究之用,请勿用于非法用途,否则后果自负!

0x01 开端

上周洗澡的时候突然想到:这种水控机有没有什么办法免费洗澡。 当时想到了两种方案。一种是洗澡的时候隔一会儿就拔插卡,只要卡没有内置时间计数器的,理论上来说可以不扣钱。(虽然我只是幻想过,没有实测)另一种是直接修改卡数据。

0x02 前期成本

因为手机有 NFC 功能,可以用 APP 读卡。果断下载 MCT(Mifare Classic Tool)工具后来发现事实上只靠 APP 破解是不现实的。

于是乎就在万能的淘宝上买了一个 PCR532,大概六十多。本来想直接买最高端的 PM3 的,但一个六百多还是有点贵了。再说破解校园一卡通这种基本上用不着那么高端的设备 (买不起,只能将就用一下中端的设备了。

再说下 PCR532PN532 的区别:PCR532 可以理解为 PN532 的进阶版,省去了一些不必要的东西,成功率上好像也比 PN532 高一点。如果买不起 PCR532 的也可以选择 PN532,后者只要二十来块钱就可以买到,效果上也不会差太多。

PS:想深入研究的可以考虑买 PM3,不会亏的 (

0x03 卡片技术和历史

如果买好了上面的设备,就可以开工了。当然就算这个流程再简单还是要讲一讲一些技术细节和相关知识的,不然这篇文章就毫无价值了。

首先我们要破解的卡片虽然被称为 IC 卡,但这个名字只是为了和 ID 卡 相区别。IC卡 既有 接触式 的也有 非接触式 的,非接触式 有基于 COS(嵌入式软件) 的,也有 Mifare Classic 1 这类逻辑加密卡,本文讨论的就是 Mifare(简称 M1 卡)M1 卡 使用硬件技术固化了一种不公开的密码算法,叫做 Crypto-1(然而信息安全这种事情从来都是和公开或者不公开没有半毛钱关系的,该破解的还是照样破解

逻辑结构上,M1 卡 本质上是一个有着几个额外功能的存储器卡。存储器被分成许多的 数据块,每个数据块由 16 Bytes 组成,这些数据块组成 扇区1KM1 卡16 个扇区,每个扇区有四个数据块,这里的数据块就是用来存储自定义内容的,比如说剩余金额一类。4KM1 卡 的前 32 个扇区由 4 个数据块组成,剩下的 8 个扇区每个由 16 个数据块组成。每一个扇区中最后一个数据块被称为 扇尾0 扇区 有特殊的数据。前 4 个数据字节包括唯一的卡验证号 UID,后面跟着一个字节的位计数检查 BCC。这个位计数检查通过连续异或所有的 UID 字节被计算出来。剩下的字节用来存储制造商的数据。这个数据块是只读的。读卡器需要在进行任何存储操作前认证扇区。扇尾包含 密钥 A密钥 B,这两个密钥都是用来认证的。访问条件定义了对该扇区的哪种操作是可行的,也是大家通常讲的「锁控制位」所锁定的地方。

扇尾有特殊的访问条件。密钥 A 是永远不可读的,而 密钥 B 可被设置成可读或不可读。当为可读时,存储器只用来存储数据而 密钥 B 不能用作认证密钥。除了访问条件 AC密钥,剩下一个未被定义的数据字节 U 可以被用来存储任意的数据或设置成 值模块(Value Block)。当用作值模块时,一个有符号的 4 Bytes 的值被存储了三次,两次未取反和一次取反。取反在这里意味着值的每一位都和 1 进行异或。这四个字节按照从左到右低位字节到高位字节的顺序存储。剩下的四个字节用来存储 1 Byte 的模块地址,这个地址可被用作 指针(Pointer)

就像一切硬件 Hack 一样,这个卡片的破解也是从硬件开始的

Note

2007 年 年底柏林举行的 第 24 届黑客大会 Chaos Communications Congress 上,两位研究者宣读了他们合作的论文。「这两位一个是德国的学者 Henryk Plotz,另一个是弗吉尼亚大学的在读博士 Karsten Nohl,他们利用显微镜,把 Mifare Classic 的芯片进行了抽丝剥茧般的逐层分析,然后附以 RFID 读卡器,得到了 Mifare Classic 芯片每层的布线图。从而分析出芯片中近万个逻辑单元,分别是逻辑电路的与门、或门以及触发器……他们从这些逻辑门中发现了规律,从而大大简化了分析的进程。接下来就是要找到其中关键的加密处理部分。他们按照自己获得的数据信息进行了重构,在此过程中他们详细分析了各个单元模块的功能,经过一番辛苦劳作之后,他们发现了 Mifare Classic 芯片的若干安全隐患。其中之一就是他们掌握了一个 16 bit 随机数发生器的原理,每次都能够正确预测下一个随机数的值」
这个伪随机数发生器的函数是x16+x14+x13+x11+1x^{16} + x^{14} + x^{13} + x^{11} + 1
2008 年 2 月,荷兰政府公布的一项针对此事的报告对此回应:报告肯定了 NohlPlotz 的发现,但却断言由于攻击的成本,M1 卡 系统在两年内还是安全的。他们估计攻击所使用的硬件成本约为 9000$,并费时数小时。
Nohl 对荷兰政府想把大事化小的态度不甚满意,于是马上又发表了一篇名为 Cryptanalysis of Crypto-1 的文章,公开了 Mifare Classic 加密算法 Crypto-1 的核心就是一个 48 bit 的线性反馈移位寄存器加上几个输出函数过滤器。而这几个函数过滤器应用了三种不同的函数关系,它们都有统计学上偏移的弱点,利用这些弱点和之前掌握的随机数发生器的知识,使用普通计算机通过向读卡器发送几十个挑战数,就能够猜出卡片的密钥中的 32 bit 是什么。其中有 12 bit 仅通过乱码流的第一位比特值便可判定,其余 36 bit 密钥值的破解时间,若使用一个 FPGA 装置 是 30 秒内,即使使用普通 PC 机 也就用几分钟。
不过 Nohl 所公布的信息还是有相当保留的,他虽介绍了攻击方法,却没有技术细节,对 Crypto-1 的内容和缺陷也披露的颇为朦胧。所以 Nohl 的这篇文章更像是在警告世人,而不是倾囊而出地展现自己到底知道多少。所以到这个时候 Mifare 的最后一层面纱还没有在公共面前揭开。然而,Nohl 的文章的标题 Cryptographic analysis of Crypto-1 却为有志者指明了奋斗方向。
后来,荷兰自己的一所大学(Radboud 大学)终于站出来打了政府的脸,通过一篇文章向公众揭开了 Crypto-1 的庐山真面目。文章声称:「在逆向研究了 M1 卡 的安全机制:『包括认证协议、对称加密算法和初始化机制后。』他们发现了存在于上述机制中的几个安全漏洞,利用这些漏洞,可实施两种攻击,这两种攻击都可以从一个真实的读卡器中获取密钥。其中一个攻击仅需要与读卡器进行一或两次的认证尝试,不到一秒钟。采取相同方法,一个攻击者可以侦听到卡与读卡器之间的通信内容并将其解密,尽管可能涉及多重认证。这使得攻击者可以克隆一张卡,或者将卡的内容恢复到之前的状态。」和 Nohl 的做法不同,他们公布了所有细节,包括 Mifare 芯片的算法逻辑和他们自己设计的攻击手段。到此时,荷兰的 Radboud 大学 的研究者向世人公布了三种攻击方法。然而他们并没有停下脚步,这之后他们又发表了 Wirelessly Pickpocketing a Mifare Classic Card 文中阐明了 M1 卡 在报文产生奇偶位和所谓嵌套认证两个方面的漏洞,利用此漏洞,攻击者可以通过工具仅仅研究该工具与一片 M1 卡 之间通讯数据便可以成功破解该卡的所有密钥,从而克隆这张卡。

此时 M1 卡 的破解才变成了我这种业余玩家也可以复现的轻松工作了。

文中设计了四种攻击手段,也是现在我们常用的四种方法,在实际操作中通常使用第一种或者第四种(本文使用第二种方式完成破解)。

Tip

  1. 暴力破解:即使是暴力破解,也需要先得到确切的明文和对应的码流。这大约要进行 1536 次认证过程,用时在一秒钟之内。不过还要进行离线暴力破解,估计在 36 分钟可完成。但是需要专用的硬件设备。

  2. 以读卡器的挑战值做变量:这里说的读卡器实际上指的是用来模拟读卡器的攻击工具,下个攻击亦如此。这种攻击又可称为选择密文攻击,用工具控制被攻击的卡每次在认证时产生同一挑战值,而读卡端则回应不同值。这种攻击需要大约 28500 次的认证过程,用时约 15 分钟,然后计算密钥,用时约一分钟。

  3. 以卡的挑战值做变量:第三种攻击与攻击 2 类似,但需要使自己的工具的挑战值为常数,而令卡的挑战值数不断变化。需要预制一个 384 GB 的 状态表(我怀疑 384 GB 这个数字有误)。要进行 4096 次认证,大约用时 2 分钟。

  4. 嵌套认证攻击:第四种攻击假设攻击者已知了至少一个扇区的密钥,他可以根据漏洞得到其它密钥的 32 bit,然后对其它 16 bit 进行穷举攻击。只需 3 次认证(时间可以忽略不计),离线攻击计算时间约为一秒。

0x04 破解过程和工具

0x01 PCR532

网上有大量的工具可供使用(这里使用卖家给的 PCR532 工具),同时无需单片机而直接使用串口进行通信也省去了编码的麻烦。这也是我使用 PCR532 的一个原因,而 PCR532 同时也是知名读卡器 ACR122U 所采用的读卡芯片,虽不及 Proxmark3(PM3) 但功能也十分强大了。

读卡器到手后就可以将 USB 那端连进电脑了(手机需要 OTG 转接)。这里以 Windows 系统为例,这大概也是大部分读者所使用的操作系统。装一下卖家提供的驱动程序,一切就绪后就可以开始破解啦。

PCR 532

0x02 破解过程

这时把要读取的卡片放在读卡器上就行,但是我要做的是破解卡而不是复制卡。所以在此之前,我先把卡放在水控机上看了下余额,记录下来以便分析内容。记好之后先 连接设备 ,然后点击界面中的 开始解卡 按钮进行对卡密钥的破解和内容读取。此时软件正在进行的操作就是之前提到的第二种方法。这个过程不会持续很长时间,稍等就好,期间卡也不要拿开读卡器。

第一次余额-18.700
解卡成功

读取出来之后点击 保存数据 按钮把卡内容以 dump 格式保存到本地,以便分析。然后再去水控机那边消费一笔,再重复上面的工作读取一遍新余额状态下的卡数据。这样做是为了方便后续分析金额位等各个数据位的含义。

第二次余额-17.900

这时已经拿到了两次的卡内容。用软件自带的 对比数据 功能比较两个 dump 文件就可以观察到文件有什么异同了。

分组对比-左18.700,右17.900

对于数据分析的思路,一般都是从金额位下手。所以,我们对金额进行数据转换,因为扇区存储的都是 16 进制的数据,所以我们的转换也同样如此。

18.700 → 490C
17.900 → 45EC

转换结束,我们立马就能发现金额位在我们的第一、二块区域,唯一的差异就是扇区里的数据用小端存储了,所以 区域 ① (第一、二块前两位数据)为金额位。

接着,我们看数据间的关系发现,区域 ② 之间只是做了一个简单的加法运算。

0017 + 2 = 0019

转换一下大小端就是 1900 。因为我测试的时候刷了两次卡,而这里数据也是加了2。因此推出 区域 ② 代表刷卡次数(这点通过多刷卡可以验证)。

0017 转十进制是 230019 转十进制是 25 。逻辑与实际情况上都符合我的刷卡次数。

区域 ③ 暂时看不出来什么东西,盲猜可能是校验位。果断修改卡余额,把 EC45(17.900)改成 0C49(18.700)。改完只重写第 15 扇区,然后去水控机那边刷一下,报错。因此推断出 区域 ③ 应该是校验位。至于校验位怎么算,因为我取的样本太少,加上技术不佳,还没推出来 后面有空研究出来了还会再写一篇文章的。

Important

第一、二块内容都是一样的,修改数据时也要注意保证两块数据相同才行。

因为我还没有推出校验算法,所以不能任意修改卡金额。但是可以通过 重放攻击 来重置卡余额。重放攻击是指将一卡通使用之前的数据保存下来,当一卡通余额用完时,将之前的数据重新写入到卡中,将同一个数据重复使用,达到无限次消费的目的。一般来说,为了便于读卡器使用固定算法验证金额,一所学校下所有的一卡通在某一金额时的数据应是相同的,这也就导致了对一卡通数据的重放攻击可以被简单的实现。

我现在最高余额数据是 18.700 那个,先花掉一点。因为只有第 15 扇区 数据会改变,所以我们只把原先 18.700 状态时的第 15 扇区 内容替换到现在的第 15 扇区。替换方法有很多,可以直接用 PCR532 工具,也可以使用 MCT 工具替换,这里不过多赘述。

替换后再去水控机那边插一下,发现余额已经重置,并且机器可以正常使用。

Caution

对卡数据更改时请确保你知道自己在做什么,以及万一出问题了最好有办法恢复还原。否则不建议瞎改,改坏了卡用不了了还得花钱去补卡,赔本。建议备份每次改动前的数据,这样万一改错了还可以用原先的数据覆盖错误数据来还原。

0x05 总结

经过我的简单研究,发现破解这样一张水卡已经变得相当简单了,各种破解工具和软件都可以很容易下载到。就算你不想打命令,对黑色的命令行感到恐惧也可以很容易找到 GUI 的版本而且功能丝毫不打折扣。而在硬件操作方面,除了有玩家通过单片机控制射频卡模块的,还有类似 PCR532 直接连接电脑用上位机操作的,甚至还有类似 Proxmark 3 这样基于 FPGA 的专业射频卡安全评估套件。如果想要复制一张一模一样的卡用在电梯或者门禁上,有一种特殊的 UID 卡可以轻松买到,价格也很低廉。

这样看来整个 M1 卡 破解与克隆似乎已经形成了完整的产业,不得不令人担忧其在门禁领域的安全性。实体入侵的风险主要在于被发现,而复制一张卡要比翻栏杆轻松多也隐蔽多了。一般一卡通都是放在口袋里,只要一部带 NFC 的手机在距离目标 4CM 的范围内感应即可获取他人的卡数据,从而进行重放攻击。

M1 卡 技术的安全漏洞早在 08 年已被公布,但时至今日仍然有大量的酒店门禁卡、校企一卡通使用这种老旧技术,很容易被破解造成经济损失。我校一卡通使用了 M1 S50 1K 容量卡 ,相对 1K 容量卡较为少见,使用 PN532 方可破解,而很多地方的 RFID 系统 用的是 1K 容量的卡,针对这种卡的破解方案太多了,绝大多数使用几十元的设备即可破解。有能力使用 CPU 卡 设备的需要尽快更新设备,有些地方因为设备较多,老用户基数较大的情况不能立马使用新设备的要加强管理,例如我校的一卡通除了水费、小卖部消费扇区使用一卡一密外,其他扇区均使用了统一的密钥,如果有人将统一的密钥泄漏出去,那么其他人使用手机 NFC 通过该密钥读取水卡扇区,篡改卡金额,几乎没有任何成本。

对于卡片的介绍、分析到此为止。但流程和原理已经介绍的足够清楚了。令人不解的是这样的卡片居然还在被广泛使用在各个场所,从安保到消费均有涉足,而且全程不需要用特别的仪器接近目标设备即可完成破解。对攻击者越安全,对被攻击物就越危险!所以,这样的攻击更加实用,更具危害。但无论是挑起争端的 Nohl 还是荷兰的 Radboud 大学 都推进了卡片安全的发展,然而当下的广泛使用可能还是会令他们始料不及。当然产生这样的结果可能还有一个重要的原因是:其实在这类应用系统上获利的诱惑还不够大,因此攻击者并不多。