hack-miband4-nfc

小米手环复制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 PlusMIFARE 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-binlibnfc-examples。如果碰到加密卡,还需要安装 mfocmfcuk

  • Linux

    基本同上,不过源里可能没有 mfocmfcuk,需要自行下载源码编译。具体编译过程请参考官方 GitHub( mfocmfcuk)。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
2
3
4
5
allow_autoscan = false
log_level=2
allow_intrusive_scan = true
device.name = "PN532"
device.connstring = "pn532_uart:/dev/ttyS3" #Linux 下为 /dev/ttyUSB0

执行 nfc-scan-device -v(需要 sudo,后文略) 确认 NFC 模块能正常识别。正常输出如下:

1
2
3
4
5
6
7
nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
- pn532_uart:/dev/ttyS3:
pn532_uart:/dev/ttyS3
chip: PN532 v1.6
initator mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), ISO/IEC 14443-4B (106 kbps), Innovision Jewel (106 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)
target mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)

Dump 卡片

卡片基本信息

执行 nfc-poll,将门禁卡在 NFC 模块上贴一下,可以看到卡片信息输出如下:

1
2
3
4
5
6
7
8
9
nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/ttyS3 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 01 23 45 67
SAK (SEL_RES): 08
nfc_initiator_target_is_present: Target Released
Waiting for card removing...done.

从上可以看到卡片 ID 为 01 23 45 67,ATQA 为 00 04,SAK 为 08。如果 ATQA 和 SAK 不是这两个值,则门卡可能是其他类型,很有可能无法复制。

无密码卡

现在将卡放在 NFC 模块上,并执行 nfc-mfclassic r a dump.mfd 尝试无密码复制卡片数据,成功的输出如下:

1
2
3
4
5
6
7
8
9
10
NFC reader: pn532_uart:/dev/ttyS3 opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 01 23 45 67
SAK (SEL_RES): 08
Guessing size: seems to be a 1024-byte card
Reading out 64 blocks |................................................................|
Done, 64 of 64 blocks read.
Writing data to file: dump.mfd ...Done.

如果能成功复制出所有数据,这就意味着卡片是没有任何密码保护的。 我们再用 xxd dump.mfd 确认下卡片内容。 如果除了前4行,其他的内容都和下面类似,则门禁可能是只校验卡片 ID 的低级门禁。

1
2
3
4
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: ffff ffff ffff ff07 8069 0000 0000 0000 .........i......

部分加密卡

如果卡片有加密没法读出,我们就需要用到 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 模拟加密门禁卡

  1. 使用设备(如 PN532)读加密门卡内容到 PC,dump
  2. 将block 0写到一张空白UID卡上,给手环复制(手环只模拟了 block 0 的卡号部分,而厂商代码是固定值且不可修改,所以碰到检查卡号和厂商的门禁就没用了)
  3. 再写入加密卡片内容的其它部分到手环(剩余63 blocks)

进监狱全攻略:Mifare1 Card破解

NFC手机模拟加密门禁卡