本文仅用作原理验证以及教育目的,请自觉遵守相关法律法规规定。因使用本文所述技术造成的一切非法后果,本文作者恕不承担任何责任!
# 安装 libnfc 驱动及 ACR122U-A9 驱动
yay -S libnfc acsccid --noconfirm
# 启动智能卡服务以支持 PN532
sudo systemctl start pcscd
# 安装 mfoc 软件,位于 community 仓库
yay -S mfoc --noconfirm
# 安装修改版 mfcuk 软件,支持对国产加强卡的暴力破解
git clone https://github.com/DrSchottky/mfcuk
cd mfcuk
automake && autoconf && ./configure && make install
注意:以下的所有操作都应当在 root shell 下运行,否则软件很有可能因权限不足而运行异常!
执行以下命令:
mfoc -O dump_trial.mfd
可能出现的情况分以下三种:
mfcuk
工具至少找出一个密钥,再使用 mfoc
工具进行破解;mfoc
可以使用嵌套认证漏洞,花费大概 10-20 分钟左右的时间将所有密钥推出,然后再将卡导出到指定文件。mfoc
可以直接将卡导出到指定文件。对于上一节的第一种情况,我们需要使用 mfcuk
工具对卡片进行 Darkside 攻击,破解出至少一个可用的密钥,再使用 mfoc
工具提供的嵌套认证漏洞利用来读出整卡。
执行以下命令:
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 <密钥>
,即可指定使用某些密钥来进行嵌套认证漏洞攻击。成功之后,我们依然可以读出整卡到文件。
目前市面上能见到的 Mifare 卡一共有 5 种类型:
这些卡片的价格按照叙述顺序递增,写卡难度也按照叙述顺序递增。
写入普通 Mifare 卡需要用到之前读出的整卡文件。其实文件里有用的部分仅仅是密钥,卡片本身只要密钥没变过,使用过期的文件同样可以对卡片进行读写。执行以下命令来将一个文件写进卡里:
nfc-mfclassic w a u newdata.mfd olddata.mfd
# newdata.mfd --- 新文件
# olddata.mfd --- 老文件(使用密钥)
这样将会更新 Mifare 卡除第 0 扇区外的其他扇区。
写入 UID 卡不需要使用之前读出的整卡文件(你甚至不用先破解),因为 nfc-mfclassic
工具支持 UID 卡的 unlocked write
模式,能够直接使用后门指令把数据导入卡内。执行以下命令来把一个文件写入 UID 卡内:
nfc-mfclassic W a u newdata.mfd
# W --- unlocked write 模式,UID 卡支持。
这样将会更新 UID Mifare 卡包括 0 扇区在内的所有扇区。
很遗憾,nfc-mfclassic
不支持直接将整个文件写入 CUID 卡。因为 nfc-mfclassic
工具写入 0 扇区只能使用 unlocked write
模式,这恰恰避开了 CUID 卡的特性——不支持后门指令。我们可以使用 nfc-mfclassic
工具写卡之后,用第三方工具再将 0 扇区的数据进行写入。
在实际验证中,我使用 Proxmark3 成功地写入了 CUID 卡的 0 扇区。当然,在写入之前,你还需要通过 Mifare 卡的正常验证。我也使用 libnfc
配合 C++ 程序实现了一个简单的 CUID 工具,用于自动在写入之前将 CUID 卡的 0 扇区进行妥善处理。感兴趣的读者也可一试。
这些卡片需要特殊的指令才能进行。略。