小米手环复制Mifare 门禁卡
背景知识
市场情况
门禁卡种类:
- ID卡,是早期的非接触式电子标签,工作频段在 125kHz,芯片中只记录了一个ID号,不可以存储任何数据卡,无需任何权限即可读取。由于太容易复制已经基本退出市场。
- MIFARE Classic,又叫 M1 卡,是 NXP 半导体公司的产品,属于IC卡的一种,由于成本低廉也是目前在中国市场上使用最广泛的门禁卡技术,使用场景包括且不限于门禁卡,还有饭卡、水卡等。工作频段在 13.56MHz,符合 ISO/IEC 14443 Type A (国内二代身份证是 Type B)标准,有数据存储空间并可反复擦写数据,数据读写都需要密码验证。
白卡类型:
类型 | 说明 |
---|---|
M1 | 普通 IC 卡,除 0 扇区不可修改,其他扇区可重复擦写 |
UID | 普通 IC 复制卡(Chinese clones),可重复擦写所有扇区 |
CUID | 用于绕过系统对 UID 卡的拦截 |
FUID | 用于绕过系统对 CUID 卡的拦截,0 扇区写入一次后变成 M1 卡 |
UFUID | UID 和 FUID 的合成卡,需要封卡操作 |
安全问题
从 1994 年就面世的 MIFARE Classic 已经算的上是一个古老的产品,在 2008 年就已经被宣告能用普通 PC 在几分钟之内通过与读卡器通信破解出密钥,2009 年更是公布了仅需卡片的离线破解。NXP 官方也已经建议使用更安全的 MIFARE Plus 和 MIFARE DESFire。有兴趣的朋友可以看看 Black Hat 上的 slides:Hacking Mifare Classic Cards。
基本结构
MIFARE Classic 一般使用的是 MIFARE Classic 1K(M1卡),1K = 16 sectors ✖️ 4 blocks ✖️ 16B = 1024字节
16 个 sector (扇区)每个 sector 再划分为 4 个 block(块),编号为block 0 - 63,sector 0的block 0用于存放厂商代码,已经固化无法更改,包括卡片 ID(官方名称叫 UID,注意不要和后文的 UID 卡弄混)和类型信息。其余sector的第block 0 - 2 用于存放数据,block 3 为控制块用于存放密钥A、控制访问权限的 Access Bits、密钥B,结构如下:
A0 A1 A2 A3 A4 A5 | FF 07 80 69 | B0 B1 B2 B3 B4 B5 |
---|---|---|
(Key A 6字节) | (存储控制 4字节) | (Key B 6字节) |
并且每个扇区块3中的密码和存储控制全部都是独立的,独立控制本扇区的各种操作,每个扇区都能实现不同的功能,所以广泛用作一卡通。
卡中每个块包含16字节,所以M1卡的容量=16扇区✖️4块✖️16字节=1024字节=1k (M1卡的由来)。
Wiki 上有直观的布局图:MiFare Byte Layout.png。
破解原理
NFC原理
NFC是现在主流的非接触式IC卡的读卡技术,其全称是近场通信(near field communication),是基于无线射频识别RFID(Radio Frequency Identification)技术发展起来的一种近距离无线通信技术,与RFID一样,NFC也是通过频谱中无线频率部分的电磁感应耦合方式传递,但两者之间还是存在很大的区别。NFC的传输范围比RFID小,RFID的传输范围可以达到0~1m,但由于NFC采取了独特的信号衰减技术,相对于RFID来说NFC具有成本低、带宽高、能耗低等特点。
近场通信技术(Near-field communication,NFC)由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体)、诺基亚和索尼共同于2004年研制开发,其基础是RFID及互连技术。近场通信是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。当前近场通信已通过成为ISO/IEC IS 18092国际标准、EMCA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种读取模式。
近场通信是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。
这段话也说明了它的技术指标,13.56MHz,传输距离,传输速度。
准备操作
确认门禁卡类型
硬件准备
NFC 模块和 USB 转 TTL 模块
- 一档(30RMB):[PN532 NFC RFID 模块 V3] 和 「CH340 USB 转 TTL 模块」
- 二档(100RMB): [ACR122U]
- 三档(300RMB):Proxmark3,支持高低频卡,可通过配套软件实现破解、嗅探、模拟、复制等功能,被誉为 RFID 界的瑞士军刀
UID 卡
不同的门禁验证的内容也不一样。
- 只验证卡片 ID :UID 卡
- 只验证卡片内容:使用 NFC 模块配套赠送的白卡就行了
- 同时验证卡片 ID 和内容:UID 卡
- 其它:可能需要用 CUID/FUID 卡才行
购买备注
购买 USB 转 TTL 模块时注意避免 PL 2303 HX 型号,该型号的早期版本 Rev A 由于山寨问题已经被官方在新版本驱动中封杀,无法在 Win10 系统中自动安装驱动使用。如果你不幸购买到了此(山寨)版本,请使用1.5.0 (2011-10-21) 版本的驱动包或者询问卖家索取。
软件准备
Windows
Windows10 启用 WSL 后从商店安装 Kali Linux,用
apt
命令从源里安装libnfc-bin
和libnfc-examples
。如果碰到加密卡,还需要安装mfoc
和mfcuk
。Linux
基本同上,不过源里可能没有
mfoc
和mfcuk
,需要自行下载源码编译。具体编译过程请参考官方 GitHub( mfoc,mfcuk)。Arch 用户可直接从 AUR 安装libnfc-git mfoc-git mfcuk-git
Mac
用 brew 安装
libnfc mfoc mfcuk
操作步骤
以 PN532 + Windows 10 + WSL + Kali Linux为例
连接 NFC 模块
PN532 | USB 转 TTL 模块 |
---|---|
GND | GND |
VCC | 5.0V |
TXD/SDA | RXD(接收端) |
RXD/SCL | TXD(传送端) |
打开“设备管理器”,将 USB 插上电脑,等待 Windows 自动安装驱动。(PL 2303 HXA 注意先安装老版本驱动再插入 USB 模块)。驱动安装完成后,在“端口”里找到 USB 转 TTL 模块的端口号,例如 COM3
。
修改 /etc/nfc/libnfc.conf
,在文件末尾加入:
1 | allow_autoscan = false |
执行 nfc-scan-device -v
(需要 sudo
,后文略) 确认 NFC 模块能正常识别。正常输出如下:
1 | nfc-scan-device uses libnfc 1.7.1 |
Dump 卡片
卡片基本信息
执行 nfc-poll
,将门禁卡在 NFC 模块上贴一下,可以看到卡片信息输出如下:
1 | nfc-poll uses libnfc 1.7.1 |
从上可以看到卡片 ID 为 01 23 45 67
,ATQA 为 00 04
,SAK 为 08
。如果 ATQA 和 SAK 不是这两个值,则门卡可能是其他类型,很有可能无法复制。
无密码卡
现在将卡放在 NFC 模块上,并执行 nfc-mfclassic r a dump.mfd
尝试无密码复制卡片数据,成功的输出如下:
1 | NFC reader: pn532_uart:/dev/ttyS3 opened |
如果能成功复制出所有数据,这就意味着卡片是没有任何密码保护的。 我们再用 xxd dump.mfd
确认下卡片内容。 如果除了前4行,其他的内容都和下面类似,则门禁可能是只校验卡片 ID 的低级门禁。
1 | 00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ |
部分加密卡
如果卡片有加密没法读出,我们就需要用到 mfoc 工具来尝试破解密钥了。它利用了在 2009 年研究出来的 offline nested attack,可以在拥有任意 sector 密码的情况下,猜解出其他 sector 的密码。如果卡片不是完全加密,仅需要几分钟就可以猜解出密钥。 我们执行 mfoc -O dump.mfd
开始破解,如果成功的话会提示以下内容,并将卡片内容和密钥一同显示出来。
Auth with all sectors succeeded, dumping keys to a file!
完全加密卡
如果门禁卡是全加密卡,上面使用 mfoc 就会有失败提示:
No sector encrypted with the default key has been found, exiting..
这时我们就需要用到 mfcuk 了。它利用了同样是 2009 年研究出的 Dark Side attack,利用认证协议上的漏洞来猜解密码,可能需要一个小时才能破解出密钥。当拿到其中一个密钥之后,就可以可上面部分加密卡一样,使用 mfoc 工具猜解其它的密钥。 先执行 mfcuk -C -R 0:A -s 250 -S 250
,然后就是漫长的等待。当输出如下内容时,表示破解成功:
INFO: block 3 recovered KEY: 123456789ABC
将拿到的 Key 传给 mfoc,执行 mfoc -k 123456789ABC -O dump.mfd
,就可破解出完整的卡片数据。
写入卡片
将 UID 卡放在 NFC 模块上,执行 nfc-mfclassic W a dump.mfd
即可写入卡片 ID 和卡片数据。参数中的 W
表示同时写入 ID 号(需要 UID 系列卡片),也可以用 w
仅写入卡片内容。如果手头没有 UID 卡,可以仅写入卡片内容试试看是不是仅校验卡内容的门禁。
懒人模式(图形界面)
步骤类似,读卡,破解,写卡
MifareOneTool
NFC上位机(NFC_READER_crack.exe+PN532破解全加密GUI.exe)
小米手环NFC 模拟加密门禁卡
- 使用设备(如 PN532)读加密门卡内容到 PC,dump
- 将block 0写到一张空白UID卡上,给手环复制(手环只模拟了 block 0 的卡号部分,而厂商代码是固定值且不可修改,所以碰到检查卡号和厂商的门禁就没用了)
- 再写入加密卡片内容的其它部分到手环(剩余63 blocks)