起因
小区门禁卡补办一张要50太贵了,经过一番研究,发现 pn532 这个东东,于是 pdd 上 48 包邮剁了一套有外壳的 pn532 读卡器,还附送了 4 个漂亮的卡通版 cuid 空白卡。当然店家还有手机端的软件跟注册码附送,如果有安卓机,直接手机上就能完成,可是我手里没得安卓机,只能在我的macbook上试验了,所以就有了下面的过程,记录一下。
准备
PN532 读卡器,typc 转 usb 接口线
门禁卡
空白的 cuid 卡
Macpro 13 寸电脑一台:系统版本 Mac OS 11
安装驱动
我购买的这个 pn532 采用的 usb 转串口的调试芯片是沁恒的 ch340 芯片,所以去官网找到对应的 macos 驱动http://www.wch.cn/download/CH341SER_MAC_ZIP.html,下载并安装。
安装完成过后,在控制台输入
ls /dev/tty*
可以看到类似/dev/tty.wchusbserial1340
的设备,则说明已经被正确挂载了,如果没有设备,安装驱动包里相关教程进行设置。ch340模块测试:如果手里有其他的 ch340 usb 转串口模块,只需要把模块的 rxd 与 txd 短接,然后控制台输入
screen /dev/tty.wchusbserial1340
随便按几下键盘看看是不是在屏幕上有返回 ,理论上是按什么返回什么说明模块驱动安装成功
工具库安装
如果要读取门禁卡信息,需要安装设备相关的工具库依赖,需要 libusb ,libnfc 这两个库,嫌编译安装麻烦,我直接使用 Homebrew 安装了。
这两个安装完成后,将 pn532 与 mac 连接好,门禁卡放上,然后控制台输入nfc-list
,这时候如果不出意外,应该能读取到门禁卡的数据了。然而我的显示如下
nfc-list uses libnfc 1.8.0
0 device(s) found
解决方案:
控制台输入 LIBNFC_LOG_LEVEL=3 nfc-list
可以列出日志信息,大致如下
info libnfc.config Unable to open file: /usr/opt/local/etc/nfc/libnfc.conf
debug libnfc.config Unable to open directory: /usr/opt/local/etc/nfc/devices.d
debug libnfc.general log_level is set to 3
debug libnfc.general allow_autoscan is set to true
debug libnfc.general allow_intrusive_scan is set to false
debug libnfc.general 0 device(s) defined by user
...
从日志中可以看到,相关的配置文件没有找到,去对应的位置添加配置文件和目录即可
我们需要修改 libnfc 配置文件开启自动扫描,否则将无法正确识别到 NFC 设备。libnfc.conf 配置信息如下,
allow_autoscan = true
allow_intrusive_scan = true
配置信息修改完成后,还需要添加 devices.d 目录,同时还需要在该目录下添加 pn532 设备的配置信息
新建目录
sudo mkdir -p /usr/opt/local/etc/nfc/devices.d
然后在 devices.d 目录下添加配置文件 mypn532.conf
name = "My_PN532"
connstring = pn532_uart:/dev/tty.wchusbserial1340
allow_intrusive_scan = true
添加完成后,再次运行nfc-list
就能正常读取到我们的门禁卡信息了
nfc-list uses libnfc 1.8.0
NFC device: My_PN532 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 4a f1 5e da
SAK (SEL_RES): 08
可以看到我的门禁卡的 SAK 是 08,是可以被破解复制的,如果为 20 的话,可能下面的方案就不太适合了
读取并复制卡信息
- 先使用 mfoc 工具进行破解。
mfoc(Mifare Classic Offline Cracker)是一款基于 nested authentication 验证漏洞破解含有默认 key 的 M1 卡的开源软件,mfoc 软件自带了一些常用的默认 key 来进行破解,用户也可以通过参数添加自定义的 key。
安装命令 brew install mfoc
安装后执行命令
sudo mfoc -O bak.mfd
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): 4a f1 5e da
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] -> [................]
...
如果最后运行没有报错,那么 mfoc 就已经成功备份出门禁的数据 bak.mfd 了,使用写卡命令直接将备份文件写入新卡即可。
如果 mfoc 报错,说明你的门禁卡并没有使用这些默认 key,就需要使用 mfcuk 进行尝试破解了。
- 使用 mcuk 破解
mfcuk (MiFare Classic Universal toolKit) 是一款基于 dackside 攻击原理破解全加密 M1 卡的开源软件,mfcuk 通过算法的漏洞破解出第一个 key,如果某个扇区的 key 被破解出来,就可以再使用 mfoc 工具使用 nested authentication 攻击破解其他扇区的密码。
安装命令 brew install mfcuk
安装后执行命令
sudo mfcuk -C -R 0:A -s 250 -S 250 -v 3
破解过程很久,运气好的据说半个小时就能破解出第一个 key 控制台如下显示
INFO: block 4 recovered KEY: 3c5d7f1e
得到第一个 key 之后,我就可以跟退出 mfcuk ,通过获取到的 key,使用 mfoc 进行再次解密
sudo mfoc -k 3c5d7f1e -O bak.mfd
如果 mfcuk 破解的第一个 key 是正确的,mfoc 命令一般会在几分钟之内完成整个 M1 卡所有扇区的破解,最终将成功生成导出备份文件。
写入新卡
使用 libnfc 软件包自带的 nfc-mfclassic
命令进行写卡
nfc-mfclassic 的相关参数如下
nfc-mfclassic --help
Usage: nfc-mfclassic f|r|R|w|W a|b u|U<01ab23cd> [ [f]]
f|r|R|w|W - Perform format (f) or read from (r) or unlocked read from (R) or write to (w) or unlocked write to (W) card
*** format will reset all keys to FFFFFFFFFFFF and all data to 00 and all ACLs to default
*** unlocked read does not require authentication and will reveal A and B keys
*** note that unlocked write will attempt to overwrite block 0 including UID
*** unlocking only works with special Mifare 1K cards (Chinese clones)
a|A|b|B - Use A or B keys for action; Halt on errors (a|b) or tolerate errors (A|B)
u|U - Use any (u) uid or supply a uid specifically as U01ab23cd.
- MiFare Dump (MFD) used to write (card to MFD) or (MFD to card)
- MiFare Dump (MFD) that contain the keys (optional)
f - Force using the keyfile even if UID does not match (optional)
Examples:
Read card to file, using key A:
nfc-mfclassic r a u mycard.mfd
Write file to blank card, using key A:
nfc-mfclassic w a u mycard.mfd
Write new data and/or keys to previously written card, using key A:
nfc-mfclassic w a u newdata.mfd mycard.mfd
Format/wipe card (note two passes required to ensure writes for all ACL cases):
nfc-mfclassic f A u dummy.mfd keyfile.mfd f
nfc-mfclassic f B u dummy.mfd keyfile.mfd f
Read card to file, using key A and uid 0x01 0xab 0x23 0xcd:
nfc-mfclassic r a U01ab23cd mycard.mfd
因为我购买的是 cuid 空白卡,所以我使用的写卡命令为nfc-mfclassic w a u bak.mfd
然后就可以去试试新复制的卡了。
最后
可以看到使用的工具都是利用了m1卡的漏洞进行破解,所以一张门禁卡能不能复制就要看这个门禁卡有没有漏洞,如果是最近一两年才新加装的门禁系统,估计已经没有这些漏洞可以利用了。
参考文献
https://www.jianshu.com/p/7a0bf015e06c
https://zohead.com/archives/copy-mifare-classic/
https://www.jianshu.com/p/fd6cee57b31d