水卡用的是uid吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了水卡用的是uid吗相关的知识,希望对你有一定的参考价值。

参考技术A Mifare1智能水卡破解分析
时间:2022-04-26
本文章向大家介绍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是没有设置保护的,其实就是厂家不按规范生产的卡。

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

工具:ACR122U-A9,UID可写白卡,待破水卡
平台&软件:Win7x64、XP:RadioWar的NFCGUI-Pro,简化版的mfocgui。
Kali平台:mfoc,,nfc-mfclassic。
0x00开头

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

0x01分析、确定卡片

首先确定卡片是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分析编辑,再将数据导入到卡里去。

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

mfoc: invalid option -- '-'
Usage: mfoc [-h] [-k key]... [-P probnum] [-Ttolerance] [-O output]
h 打印帮助
k 将一个新的密钥添加到密钥表里
P 每扇区测试多少个密钥(默认20)
T 随机和随机范围
O 输出到的文件
为了以后使用方便,我们将破解的命令写成shell脚本:crack2file

if [ $# -lt 1 ]
then
echo "Usage:"
echo " readto dumpFile"
else
mfoc -k ffffeeeedddd -O $1 #这句是我们真正用到的命令,这里的key以后可以换成我们破解出来的key,加快速度
fi
我们连接上ACR122U到电脑,输入./crack2file tmp/unknow.mdf,就会开始自动破解了。

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

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

r|R|w|W 从卡片中读取数据到文件中(r),读取文件然后写入到卡片中(w)。或者如果你是使用uid可写卡,使用强制读取R,
强制写入W可以改写uid。
a|A|b|B 使用keyA还是keyB,当有错误的时候就停止(a,b)或者忽略错误(A|B)
<dump.mfd> dump到的文件
<keys.mfd> key文件
F 如果UID不一样的话也继续
我们使用命令:nfc-mfclassic r A 600.mfd tmp/unknow.mfd f(建议写成脚本)。

0x04分析导出的Dump文件

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

04 0A 52 18 7B EF 03 20 00 6A C8 01 00 3C00 1E
4F 4B 18 7B EF 03 20 00 6A C8 01 00 3C 001E 00
04 0A 4B 18 7B EF 03 20 00 6A C8 01 00 3C00 1E 8.00

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

0x05转折点

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

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

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

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

如下图

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

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

[本文作者diigu,本文属FreeBuf黑客与极客
参考技术B 不是,水卡一般使用的是卡号。 参考技术C 水卡用的是uid,是用来识别卡的号码来区分用户缴纳水费的。

校园水卡M1卡破解写卡

M1卡说明及使用proxmark3破解方法

看了网上写的一些关于M1卡的文章,多数有些误导之嫌。首先谈谈M1卡的规格,M1卡的容量为1KB,好多网上写8KB,这里其实是有个误区,应该是8K位。1Byte=1B=8位。其实也就是说8k位想到于1KB的容量,也就是说一个4GB的U盘的存储空间约等于四百万张m1卡的空间。
        虽然空间比较小,但是里面其实学问很大,我们来看一下M1卡的内部结构。M1卡分为16个数据存储区,通常我们称为“扇区”,编号是“0”到“15”。每个扇区又分为4个存储单元,我们称为“块”,在M1卡中数据存储的最小单位就是“块”。每一块有16字节(16B),用来存放数据。
就像下图所示:
 

其中每个data为一个“块”。这样我们可以计算一下:16b* 4(块)*16(扇区)=1024B 就是1K。

第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

在全扇区加密时,通常用前三个“块”(0,1,2号块)存放数据,用最后一个”块“(3号块)存放密码。
其中密码分为A密码和B密码:前6个字节存放A密码,中间4字节为控制字段,后6字节存放B密码。
例如:
A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5
注意这里每个扇区的密码都是独立的,也就是说可以为16个扇区设置16个不同的密码,当然也可以使用相同的密码,但是这样会大大降低破解的难度。例如上图中的该扇区A密码为空:000000000000,B密码为:FFFFFFFFFFFF。
对于控制位这里有点门路,我找了很多网上的文章,其中发现这篇讲解得最好:http://www.duoluodeyu.com/2013/835.html
但是注意其中的 字节7是C1Y,而不要把字节6、7、8一次当成了C1Y C2Y C2Y。注意到这一点对于理解就没什么难度了。 
每个M1卡都有一个唯一的序列号,我们称为“UID”,是32位的,也就是4个字节。
M1卡是典型的高频卡,工作频率为13.56MHz,一般调频(FM)收音机接收的广播频率在87MHz到108MHz之间。猜想:如果高频卡工作频率达到80MHz以上时在读卡或写卡时产生的频率应该能对该频段收音机产生电磁干扰。
通信速率:106KBPS,也就是说可以在10毫秒的时间内完成读写内容。
工作半径:100mm。大约在100mm以内的距离,可以使用读卡器对m1卡进行操作(一般写距离要小于读距离)。

在使用proxmark3对M1卡进行破解时 ,我们可以使用hf mf mifare命令去探测基于PRNG的漏洞出现的Key 。
例如:


然后使用hf mf nested 1 0 A FFFFFFFFFFFF  去探测各个扇区的密码,例如:


花费几分钟后,得到如下的key列表:



根据这个key列表,按道理使用hf mf dump就可以直接读取各扇区的数据了,但是这里遇到了点问题,hf mf dump使用默认的密码FFFFFFFFFFFF来读取各扇区数据,而这里只有0扇区密码正确,其他的均无法dump,所以我们需要使用其他办法。

[size=1em]hf mf rdsc 1 a 1866c42fe6a8
来读取第一扇区数据:

同样的用 hf mf rdsc 2 b 1866c42fe6a8
读取第二扇区数据,这里为什么用B密码是有原因的(因为控制位设置的问题 )。
依次读取16个扇区即可。(其实在这张卡中,只有前3个扇区有数据,后面的扇区数据块均为空)
这里我们就获取了全部想要的数据,在最开始接触m1卡的时候由于知识的不足,总感觉可以控制的位置是有限的。
这也就是不要已经拥有了整个世界还觉得不完美。  

现在就可以去刷卡,然后把16个扇区的数据做一个对比了,看看哪一位变化了,如何变化了。


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卡片两张

正常使用洗澡卡一张

上图:

平台: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卡内。

具体实施:

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

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

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

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

破解成功:

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

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

修复,如图:

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

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

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

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

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

如图;

余额为26.91:

余额为26.88:

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



通过十六进制转换测试:

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

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

修改金额为600元则计算

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

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

则金额位填:60EA

金额校验位填:9F15

直接在winhex内修改dump文件:

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

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

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

如图:

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

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

写入成功:

4)测试:

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

解决方案:

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

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

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



通过十六进制转换测试:

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

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

修改金额为600元则计算

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

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

则金额位填:60EA

金额校验位填:9F15

直接在winhex内修改dump文件:

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

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

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

如图:

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

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

写入成功:

4)测试:

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

解决方案:

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

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

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

以上是关于水卡用的是uid吗的主要内容,如果未能解决你的问题,请参考以下文章

pfuid与ufuid区别

校园卡水卡最低成本破解具体过程(补上上次工具教程)By:dj1149 -02

cuid和uid卡有啥区别

请问ic和id卡分别是啥卡,uid卡又是啥卡?

Mifare Classic Tool读水卡扇区显示没密钥发现(或死扇区)怎么回事

某某水卡数据算法