RFID初探之M1卡的分析与复制(使用PN532模块)


无需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卡:

结果是钻开表带把线圈塞进去了。。。

此外,

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),它接收到读卡器发来的校验请求后:

  1. 发送UID号给读卡器,进入防冲突循环,防止读卡器同时读到多张卡片
  2. 读卡器返回认证请求
  3. Tag产生一个(伪)随机数nT以明文方式发送给读卡器
  4. 读卡器在自身数据库中根据nT找到对应加密key,自身再产生一个随机数nR,使用key将nT与nR加密后分别返回给卡片
  5. 卡片使用自己的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攻击。

  1. 点击左上三角将整个卡存为dump文件,再额外记录下0扇区0区块(厂商块)的内容备用
  2. 读一张白卡(UID或CUID),将第1步中0扇区0区块的内容填进去,再把整个卡dump出来。
  3. 把第2步的dump数据写进空卡,这一步相当于得到了一张只有卡号、厂商信息的非加密卡
  4. 使用小米手环自己的功能复制第3步得到的卡,由于是非加密卡所以可以直接复制。这一步复制成功的卡还是不能使用的,手环上只有基础的UID信息(厂商块)。
  5. 使用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卡
  • 服务端数据库存储数据 - 后端校验
文章目录
  1. 1. 基础概念梳理:RFID、NFC、IC卡与ID卡
  2. 2. M1卡分析
    1. 2.1. 结构
    2. 2.2. 认证流程
    3. 2.3. 攻击方法
  3. 3. M1卡复制
    1. 3.1. 道具
    2. 3.2. 接线
    3. 3.3. 具体步骤
  4. 4. 思考
|