RFID入门:Mifare1卡破解分析

文章的最开始,先来致敬RadioWar。一直手痒RFID这个领域,准备了一段时间,开始入门RFID。

先来普及一下基础知识:

RFID即为射频识别。NFC近场通信。很多人把NFC和RFID混为一谈,但实际上NFC可以理解为“以RFID技术为基础的一种产品”。

RFID技术中所衍生的产品大概有三大类:无源RFID产品、有源RFID产品、半有源RFID产品。根据RFID Tag的工作方式,有可分为被动,主动、半主动三种。最常见的就是被动式的了。我们目前接触的多的就是无源、被动式产品,其中最为广泛常见的就是MIFARE Classic 1K卡,简称M1卡、S50卡。M1卡有从0-15共16个扇区,每个扇区配备了从0-3共4个段,每个段可以保存16字节的内容。每个扇区的03段是用来保存KeyA,KeyB和控制位的,因为M1卡允许每个扇区有一对独立的密码保护,这样能够更加灵活的控制数据的操作,控制位就是这个扇区各种详细权限计算出来的结果。每张M1卡都有一个全球唯一的UID号,这个UID号保存在卡的00扇区的00段,也称为厂商段,其中前4个字节是卡的UID,第5个字节是卡UID的校验位,剩下的是厂商数据。并且这个段在出厂之前就会被设置了写入保护,只能读取不能修改,当然也有例外,有种叫UID卡的特殊卡,UID是没有设置保护的,其实就是厂家不按规范生产的卡。

更多的资料请百度、谷歌之,就目前来说我们简单了解下就够了,有了这些大体的了解,我们就开始今天尝试破解一张水卡(洗澡用,宿舍常见)试试。

 

0×00 开头

关于ACR122U-A9这个读卡器,虽然比不上PM3那么神通广大,但是对于入门学习来说绝对算得上神器了。某宝上一搜一堆,很多店都卖165元左右(爆个内幕;其实都是一家)。然后就是UID可写的卡了,大约3元一张。平台选择这两个是因为入门来说自然首选Win平台,但是其中出现了一些问题,虽然失败但也贴出来供大家查错。

0×01 分析、确定卡片

首先确定卡片是M1卡,且数据是保存在卡里而不是服务器上的。 通过图1,我们可以看到机器只有电源线,没有网线,且机器已经很老了,肯定不能是无线方式联接。

我想到了一种“非正式”的一种鉴别方法,大多数注明“不记名不挂失”的卡片都是数据存放在本地的IC卡,否则他们完全可以提供记名挂失的功能的,对吧?

所以我们有把握这肯定就是IC卡,金额数据存放在卡里的了。那么对于这种卡, 我们有两种让钱“无限”的方式:1.直接复制现有的卡,因为金额可以任意复制,C/V模式,但是这样太没有技术含量,而且成了纯粹的为了利益了;2.尝试了解卡片内数据块的实际意义作用,找到数据加密方法。 对应的写出解密方法,这样卡内余额就我们随意控制了。当然,第二种方式是以第一种方式为基础的,所以我们一步一步来尝试。

0x02Win 尝试

根据网上提供的资料(http://bobylive.com/static/1491),我们尝试使用验证漏洞,也就是利用mfocgui破解M1卡的密钥。先是Win7 x64,点击按钮即可一键自动破解,但是出现了问题。当试到05扇区的时候,程序就开始报错,然后ACR122U莫名与PC断开联接。网上搜索无果。尝试RadioWar的NFCGUI-PRO,同样的问题。同样的软件,后来换到XP,问题依旧。说明在Win平台上还是多少有点问题。不如Linux上的兼容性好。

0x03Kali 尝试

值得一提的是,Kali原生支持ACR122U的,而且里面内置了很多的NFC安全研究的工具,极大的方便了我们的工作。(注意尽量不要用Win上的Kali虚拟机,因为USB口还是通过Win平台,所以兼容性问题还是可能存在,我的就会出现Usb Timeout错误)

进入Kali我们能看到很多RFID/NFC的工具。我们用到的是mfoc和nfc-mfclassic这两个工具。 Mfoc是利用验证漏洞破解key的一个工具,而nfc-mfclassic则是对卡片进行读写的工具,我们可以从卡片里dump出来数据到本地,然后利用hexeditr分析编辑,再将数据导入到卡里去。

由于网上很少有这类工具的中文使用说明,我在此一并给大家介绍了:

为了以后使用方便,我们将破解的命令写成shell脚本:crack2file

我们连接上ACR122U到电脑,输入./crack2file tmp/unknow.mdf,就会开始自动破解了。

如果这张卡存在默认密码的话,理论上我们就能得到全部密钥。稍等几分钟,我们看到mfoc提示成功,dump文件已经得到,保存备份几次。然后我们再次去水机处刷卡,消费1元之后余额为8.00。因为我们已经有卡的加密密钥了,所以我们不必再次破解,我们通过使用nfc-mfclassic工具,使用已经有的导出文件再次导出卡内数据。

同样再给些中文使用帮助:

我们使用命令:nfc-mfclassic r A 600.mfd tmp/unknow.mfd f(建议写成脚本)。

0×04 分析导出的 Dump 文件

成功导出变化了的dump文件。然后我们用hexeditor(这个会自动变成正常阅读顺序,当然某些数据不懂时我们可以尝试使用hexdump,这个是反端的顺序,可能会有新的发现)。打开分析。通过对比文件变化,我们发现有一部分内容变化了。

这其中hex(900)=0×384,hex(800)=0×320,所以这三行的对应数值就是金额。后面7C EB 01和6A C8 01是变化的内容。 然后拿这张卡我再去刷一次,确定金额已经正确分析出来,但是后面的6A C8 01变为了6A C8 02。 既然这三次变化没有规律,为了确认后面的变化部分是否与时间有关,我同一个数据复制了两张卡,然后先后到机器上刷了一样的钱,然后回来再dump出来,发现两张卡内的数据一模一样,所以推断与时间无关。但是!就因为最开始下的这个结论,导致我在解密的路上越走越偏。那么我猜测可能是金额与UID或者某部分内容通过异或,或,与等常见的运算。我尝试算了很长时间很多种可能性,最终没能算出来。暂时只好将卡多复制几次,继续慢慢尝试。

0×05转折点

接连刷了几天,得到了很多数据。直到12月2号中午,再次把所有数据放在一起对比时,忽然发现卡里面内容有点奇怪。当我用变化的6A C8这部分数值与UID异或的时候,组成的内容再加上后面的01好像有点规律了:

怎么忽然从1127变成1201然后是1202了?今天是12月2号!也就是说我前几天测试的时候应该是11月27日。112701,112702,是指第一次刷卡,第二次刷卡。然后至于那次单独测试是不是与时间有关,因为我是在同一天测试的数据,而它只记录日期。所以自然数据就一样了。

知道了这些,我们就把卡上所有信息都掌握了。其他字段都是些无关紧要且不会变的东西,因为卡是匿名买的,不记名不登记。

了解了这些, 我们修改为8888即为88.88元试试,hex(8888)=0x22b8。然后写入卡内,去刷,成功了!

如下图

但是,当我再次刷准备拍照的时候发现卡失效了,换一个机器,发现刷一次之后卡就失效了。经过多次测试发现,卡内余额只要大于50元钱,当前卡就临时失效,而我们购买单张卡时,单张卡内有的余额正好就是50。也就说机器内固化了检测卡内余额的功能,实在是想不通为什么要这样的鸡肋功能,对于机器的可升级维护性造成了负担。

至此,这张卡我们就彻底弄清楚如何修改金额了。 虽然这只是一个较为简单的数据存放案例,但是作为M1卡入门还是不错的教程。希望这篇文章能为大家在RFID安全方向上起一个抛砖引玉的作用!