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
    11
    unar 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
2
3
4
5
6
7
# 查看内核是否加载了 pn533 模块
lsmod | grep pn533
# 禁用模块
modprobe -r pn533_usb pn533 nfc
echo "blacklist pn533_usb" >> /etc/modprobe.d/blacklist-libnfc.conf
echo "blacklist pn533" >> /etc/modprobe.d/blacklist-libnfc.conf
echo "blacklist nfc" >> /etc/modprobe.d/blacklist-libnfc.conf

这时,一般来说我们的系统就可以使用 acr122u 了。

可以使用 nfc-list 查看读卡器的状态。

但是在我的环境下依旧是有问题,无法识别到 acr122u。解决方法是插着 acr122u 进行重启。重启后就可以正常使用读卡器了,注意此时不能把 acr122u 拔下,拔下后再插上依旧会变回无法识别读卡器的状态。

破解

Dump 数据

尝试使用 mfoc 进行 dump 数据,mfoc(Mifare Classic Offline Cracker)是一款离线的认证嵌套攻击工具。可以使用仓库进行安装

1
2
3
4
5
6
pacman -S mfoc

# 安装修改版 mfcuk 软件,支持对国产加强卡的暴力破解
git clone https://github.com/DrSchottky/mfcuk
cd mfcuk
automake && autoconf && ./configure && make install

具体使用方法可以查看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
2
3
4
5
6
7
8
9
mfcuk -C -R 0 -s 500 -S 500 -v 2 -w 5

# -C --- 破解模式。
# -R 0 --- 破解 0 号扇区的密钥。
# -s 500
# -S 500 --- 关闭电磁场和开启电磁场的时间间隔。使用 PN532 破解的用户可以无视。
# 但对 ACR122U 来说,默认的 10ms 和 50ms 太快了,成功率很低。
# -v 2 --- 多显示一些信息。
# -w 5 --- treshold。防止 NACK 卡爆程序。

特别注意的是,虽然 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 种类型:

  1. 普通 Mifare 卡。这种卡的 0 扇区是不可写的,所以对于要复制卡片的人来说,这种卡可能并不适用。大多见于被攻击的原卡,不过对于原卡来说,即使不能进行写入,也可以修改其他扇区的数据。
  2. UID Mifare 卡。这种卡通过响应后门指令来实现所有扇区的可写,可以直接绕过密钥验证读取、擦出、写入任意扇区。对于需要复制卡片的人来说这种卡片简直是福音,但事实上恰恰有些系统会去验证卡片是否响应后门指令。这样的话,轻则拒绝访问,重则当场报警,慎之慎之。
  3. CUID Mifare 卡。这种卡的所有扇区都是可写的,但是并不响应后门指令。这种卡片由于不响应后门指令,可以绕过一些防火墙系统的设计。但是有些变态的防火墙系统会尝试对 0 扇区进行写入以进行测试,这时轻则卡片写废、拒绝访问,重则当场完犊子,同样要小心。
  4. FUID Mifare 卡。这种卡是一种经过改良的 UID 卡,不同的是卡片多出了一个烧死的特殊指令。一旦使用特殊的工具执行了烧死这一指令,卡片就从 UID 卡变回普通的 Mifare 卡。这种卡片连防火墙都拿他没辄,不过缺点是只能用一次,而且太贵了。
  5. FCUID Mifare 卡。与 FUID Mifare 卡类似,基于 CUID 卡,不再赘述。

这些卡片的价格按照叙述顺序递增,写卡难度也按照叙述顺序递增。

普通 Mifare 卡

写入普通 Mifare 卡需要用到之前读出的整卡文件。其实文件里有用的部分仅仅是密钥,卡片本身只要密钥没变过,使用过期的文件同样可以对卡片进行读写。执行以下命令来将一个文件写进卡里:

1
2
3
4
nfc-mfclassic w a u newdata.mfd olddata.mfd

# newdata.mfd --- 新文件
# olddata.mfd --- 老文件(使用密钥)

这样将会更新 Mifare 卡除第 0 扇区外的其他扇区。

UID Mifare

写入 UID 卡不需要使用之前读出的整卡文件(你甚至不用先破解),因为 nfc-mfclassic 工具支持 UID 卡的 unlocked write 模式,能够直接使用后门指令把数据导入卡内。执行以下命令来把一个文件写入 UID 卡内:

1
2
3
nfc-mfclassic W a u newdata.mfd

# W --- unlocked write 模式,UID 卡支持。

这样将会更新 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

这些卡片需要特殊的指令才能进行。略。

参考

在 Arch Linux 下攻击 Mifare NFC 卡片的简明指南

Arch Linux上使用ACR122U破解鲜奶卡