Proxmark3实战:破解MIFARE Classic卡安全漏洞与密钥恢复

📅 2026/7/5 23:30:46
Proxmark3实战:破解MIFARE Classic卡安全漏洞与密钥恢复
1. 项目概述为什么MIFARE Classic卡能被破解如果你接触过门禁卡、公交卡或者一些早期的会员卡那么你大概率已经和MIFARE Classic卡打过交道了。作为非接触式智能卡领域的“上古神兽”它凭借其低成本和高可靠性在过去二十多年里被广泛应用于全球各地。然而在安全领域它同样是一个经典的“反面教材”。今天我们不聊枯燥的学术论文就从我手边这台Proxmark3 RDV4设备开始带你完整走一遍从硬件连接到最终恢复出卡片密钥的全过程。这不仅仅是一次“破解”演示更是一次深入理解射频卡安全机制的绝佳实践。无论你是物联网安全研究员、硬件爱好者还是仅仅对身边这张小卡片的工作原理感到好奇这篇实战指南都将为你提供可直接复现的操作步骤和背后的原理思考。核心要解决的问题很明确一张常见的MIFARE Classic卡通常简称M1卡我们如何在不已知任何密钥的情况下读取甚至修改其扇区中的数据答案就藏在Proxmark3这个工具和M1卡脆弱的加密算法Crypto-1里。通过这次实战你会清晰地看到一个广泛部署的技术如果其安全设计存在根本性缺陷将会带来怎样的现实风险。2. 核心原理与工具准备理解战场与装备在开始动手之前我们必须先搞清楚两件事我们要攻击的对象MIFARE Classic究竟弱在哪里以及我们手中的武器Proxmark3为何能胜任这项工作。跳过原理直接操作就像不看地图就闯迷宫即使成功了也只是一知半解。2.1 MIFARE Classic卡的安全软肋MIFARE Classic卡的核心是Philips后并入NXP的MIFARE Classic芯片。它使用一种称为Crypto-1的专有流密码算法进行认证和数据加密。正是这个算法成为了它阿喀琉斯之踵。Crypto-1算法的根本问题算法保密导致安全性误判NXP最初并未公开Crypto-1的细节寄希望于“安全通过 obscurity”隐匿即安全。然而历史反复证明不公开的算法更容易被逆向工程和攻破。安全社区最终通过芯片逆向工程完整还原了该算法。密钥长度与随机数缺陷Crypto-1使用48位密钥。在今天看来这个长度已经不足以抵抗暴力破解。更致命的是卡片在认证过程中生成的随机数Nonce并非真随机存在严重的伪随机性这为多种攻击如嵌套认证攻击打开了大门。认证协议漏洞卡片与读卡器之间的三次握手认证协议在特定条件下会泄露关于密钥状态的比特信息。通过收集足够多的这种“比特信息”可以大大降低密钥搜索的难度。基于这些弱点安全研究人员开发出了几种高效的攻击方法其中最适合我们本次实战的就是“嵌套认证攻击”Nested Authentication Attack。简单来说这种攻击利用一个已知密钥的扇区作为“跳板”去探测相邻未知密钥扇区在认证过程中泄露的信息从而逐步恢复出所有密钥。2.2 武器库Proxmark3 RDV4平台详解Proxmark3是一个开源的硬件工具专为研究13.56 MHz频段的RFID/NFC系统安全而设计。你可以把它理解为一个“万能射频卡读写器嗅探器信号分析仪”。我们使用RDV4版本因为它集成了更强的FPGA、更快的ARM处理器和更好的天线设计性能远超早期版本。为什么是Proxmark3而不是手机APP或简易读卡器市面上有很多手机APP或USB读卡器可以读取M1卡的UID甚至某些数据但它们通常只能与已知密钥的卡片交互。Proxmark3的强大之处在于它的“离线”攻击能力和灵活性硬件模拟它可以完全模拟一张卡片或一个读卡器直接与目标设备交互。低频/高频嗅探可以捕获卡片与读卡器之间的原始无线通信数据这是分析协议和发起攻击的基础。执行复杂攻击内置的hf mf命令集直接集成了如嵌套攻击、硬嵌套攻击、darkside攻击等算法一键化完成密钥恢复。社区支持拥有极其活跃的开源社区Iceman分支固件和客户端软件持续更新支持最新的攻击技术。你的实战装备清单Proxmark3 RDV4设备一台。一张或多张MIFARE Classic卡S50或S70即1K或4K容量。可以从旧门禁卡、废弃的会员卡中获取。一台电脑Windows, Linux, macOS均可。本文以Windows客户端为例其他系统原理相通。Proxmark3客户端软件。推荐使用 Iceman分支的客户端 它功能最全更新最及时。必要的连接线USB Type-C线。重要提示法律与道德边界本文所有技术讨论及实践仅限用于您拥有完全所有权的卡片如您个人的测试卡、已废弃的卡或已获得明确书面授权的安全评估场景。未经授权对他人的卡片、门禁、支付系统进行任何形式的探测、读取或写入不仅是非法的更是违背安全伦理的。技术本身无罪但使用技术的人必须为其行为负责。3. 环境搭建与基础操作让Proxmark3跑起来拿到设备后第一步是建立通信。这个过程可能会遇到一些驱动问题是新手的第一道坎。3.1 固件刷写与客户端连接新设备或长时间未用的设备第一步是刷写最新固件。Iceman分支的客户端已包含了刷写工具。下载与解压从Iceman的GitHub Release页面下载对应操作系统的最新版本压缩包解压到一个纯英文路径的文件夹例如D:\Proxmark3。进入Bootloader模式断开Proxmark3电源。按住设备侧面的按钮不放同时插入USB线连接到电脑。待设备上的LED灯开始跑马交替闪烁时松开按钮。此时设备已进入Bootloader模式等待刷机。刷写固件Windows运行解压文件夹中的proxmark3.bat。在出现的命令行窗口中输入hw version检查连接。如果正常输入make flash-all开始自动刷写。这个过程需要几分钟期间不要断开USB。Linux/macOS在终端中进入客户端目录运行./pm3启动客户端。同样使用hw version和make flash-all命令。正常启动与连接刷写完成后拔插一次USB线让设备以正常模式启动。再次运行客户端Windows下双击proxmark3.bat你应该能看到Proxmark3的命令行提示符proxmark3。输入hw version确认设备信息正确显示。实操心得驱动问题的解决在Windows上如果设备无法识别或端口异常最常见的原因是驱动未正确安装。你可以尝试使用Zadig工具随客户端附带或需单独下载为Proxmark3安装WinUSB或libusb驱动。具体操作是用Zadig打开设备选择Proxmark3将驱动替换为WinUSB或libusb-win32然后点击“Replace Driver”。这个过程可能需要关闭所有可能占用设备的软件如客户端。3.2 基础命令与卡片识别连接成功后我们先熟悉几个最基础的高频HF命令并确认目标卡片类型。搜索卡片将一张MIFARE Classic卡放在Proxmark3的天线区域通常位于设备顶部。在客户端输入hf search这个命令会发送多种调制信号去探测卡片。对于M1卡你会看到类似下面的输出UID: 01 23 45 67 ATQA: 00 04 SAK: 08 [2] Possible types: - MIFARE Classic 1K - MIFARE Plus (2K) SL1这里UID是卡片的唯一标识ATQA和SAK是卡片的应答参数用于判断类型。SAK为08通常指MIFARE Classic 1K。读取卡片基础信息更直接的方式是使用hf 14a reader这个命令模拟一个读卡器去读取卡片信息输出会更详细包括UID、ATQA、SAK以及卡片的容量信息。识别卡片类型通过以上命令我们已经可以确定这是一张MIFARE Classic卡。但为了后续攻击我们还需要确认其具体类型1K或4K。1K卡有16个扇区每个扇区4个块4K卡有40个扇区前32个扇区类似1K后8个扇区每个有16个块。可以使用hf mf info命令尝试读取如果某个扇区有已知密钥或者根据经验常见的门禁卡多为1K。4. 实战攻击流程从嗅探到密钥恢复现在进入核心环节。我们的目标是恢复出卡片所有扇区的密钥。我们将采用最通用、成功率最高的“嵌套认证攻击”。4.1 第一步寻找一个已知密钥的扇区或默认密钥嵌套攻击需要一个起点至少一个扇区的密钥Key A或Key B是已知的。幸运的是很多MIFARE Classic卡在出厂或初始部署时部分扇区可能仍在使用默认密钥。常见的默认密钥有FFFFFFFFFFFF全F密钥最常见A0A1A2A3A4A5D3F7D3F7D3F7000000000000我们可以先用这些默认密钥尝试读取卡片信息。尝试用默认密钥读取在客户端输入hf mf chk *1 ? t这个命令会尝试用内置的默认密钥字典*1代表字典1去测试所有扇区的Key A。?表示测试未知密钥t表示使用嵌套攻击所需的“测试”模式。执行后观察输出。如果运气好你会看到类似这样的成功信息Chk key[ff ff ff ff ff ff] ... Found valid key:[ff ff ff ff ff ff] ... Sec:0 Key A:ffffffffffff这表示第0扇区的Key A是默认密钥FFFFFFFFFFFF。我们找到了突破口如果没有默认密钥怎么办情况一你知道某个扇区的密钥。比如你有一张你自己知道密码的卡或者通过其他途径如系统文档获取了一个密钥。你可以手动指定这个密钥作为起点。情况二完全未知。如果所有默认密钥都失败且没有任何已知密钥那么标准的嵌套攻击将无法直接启动。此时可能需要尝试其他攻击如“硬嵌套攻击”hf mf hardnested它能在已知密钥极少甚至没有的情况下工作但速度较慢或者尝试“Darkside攻击”针对特定版本的卡片。这超出了本文基础实战的范围但Proxmark3同样支持。4.2 第二步执行嵌套认证攻击Nested Attack假设我们通过上一步发现扇区0的Key A是默认密钥FFFFFFFFFFFF。现在我们将利用这个已知扇区作为“桥头堡”去攻击其他扇区。准备已知密钥文件首先我们需要创建一个文本文件告诉Proxmark3我们已知的密钥。在客户端同级目录下创建一个名为key.txt的文件内容如下FFFFFFFFFFFF这表示我们已知一个密钥。如果有多个每行写一个。执行嵌套攻击在Proxmark3客户端中输入以下命令hf mf nested 0 A FFFFFFFFFFFF d key.txt0: 我们已知密钥的扇区号这里是扇区0。A: 已知的是Key A如果是Key B则改为B。FFFFFFFFFFFF: 已知的密钥值。d: 将恢复出的密钥保存到字典文件。key.txt: 指定的字典文件输出文件。这个命令的大致原理是Proxmark3会模拟一个读卡器先用已知密钥FFFFFFFFFFFF去认证扇区0。在认证过程中它会“诱使”卡片与它进行通信并在这个过程中利用协议漏洞去尝试认证目标扇区其他扇区。通过收集多次认证交互中泄露的比特信息最终通过算法计算出目标扇区的密钥。观察攻击过程命令执行后你会看到滚动的日志。它会显示正在测试的扇区和密钥类型A/B以及进度。整个过程可能需要几十秒到几分钟取决于卡片的类型和需要破解的扇区数量。Testing known keys. Sector count16 Using sector 00 as nest sector ... Found key: [a0 a1 b2 c3 d4 e5] ...当攻击成功时它会显示“Found key”以及恢复出的密钥。所有恢复出的密钥会自动追加到我们指定的key.txt文件中。4.3 第三步验证与读取卡片数据攻击完成后key.txt文件中应该包含了所有被成功恢复密钥的扇区及其密钥。用恢复的密钥读取整个卡片现在我们可以用这个“装满”密钥的字典文件来读取整张卡的数据。hf mf rdsc -k key.txtrdsc命令表示读取扇区。-k key.txt指定使用我们刚生成的密钥文件。执行后Proxmark3会尝试用文件中的所有密钥去读取每个扇区的每一个块并将数据以十六进制和ASCII码的形式显示出来。解读数据MIFARE Classic卡的数据存储结构是固定的。每个扇区Sector有4个块Block每个块16字节。块0-2通常是数据块Data Blocks用于存储实际信息如金额、次数、用户ID等。块3是扇区尾块Sector Trailer存储着两个密钥Key A和Key B各6字节以及访问控制位Access Bits4字节。访问控制位决定了该扇区内每个块的读写权限需要哪个密钥以及允许什么操作这是非常关键的信息。读取出的数据中你需要重点关注扇区尾块通常是块3、7、11等。例如一个扇区尾块可能显示为[Sector 0] Block 3: A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5前6字节A0 A1 A2 A3 A4 A5是Key A有时会被隐藏显示为FF FF FF FF FF FF但实际已恢复。中间4字节FF 07 80 69是访问控制位。最后6字节B0 B1 B2 B3 B4 B5是Key B。分析访问控制位访问控制位定义了该扇区的安全状态。你需要使用hf mf chk命令或客户端内置的工具来解析它以了解每个数据块是可读、可写还是需要特定密钥。错误的访问控制位设置例如将Key B设置为全0且可读本身就是一种常见的安全隐患。5. 深度解析与高级技巧不止于破解成功恢复密钥并读取数据只是开始。作为一个安全研究者或爱好者我们需要理解更深层次的东西。5.1 访问控制位Access Bits的奥秘与风险访问控制位是MIFARE Classic卡安全模型的核心但也是最容易被错误配置的部分。它由4个字节C1, C2, C3, Cx组成但实际上有效位是9个每个块3位。它们决定了每个数据块块0-2和扇区尾块本身块3的权限。常见的错误配置也是安全漏洞Key B可读在出厂默认或某些粗心的配置中Key B被直接存储在扇区尾块中并且访问控制位允许用Key A读取块3。这意味着一旦攻击者获得Key AKey B也就直接暴露了。在我们的攻击中如果发现Key B是可见的一定要记录下来。传输配置Transport Configuration这是一种特殊的访问控制位设置通常为FF 07 80允许在知道Key A的情况下用Key A去修改Key A、Key B和访问控制位本身。如果一张卡在交付后仍保持此配置攻击者可以用已知的Key A如默认密钥完全接管该扇区。权限混乱例如将数据块设置为“读/写需要Key A读/减/加需要Key B”这种复杂配置在实际系统开发中很容易被误解和错误实现导致权限绕过。如何检查在Proxmark3中使用hf mf fchk或hf mf info命令在成功认证后可以显示解析后的访问控制位信息。你应该养成习惯在读取数据后仔细审查每个扇区的权限设置。5.2 嗅探通信与重放攻击初探Proxmark3不仅是攻击者也是一个优秀的“窃听者”。我们可以用它来嗅探合法读卡器与卡片之间的通信。设置嗅探模式hf 14a sniff将Proxmark3天线靠近正在通信的读卡器和卡片它会开始捕获空中传输的原始数据帧。分析嗅探数据捕获到的数据可能包含认证请求、随机数交换、加密数据通信等。通过分析这些数据可以学习协议交互理解特定读卡系统的认证流程。寻找重放攻击机会如果某个加密命令如“扣款1元”是固定的且系统没有有效的防重放机制那么捕获该命令并重新发送重放就可能欺骗系统。Proxmark3可以很容易地重放捕获到的数据帧hf 14a sim或hf 14a raw命令。辅助密钥恢复在某些攻击变种中嗅探到的认证过程数据可以作为离线破解的输入。注意事项嗅探的环境挑战13.56MHz的磁场强度随距离衰减很快。要想成功嗅探需要将Proxmark3的天线非常靠近通常1-2厘米内通信双方。过远的距离会导致信号太弱而无法解码。使用RDV4自带的高灵敏度天线会有所改善。5.3 模拟与克隆从读取到复制在恢复密钥并了解数据结构后你可能会想“我能不能复制一张卡”答案是视情况而定。UID可改写卡 vs. UID不可改写卡普通MIFARE Classic卡其UID是出厂固化、不可更改的。你无法用另一张UID不同的卡去完全克隆它因为很多系统特别是门禁会校验UID。UID可改写卡Magic Card或Gen2卡这是一种特殊卡片其UID可以通过特定指令修改。Proxmark3可以识别和写入这类卡片。克隆到UID可改写卡首先用hf search或hf 14a reader确认你的空白卡是UID可改写的通常显示为“MIFARE Classic 1K (gen2)”或类似。使用hf mf restore命令配合之前导出的密钥文件和数据dump文件可以将源卡的所有数据包括UID如果目标卡支持写入到新卡中。# 首先将源卡数据dump到文件 hf mf dump -k key.txt -o source_card.dump # 然后将dump文件写入到目标卡目标卡需放置在天线上 hf mf restore -k key.txt -s source_card.dump写入后使用hf mf rdsc读取新卡验证数据是否一致。重要限制即使克隆了UID和数据如果后端系统如服务器除了校验卡片数据外还记录了其他绑定信息如卡号与持卡人绑定那么单纯的物理克隆仍然是无效的。克隆主要针对的是离线验证系统。6. 常见问题、故障排查与实战心得在实际操作中你几乎一定会遇到各种问题。下面是我在无数次实践中总结出的“避坑指南”。6.1 攻击失败原因分析与解决问题现象可能原因排查与解决思路hf search找不到卡1. 卡片不是13.56MHz可能是125kHz ID卡。2. 卡片损坏。3. Proxmark3天线未连接好或损坏。4. 卡片放置位置不佳。1. 确认卡片类型MIFARE Classic是13.56MHz。2. 换一张卡测试。3. 检查天线连接器是否拧紧。4. 将卡片放在天线中心区域缓慢移动。嵌套攻击长时间无结果1. 已知密钥错误或无效。2. 卡片防御机制触发如防拆焊。3. 信号质量差。4. 目标扇区使用了非标准密钥算法极少见。1. 用hf mf chk确认已知密钥能正确读取该扇区数据。2. 将卡片移开再放回等待几秒重试。某些卡在连续错误认证后会暂时锁定。3. 确保环境无强射频干扰卡片与天线贴合良好。4. 尝试hf mf hardnested命令它更强大但更慢。恢复出的密钥无法读取数据1. 访问控制位禁止读取。2. 恢复出的是Key A但读取需要Key B或反之。3. 数据块本身是空的或已格式化。1. 使用hf mf fchk或hf mf info分析访问控制位确认读取权限。2. 尝试用恢复出的另一个密钥A或B读取。3. 这是正常情况并非密钥错误。hf mf rdsc读取部分扇区失败1. 密钥文件key.txt中缺少该扇区的密钥。2. 该扇区的访问控制位设置了永远不可读。1. 检查key.txt文件确保包含了所有扇区的至少一个密钥。可以手动添加或重新运行攻击。2. 如果访问控制位被设置为“000”或“001”等禁止读的组合则任何密钥都无法读取数据块这是设计如此。客户端连接断开或命令无响应1. USB线接触不良或供电不足。2. 客户端软件崩溃。3. 固件不匹配。1. 换一根高质量的USB数据线直接连接电脑主板后置USB口。2. 关闭客户端重新插拔设备再启动。3. 重新刷写与客户端版本匹配的最新固件。6.2 性能优化与操作技巧使用高效的密钥字典在运行hf mf nested前可以编辑一个更精准的字典文件。除了默认密钥可以加入目标系统可能使用的其他常见密钥如门禁系统常用的固定密码、生日等。字典越小、越精准前期尝试的速度越快。硬嵌套攻击Hardnested的适用场景当卡片没有一个扇区使用默认密钥且你没有任何已知密钥时hf mf hardnested是你的首选。它利用了密码算法的数学弱点即使在没有已知密钥的情况下也能通过收集大量认证错误信息来恢复密钥。它的缺点是速度慢可能需要数小时甚至更久。命令格式类似hf mf hardnested 0 A假设从扇区0的Key A开始猜测。保存与加载工作进度对于硬嵌套攻击或大型卡片攻击过程可以暂停和恢复。使用-s参数指定一个状态文件来保存进度。hf mf hardnested 0 A -s save_state.bin中断后再次运行相同命令状态文件已存在它会从中断处继续。天线摆放的艺术信号质量是关键。对于难以读取的卡片可以尝试将卡片用一点点双面胶固定在天线中心。移除卡片和天线附近的金属物体。对于内置在设备中的卡片如手机壳内的公交卡需要将Proxmark3天线紧贴设备背面相应位置。6.3 安全启示与延伸思考完成这次实战你应该对MIFARE Classic的安全性有了刻骨铭心的认识。它的脆弱性根植于设计阶段。对于我们今天的启示是“隐匿即安全”是伪命题Crypto-1的失败是这一原则的典型案例。真正的安全应该建立在公开、经得起检验的算法和协议之上如AES。密钥管理和访问控制至关重要很多M1卡被攻破直接原因是未修改默认密钥或访问控制位配置错误。在任何一个使用智能卡的系统里初始化后的第一件事就应该是更改默认密钥并正确配置权限。升级到更安全的方案如果你是系统的设计者或维护者正在使用MIFARE Classic应尽快制定迁移计划。NXP早已推出了更安全的替代品如MIFARE Plus兼容经典但支持AES加密和MIFARE DESFire基于DES/AES具有更完善的文件系统和安全机制。最后Proxmark3的能力远不止于此。它还能研究低频ID卡、EM410x系列、Hitag标签以及高频的NTAG、DESFire等更复杂的卡片。本次针对MIFARE Classic的实战是你进入射频安全世界的一把钥匙。理解了这个经典案例你再去看其他协议和攻击手法会发现很多原理是相通的。技术总是在攻防之间螺旋上升而理解攻击正是为了构建更坚固的防御。