复制MIFARE Classic小区门禁卡记录

上个月忙着找房搬家换新住处,住进去发现新小区除了稍有点远的大门,平时方便行人出入的侧门都是必须刷门禁卡的,而房东那只有一张 IC 门禁卡,小区物业也无法办理新卡了,因此想着是不是能用手机模拟或者复制门禁卡的方式自己解决。

尝试手机模拟

由于我使用的华硕 Zenfone 2 手机是支持 NFC 功能的,首先可以用手机读取现有的门禁卡信息,这里我使用的是 NXP 官方推出的 NFC TagInfo App:

IC 卡类型

IC Info 里可以看到小区 IC 门禁卡是最常见的 MIFARE Classic EV1 S50 也就是 M1 1k 卡。

另外 App 下方还提示我的手机不兼容此卡,我们可以在 FULL SCAN 标签里查询详细信息:

IC 卡详细信息

这里可以读到 M1 卡的 4 个字节 UID,但由于我的 Zenfone 2 手机使用的是 Broadcom 的 BCM20795 NFC 芯片,此芯片并不兼容国内常用的 M1 卡,NFC TagInfo App 读不到卡中的数据。

虽然也有网友分享了通过修改 Android 系统文件固定手机 NFC ID 的方法来模拟门禁卡,但现在的小区门禁并不只单纯验证卡 ID,因此想用手机来模拟门禁卡就行不通了。

准备 NFC 读卡器和 UID 卡

NFC 读卡器

如果为了省事,大家可以选择 ACR122U 这种现成的 USB NFC 读卡器,ACR122U 不仅有配套的软件,而且很多 IC 卡商家对其支持也比较好。

不过出于练(省)练(银)手(子)的考虑,我用的还是 NXP 自家产的 PN532 NFC/RFID v3 模块 + PL-2303HX USB 转 TTL 模块,毕竟这一套从淘宝买下来也才 30 多大洋。

收到的 PN532 NFC/RFID 模块和配件:

PN532 NFC/RFID 模块

需要注意模块背面的 GNDVCCTXDRXD 4 个引脚:

PN532 背面引脚

PL-2303HX USB 转 TTL 模块就更简单了,背面依次是 3.3V5.0VTXDRXDGND 5 个引脚:

PL-2303HX 背面引脚

将引脚针焊接到 PN532 的 4 个引脚,然后按下面的顺序和 PL-2303HX 模块连接起来即可:

  • PN532 的 VCC <-> PL-2303HX 的 5.0V
  • PN532 的 GND <-> PL-2303HX 的 GND
  • PN532 的 RXD <-> PL-2303HX 的 TXD
  • PN532 的 TXD <-> PL-2303HX 的 RXD

完成之后就可以插在电脑的 USB 接口上使用了:

NFC 读卡器

关于 UID 卡

M1 1k 卡有 16 个数据存储区(扇区),编号是 0 到 15,每个扇区都有独立的加密 key,每个扇区又分为 4 个存储单元(块)。在 M1 卡中数据存储的最小单位就是“块”,每一块有 16 字节用来存放数据。

由于一般的 M1 卡(例如 NFC 读卡器模块商家赠送的两张白卡)的 0 扇区 0 块为制造商使用,其中包括的 UID 值等数据并不能随意修改,这样即使复制下来也没什么意义了。

这里我使用的是被称为 Chinese Magic Card 的 0 扇区 0 块可写的 CUID 卡,相对于普通 UID 卡其好处在于可以被反复擦写,而且还支持使用兼容 M1 卡的 Android 手机(一般都是采用 NXP NFC 芯片的手机)来进行读写。

使用 mfoc 工具复制门禁卡

MFOC(Mifare Classic Offline Cracker)是一款基于 nested authentication 验证漏洞破解含有默认 key 的M1卡的开源软件,mfoc 软件自带了一些常用的默认 key 来进行破解,用户也可以通过参数添加自定义的 key。

安装 libnfc

为了方便我就直接在 Chromebook 上安装使用了,插上自制的 USB NFC 读卡器之后,我们可以使用 lsusb 命令检查是否找到了 PL-2303HX 设备:

(trusty)zzm@localhost:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 041: ID 0cf3:e003 Atheros Communications, Inc. 
Bus 001 Device 039: ID 0bda:575a Realtek Semiconductor Corp. 
Bus 001 Device 043: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

首先必须安装 mfoc 依赖的 libnfc 包:

(trusty)zzm@localhost:~$ sudo apt-get install libnfc-bin libnfc-dev libnfc-examples

对于 PL-2303HX 上的 PN532 模块,我们需要修改 libnfc 配置文件开启自动扫描,否则将无法正确识别到 NFC 设备:

(trusty)zzm@localhost:~$ sudo mkdir -p /etc/nfc/devices.d
(trusty)zzm@localhost:~$ cat > /etc/nfc/libnfc.conf
allow_autoscan = true
allow_intrusive_scan = true

此时将门禁卡放到 PN532 模块上,以 root 用户身份运行 nfc-list 命令,没什么意外的话就可以识别到 NFC 设备,并能读取到门禁卡 UID 信息了:

(trusty)zzm@localhost:~$ sudo nfc-list
nfc-list uses libnfc 1.7.0
NFC device: pn532_uart:/dev/ttyUSB0 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): 8e  f3  7c  de
      SAK (SEL_RES): 08

安装和使用 mfoc

最好自行编译安装 GitHub 上最新版本的 mfoc:

(trusty)zzm@localhost:~/Downloads/src$ wget https://github.com/nfc-tools/mfoc/archive/mfoc-0.10.7.tar.gz
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ autoreconf -vis
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ sudo make
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ sudo make install

安装成功之后就可以运行 mfoc 命令尝试破解读取门禁卡数据了,参数为需要导出的备份文件名:

(trusty)zzm@localhost:~/Downloads$ sudo mfoc -O bak.dmp
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
* UID size: single
* bit frame anticollision supported
       UID (NFCID1): 8e  f3  7c  de
      SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092

Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:

Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: ffffffffffff] -> [................]
[Key: a0a1a2a3a4a5] -> [................]
[Key: d3f7d3f7d3f7] -> [................]
[Key: 000000000000] -> [................]
[Key: b0b1b2b3b4b5] -> [................]
[Key: 4d3a99c351dd] -> [................]
[Key: 1a982c7e459a] -> [................]
[Key: aabbccddeeff] -> [................]
[Key: 714c5c886e97] -> [................]
[Key: 587ee5f9350f] -> [................]
[Key: a0478cc39091] -> [................]
[Key: 533cb6c723f6] -> [................]
[Key: 8fd0a4f256e9] -> [................]

Sector 00 -  UNKNOWN_KEY [A]  Sector 00 -  UNKNOWN_KEY [B]  
Sector 01 -  UNKNOWN_KEY [A]  Sector 01 -  UNKNOWN_KEY [B]  
Sector 02 -  UNKNOWN_KEY [A]  Sector 02 -  UNKNOWN_KEY [B]  
Sector 03 -  UNKNOWN_KEY [A]  Sector 03 -  UNKNOWN_KEY [B]  
Sector 04 -  UNKNOWN_KEY [A]  Sector 04 -  UNKNOWN_KEY [B]  
Sector 05 -  UNKNOWN_KEY [A]  Sector 05 -  UNKNOWN_KEY [B]  
Sector 06 -  UNKNOWN_KEY [A]  Sector 06 -  UNKNOWN_KEY [B]  
Sector 07 -  UNKNOWN_KEY [A]  Sector 07 -  UNKNOWN_KEY [B]  
Sector 08 -  UNKNOWN_KEY [A]  Sector 08 -  UNKNOWN_KEY [B]  
Sector 09 -  UNKNOWN_KEY [A]  Sector 09 -  UNKNOWN_KEY [B]  
Sector 10 -  UNKNOWN_KEY [A]  Sector 10 -  UNKNOWN_KEY [B]  
Sector 11 -  UNKNOWN_KEY [A]  Sector 11 -  UNKNOWN_KEY [B]  
Sector 12 -  UNKNOWN_KEY [A]  Sector 12 -  UNKNOWN_KEY [B]  
Sector 13 -  UNKNOWN_KEY [A]  Sector 13 -  UNKNOWN_KEY [B]  
Sector 14 -  UNKNOWN_KEY [A]  Sector 14 -  UNKNOWN_KEY [B]  
Sector 15 -  UNKNOWN_KEY [A]  Sector 15 -  UNKNOWN_KEY [B]  
mfoc: ERROR: 

No sector encrypted with the default key has been found, exiting..

如果运行正常没有报错的话,那么恭喜你,mfoc 工具会将整个 M1 卡备份为指定的文件。你可以跳过下面这一步接着就将备份文件写入新卡了。

如果你也遇到我贴在上面的错误输出,说明你的门禁卡并没有使用这些默认 key,此时就要请出 mfcuk 工具了。

使用 mfcuk 工具

MFCUK(MiFare Classic Universal toolKit) 是一款基于 dackside 攻击原理破解全加密 M1 卡的开源软件,mfcuk 通过算法的漏洞破解出第一个 key,如果某个扇区的 key 被破解出来,就可以再使用 mfoc 工具使用 nested authentication 攻击破解其他扇区的密码。

首先从 GitHub 上下载代码并编译安装:

(trusty)zzm@localhost:~/Downloads/src$ wget https://github.com/nfc-tools/mfcuk/archive/mfcuk-0.3.8.tar.gz
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ autoreconf -vis
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ sudo make
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ sudo make install

接着就可以用 mfcuk 进行破解了,我这边破解第一个 key 用了近半个小时的时间:

(trusty)zzm@localhost:~/Downloads$ sudo mfcuk -C -R 0:A -s 250 -S 250 -v 3

如果破解顺利的话,mfcuk 命令输出中会显示类似下面的 key 信息:

INFO: block 4 recovered KEY: XXXXXXXXXXXX

得到第一个 key 之后,我们就可以按 Ctrl-C 键退出 mfcuk 命令。

此时我们就可以把破解出来的 key 添加到 mfoc 命令的自定义参数中:

(trusty)zzm@localhost:~/Downloads$ sudo mfoc -O bak.dmp -k XXXXXXXXXXXX

如果 mfcuk 破解得到的第一个 key 是正确的,mfoc 命令一般会在几分钟之内完成整个 M1 卡所有扇区的破解,最终将成功生成导出备份文件。

写入新 UID 卡

通过 mfoc 和 mfcuk 工具成功导出原门禁卡数据之后,我们就可以将备份文件写入新的 UID 卡了。

Linux 系统写 UID 卡

Linux 系统下我们可以使用 libnfc 软件包自带的 nfc-mfclassic 工具来写新的 UID 卡:

(trusty)zzm@localhost:~/Downloads$ sudo nfc-mfclassic W a bak.dump bak.dump f

nfc-mfclassic 命令的 W 参数表示以 unlocked write 方式写入包含 0 扇区 0 块的数据(必须是 0 扇区 0 块国产魔卡)。

不过可惜的是我使用 nfc-mfclassic 工具写购买的 CUID 卡始终会报 0 块写入失败,无奈只能在 Windows 系统上使用其它工具写卡。

Windows 系统写 UID 卡

Windows 上我使用专门适配 PN532 NFC 读卡器设备的 MiFare Offline Cracker GUI(MFOC GUI)工具来写新的 UID 卡,软件界面如下:

Windows MFOC GUI

打开软件之后,首先需要确认 Reader 处能正确识别到 USB 转 TTL 设备(我的是 PN532 COM3 设备),放上新的 UID 卡之后,点击 Read data (Reader) 按钮将会从读卡器读取卡的类型和 UID 值等信息。

选中 Write keysNon-OV Card 复选框,然后点击 Write data (Reader) 按钮,软件会提示你选择之前导出的备份文件,确认之后就会开始将数据写入新卡。

一切运行正常的话,你可以再次点击 Read data (Reader) 按钮读取新卡的 UID 值,如果和原来的门禁卡 UID 一致那就表示写入成功咯。

提示

如果你使用的其它软件导出的备份文件大小是 1kb 而不是 4kb,那么需要先使用 fixdump 工具修复备份文件,然后再使用 MFOC GUI 写入新卡。

Windows 上的 MFOC GUI 工具、fixdump 还有 MFCUK 软件我已经上传到百度网盘了,有需要的朋友可以通过下面的分享链接下载:

https://pan.baidu.com/s/1kV7MOg3

改装到手机

上面的复制及写入步骤都完成之后,我就拿着新复制的两张 UID 卡到小区门禁那测试,不出意外都成功地刷开了两边侧门的门禁。

为了不用外出时还专门带张门禁卡,我决定稍微小改一下 UID 卡装到手机上,首先拆开 UID 卡取出内部的 M1 电子标签,这里就要提醒大家最好购买方便拆装的钥匙扣样式的卡了:

M1 电子标签

然后将取出的 M1 电子标签用 NFC 贴纸之类的东西贴到手机后盖或者手机壳上,由于我的华硕 Zenfone 2 手机后盖上有 NFC 线圈,因此只能贴到手机壳上,另外 M1 电子标签最好能远离手机后盖上的 NFC 线圈:

手机后盖 M1 标签

搞定之后就能很方便地用手机直接刷小区门禁了,最后祝大家玩的开心,本文中使用的工具和方法还请勿用于非法用途哦。

复制MIFARE Classic小区门禁卡记录》上的评论

  1. 打开软件之后,首先需要确认 Reader 处能正确识别到 USB 转 TTL 设备(我的是 PN532 COM3 设备),放上新的 UID 卡之后,点击 Read data (Reader) 按钮将会从读卡器读取卡的类型和 UID 值等信息。

    您复制到底用cuid卡还是uid卡呢?

  2. 感谢分享,成功copy了卡。
    可是我买的门禁卡拆开是裸漏的线圈,被胶粘住了。
    方便发一下您卡的购买链接么?我邮箱是 kj786543563艾特163.com。谢谢。

  3. 感觉文章里面缺了个配置文件

    cat /etc/nfc/devices.d/pn532_uart.conf
    name = “PN532 board via UART”
    connstring = pn532_uart:/dev/ttyUSB0
    allow_intrusive_scan = true

    ttyUSB0 地址一般是这个,不是的自己修改

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*