无需NFC手机与MIFARE Classic Tool (MCT)
基础概念梳理:RFID、NFC、IC卡与ID卡
RFID (Radio Frequency Identification,射频识别) 技术分为无源RFID、有源RFID与半有源RFID三种类别,其中
- 有源RFID的应用场景主要有高速上的ETC(车载的OBU设备是供电的,很好理解),因为有源所以传输距离长、速度快
- 半有源RFID是加了一个休眠机制的有源RFID,功耗低又传输强
- 无源RFID是本文讨论重点,因为无需供电,成本低、使用广,但只能做近距离的无线传输,工作在包括但不仅限于125KHz、13.56MHz的低频段(这里的低频是相对于有源RFID频段)
而NFC(Near-field communication,近场通信) 技术是RFID技术的子集,NFC只工作在13.56MHz这一个频率。你想,有源RFID的传输距离那么远,当然也就不能叫“近场通信”了。这里放一张好图:
而IC卡 (Integrated Circuit Card,集成电路卡,智能卡) 和ID卡 (Identification Card,身份识别卡) 就属于无源RFID的应用。其中IC卡只工作在13.56MHz频率,这点看起来没有争议。但ID卡不只工作在125KHz,实际上有三个主要频率:
并且我搜到了一个UHF(超高频) ID Card的实际应用,挂在脖子上据称可以最远11米外识别:
因此,
- 将ID卡称为“低频卡”、IC卡称为“高频卡”是不准确的
- NFC技术仅工作在13.56MHz,因此无法识别125KHz的ID卡(绝大部分ID卡都是125KHz)
- 上面那条也是为什么手环、手机的NFC模块不可能复制某些门禁卡(125KHz ID卡)
搜到SMZDM有人用手环复制了ID卡:
结果是钻开表带把线圈塞进去了。。。
此外,
- ID卡只能一次性写入,而IC卡可以反复读写
- 125KHz ID卡虽然不能用NFC读写,但可以用低频读卡器读出来复制到另一张卡。事实上由于ID卡只存储了一个ID号而没有加密算法,其安全性是更低的。
- 所谓的“CPU卡”是一种带COS(芯片操作系统)的IC卡
- 二代身份证是一种Type B标准的IC卡:https://wiki.nfc.im/books/%E6%99%BA%E8%83%BD%E5%8D%A1%E6%89%8B%E5%86%8C/page/%E4%BA%8C%E4%BB%A3%E5%B1%85%E6%B0%91%E8%BA%AB%E4%BB%BD%E8%AF%81
M1卡分析
- 本文要模拟的卡片类型是13.56MHZ Mifare Classic S50卡,即M1卡
- Mifare是日本NXP公司的一个商标,Mifare卡是全球使用最广泛的IC卡,但这种技术也已经被广泛破解
- MF1卡又分为S50与S70,他们的存储空间与认证过程有略微差异,本文研究S50
结构
S50卡有16个扇区,1K的存储空间 (64x16=1024):
- 0扇区0区块:厂商块
- 0-15扇区3区块:控制块
- 其他区块:数据块
从结构图中可以看出,0扇区0区块存放着卡号与厂商信息,按规范这部分是固定不可修改的只读块,但据说是国内厂商制作出了0扇区0区块可写的魔卡(白卡/UID卡/CUID卡),这也是实现M1卡复制的基础。
需要强调的是,每个扇区都会有一组独立的密码及访问控制块(在第3区块),而IC卡的UID是不通过密码控制的(也就是0扇区0区块),可以直接通过读卡器获得。
认证流程
读写器向卡片发出一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC串联谐振电路产生共振,从而使电容内有了电荷。电容另一端接有一个单向导通的电子泵,此电子泵可将电容内的电荷输送到另一个电容内存储。当电容所积累的电荷达到2V时,此电容可作为电源为其他电路提供工作电压,将卡内数据发送出去或接收读写器的数据。(来源;《近源渗透测试》)
来源:BlackHat 2014 - Hacking Mifare Classic Cards
图中Tag指卡片0扇区存储的信息标签(UID),它接收到读卡器发来的校验请求后:
- 发送UID号给读卡器,进入防冲突循环,防止读卡器同时读到多张卡片
- 读卡器返回认证请求
- Tag产生一个(伪)随机数nT以明文方式发送给读卡器
- 读卡器在自身数据库中根据nT找到对应加密key,自身再产生一个随机数nR,使用key将nT与nR加密后分别返回给卡片
- 卡片使用自己的key验证返回值,若正确则响应一个新的校验值,认证流程结束。
破解的关键就在于,最后一步如果卡片验证失败,则会直接返回异常。而M1卡的校验是写死在卡片存储中的,无法实现CPU卡的一些额外逻辑操作,因此可以重放密钥对M1卡进行暴力破解。
当然以上的认证流程、破解部分都是通过成熟的工具完成的,对其有个大概了解,下文的复制不是重点内容。
攻击方法
通过分析上面的认证流程,我们知道了扇区数据必须要经过密钥(也就是keyA和keyB)认证才能被读取,下面是破解扇区密钥的三种方法:
默认密钥攻击
很多IC卡并没有更改默认密钥,常见的有:
ffffffffffff
000000000000
a0a1a2a3a4a5
b0b1b2b3b4b5
aabbccddeeff
4d3a99c351dd
1a982c7e459a
d3f7d3f7d3f7
714c5c886e97
587ee5f9350f
a0478cc39091
533cb6c723f6
8fd0a4f256e9
Nested Authentication漏洞攻击
简单来说,在已知16个扇区中任意一个扇区的密钥时,采用Nested Authentication攻击可以获得其他扇区的密钥。
【TBD】
Dark side攻击
Darkside攻击利用的是M1卡通信验证中算法存在的一个缺陷:当读卡器发送的加密数据中的某8bit全部正确的时候,tag会给读卡器发送一个加密的4bit NACK(否定应答)数据回复,其他任何情况下tag都会直接停止。
通过这种方式可以猜解密钥,但耗时会比较长。当破解出任意一个扇区的密钥时,就可以使用Nested Authentication攻击继续获得其他扇区的密钥。
M1卡复制
整体思路:小米手环对存在加密区的卡片默认无法模拟,因此需要一张白卡做中转。先复制一张非加密卡到手环,再将加密部分直接通过PN532写入手环。
道具
PN532模块 + USB2TTL(CH340模块) + 杜邦线 + UID/CUID卡(T5577)
接线
使用杜邦线连接PN532模块与USB2TTL(CH340):
PN532 | CH340 |
---|---|
GND | GND |
VCC | 5V |
SDA | RXD |
SCL | TXD |
黄色跳线帽不用管。接线接错使用模块可能会烧掉。
具体步骤
模块接入电脑后在设备管理器中可以看到,可以将波特率调高一些:
我用的WIN10虚拟机无需安装驱动,直接使用经典的NFC上位机软件即可读卡:
这里NFC上位机软件其实就是用默认密钥碰撞一些扇区,当某些扇区密钥被找到以后,再使用Nested Authentication攻击获取其他扇区的密钥。而像Proxmark3这样更高端的工具会集成Darkside攻击。
- 点击左上三角将整个卡存为dump文件,再额外记录下0扇区0区块(厂商块)的内容备用
- 读一张白卡(UID或CUID),将第1步中0扇区0区块的内容填进去,再把整个卡dump出来。
- 把第2步的dump数据写进空卡,这一步相当于得到了一张只有卡号、厂商信息的非加密卡。
- 使用小米手环自己的功能复制第3步得到的卡,由于是非加密卡所以可以直接复制。这一步复制成功的卡还是不能使用的,手环上只有基础的UID信息(厂商块)。
- 使用
nfc-mfclassic
工具将数据块信息直接写入手环:
nfc-mfclassic.exe w A xxxxx.dump # 这是第1步的dump文件
同目录下还需要有配置文件libnfc.conf:
allow_autoscan = true
log_level=2
# 0sec.com.cn
allow_intrusive_scan = true
device.name="PN532Reader"
# 设置端口和波特率
device.connstring="pn532_uart:COM3:115200"
手环的位置不太好读取到,可以多次尝试,我的验证是把手环侧放在模块上面可以识别到。
思考
本来对RFID这一领域毫无涉猎,跟着网上文章复制一张门禁卡后,为了明白自己做的是什么,才去了解到这些东西。搜集资料过程中发现互联网上各种说法定义五花八门,各路大神众说纷纭,本文也一定有不够准确的地方,作为RFID初探。
RFID技术的众多应用,说到底就是一个认证授权的过程,只是将令牌信息写死在了硬件中。类比Web应用的认证流程,可以将其想象成前端js加密,破解加密后可以看到明文的HTTP请求内容(所有扇区数据),任何人可以复用此payload(复制卡)。如果服务端不将信息存在数据库中做校验,完全信任客户端发送的信息,则可以任意声明客户端的属性(修改饭卡水卡金额)。
因此提高RFID技术应用的安全性就可以从加密方式和零信任两个地方做抓手赋能,形成闭环:
- 防止扇区数据被解密 - 强密钥
- 添加锁定策略防止暴力破解 - CPU卡
- 服务端数据库存储数据 - 后端校验