1. 项目概述:从“读卡器”到“安全分析仪”的认知跃迁
如果你手头有一台Proxmark3,却还只停留在复制门禁卡、克隆低频ID卡的阶段,那无疑是“杀鸡用牛刀”,甚至可以说是暴殄天物。这台被圈内人戏称为“瑞士军刀”的射频安全工具,其真正的威力在于对现代高频、高安全性协议的深度交互与分析。今天要聊的,就是它的两大高级应用场景:EMV银行卡与FIDO安全密钥。这不仅仅是技术操作,更是一种思维模式的转变——从被动的数据读取,转向主动的协议交互与安全评估。
EMV(Europay, Mastercard, Visa)标准早已是全球银行卡支付的基石,其核心的芯片与PIN技术构成了我们日常金融交易的安全防线。而FIDO(Fast Identity Online)联盟推出的安全密钥(如YubiKey、Google Titan Key),则是无密码未来和强双因素认证的物理载体。分析它们,意味着你正在触碰当今数字身份与资产安全最核心的硬件实体。通过Proxmark3,我们可以非侵入式地与这些设备“对话”,理解其工作流程,验证其安全假设,甚至发现特定配置下的潜在风险(注意:所有操作必须在合法授权和合规的环境下进行,例如对自有设备的安全研究、渗透测试授权靶场)。
本指南旨在为已经熟悉Proxmark3基础操作的硬件爱好者、信息安全研究人员及嵌入式开发人员,提供一个深入高频13.56MHz RFID/NFC安全领域的路线图。你将不再仅仅是一个工具的使用者,而成为一个协议的解析者与安全机制的洞察者。
2. 核心思路与准备工作:构建专业分析环境
2.1 思维转变:从克隆到会话分析
使用Proxmark3进行低频卡克隆(如125kHz的EM4100)本质上是“数据搬运”,因为这类协议简单、无加密或加密脆弱,关键在获取卡号。但面对EMV和FIDO,我们必须建立“会话分析”思维。这些设备基于ISO/IEC 14443 Type A/B或ISO/IEC 7816标准,通信是复杂的、有状态的、需要遵循特定应用协议数据单元(APDU)命令的交互过程。
核心思路拆解:
- 建立物理连接:确保Proxmark3能够稳定地与目标卡片或密钥建立射频场并完成防碰撞、选卡等底层操作。
- 应用选择与初始化:像在电脑上打开一个软件一样,在智能卡上选择需要交互的特定应用(如银行卡的支付应用PSE/PPSE)。
- APDU命令流交互:发送一系列结构化的APDU命令(如读取数据、验证身份、执行操作),并解析设备的响应。这是分析的核心。
- 数据解析与逻辑推理:对返回的复杂TLV(Tag-Length-Value)格式数据进行解码,结合协议规范,理解设备的状态、安全策略和潜在逻辑漏洞。
2.2 硬件与固件准备
工欲善其事,必先利其器。针对高频应用,你的Proxmark3硬件和固件需要达到一定标准。
硬件检查清单:
- Proxmark3 RDV4或Iceman兼容版本:这是当前的主流选择,其天线调谐电路和高频部分(特别是RDV4)针对13.56MHz进行了优化,功率和灵敏度更适合与各类卡片稳定交互。老版本的Proxmark3 Easy可能在连续交互或功率要求高的场景下力不从心。
- 天线状态:确保高频天线(通常标有HF或13.56MHz)连接牢固,无物理损伤。可以通过
hw tune命令观察高频场强的反馈值,一个健康的读数(通常在30-80之间,因版本而异)是稳定通信的基础。 - 供电充足:在进行复杂的APDU交互,尤其是可能触发卡片内部加密运算时,需要稳定的电源。建议使用原装或质量可靠的USB线缆,并连接到电脑的USB 3.0端口或使用有源USB Hub,避免因电压跌落导致通信中断。
固件与客户端:强烈推荐使用iceman分支的固件和客户端。这个社区维护的分支不仅修复了大量官方固件的Bug,还持续集成最前沿的指令和脚本,对EMV和FIDO等高级应用的支持度最高。
升级/编译步骤简述:
- 获取源码:
git clone https://github.com/RfidResearchGroup/proxmark3.git - 进入目录并清理:
cd proxmark3 && make clean - 编译完整环境:
make all - 刷写固件:将Proxmark3连接至电脑,运行
make flash。RDV4用户可能需要先让设备进入bootloader模式(通常通过按住按钮上电)。 - 安装客户端:编译生成的
proxmark3可执行文件在client/目录下,可以将其路径加入系统环境变量,方便随时调用。
注意:固件编译过程可能需要安装特定的开发工具链(如arm-none-eabi-gcc)。在Linux和macOS上相对顺畅,在Windows上建议使用WSL2(Windows Subsystem for Linux)环境进行操作,这是最接近原生Linux的体验,能避免大量兼容性问题。
2.3 关键软件工具与知识储备
除了Proxmark3本身,以下工具和知识能极大提升你的分析效率:
emv命令套件:Iceman固件内置的强大工具集,输入hf emv可以看到一系列子命令,如search,gpo,readrec等,这是自动化执行EMV交易流程的利器。script命令:允许你运行预编写或自己录制的Lua脚本,实现复杂的自动化交互流程。对于研究FIDO等非标准或自定义协议至关重要。- APDU调试工具(辅助):如
pcsc_scan,opensc-tool,或者手机上的NFC读写工具。它们可以帮助你独立验证APDU命令的正确性,或作为与Proxmark3对比的参照。 - 协议文档:虽然EMV和FIDO规范是付费的,但其核心的ISO/IEC 7816-4(APDU结构)、ISO/IEC 14443(射频接口)以及FIDO的CTAP(Client to Authenticator Protocol)协议框架,可以在网上找到大量的公开资料、技术摘要和开源实现(如Google的OpenSK),这是你理解TLV数据含义的基础。
3. EMV银行卡深度分析实战
EMV交易是一个标准的“应用选择 -> 读取数据 -> 生成应用密文 -> 完成”流程。Proxmark3可以模拟一个非接触式读卡器,完整地走一遍这个流程,从而提取出卡片的静态数据并观察其动态响应。
3.1 基础信息读取与应用选择
首先,将银行卡放置在Proxmark3的高频天线上。
寻卡与识别:
hf 14a reader这个命令会让PM3模拟成一个读卡器,尝试与卡片通信。成功后会显示卡片的UID、ATQA、SAK等信息。SAK字节尤为重要,它能初步判断卡片是否支持ISO 14443-4(即后续的APDU通信)。如果SAK显示支持(例如
20),就可以进行下一步。列出支付系统环境(PSE/PPSE):
hf emv search这是EMV分析的入口命令。它会自动发送
SELECT PSE(接触式)或SELECT PPSE(非接触式)命令。成功的话,会返回一个或多个支付应用列表,包含应用标识符(AID),例如A0000000031010(Visa信用卡)。这个AID就是通往卡片上那个特定支付应用的“钥匙”。选择支付应用:
hf emv select -a A0000000031010使用上一步获取的AID来选择具体的支付应用。成功后,卡片会返回一个文件控制信息(FCI),其中包含大量TLV格式的数据,包括应用标签、优先级、发卡行标识等。
3.2 关键数据提取与解析
选择应用后,卡片处于就绪状态。接下来是读取卡片的公开数据记录。
获取处理选项(GPO):
hf emv gpo这个命令发送
GET PROCESSING OPTIONS指令。它的响应至关重要,会返回应用文件定位器(AFL)和认证相关数据。AFL指明了接下来需要读取哪些记录文件以及这些文件的位置。读取记录文件:
hf emv readrec -f <记录号>根据AFL指示的记录号,逐个读取。例如
hf emv readrec -f 1。这些记录里存放着卡片的“数据元”,也就是我们最关心的信息:- PAN(主账号):你的卡号。
- Cardholder Name(持卡人姓名):卡片上的姓名。
- Expiration Date(有效期):卡片的到期年月。
- Application Interchange Profile(AIP):指明卡片支持的功能,如是否支持电子现金、是否支持动态数据认证等。
- Application Usage Control(AUC):规定卡片的使用范围,如是否可用于国内、国际、取现等。
- 发卡行公钥证书、ICC公钥证书等(如果支持公钥加密):这些是进行脱机数据认证(SDA/DDA)的关键。
Proxmark3的
emv命令套件会自动解析这些TLV数据,并以相对可读的格式呈现。但深入分析时,你仍需对照EMV规范去理解每个Tag的含义。
实操心得:
- 不同银行的卡片,其AFL指示的记录数量和内容可能差异很大。有些卡片的持卡人姓名可能不在标准记录中,而是存放在发卡行自定义的文件里。
hf emv命令的输出信息非常丰富。建议使用-v(verbose)参数来获取更详细的原始APDU命令和响应,这对学习和调试极有帮助。例如hf emv search -v。- 读取到的PAN(卡号)通常是经过掩码处理的(例如,
12** **** **** 3456),这是卡片芯片的安全策略,旨在防止通过非授权读卡器轻易获取完整卡号。获取完整明文PAN通常需要成功的持卡人验证(PIN验证)。
3.3 深入:交易模拟与安全机制探究
对于安全研究人员,仅仅读取静态数据是不够的。Proxmark3可以进一步模拟交易环境,触发卡片更深层次的安全逻辑。
生成应用密文(GAC):这是EMV交易的核心步骤之一。读卡器会生成一个不可预测数(Unpredictable Number)和交易详情,发送给卡片,卡片结合内部密钥计算出一个应用密文(ARQC或TC)。
# 首先需要构造一个GAC命令的输入数据(通常包括PDOL指定的数据) # 这需要手动构造APDU,或使用更高级的脚本。 # 一个简化的思路是,先读取PDOL(处理选项数据对象列表),然后根据PDOL的要求构造数据。 hf emv gac -t arqc -u 12345678 -a 9F0206000000000100...(注:
-u后接不可预测数,-a后接根据PDOL构造的标签数据)。这个操作非常高级,需要精确理解交易流程和数据结构。成功执行后,卡片会返回一个ARQC(授权请求密文),这在真实交易中会被发送到银行后台进行联机授权。分析安全机制:
- SDA(静态数据认证):通过验证发卡行对静态数据的数字签名来确认卡片真伪。Proxmark3可以提取签名数据,但验证需要发卡行的公钥,这通常无法获得。
- DDA(动态数据认证):更安全,卡片在交易中动态生成签名。分析DDA流程可以理解卡片如何利用内部私钥和读卡器提供的挑战数进行运算。
- CDA(组合数据认证):SDA/DDA与ARQC生成的组合。模拟完整的CDA流程是评估卡片安全性的高阶操作。
重要警告:模拟GAC生成ARQC等操作,在真实卡片上可能会被记录为一次交易尝试,尽管未完成完整流程。绝对禁止对非本人所有且未获明确授权的银行卡进行此类操作,这不仅是非法的,也可能触发银行的风控系统。所有分析务必在完全隔离的测试环境或对自有废卡进行。
4. FIDO安全密钥交互与协议分析
FIDO安全密钥(如YubiKey)通常也工作在13.56MHz,使用NFC接口,但其内部协议与EMV完全不同。它遵循FIDO联盟的CTAP2协议。Proxmark3在这里的角色,是模拟一个“真实的客户端平台”(如手机、电脑),与密钥进行注册和认证交互。
4.1 建立连接与发现能力
与EMV先选择支付应用不同,FIDO U2F/WebAuthn通常使用一个特定的AID:A0000006472F0001或A0000006472F0001FFFFFFFFFFFFFFFF(用于U2F)。但更通用的方式是使用CTAP2的“初始化”流程。
基础连接测试:
hf 14a reader同样,先确认能与密钥建立基础的ISO 14443-3连接,获取其UID。
使用FIDO专用指令:Iceman固件可能包含一些实验性的FIDO指令,但更灵活的方式是使用
script功能和hf iclass或hf felica命令的RAW模式来发送自定义APDU。因为CTAP2的通信虽然基于ISO 7816-4,但有其专用的指令编码。- 首先,你需要知道FIDO密钥的指令集。例如,CTAP2的主命令
0x10(初始化)、0x11(后续帧)等。 - 你可以通过
hf 14a raw -s -c进入RAW发送模式,然后手动输入APDU。但这非常繁琐。
- 首先,你需要知道FIDO密钥的指令集。例如,CTAP2的主命令
4.2 利用脚本进行自动化交互
对于复杂的FIDO协议分析,编写或使用现有的Lua脚本是唯一高效的方法。
准备脚本环境:确保你的PM3客户端支持Lua(Iceman版本默认支持)。
编写/获取脚本:你可以从社区(如RfidResearchGroup的GitHub Wiki或论坛)寻找针对FIDO的示例脚本。一个基础的脚本框架可能如下:
-- 示例:发送FIDO CTAP2 初始化命令 (0x10) core.clearCommandBuffer() -- 构造APDU: CLA=0x00, INS=0x10 (CTAP2初始化), P1=0x00, P2=0x00, 数据为空 cmd = "00 10 00 00 00" core.console( "hf 14a raw -s -c -d " .. cmd ) -- 接收响应并解析实际的脚本要复杂得多,需要处理CTAP2的分帧机制(命令
0x11)、CBOR(Concise Binary Object Representation)数据的编解码、以及各种认证器命令(如authenticatorMakeCredential注册,authenticatorGetAssertion认证)。执行脚本:
script run <你的脚本文件名>.lua脚本会自动执行一系列APDU命令,并可以解析返回的复杂CBOR数据,提取出公钥、签名计数器、用户ID等信息。
核心分析点:
- 注册过程分析:模拟一个RP(依赖方,如网站)向密钥发起注册请求。观察密钥返回的
attestationObject(证明对象),里面包含了新生成的公钥、签名以及证明声明,可用于分析密钥的厂商、型号和安全芯片特性。 - 认证过程分析:模拟RP发起认证请求。观察密钥如何利用内部私钥对挑战(challenge)进行签名。通过分析签名算法(如ES256,EdDSA)和返回的签名数据,可以评估其密码学实现。
- Resident Key(常驻密钥)与用户验证:测试密钥是否支持将凭据常驻在设备内(无需服务器提供凭据ID),以及如何触发用户验证(如触摸按键、生物识别)。
4.3 安全测试与边界案例
在合法授权的研究中,可以探索一些边界情况:
- 无效命令或畸形数据:发送不符合CTAP2规范的APDU,观察密钥的错误处理机制,是否会出现崩溃、信息泄露或状态异常。
- 重放攻击测试:捕获一次成功的认证签名数据,尝试在另一次会话中重放,验证密钥或RP的防重放机制(通常依赖挑战数随机性)。
- 用户存在性验证测试:在要求用户验证(UV)的认证中,不执行验证操作(如不触摸),观察密钥是否拒绝签名。这测试了物理确认机制的可靠性。
注意事项:FIDO密钥的设计初衷是抵抗物理攻击。大多数商业密钥(如YubiKey)的安全元件会严格限制对关键操作的访问,并具备防侧信道、防故障注入等特性。通过Proxmark3进行的NFC交互,通常只能触及协议层面,难以直接提取内部私钥。我们的分析重点在于理解协议流程、验证实现正确性、发现逻辑层面的配置问题。
5. 常见问题、排查技巧与实战心得
在实际操作中,你会遇到各种各样的问题。下面是一些典型问题及其解决思路的实录。
5.1 通信不稳定或完全失败
- 现象:
hf 14a reader无法检测到卡片,或检测到但后续APDU命令超时、返回错误码6F00(未找到应用)等。 - 排查步骤:
- 检查硬件连接与供电:这是最常见的原因。重新插拔USB线,尝试不同的USB口,确保天线连接器紧固。运行
hw tune观察HF场强。 - 调整天线距离和位置:13.56MHz对距离和角度敏感。将卡片/密钥放在天线正中央,并轻微调整高度(通常1-3厘米内最佳)。
- 确认卡片/密钥类型:确保目标设备确实支持ISO 14443-A/B。有些银行卡或密钥可能只支持某种特定类型。可以尝试
hf search命令进行全频段扫描。 - 降低通信速率:默认可能是106kbps,有些老旧或特殊芯片可能支持更低的速率。尝试在命令中指定速率(如果客户端支持),但Proxmark3的
hf 14a命令通常自动协商。 - 检查固件版本:确保使用的是最新的Iceman固件,旧版本可能存在对某些卡片或特定APDU的兼容性问题。
- 检查硬件连接与供电:这是最常见的原因。重新插拔USB线,尝试不同的USB口,确保天线连接器紧固。运行
5.2 APDU命令执行错误
- 现象:能够选卡,但发送特定APDU后返回错误状态字(SW),如
6985(使用条件不满足)、6A86(参数P1/P2不正确)、6A82(未找到文件)。 - 排查思路:
- 解码状态字(SW1SW2):这是最重要的线索。
61XX表示成功并有XX字节数据待取;6CXX表示长度错误,Le应为XX;6982表示安全状态不满足(如需要PIN验证);6985表示需要持卡人验证(如需要插卡+输PIN的交易用了非接)。对照ISO 7816-4标准理解SW的含义。 - 验证命令结构:使用
-v参数查看Proxmark3实际发送的APDU字节。检查CLA、INS、P1、P2是否正确,Le(期望响应长度)和Data字段是否符合协议规范。一个常见的错误是Le值设置不对。 - 检查会话状态:智能卡是有状态机。你是否漏掉了某个必要的初始化或选择步骤?例如,在发送
READ RECORD命令前,是否成功执行了GET PROCESSING OPTIONS?回顾协议状态图。 - 参考已知正确的命令流:对于EMV,可以先用
hf emv的自动化命令执行一遍,用-v记录下成功的APDU序列。对于FIDO,查找开源实现(如OpenSK的PC端测试代码)中的命令序列作为参考。
- 解码状态字(SW1SW2):这是最重要的线索。
5.3 数据解析困难
- 现象:命令执行成功,返回了一长串十六进制数据,但看不懂含义。
- 解决工具与方法:
- TLV解析器:在线工具或本地脚本(如Python的
asn1crypto或pyemv库)可以帮助解析EMV的TLV结构。将十六进制数据粘贴进去,能分层级展示Tag和Value。 - CBOR解析器:对于FIDO返回的数据,需要使用CBOR解析器。在线的CBOR to JSON工具(如
cbor.me)非常方便。 - 结合规范:解析出的Tag(如
5A表示PAN)或CBOR Map Key,需要去EMV规范或FIDO CTAP2规范中查找其具体定义。这是一个学习过程,积累多了就能快速识别关键字段。 - 使用Proxmark3内置解析:
hf emv命令的输出已经做了大量解析工作。对于更原始的数据,可以尝试hf emv decode -h <十六进制数据>看是否能识别。
- TLV解析器:在线工具或本地脚本(如Python的
5.4 脚本编写与调试
- 心得:从简单的脚本开始,比如只是发送一个固定的APDU并打印响应。利用
core.console()函数执行PM3命令,并用core.lastResponse()获取返回数据。在脚本中加入大量的print()语句输出中间变量,这是调试Lua脚本最有效的方法。 - 利用交互模式:在编写复杂交互流程前,先在PM3交互命令行中手动执行每一步,确认命令和响应符合预期,再将这个流程翻译成脚本。
- 社区资源:GitHub上搜索
proxmark3 fido lua或proxmark3 emv script,可能会找到宝贵的起点代码。理解并修改现有脚本比从零开始要快得多。
6. 高级技巧与扩展应用方向
当你掌握了基础交互后,可以尝试以下更深入的方向,这些将真正体现Proxmark3作为研究平台的价值。
6.1 低频唤醒与高频交互的联动
一些双频卡片或设备(如某些门禁卡或工牌)可能同时包含125kHz(LF)和13.56MHz(HF)芯片,甚至两者之间存在某种关联。你可以尝试:
- 用低频部分(
lf命令)读取其ID。 - 尝试用这个ID或衍生物作为密钥或参数,去触发或解锁高频部分的某个功能。这需要逆向工程设备的通信协议,是硬件安全研究的经典课题。
6.2 侧信道信息收集
虽然Proxmark3不是专业的侧信道分析设备,但在高频交互中仍能收集到一些有趣的信息:
- 功耗分析(粗略):观察在执行不同加密操作(如DDA签名、FIDO的ES256签名)时,
hw tune反馈的场强波动是否有差异。这需要非常稳定的环境和精细的对比,但可以作为初步的迹象。 - 时序分析:使用脚本精确记录发送命令到收到响应之间的时间差。复杂的加密运算(如RSA签名)通常比简单操作(如读取数据)耗时更长。通过分析时序差异,可能推断出卡片内部执行了哪些类型的操作。
6.3 自定义模拟与模糊测试
Proxmark3不仅可以读取,还可以模拟。hf 14a sim命令可以模拟一张MIFARE Classic卡片。虽然直接模拟EMV或FIDO这样复杂的卡片极其困难(需要实现完整的协议栈和密钥),但你可以:
- 模拟一个简单的ISO 14443-4标签:响应基本的选卡和APDU,用于测试读卡器端的兼容性。
- 进行APDU模糊测试:编写脚本,向目标卡片或密钥发送大量随机或畸形的APDU命令,观察其响应,寻找可能导致崩溃、状态异常或信息泄露的边界情况。这是高级安全研究手段,必须在完全隔离的实验室环境中,对自有设备进行。
6.4 集成与自动化
将Proxmark3集成到你的自动化测试流水线中:
- Python控制:使用
proxmark3的Python客户端库(如pyproxmark3),通过脚本控制PM3执行一系列测试用例,并自动解析结果。 - 与其它工具联动:例如,用Proxmark3触发FIDO密钥的认证,同时用逻辑分析仪或示波器捕捉安全芯片的IO引脚或功耗轨迹,进行关联分析。
走到这一步,你已经超越了绝大多数Proxmark3用户。这台设备不再是一个简单的“复制器”,而成为了一个连接数字世界与物理安全硬件的桥梁,一个探索现代认证协议深度的显微镜。每一次成功的交互、每一个解析出的数据字段、每一处发现的协议特性,都是对庞大而隐秘的物联网安全图景的一次亲手测绘。记住,能力越大,责任越大。所有这些知识与技能,都应应用于建设性的安全研究、授权测试与个人学习,共同维护一个更安全的数字环境。