复制MIFARE Classic小区门禁卡记录
上个月忙着找房搬家换新住处,住进去发现新小区除了稍有点远的大门,平时方便行人出入的侧门都是必须刷门禁卡的,而房东那只有一张 IC 门禁卡,小区物业也无法办理新卡了,因此想着是不是能用手机模拟或者复制门禁卡的方式自己解决。
尝试手机模拟
由于我使用的华硕 Zenfone 2 手机是支持 NFC 功能的,首先可以用手机读取现有的门禁卡信息,这里我使用的是 NXP 官方推出的 NFC TagInfo App:
从 IC Info
里可以看到小区 IC 门禁卡是最常见的 MIFARE Classic EV1 S50 也就是 M1 1k 卡。
另外 App 下方还提示我的手机不兼容此卡,我们可以在 FULL SCAN
标签里查询详细信息:
这里可以读到 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 模块和配件:
需要注意模块背面的 GND
、VCC
、TXD
和 RXD
4 个引脚:
PL-2303HX USB 转 TTL 模块就更简单了,背面依次是 3.3V
、5.0V
、TXD
、RXD
和 GND
5 个引脚:
将引脚针焊接到 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 接口上使用了:
关于 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 卡,软件界面如下:
打开软件之后,首先需要确认 Reader 处能正确识别到 USB 转 TTL 设备(我的是 PN532 COM3 设备),放上新的 UID 卡之后,点击 Read data (Reader)
按钮将会从读卡器读取卡的类型和 UID 值等信息。
选中 Write keys
和 Non-OV Card
复选框,然后点击 Write data (Reader)
按钮,软件会提示你选择之前导出的备份文件,确认之后就会开始将数据写入新卡。
一切运行正常的话,你可以再次点击 Read data (Reader)
按钮读取新卡的 UID 值,如果和原来的门禁卡 UID 一致那就表示写入成功咯。
提示
如果你使用的其它软件导出的备份文件大小是 1kb 而不是 4kb,那么需要先使用
fixdump
工具修复备份文件,然后再使用 MFOC GUI 写入新卡。Windows 上的 MFOC GUI 工具、
fixdump
还有 MFCUK 软件我已经上传到百度网盘了,有需要的朋友可以通过下面的分享链接下载:
改装到手机
上面的复制及写入步骤都完成之后,我就拿着新复制的两张 UID 卡到小区门禁那测试,不出意外都成功地刷开了两边侧门的门禁。
为了不用外出时还专门带张门禁卡,我决定稍微小改一下 UID 卡装到手机上,首先拆开 UID 卡取出内部的 M1 电子标签,这里就要提醒大家最好购买方便拆装的钥匙扣样式的卡了:
然后将取出的 M1 电子标签用 NFC 贴纸之类的东西贴到手机后盖或者手机壳上,由于我的华硕 Zenfone 2 手机后盖上有 NFC 线圈,因此只能贴到手机壳上,另外 M1 电子标签最好能远离手机后盖上的 NFC 线圈:
搞定之后就能很方便地用手机直接刷小区门禁了,最后祝大家玩的开心,本文中使用的工具和方法还请勿用于非法用途哦。
T.L:
2017年06月26日 星期一 03:26下午
强,有没有可能直接复制到手机里而不使用物理卡呢?
Uranus Zhou:
2017年06月26日 星期一 05:52下午
手机直接模拟可以参考这个 [MIFARE4Mobile] 产品介绍;
或者看看这篇文章:
https://nelenkov.blogspot.fr/2012/08/exploring-google-wallet-using-secure.html
另外可能需要用一加 3T 这种使用 NXP 芯片的 Android 手机。
扭扭:
2019年04月11日 星期四 11:04上午
打开软件之后,首先需要确认 Reader 处能正确识别到 USB 转 TTL 设备(我的是 PN532 COM3 设备),放上新的 UID 卡之后,点击 Read data (Reader) 按钮将会从读卡器读取卡的类型和 UID 值等信息。
您复制到底用cuid卡还是uid卡呢?
Uranus Zhou:
2019年04月18日 星期四 03:24下午
我用的是 CUID 卡哦,相当于是一种特殊的 0 扇区可写的 UID 卡。
老司机:
2019年05月11日 星期六 01:58上午
感谢分享,成功copy了卡。
可是我买的门禁卡拆开是裸漏的线圈,被胶粘住了。
方便发一下您卡的购买链接么?我邮箱是 kj786543563艾特163.com。谢谢。
Uranus Zhou:
2019年05月15日 星期三 01:38下午
我用的是淘宝上买的 0 扇区可写的 CUID 钥匙扣卡:
3号CUID钥匙扣卡 F-UID UFUID升级版 MCT直改0扇区可反复擦写
这个店铺里也有别的类型的 NFC 卡。
virusdefender:
2019年05月31日 星期五 01:50下午
感觉文章里面缺了个配置文件
cat /etc/nfc/devices.d/pn532_uart.conf
name = “PN532 board via UART”
connstring = pn532_uart:/dev/ttyUSB0
allow_intrusive_scan = true
ttyUSB0 地址一般是这个,不是的自己修改
Uranus Zhou:
2019年05月31日 星期五 10:58下午
我之前在 Chromebook 的 Ubuntu 上测试的时候,只增加 libnfc.conf 配置文件就可以自动搜索 ttyUSB 设备了,
不知道是不是可能和 libnfc 版本有关系。
老司机:
2019年08月25日 星期日 09:35下午
感谢
带你开车:
2020年07月17日 星期五 10:25下午
作者有联系方式吗,我在Linux 上写cuid也是失败,只有在win上用软件才能写
Uranus Zhou:
2020年07月20日 星期一 11:40上午
联系方式留言板页面有的,
我之前 Linux 上用
nfc-mfclassic
命令去写也会报错。no3ks:
2021年09月19日 星期日 12:30下午
楼主请问 在linux下写卡失败是怎么解决的,我写卡的时候也报错了。
Uranus Zhou:
2021年09月23日 星期四 03:21下午
额,还是通过换到 Windows 上用
MiFare Offline Cracker GUI
工具来写卡的。最近我有空再看看这个问题。