mfcuk(MIFARE Classic Universal Keyfinder)是 Kali Linux 中一款专注于 MIFARE Classic 智能卡密钥恢复与分析的工具,核心功能是通过利用 MIFARE Classic 卡片的加密漏洞(如弱密钥、加密算法缺陷),恢复卡片中各扇区的访问密钥(Key A/Key B),同时支持卡片数据 dump 文件的加载、解析、验证与导出,适用于 RFID/NFC 安全测试、智能卡逆向分析等场景(需对测试卡片拥有合法所有权或授权)。
其核心特性与适用范围如下:
- 密钥恢复能力:支持针对单个扇区或所有扇区(-1 表示全部)恢复 Key A 和 Key B,可指定密钥类型(仅恢复 Key A/Key B 或两者均恢复),适配不同加密强度的 MIFARE Classic 卡片(1K/4K 等)。
- dump 文件处理:支持加载标准 MIFARE 卡片 dump 文件(.dmp,-i 参数)和工具专属扩展 dump 文件(-I 参数),可导出恢复密钥后的标准 dump(-o)和扩展 dump(-O),便于后续分析或卡片克隆。
- 密钥验证功能:可验证指定扇区的密钥有效性(-V 参数),支持自定义密钥覆盖 dump 文件中的默认密钥,同时支持加载默认密钥库(-D)和额外自定义默认密钥(-d),提升验证效率。
- Proxmark3 联动:支持解析 Proxmark3(另一款 RFID 测试工具)捕获的通信日志(-p 参数)或直接输入嗅探到的通信数据(-P 参数),从交互数据中恢复密钥,适配复杂测试场景。
- 卡片指纹识别:可对加载的 dump 文件进行指纹分析(-F 参数),匹配已知卡片的数据格式(如交通卡、门禁卡的标准数据结构),辅助判断卡片类型与用途。
适用卡片类型:主要支持 MIFARE Classic 系列卡片(1K/4K),部分支持 DESFire 卡片(需通过 -M 参数指定类型);不支持 MIFARE Ultralight、NTAG 等非 Classic 系列卡片。
二、命令参数解析(表格形式)
1. 核心功能参数(按功能分类)
| 参数 | 英文说明 | 中文解析 | 使用示例 |
|---|---|---|---|
| -C | require explicit connection to the reader. Without this option, the connection is not made and recovery will not occur | 强制与读卡器建立显式连接(必须添加此参数,否则无法建立连接,密钥恢复/验证等操作无法执行) | mfcuk -C -R -1(连接读卡器并恢复所有扇区密钥) |
| -i mifare.dmp | load input mifare_classic_tag type dump | 加载标准 MIFARE Classic 卡片 dump 文件(.dmp 格式,包含卡片基础数据与密钥信息) | mfcuk -C -i backup.dmp -V -1(加载 dump 并验证所有扇区密钥) |
| -I mifare_ext.dmp | load input extended dump specific to this tool, has several more fields on top of mifare_classic_tag type dump | 加载工具专属的扩展 dump 文件(在标准 dump 基础上增加额外字段,如密钥恢复日志、卡片详细属性) | mfcuk -C -I ext_backup.dmp -O new_ext.dmp(加载扩展 dump 并导出新扩展 dump) |
| -o mifare.dmp | output the resulting mifare_classic_tag dump to a given file | 将处理后的标准 MIFARE Classic dump 数据导出到指定文件 | mfcuk -C -R -1 -o recovered.dmp(恢复所有密钥后导出标准 dump) |
| -O mifare_ext.dmp | output the resulting extended dump to a given file | 将处理后的扩展 dump 数据导出到指定文件 | mfcuk -C -R 0 -O sector0_ext.dmp(恢复扇区 0 密钥后导出扩展 dump) |
| -V sector[:A/B/any[:key]] | verify key for specified sector, -1 means all sectors. After first semicolon: A=verify KeyA, B=verify KeyB, others=verify both. After second semicolon: 12-hex key overrides dump key | 验证指定扇区的密钥: 1. sector:扇区号(-1 表示所有扇区); 2. A/B/any:密钥类型(A=仅验证 KeyA,B=仅验证 KeyB,其他值=验证两者); 3. key:12 位十六进制密钥(可选,覆盖 dump 文件中的默认密钥) | mfcuk -C -V 1:A:FFFFFFFFFFFF(验证扇区 1 的 KeyA,使用密钥 FFFFFFFFFFFF) |
| -R sector[:A/B/any] | recover key for sector, -1 means all sectors. After first semicolon: A=recover KeyA, B=recover KeyB, others=recover both | 恢复指定扇区的密钥: 1. sector:扇区号(-1 表示所有扇区); 2. A/B/any:密钥类型(A=仅恢复 KeyA,B=仅恢复 KeyB,其他值=恢复两者) | mfcuk -C -R 2:B(恢复扇区 2 的 KeyB) |
2. 卡片属性与配置参数
| 参数 | 英文说明 | 中文解析 | 使用示例 |
|---|---|---|---|
| -U UID | force specific UID. If a dump was loaded with -i, -U will overwrite the UID in memory | 强制指定卡片 UID(若通过 -i 加载了 dump 文件,此参数会覆盖内存中 dump 的 UID) | mfcuk -C -i old.dmp -U 12345678 -o new_uid.dmp(覆盖 UID 为 12345678 并导出) |
| -M tagtype | force specific tagtype. 8=1K, 24=4K, 32=DESFire | 强制指定卡片类型: 8 = MIFARE Classic 1K(默认常见类型); 24 = MIFARE Classic 4K; 32 = DESFire 卡片 | mfcuk -C -M 24 -R -1(指定 4K 卡片并恢复所有扇区密钥) |
| -F | tries to fingerprint the input dump (-i) against known cards' data format | 对通过 -i 加载的 dump 文件进行"指纹识别",匹配已知卡片的数据格式(如交通卡、门禁卡标准结构) | mfcuk -C -i card.dmp -F(分析 dump 并识别卡片类型) |
3. 密钥验证辅助参数
| 参数 | 英文说明 | 中文解析 | 使用示例 |
|---|---|---|---|
| -D | for sectors and key-types marked for verification, first use default keys to verify | 对标记为"待验证"的扇区和密钥类型,优先使用工具内置的默认密钥库进行验证(提升弱密钥验证效率) | mfcuk -C -V -1 -D(用默认密钥验证所有扇区的密钥) |
| -d key | specifies additional full 12 hex-digits default key to be checked. Multiple -d options allowed | 添加额外的 12 位十六进制默认密钥(可多次使用 -d 添加多个密钥,补充内置密钥库) | mfcuk -C -V 0 -D -d AAAAAAAAAAAA -d BBBBBBBBBBBB(用默认密钥+两个自定义密钥验证扇区 0) |
4. 读卡器交互与日志参数
| 参数 | 英文说明 | 中文解析 | 使用示例 |
|---|---|---|---|
| -s ms | milliseconds to sleep for SLEEP_AT_FIELD_OFF (Default: 10 ms) | 设置"读卡器字段关闭"时的休眠时间(单位:毫秒,默认 10ms,调整此值可优化读卡器兼容性) | mfcuk -C -R -1 -s 50(休眠 50ms 后恢复所有扇区密钥) |
| -S ms | milliseconds to sleep for SLEEP_AFTER_FIELD_ON (Default: 50 ms) | 设置"读卡器字段开启"后的休眠时间(单位:毫秒,默认 50ms,解决部分读卡器响应延迟问题) | mfcuk -C -R 3 -S 100(开启字段后休眠 100ms,再恢复扇区 3 密钥) |
| -v level | verbose level (default is 0) | 设置详细日志级别(默认 0,级别越高输出日志越详细,如 1=基础日志,2=调试日志) | mfcuk -C -R -1 -v 2(开启调试级日志,恢复所有扇区密钥) |
5. Proxmark3 联动参数
| 参数 | 英文说明 | 中文解析 | 使用示例 |
|---|---|---|---|
| -P hex_str | recover key from Proxmark3-sniffed conversation (mifarecrack.c based). Format: uid:tag_chal:nr_enc:reader_resp:tag_resp | 从 Proxmark3 嗅探的通信数据中恢复密钥,需输入十六进制格式的完整交互数据(格式:UID:标签挑战值:nr_enc:读卡器响应:标签响应) | mfcuk -C -P 0x5c72325e:0x50829cd6:0xb8671f76:0xe00eefc9:0x4888964f(从指定交互数据恢复密钥) |
| -p pm3.log | parse Proxmark3 log file (mifarecrack.py based), extract -P values and invoke key recovery | 自动解析 Proxmark3 生成的完整日志文件,提取 -P 参数所需的交互数据,自动执行密钥恢复 | mfcuk -C -p proxmark3.log(解析 Proxmark3 日志并恢复密钥) |
6. 官方使用示例解析
| 英文示例命令 | 中文解析 | 核心功能 |
|---|---|---|
| mfcuk -C -R -1 | 1. -C:建立读卡器连接; 2. -R -1:恢复所有扇区(-1)的 Key A 和 Key B(未指定密钥类型,默认恢复两者) | 全扇区密钥恢复(适用于未知密钥的 MIFARE Classic 卡片) |
| mfcuk -C -R 0 -s 250 -S 250 | 1. -C:建立读卡器连接; 2. -R 0:仅恢复扇区 0 的密钥; 3. -s 250:字段关闭时休眠 250ms; 4. -S 250:字段开启后休眠 250ms | 指定扇区密钥恢复(调整休眠时间提升读卡器兼容性,解决恢复失败问题) |
三、mfcuk 完整使用教程(全场景覆盖)
1. 前提准备:硬件与环境确认
使用 mfcuk 前需准备兼容的硬件与软件环境,确保工具正常交互:
1.1 必备硬件
- RFID/NFC 读卡器:支持 MIFARE Classic 卡片的 USB 读卡器(如 ACR122U、PN532 模块,需在 Kali 中正常识别);
- MIFARE Classic 卡片:待测试的 MIFARE Classic 1K/4K 卡片(需合法拥有或获得授权);
- Proxmark3(可选):若需通过嗅探通信恢复密钥,需准备 Proxmark3 设备及配套日志文件。
1.2 软件环境验证
# 步骤 1:安装 mfcuk(Kali 默认预装,未安装则执行)
sudo apt update && sudo apt install mfcuk -y
# 步骤 2:验证读卡器连接(以 ACR122U 为例)
sudo pcsc_scan
# 输出应包含"ACR122U"相关信息,且提示"Waiting for a card...",说明读卡器正常识别
# 步骤 3:验证工具可用性
mfcuk --help
# 输出参数说明列表,说明工具安装成功
1.3 注意事项
- 确保读卡器无其他进程占用(如关闭其他 RFID 工具:pcscd、nfctool 等);
- 部分读卡器需 root 权限操作,所有命令建议加
sudo执行; - 密钥恢复过程中,卡片需保持贴近读卡器,避免移动导致连接中断。
2. 场景 1:基础全扇区密钥恢复(未知密钥的 1K 卡片)
场景描述:拿到一张未知密钥的 MIFARE Classic1K 卡片,需恢复所有扇区的 Key A 和 Key B,并导出包含密钥的 dump 文件。
# 步骤 1:执行全扇区密钥恢复(核心命令)
sudo mfcuk -C -R -1 -o full_recovered.dmp -v 1
# 参数解析
# sudo:确保读卡器操作权限;
# -C:强制建立读卡器连接(必选);
# -R -1:恢复所有扇区(-1)的 Key A 和 Key B;
# -o full_recovered.dmp:将恢复密钥后的标准 dump 导出到文件;
# -v 1:输出基础日志,便于查看恢复进度(如"Recovering sector 0""Key A found: FFFFFFFFFFFF")。
# 步骤 2:查看恢复过程与结果
# 终端日志输出示例:
# [INFO] Connected to reader: ACR122U PICC Interface
# [INFO] Recovering sector 0 (Key A and Key B)
# [SUCCESS] Sector 0 Key A: AAAAAAAAAAAA
# [SUCCESS] Sector 0 Key B: BBBBBBBBBBBB
# ...
# [INFO] All sectors processed. Dump saved to full_recovered.dmp
# 步骤 3:验证恢复的 dump 文件(可选)
# 加载导出的 dump,验证所有扇区密钥有效性
sudo mfcuk -C -i full_recovered.dmp -V -1 -D
# -i full_recovered.dmp:加载恢复后的 dump;
# -V -1:验证所有扇区密钥;
# -D:优先用默认密钥验证(若恢复的密钥与默认密钥一致,会快速通过);
# 验证成功会输出"[SUCCESS] Sector X Key A verified""[SUCCESS] Sector X Key B verified"。
3. 场景 2:指定扇区密钥恢复(仅恢复扇区 0 的 Key A)
场景描述:已知卡片为 MIFARE Classic 4K 类型,仅需恢复扇区 0 的 Key A(扇区 0 包含卡片 UID 等关键信息,密钥常为默认值),且读卡器响应较慢需调整休眠时间。
# 步骤 1:指定卡片类型与扇区、密钥类型(核心命令)
sudo mfcuk -C -M 24 -R 0:A -s 200 -S 200 -O sector0_ext.dmp -v 2
# 参数解析
# -M 24:强制指定卡片类型为 4K(MIFARE Classic 4K,默认 1K 无需此参数);
# -R 0:A:仅恢复扇区 0(0)的 Key A(A);
# -s 200:"字段关闭"休眠 200ms(解决读卡器响应慢问题);
# -S 200:"字段开启后"休眠 200ms;
# -O sector0_ext.dmp:导出扩展 dump(包含恢复日志、卡片类型等额外信息);
# -v 2:调试级日志,输出详细交互过程(如读卡器指令、卡片响应)。
# 步骤 2:查看扩展 dump 内容(可选)
# 扩展 dump 为二进制文件,可通过 hexdump 查看关键信息
hexdump -C sector0_ext.dmp | head -20
# 输出中可找到扇区 0 Key A 的十六进制值(通常在固定偏移位置)。
4. 场景 3:利用 Proxmark3 日志恢复密钥(复杂加密卡片)
场景描述:普通密钥恢复失败(卡片使用强密钥),但已通过 Proxmark3 嗅探到卡片与读卡器的交互日志(proxmark3.log),需通过日志解析恢复密钥。
# 步骤 1:准备 Proxmark3 日志
# 确保 Proxmark3 日志包含完整的 MIFARE 交互数据(如"uid:tag_chal:nr_enc:reader_resp:tag_resp"格式片段),日志路径假设为 /home/user/proxmark3.log。
# 步骤 2:自动解析日志并恢复密钥(核心命令)
sudo mfcuk -C -p /home/user/proxmark3.log -o pm3_recovered.dmp -v 1
# 参数解析
# -p /home/user/proxmark3.log:指定 Proxmark3 日志文件路径;
# 工具会自动解析日志中的交互数据,提取 -P 参数所需的 hex 字符串,进而恢复密钥;
# 若解析成功,会输出"[SUCCESS] Extracted interaction data from log: 0x...:0x...:0x...:0x...:0x...",随后显示密钥恢复结果。
# 步骤 3:手动输入交互数据恢复(日志解析失败时备用)
# 若自动解析失败,从 Proxmark3 日志中手动提取交互数据(格式:uid:tag_chal:nr_enc:reader_resp:tag_resp)
sudo mfcuk -C -P 0x12345678:0x9abcdef0:0x1a2b3c4d:0x5e6f7a8b:0x9c0d1e2f -o manual_recovered.dmp
# -P 后紧跟手动提取的 hex 字符串,其他参数与自动解析一致;
# 示例中会恢复出对应扇区的密钥(如官方示例中的 FFFFFFFFFFFF)。
5. 场景 4:验证自定义密钥与 dump 文件修复
场景描述:现有一份 MIFARE 卡片 dump 文件(old.dmp),但部分扇区密钥缺失或错误,需手动指定密钥验证有效性,并生成修复后的 dump 文件。
# 步骤 1:验证指定扇区的自定义密钥
# 假设已知扇区 5 的 Key A 为"112233445566",验证该密钥是否有效
sudo mfcuk -C -i old.dmp -V 5:A:112233445566 -v 1
# 参数解析
# -i old.dmp:加载待修复的旧 dump;
# -V 5:A:112233445566:验证扇区 5(5)的 Key A(A),使用自定义密钥"112233445566";
# 验证成功输出"[SUCCESS] Sector 5 Key A verified with custom key";
# 验证失败输出"[ERROR] Sector 5 Key A verification failed"(需检查密钥是否正确)。
# 步骤 2:修复 dump 文件(替换错误密钥)
# 若扇区 5 原密钥错误,用自定义正确密钥覆盖,并导出新 dump
sudo mfcuk -C -i old.dmp -V 5:A:112233445566 -o fixed.dmp
# 工具会将验证通过的自定义密钥写入内存中的 dump 数据,再通过 -o 导出修复后的 fixed.dmp;
# 修复后可再次验证:sudo mfcuk -C -i fixed.dmp -V 5:A -v 1(无需指定密钥,使用 dump 中的修复后密钥)。
# 步骤 3:批量添加额外默认密钥(提升多扇区验证效率)
# 若多个扇区使用非内置默认密钥,批量添加自定义默认密钥验证
sudo mfcuk -C -i old.dmp -V -1 -D -d 112233445566 -d 665544332211 -v 1
# -d 112233445566 -d 665544332211:添加两个额外默认密钥;
# 工具会先用内置默认密钥,再用添加的自定义默认密钥验证所有扇区,减少手动指定密钥的次数。
6. 场景 5:卡片指纹识别(判断卡片用途)
场景描述:拿到一份未知用途的 MIFARE 卡片 dump 文件(unknown.dmp),需通过指纹识别匹配已知卡片格式(如交通卡、门禁卡),辅助判断卡片用途。
# 步骤 1:执行指纹识别(核心命令)
sudo mfcuk -C -i unknown.dmp -F -v 1
# 参数解析
# -F:启用指纹识别功能;
# -i unknown.dmp:加载待识别的 dump 文件;
# 工具会对比 dump 中的数据结构(如扇区数据布局、特定字段值)与内置的已知卡片格式库。
# 步骤 2:查看识别结果
# 识别成功输出示例:
# [INFO] Fingerprinting dump file: unknown.dmp
# [SUCCESS] Matched known format: "Public Transport Card (City X)"
# [DETAILS] Sector 4: Balance field found (0x00001234 = 4660 cents)
# [DETAILS] Sector 8: Transaction log start at offset 0x10
# 识别失败输出示例:
# [INFO] No known card format matched. Dump may be custom or encrypted.
# 失败时可尝试:1. 确认 dump 包含完整数据(无损坏);2. 手动分析 dump 关键字段(如用 hexdump 查看扇区 0 的 UID、扇区 1 的数据结构)。
四、常见问题与解决方案
| 常见问题 | 可能原因 | 解决方案 |
|---|---|---|
| "Could not connect to reader"(无法连接读卡器) | 1. 读卡器未插入或未被系统识别;2. 读卡器被其他进程占用;3. 无 root 权限 | 1. 重新插拔读卡器,执行 lsusb 确认设备存在(如 ACR122U 显示"072f:2200");2. 关闭占用进程:sudo killall pcscd;3. 所有命令添加 sudo 执行 |
| "Sector X key recovery failed"(扇区 X 密钥恢复失败) | 1. 卡片加密强度高(无弱密钥漏洞);2. 读卡器休眠时间过短;3. 卡片接触不良 | 1. 尝试 Proxmark3 嗅探通信(场景 3);2. 增加休眠时间(如 -s 300 -S 300);3. 确保卡片紧贴读卡器,恢复过程中不移动 |
| "Dump file corrupted"(dump 文件损坏) | 1. 导出过程中断(如卡片移动、读卡器断开);2. dump 文件路径无写入权限;3. 文件格式错误(非标准 .dmp) | 1. 重新执行恢复命令,确保过程不中断;2. 选择有权限的路径(如 -o /tmp/recovered.dmp);3. 确认 dump 来源(仅支持 mfcuk 或同类工具生成的标准 dump) |
| "Proxmark3 log parse failed"(Proxmark3 日志解析失败) | 1. 日志文件无交互数据(未捕获到 MIFARE 通信);2. 日志格式不兼容(非 Proxmark3 标准日志);3. 交互数据不完整 | 1. 重新用 Proxmark3 嗅探(确保捕获"uid:tag_chal:nr_enc:reader_resp:tag_resp"片段);2. 使用 Proxmark3 官方固件生成日志;3. 手动提取交互数据用 -P 参数执行(场景 3 步骤 3) |
| "Tag type mismatch"(卡片类型不匹配) | 1. 手动指定的卡片类型(-M)与实际卡片不符(如实际是 1K 却指定 -M 24);2. 卡片非 MIFARE Classic 系列(如 Ultralight) | 1. 移除 -M 参数让工具自动识别,或用 nfc-list 查看卡片类型(如"MIFARE Classic 1K");2. 确认卡片为 MIFARE Classic 1K/4K(mfcuk 不支持其他类型) |
五、注意事项与安全规范
- 法律边界 :仅可对 合法拥有或获得明确授权的 MIFARE Classic 卡片使用 mfcuk,未经授权破解他人卡片(如门禁卡、交通卡)涉嫌违反《刑法》《治安管理处罚法》《数据安全法》,需承担法律责任(如非法获取计算机信息系统数据罪)。
- 密钥安全 :恢复的密钥与 dump 文件包含敏感信息,需加密存储(如用
gpg -c recovered.dmp加密),避免泄露导致卡片被克隆、数据被篡改;测试完成后建议删除临时文件(rm -f *.dmp)。 - 硬件兼容性 :优先选择主流读卡器(如 ACR122U、PN532),部分廉价读卡器可能存在协议兼容性问题(如无法发送特定指令导致恢复失败),建议提前用
pcsc_scan确认读卡器支持 MIFARE Classic 协议。 - 卡片损坏风险 :密钥恢复过程中,工具会向卡片发送大量指令,频繁操作可能导致卡片临时锁死(通常断电后恢复)或物理损坏,建议对重要卡片先备份 dump(如用
mfoc -O backup.dmp,需已知部分密钥),再执行恢复操作。 - 工具局限性 :mfcuk 依赖 MIFARE Classic 的加密漏洞,对使用 强密钥且无漏洞的卡片(如部分新版门禁卡)无法恢复密钥,此时需结合其他工具(如 Proxmark3 的暴力破解模块)或获取合法密钥。
- 版本更新 :Kali 仓库中的 mfcuk 版本可能较旧,若遇到兼容性问题,可从源码编译最新版(参考官方仓库:https://github.com/nfc-tools/mfcuk),支持更多新读卡器与卡片类型。