尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MFCUK实战指南:MiFare Classic密钥恢复原理与安全审计

MFCUK实战指南:MiFare Classic密钥恢复原理与安全审计 1. 项目概述从一张门禁卡说起如果你手头有一张公司门禁卡、小区门禁卡或者一张旧版的公交卡它很可能就是一张MiFare Classic卡。这种卡在过去的十几年里无处不在几乎构成了我们物理门禁和早期小额支付的基础。作为一名安全研究员我接触过无数这样的卡片也处理过很多因为卡片丢失、密钥遗忘或者系统交接不清导致的“锁死”问题。这时候一个叫做MFCUK的工具就进入了我们的视野。它不是一个“破解”工具而是一个“密钥恢复”工具其核心价值在于当你拥有对卡片的合法物理接触权限却因为管理疏忽丢失了部分或全部密钥时它能帮你把钥匙找回来。MFCUK全称MiFare Classic Universal toolKit是一个专门针对MiFare Classic 1K/4K卡片进行密钥恢复的命令行工具。它基于卡片与读卡器通信过程中的一些密码学特性尝试穷举出扇区的访问密钥。请注意这里讨论的所有操作都基于一个核心前提你正在操作的是你拥有合法权限的卡片比如你公司的测试卡、你自己购买的空白卡或者你需要进行安全审计的、已获得授权的设备。对他人所属的卡片进行未授权的密钥恢复尝试不仅是非法的也违背了安全研究的伦理。本指南将带你完整走一遍MFCUK的实战流程。我不会只给你命令和步骤那样你只是会“按按钮”。我会拆解每一个步骤背后的逻辑解释MFCUK在做什么、为什么这么做以及在这个过程中你可能会遇到哪些坑怎么爬出来。毕竟恢复密钥的过程本身就是一次对MiFare Classic安全机制的深刻学习。2. MiFare Classic与MFCUK核心原理拆解要玩转MFCUK你不能只把它当黑盒。理解它工作的底层原理不仅能让你在工具报错时知道问题出在哪更能让你评估恢复的成功率和时间成本。2.1 MiFare Classic的安全机制与软肋MiFare ClassicM1卡使用的是CRYPTO1流密码算法。每个扇区1K卡有16个扇区4K卡有32个有两组密钥Key A和Key B。读写器必须使用正确的密钥与卡片完成三次握手认证3-Pass Authentication才能访问该扇区。它的核心软肋在于其随机数生成器PRNG并非完全随机。在认证过程中卡片会发送一个随机数NT。研究发现这个随机数的某些位特别是低位存在一定的可预测性或者说其随机性不足。这就为攻击或者说在我们的场景下为密钥恢复打开了一扇窗。MFCUK利用的正是这个弱点。它属于“嵌套认证攻击”Nested Authentication Attack或“离线暴力破解”的自动化实现。其核心思路可以概括为捕获一次成功的认证过程首先你需要有一个扇区是已知密钥的比如扇区0的默认密钥FFFFFFFFFFFF。利用这个已知密钥与卡片完成一次认证。在这个过程中工具会监听并捕获卡片发出的随机数NT、读写器发出的应答NR以及后续的加密数据流。分析并预测随机数基于捕获到的NT序列分析PRNG的状态从而能够相对准确地预测卡片在下一次认证时会发出的NT‘。利用预测进行离线破解当工具尝试用某个候选密钥去认证另一个未知密钥的扇区时因为我们已经“预测”了卡片即将发出的NT‘我们就可以在离线状态下不与卡片实际通信模拟整个认证过程用候选密钥去加密我们预测的NT‘生成一个预期的应答。然后工具将这个预期的应答发送给卡片。如果卡片接受了认证通过那就证明我们用的候选密钥是正确的如果拒绝就换下一个密钥尝试。迭代与递归恢复出一个扇区的密钥通常是Key A后这个扇区就变成了新的“已知密钥扇区”。工具可以以此为跳板去尝试恢复与之相邻或关联的其他扇区的密钥像爬藤一样逐步攻克整张卡。注意MFCUK主要针对Key A进行恢复。因为很多系统的访问控制位ACL配置使得知道了Key A就能读取甚至修改ACL从而可能推导出或绕过对Key B的需求。而且很多实际部署中Key A就是默认密钥或者简单密钥。2.2 MFCUK工具链的组成与协作MFCUK通常不是单打独斗的。它需要一个能与之配合的读卡器硬件和底层驱动库。最常见的组合是硬件基于NXP PN532芯片的读卡器如ACR122U, Proxmark3 Easy等或直接使用Proxmark3 RDV4。PN532因其开源、廉价和广泛支持而成为首选。驱动/库libnfc。这是一个跨平台的近场通信库为多种读卡器包括PN532提供了统一的API。MFCUK通过调用libnfc的函数来控制读卡器与卡片通信。工具本身mfcuk。这是执行核心恢复算法的命令行程序。所以你的工作流将是libnfc驱动读卡器 -mfcuk调用libnfc发送指令、接收数据 -mfcuk在本地进行密码学计算 - 循环往复。3. 实战环境搭建与前期准备工欲善其事必先利其器。一个稳定、配置正确的环境是成功的一半。这里我以最常用的Linux系统Ubuntu 22.04和PN532 USB读卡器为例。3.1 硬件与驱动安装首先将你的PN532读卡器插入电脑USB口。在终端输入lsusb你应该能看到类似072f:2200ACS ACR122U或054c:06c3SONY RC-S380的设备。安装libnfc# 更新软件包列表 sudo apt update # 安装编译依赖 sudo apt install build-essential libusb-dev libpcsclite-dev # 下载libnfc源码建议使用官方仓库 git clone https://github.com/nfc-tools/libnfc.git cd libnfc # 配置、编译并安装。这里使用udev规则以便普通用户也能访问设备。 autoreconf -vis ./configure --prefix/usr --sysconfdir/etc make sudo make install # 安装udev规则避免每次都需要sudo sudo cp contrib/udev/90-libnfc.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger拔插一下读卡器现在你应该可以直接在用户态下访问它了。测试一下nfc-list如果看到你的读卡器信息如pn532_uart:/dev/ttyUSB0说明libnfc安装成功。安装MFCUK# 下载MFCUK源码 git clone https://github.com/nfc-tools/mfcuk.git cd mfcuk # 编译安装。注意mfcuk依赖于libnfc的头文件和库。 autoreconf -vis ./configure make sudo make install安装完成后可以输入mfcuk -h查看帮助信息确认安装成功。3.2 目标卡片的初步侦察在开始恢复之前你必须像侦察兵一样先摸清“敌情”。直接把卡扔给MFCUK是不明智的。我们需要先用libnfc自带的工具nfc-mfclassic进行一轮快速扫描。识别卡片类型将卡片放在读卡器上执行nfc-list确认能识别为MIFARE Classic。尝试默认密钥扫描这是最关键的一步。很多卡片的生产商、系统集成商会偷懒使用默认密钥。# 假设读卡器是第一个设备将卡片数据读取到dump.mfd文件使用常见的默认密钥字典 nfc-mfclassic r a dump.mfd这个命令会用内置的一组默认密钥如FFFFFFFFFFFF A0A1A2A3A4A5, D3F7D3F7D3F7等尝试读取所有扇区。如果这个命令能成功读出大部分或全部扇区那么恭喜你你的工作已经完成了99%根本不需要动用MFCUK。请务必先执行这一步分析dump文件如果上一步只读出了部分扇区比如只有扇区0用十六进制编辑器如hexdump -C dump.mfd查看dump.mfd。一个MiFare Classic 1K的dump文件是1024字节。扇区0的前16字节是厂商信息不可更改。每个扇区最后16字节是访问条件Access Bits和密钥Key A, Key B。通过分析已读出的扇区你可以知道哪些扇区的密钥是已知的这将是MFCUK的起点以及访问条件是如何设置的。实操心得我遇到过很多情况客户信誓旦旦说密钥全改了结果用默认密钥一读全卡畅通无阻。永远从最简单的方法开始尝试这是效率最高的原则。另外在执行nfc-mfclassic时如果读卡器频繁报错或掉线可能是信号问题。试着将卡片用胶带固定在读卡器天线的最佳位置通常需要自己摸索一下这能极大提高后续MFCUK运行的稳定性。4. MFCUK核心参数详解与恢复策略制定当你确认卡片确实有未知密钥且默认密钥扫描无效后就可以请出MFCUK了。直接运行mfcuk会看到一大堆参数别慌我们只关注最核心的几个。4.1 关键运行参数深度解析mfcuk -C -v 3 -k 已知密钥 -s 起始扇区 -S 结束扇区-C这是最重要的标志之一代表“恢复密钥”Recover key。没有这个参数程序不会进入恢复模式。-v 3设置详细级别为3。我强烈建议始终使用-v 3。级别1和2输出的信息太少当程序卡住或报错时你根本不知道发生了什么。级别3会打印出每个候选密钥的尝试、PRNG状态预测、认证交互的详细数据流是调试和理解的唯一途径。-k FFFFFFFFFFFF指定一个已知的、可用的密钥。这就是我们攻击的“桥头堡”。通常扇区0的Key A有很大概率是默认的FFFFFFFFFFFF。如果扇区0不是你就必须用nfc-mfclassic扫描的结果指定一个你确认已知的密钥。这个密钥必须能成功对该扇区进行认证。-s 0 -S 15指定要恢复密钥的扇区范围。对于1K卡是0到15对于4K卡是0到31。通常我们从一个已知扇区开始逐个扇区向外恢复。比如已知扇区0的密钥那么可以先尝试恢复扇区1 (-s 1 -S 1)。其他重要参数-D深度搜索模式。当普通模式失败时比如PRNG预测不准确可以尝试此模式。它会尝试更多的PRNG状态但速度会慢很多。-m指定已知密钥对应的扇区号。如果你已知的密钥不是扇区0的比如是扇区5的Key A那么你需要-k key_of_sector5 -m 5。-p指定读卡器端口。如果你的系统有多个NFC设备需要用这个参数指定例如-p pn532_uart:/dev/ttyUSB0。4.2 制定你的恢复策略盲目运行mfcuk -C -v 3去扫全卡是非常低效的。你需要一个策略单点突破首先集中火力攻击与已知密钥扇区物理位置相邻的扇区。因为某些卡片初始化工具或系统可能会按顺序使用相同或相似的密钥。命令示例mfcuk -C -v 3 -k FFFFFFFFFFFF -s 1 -S 1由易到难如果相邻扇区久攻不下可以尝试跳跃到其他扇区试试。有时中间某个扇区的密钥反而更简单比如全是0或1。你可以写一个简单的脚本轮流尝试不同的扇区作为目标。利用访问条件如果你通过已知扇区读出了其他扇区的访问条件Access Bits有时可以推断出密钥的类型。例如如果某个扇区的访问条件被设置为“Key A可读Key B不可读”且你知道该扇区数据可读那么当前认证用的很可能就是Key A。这能帮你明确恢复目标。耐心与监控MFCUK的运行可能会持续几分钟到几小时不等取决于密钥的复杂度和运气。将输出重定向到日志文件是个好习惯mfcuk -C -v 3 -k FFFFFFFFFFFF -s 1 -S 1 21 | tee recovery_sector1.log。这样你可以随时tail -f查看进度即使终端断开连接记录也在。5. 完整实战流程与现场记录假设我们有一张1K卡已知扇区0的Key A为FFFFFFFFFFFF我们要恢复扇区1的Key A。步骤1发起恢复攻击mfcuk -C -v 3 -k FFFFFFFFFFFF -s 1 -S 1 -p pn532_uart:/dev/ttyUSB0步骤2解读实时输出关键程序开始运行后你会看到瀑布般的输出。你需要会看关键信息[] Using reader: pn532_uart:/dev/ttyUSB0 [] Found Mifare Classic 1k card [] UID: XX XX XX XX [] Using known key: FFFFFFFFFFFF for sector 00 [] Starting recovery for sector 01... [] Running PRNG attack to recover key... [.] Trying key: 000000000000 [.] Trying key: 000000000001 ... [] Potential key found: A0B1C2D3E4F5 [!] Verifying key A0B1C2D3E4F5 for sector 01... [] Key A0B1C2D3E4F5 verified successfully for sector 01! [] Recovered key for sector 01: A0B1C2D3E4F5Trying key: ...这是MFCUK在遍历密钥空间。默认的密钥空间是0x000000000000到0xFFFFFFFFFFFF但工具会利用PRNG弱点大幅缩小搜索范围所以实际尝试的密钥数远少于2^48个。Potential key found: ...工具根据离线计算认为这个密钥有极大概率是正确的。但这还不是最终确认。Verifying key ...工具会用这个候选密钥实际与卡片进行一次在线认证。这是最终的、决定性的测试。Key ... verified successfully!恭喜密钥恢复成功。请立即将这个密钥记录下来。步骤3扩大战果恢复出扇区1的密钥假设为A0B1C2D3E4F5后现在你有两个桥头堡了扇区0和扇区1。你可以用扇区1的密钥去攻击扇区2mfcuk -C -v 3 -k A0B1C2D3E4F5 -m 1 -s 2 -S 2注意这里使用了-m 1来指明已知密钥A0B1C2D3E4F5是属于扇区1的。如此循环像多米诺骨牌一样逐个扇区恢复。步骤4整理与验证将所有恢复出的密钥整理到一个文本文件中例如keys.txt格式可以是Sector 00: Key A: FFFFFFFFFFFF Sector 01: Key A: A0B1C2D3E4F5 Sector 02: Key A: 112233445566 ...然后使用nfc-mfclassic和这个密钥文件尝试完整读取卡片进行最终验证nfc-mfclassic r a full_dump.mfd -f keys.txt如果能够完整读出1024字节且没有错误说明所有扇区的Key A均已正确恢复。6. 常见问题、错误排查与避坑指南MFCUK运行过程中绝不会一帆风顺。下面是我踩过无数坑后总结的“生存手册”。6.1 典型错误与解决方案错误现象可能原因解决方案[-] ERROR: Can’t select card或[-] No NFC device found.1. 读卡器未连接或驱动问题。2. 多个设备时未指定端口。3.libnfc配置冲突。1. 检查lsusb重新拔插。运行nfc-list测试。2. 使用-p参数明确指定设备路径。3. 检查/etc/nfc/libnfc.conf确保没有错误配置。[-] ERROR: Authentication failed with known key.指定的“已知密钥”错误或者该密钥无法认证指定扇区。1.双重检查你的已知密钥和扇区号。用nfc-mfclassic单独尝试用这个密钥读该扇区确认。2. 确认你使用的是Key A还是Key B。MFCUK主要恢复Key A确保你提供的已知密钥也是Key A。[.] Trying key: ...一直滚动几小时没结果。1. PRNG预测失败当前候选密钥空间内没有正确密钥。2. 目标扇区使用的根本不是Key A认证而是Key B。3. 卡片信号不稳定导致认证过程出错PRNG状态同步失败。1. 尝试-D深度搜索模式。2.检查访问条件。如果可能用已知扇区读出目标扇区的访问条件。如果ACL设置成只用Key B认证MFCUK针对Key A将永远无法成功。你需要寻找其他工具或方法针对Key B。3.这是最常见的原因固定好卡片和读卡器确保它们在整个过程中相对位置绝对静止。用胶带粘牢。尝试降低读卡器功率如果驱动支持。[] Potential key found: ...但验证失败[-] Verification failed.1. PRNG状态预测出现偏差找到了一个错误的“潜在密钥”。2. 在验证阶段发生了通信错误。1. 这是正常现象尤其是信号不佳时。MFCUK会继续尝试。确保硬件连接稳定。2. 忽略这次失败让程序继续运行。如果连续多次出现考虑重启程序或重新放置卡片。恢复出的密钥能认证但读出的数据是乱码或全0。可能恢复了Key B而不是Key A。Key B有时被用作数据加密密钥而访问控制位可能禁止用Key B读取数据。用恢复出的这个密钥尝试写入一个块先备份原数据。如果能写入那很可能就是Key B。你需要继续寻找Key A。6.2 高级技巧与心得“已知密钥”的选择艺术不一定非要用扇区0。如果扇区0的密钥被改了但其他某个扇区比如存放余额的扇区为了方便系统充值可能还留着默认密钥或简单密钥。用nfc-mfclassic的字典扫描找出任何一个可读扇区它就能作为你的起点。并行攻击如果你有多个读卡器可以对不同扇区同时发起恢复攻击速度倍增。只需要用-p参数指定不同的设备端口并在不同终端运行多个mfcuk进程。字典辅助MFCUK本质是暴力穷举但你可以引导它。如果你对目标系统的密钥命名规则有了解比如公司缩写日期可以自己生成一个字典文件然后通过修改MFCUK源码或结合其他脚本优先尝试字典中的密钥。这属于高级用法需要一定的编程能力。耐心是最强的工具恢复一张全加密的卡可能需要数小时甚至更久。把它放在后台运行去忙别的。确保电脑不会休眠断网。使用screen或tmux会话运行防止终端断开导致进程终止。伦理与法律的底线再强调所有这些技术只应用于你拥有合法所有权或已获得明确书面授权的资产上。对任何未经授权的卡片进行操作都是违法行为。这项技术的正确用途是安全审计、恢复自家门禁系统丢失的密钥、学习研究RFID安全机制。7. 密钥恢复之后数据解析与安全加固成功恢复出所有密钥并导出完整dump文件full_dump.mfd后工作只完成了一半。如何解读这些数据以及如何为你自己的系统设置更安全的密钥才是最终目标。7.1 MiFare Classic Dump文件结构解析使用十六进制编辑器打开1K的dump文件你会看到1024字节的数据。其结构是块0 (0x00-0x0F)扇区0块0。前4字节是卡片的UID接着是1字节的BCCUID校验然后是6字节的SAK/ATQA等厂商数据最后6字节是厂商预留数据。这个块在绝大多数情况下是不可写的。每个扇区包含4个块16字节/块块0 块1 块2数据块。可以用来存储任意信息金额、编号、权限等。块3扇区尾块Trailer。这是最关键的安全控制块。字节 0-5:Key A(通常不可读显示为00或已加密值)字节 6-8:访问条件 (Access Bits)字节 9-14:Key B(可被配置为不可读)字节 15: 通常为保留字节访问条件Access Bits决定了Key A和Key B的权限读、写、增减值、传输以及用哪个密钥进行认证。你必须使用像“MiFare Classic Access Bits Calculator”这样的工具来解码这些字节才能理解当前的安全设置。错误的修改会导致扇区被永久锁死7.2 为你的卡片设置强密钥与合理权限如果你是在管理自己的系统恢复密钥后强烈建议重新初始化卡片使用强密钥。生成强密钥绝对不要使用默认密钥或简单序列。使用密码学安全的随机数生成器生成12个十六进制数如A3 4F 19 8C D2 7E。确保每个扇区的Key A和Key B都不同。理解并配置访问条件这是安全的核心。遵循“最小权限原则”。典型安全配置Key A作为“管理密钥”知道的人越少越好权限设置为可修改访问条件和Key B。Key B作为“日常操作密钥”用于读写数据块。这样即使Key B泄露攻击者也无法修改安全设置。禁用传输密钥在访问条件中可以设置禁用从块3读取Key A和Key B。这样即使拥有该扇区的读写权限也无法直接读出密钥。使用工具安全写卡使用nfc-mfclassic的写卡功能时务必先备份原卡数据命令格式类似nfc-mfclassic w a new_dump.mfd old_dump.mfd。new_dump.mfd是你准备好的、包含新密钥和数据的镜像文件。操作前务必在空白卡或测试卡上验证你的dump文件和新密钥是否工作正常避免锁死重要卡片。整个过程从环境搭建、原理理解、实战操作到问题排查是一次完整的逆向工程和安全加固实践。它教会你的不仅仅是如何使用MFCUK这个工具更是如何系统地思考一个RFID系统的安全性弱点在哪、如何利用、如何防御。记住强大的工具永远伴随着重大的责任将这些知识用于建设而非破坏才是技术人真正的价值所在。
返回列表