PN532 的简短使用教程与示例

闲来无事想研究一下NFC的工作原理,于是斥巨资30元购入PN532+CH340以便在电脑上操作。

如图所示,PN532小红板与CH340。

使用MifareOne Tool进行读写操作:Releases · xcicode/MifareOneTool

使用CH340模块不用安装驱动,完全靠着MifareOne Tool可以解决绝大部分卡片,对于CPU加密卡、SAK28卡,我的建议是放弃。

读卡

如图所示,外圈白色部分才是感应区域。

很多人教程都是直接把卡放在芯片上,或者白圈内,实际上放在外围白圈上才是最容易感应到的。包括圆形的小cuid卡,直接放白圈内无法感应到。

连接好杜邦线后,将CH340连接到电脑上,能看到红色的POWER LED灯亮起:

如若检测不到可以尝试更换USB接口。

切换到高级操作模式。

点击检测设备,检测到PN532设备后将要读取的或者写入的卡片放在外围白色pcb板上线圈处。

点击MifareOne Tool上的扫描卡片按钮,反复调整位置直到扫描到卡片即可:

注释

CUID卡,指的是可读写的UID卡,一般通过厂家预留的后门指令对卡上扇区信息进行擦写。

扇区,指的是UID卡保存信息的位置,通俗来说类似于电脑的磁盘,每个扇区的大小一致,通常会进行加密。

读取原理:

  1. 靠近感应:读卡器与卡片通过射频耦合建立通信(感应)。
  2. 请求认证:读卡器要访问某个 block(或扇区)的数据时,先发出认证请求,指明要访问哪个 block 并使用 Key A 还是 Key B 进行认证。
  3. 挑战 — 响应(不直接发送密钥)
  4. 读卡器与卡片进行一个基于 nonce 的**挑战/响应(challenge–response)**过程,双方用事先共享的密钥(Key A/B)和 Crypto1 流密码算法生成并验证加密流。
  5. 读卡器不会把密钥明文发给卡片;而是用密钥计算出能通过卡片验证的响应,从而证明读卡器知道密钥。
  6. 认证成功:卡片验证通过后,会允许特定操作(读、写、修改 trailer 等),具体允许哪些由该 sector 的 Access Bits 决定。
  7. 读/写数据(加密或明文,视 Access Bits 与会话而定):读卡器发送读/写命令,数据在 Crypto1 流下可能是加密传输的,卡片返回相应的数据块。
  8. 结束会话:完成后断开或跳到其它命令。

0扇区:存储卡片UID与一些厂商信息的地方,也可写入一些数据,大部分正版UID卡片出场UID由厂商设置,无法修改0扇区的任何内容。但是CUID卡可以对0扇区进行擦写更改。

常见 MIFARE 卡 SAK 对照:

SAK说明
0x08MIFARE Classic 1K(不支持 ISO14443-4)
0x18MIFARE Classic 4K 或 SLE 44xx(支持 ISO14443-4)
0x28MIFARE DESFire 系列(支持 ISO14443-4)

CPU卡,可编程、安全、智能的卡,相比简单 UID 卡,它可以做逻辑判断、存储敏感数据、加密通信,所以在金融、交通、身份认证等高安全场景非常普遍,破解难度极大。

读卡

对于Mifare 1K/4K卡片,直接进行MFOC读进行尝试破解卡片:

此时可以看到程序自动进行字典和密钥尝试,不要移开卡片或者移动PN532,耐心等待。

当破解完毕后MifareOne Tool会弹出保存dump文件的框:

这个文件包含着整个cuid卡的信息,包括所有扇区的数据。

写卡

把你购买的白卡放上去,然后手动扫描卡,直到能读取到卡的信息。

然后要确认写入的数据大小和卡的类型一致。

得到dump文件,然后点击CUID写,选择刚刚导出的dump文件,然后选择取消(因为你是全新白卡)。

如上第一图的结果,虽然写入似乎没有写0扇区,但是当第二次读取的时候却是正常的:

至此,你已经完成了卡片的读取与写入。

关于手机写1K卡片

需要下载Mifare Classic Tool,并将dump文件传输到手机。

导入dump文件,然后打开:

一定要开启0扇区写入:

选择所有扇区,点击OK后,贴卡,选择std.keys,写入,大功告成。

关于卡大小的信息

不同卡的存储大小不同,比如此篇文章的原始案例卡大小为4KB,但是真正存储了数据的扇区只有0~9这十个扇区,总共加起来不到1KB,故可以尝试使用1KB的CUID卡写入这些数据进行测试。

一些坑

1

正在检查是否存在默认/简单/已知密钥...
图例: '.' 代表不存在, '/' 代表KeyA已知, '\' 代表KeyB已知, 'x' 代表KeyAB皆已
[Key: ffffffffffff] -> [............x..x/\.\xxxxxxx.//x\/\.\.\\\]
[Key: a0a1a2a3a4a5] -> [............x..x/\.\xxxxxxx.//x\/\.\.\\\]
[Key: d3f7d3f7d3f7] -> [............x..x/\.\xxxxxxx.//x\/\.\.\\\]
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
nfc_initiator_mifare_cmd: Invalid argument(s)
[Key: 000000000000] -> [..

##运行出错##

尝试切换USB接口,读卡器与电脑的连接不好。

2

已启用CUID空卡写入补丁
正在使用智能KeyABN
开始执行CUID/FUID卡片写入……
NFC设备: pn532_uart:COM13 已打开
已找到Mifare Classic卡片:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): 39  9f  d5  05  
      SAK (SEL_RES): 08  
推测大小: 可能是 1024-byte 大小的卡片
提示: 这张卡不需要后门写 (W) 
需要写入 64 个块 |x...............................................................|
完成写入了 63 / 64 个块.

##运行完毕##

缺少0扇区没有成功写入,大概率会导致卡片无法通过读卡器校验。

解决方法是购买能写入0扇区的卡片。

3

使用扇区 10 的密钥开始解密
扇区: 0, 密钥 A, 探测次数 0, distance 64 .....
扇区: 0, 密钥 A, 探测次数 1, distance 64 .....
扇区: 0, 密钥 A, 探测次数 2, distance 64 .....
扇区: 0, 密钥 A, 探测次数 3, distance 64 .....
扇区: 0, 密钥 A, 探测次数 4, distance 64 .....
扇区: 0, 密钥 A, 探测次数 5, distance 64 .....
扇区: 0, 密钥 A, 探测次数 6, distance 64 .....
扇区: 0, 密钥 A, 探测次数 7, distance 64 .....

程序一直卡在distance 64,这是无漏洞卡,使用mfoc工具很难进行破解。给一个正常有漏洞的的探测密钥日志:

扇区: 0, 密钥 A, 探测次数 0, distance 16874 .....
扇区: 0, 密钥 A, 探测次数 1, distance 16870 .....
扇区: 0, 密钥 A, 探测次数 2, distance 16718 .....
扇区: 0, 密钥 A, 探测次数 3, distance 16918 .....
扇区: 0, 密钥 A, 探测次数 4, distance 16826 .....
扇区: 0, 密钥 A, 探测次数 5, distance 16972 .....
扇区: 0, 密钥 A, 探测次数 6, distance 16976 .....
扇区: 0, 密钥 A, 探测次数 7, distance 16920 .....
扇区: 0, 密钥 A, 探测次数 8, distance 16918 .....
扇区: 0, 密钥 A, 探测次数 9, distance 16978 .....

同时,你复制的CUID卡写入之后再次尝试破解也可能会出现distance 64的问题,因为这张CUID卡无法完全复制原UID卡的所有行为,比如无法复现Crypto1漏洞等,所以没办法找到漏洞。

警告

本篇文章仅作技术探讨,请勿用于违法用途,请在自身拥有授权和权限的情况下,确定不违反法律进行操作。

发表回复