Pentesting RFID
Reading time: 15 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
介绍
Radio Frequency Identification (RFID) 是最常见的短距离无线方案。它通常用于存储和传输用于识别实体的信息。
RFID 标签可以依赖于自身电源(active),例如内置电池,或者通过读取天线使用接收无线电波所感应的电流来获取电源(passive)。
分类
EPCglobal 将 RFID 标签分为六类。每一类标签都具有前一类中列出的所有功能,从而实现向后兼容。
- Class 0 标签是运行在 UHF 频段的被动标签。厂商在生产时预编程它们。因此,你无法更改存储在其内存中的信息。
- Class 1 标签也可以在 HF 频段工作。此外,它们可以在生产后一次性写入。许多 Class 1 标签还能处理它们接收命令的循环冗余校验(CRCs)。CRC 是命令末尾用于错误检测的几个额外字节。
- Class 2 标签可以多次写入。
- Class 3 标签可以包含可以记录环境参数(例如当前温度或标签运动)的嵌入式传感器。这些标签是半被动的,因为尽管它们有嵌入式电源(例如集成电池),但它们不能主动与其他标签或读卡器发起无线通信。
- Class 4 标签可以与同一类的其他标签发起通信,使其成为主动标签。
- Class 5 标签可以为其他标签提供电力并与之前所有的标签类通信。Class 5 标签可以充当RFID readers。
RFID 标签中存储的信息
RFID 标签的内存通常存储四类数据:用于识别标签所附实体的识别数据(此数据包含用户定义字段,如银行账户);提供有关实体更多细节的补充数据;用于标签内部配置的控制数据;以及包含标签唯一标识符(UID)和有关标签生产、类型和供应商的详细信息的制造商数据。前两类数据在所有商业标签中都能找到;后两类则可能因标签供应商而异。
ISO 标准指定了 Application Family Identifier(AFI)的值,这是一个指示标签所属对象类型的代码。另一个由 ISO 指定的重要寄存器是 Data Storage Format Identifier(DSFID),它定义了用户数据的逻辑组织。
大多数 RFID 安全控制具有限制对每个用户内存块以及包含 AFI 和 DSFID 值的特殊寄存器的读或写操作的机制。这些锁定机制使用存储在控制内存中的数据,并由供应商预配置默认密码,但允许标签所有者配置自定义密码。
低频与高频标签比较
.png)
低频 RFID 标签(125kHz)
低频标签常用于不需要高安全性的系统:楼宇门禁、对讲钥匙、健身房会员卡等。由于它们的读距较大,因此在付费停车场非常方便:驾驶员不需要将卡靠近读卡器,因为它可以从较远处被触发。与此同时,低频标签非常原始,数据传输速率低。因此,无法为诸如余额保持和加密等功能实现复杂的双向数据传输。低频标签只传输它们的短 ID,且没有任何身份验证手段。
这些设备依赖于被动的 RFID 技术并在 30 kHz 到 300 kHz 的范围内工作,尽管更常用的是 125 kHz 到 134 kHz:
- 远距离 — 更低的频率意味着更高的读距。有些 EM-Marin 和 HID 的读卡器可以在约一米的距离工作。这些通常用于停车场。
- 原始协议 — 由于低数据传输速率,这些标签只能传输其短 ID。在大多数情况下,数据不经过身份验证且不以任何方式保护。只要卡处于读卡器范围内,它就开始传输其 ID。
- 低安全性 — 这些卡很容易被复制,甚至因为协议的原始性而可能从别人衣袋中被读取。
流行的 125 kHz 协议:
- EM-Marin — EM4100, EM4102。在独联体地区最流行的协议。由于其简单性和稳定性,可从大约一米处读取。
- HID Prox II — 由 HID Global 推出的低频协议。该协议在西方国家更为流行。它更复杂,且该协议的卡和读卡器相对昂贵。
- Indala — 非常古老的低频协议,最初由 Motorola 引入,后来被 HID 收购。与前两者相比,你在野外遇到它的可能性较小,因为它正在逐渐被淘汰。
实际上,还有更多低频协议。但它们在物理层上都使用相同的调制,并且可以在某种程度上被视为上述协议的变体。
攻击
你可以使用 Flipper Zero 攻击这些标签:
高频 RFID 标签(13.56 MHz)
高频标签用于需要加密、大量双向数据传输、身份验证等更复杂的读写器-标签交互场景。
它们通常出现在银行卡、公共交通和其他安全通行证中。
13.56 MHz 高频标签是一组标准和协议。它们通常被称为 NFC,但这并非总是准确。物理和逻辑层上使用的基本协议集是 ISO 14443。高级协议以及替代标准(如 ISO 19092)基于它。许多人将这项技术称为Near Field Communication (NFC),这是一个描述在 13.56 MHz 频率上运行设备的术语。
.png)
简单来说,NFC 的架构如下:传输协议由制造卡的公司选择并基于低层的 ISO 14443 实现。例如,NXP 发明了自己的高级传输协议 Mifare。但在较低层,Mifare 卡基于 ISO 14443-A 标准。
Flipper 可以与低层的 ISO 14443 协议以及 Mifare Ultralight 数据传输协议和用于银行卡的 EMV 进行交互。我们正在努力添加对 Mifare Classic 和 NFC NDEF 的支持。对构成 NFC 的协议和标准的深入考察值得另写一篇文章,我们计划稍后发布。
所有基于 ISO 14443-A 标准的高频卡都有一个唯一的芯片 ID。它充当卡的序列号,就像网络卡的 MAC 地址一样。通常,UID 长度为 4 或 7 字节,但极少数情况下可以达到 10 字节。UID 不是秘密,它们很容易被读取,有时甚至印在卡片上。
许多门禁系统依赖 UID 来进行身份验证并授予访问权限。有时即使 RFID 标签支持加密也会这样使用。这种误用使它们在安全性上与原始的 125 kHz 卡处于同一水平。虚拟卡(如 Apple Pay)使用动态 UID,以便手机用户不会通过支付应用打开门禁。
- 短距离 — 高频非接触卡专门设计为必须将其放在靠近读卡器的位置。这也有助于保护卡片免受未经授权的交互。我们曾实现的最大读取距离约为 15 cm,那还是使用定制的高距离读卡器时的记录。
- 高级协议 — 高达 424 kbps 的数据传输速率允许复杂协议实现完整的双向数据传输,从而支持加密、数据传输等功能。
- 高安全性 — 高频非接触卡在任何方面都不逊色于智能卡。有些卡支持像 AES 这样的强加密算法并实现非对称加密。
攻击
你可以使用 Flipper Zero 攻击这些标签:
或者使用 proxmark:
MiFare Classic offline stored-value tampering (broken Crypto1)
当系统将货币余额直接存储在 MiFare Classic 卡上时,你通常可以操纵它,因为 Classic 使用 NXP 已弃用的 Crypto1 密码算法。Crypto1 多年已被破解,允许使用普通硬件(例如 Proxmark3)恢复扇区密钥并对卡内存进行完全读/写。
端到端工作流程(概述):
- Dump the original card and recover keys
# Attempt all built-in Classic key recovery attacks and dump the card
hf mf autopwn
这通常会恢复扇区密钥 (A/B),并在 client dumps 文件夹中生成完整卡片 dump。
- 定位并理解 value/integrity 字段
- 对原始卡执行合法充值(top-ups),并在充值前后获取多个 dumps。
- 对两个 dumps 做 diff,以识别表示余额和任何完整性字段的变化的块/字节。
- 许多 Classic 部署要么使用原生的 "value block" 编码,要么自定义校验和(例如对余额与另一个字段及常数做 XOR)。在更改余额后,需相应地重新计算完整性字节,并确保所有重复/补码字段一致。
- 将修改后的 dump 写入可写的 “Chinese magic” Classic tag
# Load a modified binary dump onto a UID-changeable Classic tag
hf mf cload -f modified.bin
- 克隆原始 UID,使终端识别该卡
# Set the UID on a UID-changeable tag (gen1a/gen2 magic)
hf mf csetuid -u <original_uid>
- 在终端使用
信任卡上余额和 UID 的读卡器会接受被篡改的卡。现场观察显示许多部署基于字段宽度对余额进行上限限制(例如 16-bit fixed-point)。
Notes
- 如果系统使用原生 Classic value blocks,请记住格式:value (4B) + ~value (4B) + value (4B) + block address + ~address。所有部分必须匹配。
- 对于带简单校验和的自定义格式,差分分析是推导完整性函数而无需反向固件的最快方法。
- 只有可更改 UID 的标签("Chinese magic" gen1a/gen2)允许写入 block 0/UID。普通 Classic 卡的 UID 是只读的。
For hands-on Proxmark3 commands, see:
制作便携式 HID MaxiProx 125 kHz Mobile Cloner
如果你在 red-team 演练中需要用来采集 HID Prox® 门禁卡的长距离、电池供电解决方案,你可以将壁挂式 HID MaxiProx 5375 读卡器改装成一个可装入背包的自包含克隆器。完整的机械和电气拆解请见:
参考资料
- https://blog.flipperzero.one/rfid/
- Let's Clone a Cloner – Part 3 (TrustedSec)
- NXP statement on MIFARE Classic Crypto1
- MIFARE security overview (Wikipedia)
- NFC card vulnerability exploitation in KioSoft Stored Value (SEC Consult)
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。