acr122u 使用
acr122u 使用记录
前言
acr122u其实是大学时候买来做实验(咳咳)用的,自从小米6上买了Card Emulator Pro之后,因为这软件也有对m1卡的复制uuid和写白卡功能,这个读卡器就丢到一边吃灰去了。
最近同事给了我几张白卡叫我帮他复制下自家的门卡,发现前几日刷了LineageOS 17.1之后手机对m1卡的模拟功能还是正常的,但不能写入白卡了,遂又把丢在一边的机器翻了出来。
使用
安装驱动
本人使用 Arch Linux 其他操作系统可以参考大致步骤和命令
安装 pcsc-lite。pcsc-lite 封装了访问使用 SCard API (PC/SC) 访问智能卡设备的开发包。
1 | pacman -S pcsc-lite libusb |
安装 acr122u 的驱动,有两种方式,对于 Arch Linux 来说 acsccid 驱动已经提交到了 community 仓库中,可以直接使用 pacman 来安装。同时也可以使用官网下载的驱动手动编译安装。
使用仓库
1
pacman -S acsccid
手动编译驱动
去acs官网下载 acr122u 的驱动。
编译前需要确保系统编译环境
- pcsclite 1.8.3 or above
- libusb 1.0.9 or above
- flex
- perl
- pkg-config
1
2
3
4
5
6
7
8
9
10
11unar ACS-Unified-Driver-Lnx-Mac-xyj-P.zip
cd ACS-Unified-Driver-Lnx-Mac-118-P
# Enter the following commands to unpack the driver source code.
tar -jxvf acsccid-x.y.z.tar.bz2
cd acsccid-x.y.z
# Enter the following commands to install the driver.
./configure
make
make install
安装 libtool 和 libnfc
1 | pacman -S libtool libnfc |
禁用部分模块,根据 Wiki 说明,内核会自动加载的pn533驱动会导致驱动报错无法识别到nfc设备。
1 | # 查看内核是否加载了 pn533 模块 |
这时,一般来说我们的系统就可以使用 acr122u 了。
可以使用 nfc-list
查看读卡器的状态。
但是在我的环境下依旧是有问题,无法识别到 acr122u。解决方法是插着 acr122u 进行重启。重启后就可以正常使用读卡器了,注意此时不能把 acr122u 拔下,拔下后再插上依旧会变回无法识别读卡器的状态。
破解
Dump 数据
尝试使用 mfoc 进行 dump 数据,mfoc(Mifare Classic Offline Cracker)是一款离线的认证嵌套攻击工具。可以使用仓库进行安装
1 | pacman -S mfoc |
具体使用方法可以查看mfoc的帮助文档。
我们可以使用 mfoc dump 原有卡中的数据,把每个 sector 的 probes 调高一点到 500,默认为 20,这样速度可以快很多,输出文件为 output.mfd。
MFOC 会先尝试默认密钥,如果匹配则进行认证嵌套攻击。
1 | mfoc -P 500 -O output.mfd |
可能出现的情况分以下三种:
卡片没有任何一个扇区使用默认密钥。此时应考虑使用
mfcuk
工具至少找出一个密钥,再使用mfoc
工具进行破解;卡片有至少一个扇区使用了默认密钥。此时
mfoc
可以使用嵌套认证漏洞,花费大概 10-20 分钟左右的时间将所有密钥推出,然后再将卡导出到指定文件。卡片全部扇区都使用了默认密钥。此时
mfoc
可以直接将卡导出到指定文件。
加密处理
如果出现第一种情况,我们需要使用 mfcuk
工具对卡片进行 Darkside 攻击,破解出至少一个可用的密钥,再使用 mfoc
工具提供的嵌套认证漏洞利用来读出整卡。
1 | mfcuk -C -R 0 -s 500 -S 500 -v 2 -w 5 |
特别注意的是,虽然 AUR 上有现成的
mfcuk-git
仓库,但是官方代码对一个严重的问题并没有进行解决:对于一些较新的 Mifare 卡,这些卡在认证失败的时候会直接发送 NACK,导致原有的工具失效并频繁爆出mfcuk: ERROR: mfcuk_key_recovery_block() (error code=0x03)
错误,详情可以原仓库 Issue #28。而 DrSchhottky 的Fork 版本通过引入 treshold 选项解决了这一问题。只需要在运行
mfcuk
时指定-w
选项设置一个 treshold,例如-w 5
,类似的问题就不会再出现。这也是为什么我要推荐使用他的版本的原因。
等待大约 30-50 分钟,我们可以至少拿到 1 个可用的密钥。接下来,我们把拿到的密钥,例如 ffeeccaabbee
传递给 mfoc
,把破解的任务转交给他来完成。在之前的 mfoc
参数列表中补充一个 -k <密钥>
,即可指定使用某些密钥来进行嵌套认证漏洞攻击。成功之后,我们依然可以读出整卡到文件。
写卡
写卡基本是通过nfc-mfclassic(MIFARE Classic command line tool)来进行写入,但是对不同类型的 Mifare 卡有不同的写入方式。
目前市面上能见到的 Mifare 卡一共有 5 种类型:
- 普通 Mifare 卡。这种卡的 0 扇区是不可写的,所以对于要复制卡片的人来说,这种卡可能并不适用。大多见于被攻击的原卡,不过对于原卡来说,即使不能进行写入,也可以修改其他扇区的数据。
- UID Mifare 卡。这种卡通过响应后门指令来实现所有扇区的可写,可以直接绕过密钥验证读取、擦出、写入任意扇区。对于需要复制卡片的人来说这种卡片简直是福音,但事实上恰恰有些系统会去验证卡片是否响应后门指令。这样的话,轻则拒绝访问,重则当场报警,慎之慎之。
- CUID Mifare 卡。这种卡的所有扇区都是可写的,但是并不响应后门指令。这种卡片由于不响应后门指令,可以绕过一些防火墙系统的设计。但是有些变态的防火墙系统会尝试对 0 扇区进行写入以进行测试,这时轻则卡片写废、拒绝访问,重则当场完犊子,同样要小心。
- FUID Mifare 卡。这种卡是一种经过改良的 UID 卡,不同的是卡片多出了一个烧死的特殊指令。一旦使用特殊的工具执行了烧死这一指令,卡片就从 UID 卡变回普通的 Mifare 卡。这种卡片连防火墙都拿他没辄,不过缺点是只能用一次,而且太贵了。
- FCUID Mifare 卡。与 FUID Mifare 卡类似,基于 CUID 卡,不再赘述。
这些卡片的价格按照叙述顺序递增,写卡难度也按照叙述顺序递增。
普通 Mifare 卡
写入普通 Mifare 卡需要用到之前读出的整卡文件。其实文件里有用的部分仅仅是密钥,卡片本身只要密钥没变过,使用过期的文件同样可以对卡片进行读写。执行以下命令来将一个文件写进卡里:
1 | nfc-mfclassic w a u newdata.mfd olddata.mfd |
这样将会更新 Mifare 卡除第 0 扇区外的其他扇区。
UID Mifare
写入 UID 卡不需要使用之前读出的整卡文件(你甚至不用先破解),因为 nfc-mfclassic
工具支持 UID 卡的 unlocked write
模式,能够直接使用后门指令把数据导入卡内。执行以下命令来把一个文件写入 UID 卡内:
1 | nfc-mfclassic W a u newdata.mfd |
这样将会更新 UID Mifare 卡包括 0 扇区在内的所有扇区。
CUID Mifare
很遗憾,nfc-mfclassic
不支持直接将整个文件写入 CUID 卡。因为 nfc-mfclassic
工具写入 0 扇区只能使用 unlocked write
模式,这恰恰避开了 CUID 卡的特性——不支持后门指令。我们可以使用 nfc-mfclassic
工具写卡之后,用第三方工具再将 0 扇区的数据进行写入。
在实际验证中,我使用 Proxmark3 成功地写入了 CUID 卡的 0 扇区。当然,在写入之前,你还需要通过 Mifare 卡的正常验证。我也使用
libnfc
配合 C++ 程序实现了一个简单的 CUID 工具,用于自动在写入之前将 CUID 卡的 0 扇区进行妥善处理。感兴趣的读者也可一试。
FUID/FCUID
这些卡片需要特殊的指令才能进行。略。