前言
我们小区的入口和单元楼门口都设有门禁系统,需要使用门禁卡来通过。但我经常会忘记带门禁卡,于是就有了用小米手环模拟门禁卡的想法。
所需的硬件
- CH340G模块(USB to TTL)
- PN532模块(NFC)
- 一张空白的CUID卡(用于测试)
所需的软件
- MifareOneTool(下文简称M1T)
- crypto1_bs
正文
首先,将CH340G和PN532用杜邦线连接好,插入到电脑上,并安装CH340G驱动。
打开M1T,点击检测连接
,应该可以识别到PN532。
开始执行检测设备……
nfc-bin/nfc-scan-device.exe 使用libnfc 1.7.1
找到 1 个NFC设备:
- pn532_uart:COM3:
pn532_uart:COM3:115200
识别了以下设备:
pn532_uart:COM3:115200
将自动选择首个设备:pn532_uart:COM3:115200
已指定使用该NFC设备:pn532_uart:COM3:115200
##运行完毕##
将门禁卡放置到PN532上,点击扫描卡片
,应当可以识别出门禁卡。
开始执行扫描卡片……
nfc-bin/nfc-list.exe 使用 libnfc 版本 1.7.1
NFC设备: NFC-Device 已打开
1 个ISO14443A(常见IC卡) 被动目标已发现:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): d0 a5 0d a6
SAK (SEL_RES): 08
[Found targets=1]
##运行完毕##
点击检测加密
,终端输出了这样一段报告,可以看出这是一张半加密卡。
开始执行检测卡片加密……
发现 Mifare Classic 1k 卡片
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): d0 a5 0d a6
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:
正在检查是否存在默认/简单/已知密钥...
图例: '.' 代表不存在, '/' 代表KeyA已知, '\' 代表KeyB已知, 'x' 代表KeyAB皆已知
[Key: ffffffffffff] -> [xxxx....xxxxxxxx]
[Key: a0a1a2a3a4a5] -> [xxxx....xxxxxxxx]
[Key: d3f7d3f7d3f7] -> [xxxx....xxxxxxxx]
[Key: 000000000000] -> [xxxx....xxxxxxxx]
[Key: b0b1b2b3b4b5] -> [xxxx....xxxxxxxx]
[Key: 4d3a99c351dd] -> [xxxx....xxxxxxxx]
[Key: 1a982c7e459a] -> [xxxx....xxxxxxxx]
[Key: aabbccddeeff] -> [xxxx....xxxxxxxx]
[Key: 714c5c886e97] -> [xxxx....xxxxxxxx]
[Key: 587ee5f9350f] -> [xxxx....xxxxxxxx]
[Key: a0478cc39091] -> [xxxx....xxxxxxxx]
[Key: 533cb6c723f6] -> [xxxx....xxxxxxxx]
[Key: 8fd0a4f256e9] -> [xxxx....xxxxxxxx]
扇区 00 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 01 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 02 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 03 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 04 - 未知的: Key A 未知的: Key B
扇区 05 - 未知的: Key A 未知的: Key B
扇区 06 - 未知的: Key A 未知的: Key B
扇区 07 - 未知的: Key A 未知的: Key B
扇区 08 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 09 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 10 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 11 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 12 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 13 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 14 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
扇区 15 - 找到: Key A: ffffffffffff 找到: Key B: ffffffffffff
##运行完毕##
按照PN532卖家提供的教程,我点击了一键解原卡
,却提示该卡片不受Nested攻击
。
……
使用扇区 00 的密钥开始解密
该卡片不受Nested攻击
##运行出错##
尝试使用HardNested
交流群里的大佬让我试试HardNested
。试试就试试吧,我打开HardNested,问大佬该怎么填写。大佬让我填8
,于是我就把已知扇区和待破解扇区都写成了8
。
我的台式机用的是E3 1220v3,跑了整整两天,跑到92.42%
的时候给我爆出来了个默认密匙,我@#$%&*……
我大意了啊,目标扇区
填写8
,出来的当然是8扇区的密匙。
群友的奇妙比喻。
云!
后来我注意到,M1T似乎有一个云计算的服务,可惜已经关掉了。
在翻看M1T项目的Issues的时候,我看到了这条Issue,作者有这样一句话。
于是我就找到了前言中提到的crypto1_bs
项目……
中间的辛酸历程就不展开说了,直接开始教程。
我试着在某大佬提供的VPS上编译这个程序,但编译总是不通过。经过一番辗转之后我在阅读列表里找到了这篇教程。
虽然是给树莓派写的,但Debian系应该都是通用的。很不巧,我VPS上运行的是CentOS 7,软件仓库里并没有libnfc-bin libnfc-dev
这两个包。
我想起了Docker,于是就有了下面的这番骚操作。
尝试使用Docker构建临时环境以编译crypto1_bs软件
标题有点多啊……这台VPS在法国,所以不用考虑更换镜像源之类的事。
首先,用官方的安装脚本安装Docker。为什么不直接用yum呢?因为听说官方源里的Docker比较旧……
curl -sSL https://get.docker.com/ | sh
准备
docker pull debian
#拉取Debian镜像
docker volume create data
#创建持久化卷,用于把编译好的程序传到宿主机。
docker run -it --rm -v ~/data:/data debian /bin/bash
#运行容器
现在应该已经打开了一个Docker里的Shell了。
cd /data
#转到持久化存储的目录
apt update
apt install libnfc-bin libnfc-dev make gcc git
#安装依赖
git clone https://github.com/aczid/crypto1_bs.git
cd crypto1_bs
git clone https://github.com/Tilka/crapto1.git crapto1-v3.3
git clone https://github.com/vk496/craptev1.git craptev1-v1.1
#Clone需要的源代码
make
#编译
编译好之后,应该会出现solve_bs solve_piwi solve_piwi_bs
这三个程序,我们只需要使用第一个。
问题来了,如何把它传到Docker外面?这时候持久卷的作用就发挥出来了。
Docker的持久化卷都存储在/var/lib/docker/volumes/
,将需要的文件复制出来即可。如果提示没有权限的话……请在前面加上sudo。
cp -r ~/data/crypto1_bs/ ~
正式开始
还是使用M1T的HardNested功能,但是收集完Nonce
之后到了计算部分就立即停止程序,我们只需要它生成的txt文件。
在程序目录下应该可以找到这样的一个txt文件。
打开后是这样的内容。
要的就是这个,把它上传到VPS上。
转到crypto1_bs目录。
cd ~/crypto1_bs
运行solve_bs
,出来了这样一段提示。
david@raspbian:~/crypto1_bs$ ./solve_bs
Usage: ./solve_bs <nonces.txt> <uid>
<nonces.txt>
当然就是我们传到VPS上的那个txt文件,但<uid>
是什么呢?其实就是那个txt文件名的前半部分。
综上所述,需要运行的命令是……
~/crypto1_bs/solve_bs ~/0xd0a50da6_019A.txt 0xd0a50da6
每张卡片的UID都不一样,需要根据实际情况修改。
如果没有错误的话,应该就可以开始计算了。
这次运气不错,在32.02%
就出结果了。而且不知为何速度比M1T内置的HardNested快多了……
有了密匙之后该如何解密呢?我们需要使用知一密破解
功能。
一般来说加密扇区的密匙都是相同的,用这个就足够了……
解密成功之后会弹出一个对话框提示你保存dump
文件,挑个喜欢的目录保存好。
后记
完整的过程就不写了,网上一搜一大把。原来的标题是“记一次使用PM532破解半加密门禁卡”,也许把它改成“教你在云服务器上进行HardNested破解”比较好?
后来还是失败了,因为CUID卡的0扇区不知道为什么无法修改,无法写入厂商信息。
2020/11/15 21:22 更新
之前是用复制的CUID卡来试验的。我又用小米手环试了试,能够成功通过大门的门禁和单元楼的门禁,算是完美了。
理论上来说复制出的CUID卡应该比小米手环的成功率更高……会有这样的结果是我没想到的,具体原因没有深究。
2020/11/15 21:32 更新
我竟然把所有的PN532
都写成了PM532
,标题也写错了……
本文由 徐艺扬 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Nov 16,2020