记一次使用PN532破解半加密门禁卡

前言

我们小区的入口和单元楼门口都设有门禁系统,需要使用门禁卡来通过。但我经常会忘记带门禁卡,于是就有了用小米手环模拟门禁卡的想法。

所需的硬件

  1. CH340G模块(USB to TTL)
  2. PN532模块(NFC)
  3. 一张空白的CUID卡(用于测试)

所需的软件

  1. MifareOneTool(下文简称M1T)
  2. crypto1_bs

正文

首先,将CH340G和PN532用杜邦线连接好,插入到电脑上,并安装CH340G驱动。

图片.png

打开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

图片.png

交流群里的大佬让我试试HardNested。试试就试试吧,我打开HardNested,问大佬该怎么填写。大佬让我填8,于是我就把已知扇区和待破解扇区都写成了8

图片.png

图片.png

我的台式机用的是E3 1220v3,跑了整整两天,跑到92.42%的时候给我爆出来了个默认密匙,我@#$%&*……

QQ图片20201115093316.jpg

我大意了啊,目标扇区填写8,出来的当然是8扇区的密匙。

QQ图片20201115104554.jpg

群友的奇妙比喻。

云!

后来我注意到,M1T似乎有一个云计算的服务,可惜已经关掉了。

在翻看M1T项目的Issues的时候,我看到了这条Issue,作者有这样一句话。

图片.png

于是我就找到了前言中提到的crypto1_bs项目……

中间的辛酸历程就不展开说了,直接开始教程。

我试着在某大佬提供的VPS上编译这个程序,但编译总是不通过。经过一番辗转之后我在阅读列表里找到了这篇教程。

树莓派进行hardnested破解

虽然是给树莓派写的,但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 /var/lib/docker/volumes/data/_data/crypto1_bs/ ~

正式开始

还是使用M1T的HardNested功能,但是收集完Nonce之后到了计算部分就立即停止程序,我们只需要它生成的txt文件。

图片.png

在程序目录下应该可以找到这样的一个txt文件。

图片.png

打开后是这样的内容。

图片.png

要的就是这个,把它上传到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文件名的前半部分。

图片.png

综上所述,需要运行的命令是……

~/crypto1_bs/solve_bs ~/0xd0a50da6_019A.txt 0xd0a50da6

每张卡片的UID都不一样,需要根据实际情况修改。

图片.png

如果没有错误的话,应该就可以开始计算了。

图片.png

这次运气不错,在32.02%就出结果了。而且不知为何速度比M1T内置的HardNested快多了……

图片.png

有了密匙之后该如何解密呢?我们需要使用知一密破解功能。

图片.png

图片.png

一般来说加密扇区的密匙都是相同的,用这个就足够了……

解密成功之后会弹出一个对话框提示你保存dump文件,挑个喜欢的目录保存好。

图片.png

后记

完整的过程就不写了,网上一搜一大把。原来的标题是“记一次使用PM532破解半加密门禁卡”,也许把它改成“教你在云服务器上进行HardNested破解”比较好?

后来还是失败了,因为CUID卡的0扇区不知道为什么无法修改,无法写入厂商信息。


2020/11/15 21:22 更新

之前是用复制的CUID卡来试验的。我又用小米手环试了试,能够成功通过大门的门禁和单元楼的门禁,算是完美了。

理论上来说复制出的CUID卡应该比小米手环的成功率更高……会有这样的结果是我没想到的,具体原因没有深究。

2020/11/15 21:32 更新

我竟然把所有的PN532都写成了PM532,标题也写错了……

点赞
  1. Catyo说道:
    Google Chrome Windows 10
    实施抓捕 :jingya:
    1. 徐 艺扬 徐 艺扬说道:
      Firefox Windows 10
      不滥用的话……应该不会有问题。

发表评论

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