毕业临走之际发点福利,纯技术贴
如今网络上能找到RFID安全类的信息非常的少,原因我就不说了,大家也明白。大家如果要研究RFID安全可以去RadioWar或者Freebuf多看看相关的文章。
这次案例的主角是某学校可怜的水卡(热水卡),先小小地上镜一下先。
用NFC手机上安装的MCT(Mifare Classic Tool)查看,水卡的确是Mifare Classic 1k类型的。
此次破解用到的工具有:电脑一台,ACR122U一台,带NFC功能的手机一台,水卡一张。
在进行破解工作之前,我们要为电脑搭建相应的环境,大家需要在电脑上安装.NET Farmwork 4以及Java,请自行上网下载安装,后面用到的软件依赖这两个运行库。
安装完运行库之后就需要安装ACR122U的驱动了(下面有链接),为了方便后续的开发,将SDK也一并安装。
安装完驱动和SDK之后,把ACR122U连接电脑,设备就能正常工作了。把我们的水卡放上去,ACR122U的蜂鸣器就会响并且LED的颜色也会改变。
验证漏洞可利用的程序是mfoc,mfoc在Windows上的版本叫mfocgui,但mfocgui对于刚刚接触RFID安全的同学来说有点麻烦,所以这次直接采用M1卡服务程序(其实就是简化版的mfocgui)。
打开之后,程序界面非常简洁,只有一个按钮,就是开始破解。在读卡器列表那我已经见到我的ACR122U了,所以直接按开始破解就可以。打开之后,程序界面非常简洁,只有一个按钮,就是开始破解。在读卡器列表那我已经见到我的ACR122U了,所以直接按开始破解就可以。
然后接下来就等待程序自己破解密钥。
不用很久,就看到所有扇区都被打勾了,破解成功了。
破解成功后根目录就生成了这张卡的dump文件了,大小是1kb,整张卡就被读取出来了。
但mfoc原本是运行在Linux环境下的,移植到Windows下的mfocgui生成的dump文件是并不能直接使用的,还需要一个修复工具fixdump(下载fixdump),将1kb的dump文件修复成4kb的dump文件才行。
fixdump是命令行操作,并且必须安装了.NET Farmwork 4运行库才可以使用,为了方便命令操作,我们将dump文件拷贝到fixdump的目录里,打开cmd进行修复。命令很简单,直接“fixdump ”就可以,生成的文件会直接覆盖源文件。
修复完成后,用UltraEdit或者WinHex之类的十六进制编辑器打开,就可以看到dump文件的数据了。
看到上图我用方框框着的数据了吗?这就是卡扇区的控制段,其中前6字节和后6字节的FFFFFFFFFFFF就是这个扇区的密码,中间的FF078069就是控制位,还不清楚M1卡的结构的可以去看看介绍M1卡结构文章。
知道密码之后,我将密码导入MCT中,开始读取卡片的数据了。
由于MCT自带数据高亮的功能,我们可以清楚的看到4扇区中有两行值块,我卡中现在的余额是32.31,我们根据值块的计算规矩进行计算,不清楚值块的还请去看看介绍M1卡结构的文章。值块的数值是两次不取反一次取反,并且保存在最低的地址里面的。看到第一个值块,0C9F,因为计算机数据是倒序存入的,所以就是真正的数据就是9F0C,换成十进制就是3231。中间那段的60F3是取反保存的,60F3倒序一次是F360,换成二进制就是1111001101100000, 取反一次就是0000110010011111,换成十进制就是3231。最后一段跟第一段一样,都是不取反保存。末端的11和EE就是地址,可以忽略不计,只要后面记得地址保持一致就可以。到此为止,卡的数据因为并没有采取任何加密导致被破解,现在我将卡的钱修改成999.99试试,999.99元应该是十进制99999,十六进制就是01869F,倒序一次结果就是9F8601 ,其他几位一样原理计算, 或者我们可以用MCT自带的值块计算工具计,最终算出结果如下图。
将数据写入到卡里,现在就是去机器实践的时候了。
破解大完满结束,总耗时5小时。
看似很顺利,但最近偶然发现一些细节问题,细心的话可能也有人留意到,卡中的数据除了两个值块保存余额之外,还存在扇区1和5的数据,虽说学校的热水系统不联网,但要是机器自带日志记录,把我卡记录下来那不就完蛋了?所以此次要斩草除根,免得引来无穷后患。
要掌握规矩,肯定要有数据对比,找同学借了张正常未经修改的水卡进行读卡,结果如下。
纳闷的发现除了我的卡之外,其他卡的1扇区都是没有数据的。果断把自己卡的1扇区清空了,拿去饮水机测试,使用一切正常,不知道是哪个这么无聊把数据写进去的,继续研究。
可以发现,所有卡的4扇区的0段开头都有0400,并以C5AE结尾,貌似这是一个校验位,把它清零,拿去饮水机测试,发现是Error,看来这个位的确是校验用的,可以保持一致,重点来分析下5扇区那段数据。
似乎发现了点端倪,除了开头的FA5C 0000 05AC FFFF和对照卡不一样之外,其他数据都相同。接着试试除了这8字节的开头保留,其余清零,在饮水机上测试,一切正常,回来再次读卡的时候又重新生成了一样的数据,可以排除影响。
接着将这8字节开头清零,拿去饮水机消费,发现提示Error,看来的确是一个校验,我们必须保证对数据的敏感,可以看到0000和FFFF,两个值恰好是取反了一次,那FA5C和05A3是不是也一样?FA5C转成二进制是1111101001011100,05A3转成二进制是0000010110100011,结果很清楚,两个值是互相取反保存,那我将它修改成0000和FFFF,其余部分清零,拿去饮水机测试,一切正常。
到此为止,水卡的校验也被破解了,为了保险起见,将水卡的无用数据清零,并用0000和FFFF代替取反的值,痕迹就被清理干净了。如图
学长要走了,学妹留给你们了,哎,一起走过三年最终还是要面对现实...有缘再见
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课