RFID近场克隆攻击:从技术原理到实战操作

本文深入探讨RFID近场克隆攻击的技术细节,涵盖低频/高频卡工作原理、MIFARE加密破解、Proxmark3实战操作及低成本Arduino替代方案,揭示RFID系统的安全漏洞与防护挑战。

RFID近场克隆攻击

Ray Felch //

引言

在整理KeyWe智能锁配件并完成此前两项研究(《逆向工程智能锁》和《机器在中间BLE攻击》)后,我发现了几个KeyWe RFID标签。尽管对RFID(射频识别)技术已有一定了解,我决定借此机会不仅终结智能锁研究,更深入探索这种迷人的无线通信方式。

按照KeyWe锁设置指南,我编程了一个RFID标签并验证其功能:将标签靠近锁几厘米内即可成功开门。手握可用的RFID标签,我开始了深度研究之旅。

HID ProxMark卡与标签

早期近场卡(Prox卡)工作在125kHz(低频),允许非接触式智能卡在读数器几英寸内被读取。这相比磁条卡刷卡是显著改进。不久后,第二代卡(HID ProxMark II)提供更远距离达15英寸,允许卡留在钱包或手提包中直接靠近读数器访问。这些早期卡类似磁条卡,数据存储有限,通常用作办公楼门禁卡。这些低频卡在靠近读数器时提供26位流:8位设备代码、16位卡ID和2位奇偶校验位。数据存储的巨大限制催生了极受欢迎的高频(13.56MHz)Mifare Classic卡。

无源与有源RFID卡

非接触式RFID卡分无源和有源两种。这些卡通常包含IC(集成电路)和天线。无源卡的IC无内部电源,而是通过互感(称为“共振能量传输”)从“供电”的读数器模块获取能量。当靠近读数器时,无源卡内芯片唤醒并向读数器发送数据流。这些卡的天线由多圈紧密绕制的导线组成,沿卡周边布置。

有源RFID卡和标签(有时称近域卡)含内部锂电池,提供更远读取距离,通常约2米(6英尺)。极少数情况下,RFID有源标签范围可达150米(500英尺)。这类标签的用例包括车辆接近安全门时读取。有源标签电池寿命2-7年,到期需更换。

MIFARE卡与标签

NXP半导体(2006年从飞利浦分拆)拥有MIFARE RFID卡商标。MIFARE卡技术因应消费者对旧HID ProxCard技术的广泛接受而创建,同时解决如有限数据容量和严重安全缺陷等问题。截至本文撰写,现存超过100亿张智能卡和超过1.5亿个智能卡读数器模块。

多数旧HID ProxCard工作在125kHz,而新MIFARE卡设计工作在13.56MHz(高频)。这些非接触式卡在数据存储上有显著改进,提供1k和4k字节存储版本。MIFARE卡(符合ISO 14443 A/B)还实现了专有(NXP)加密算法Crypto1,在其MIFARE Classic 1k卡上使用48位密钥。不幸的是,如常见于自定义加密,Crypto1已被攻破,易受嵌套和硬嵌套暴力密钥猜测攻击。

为持续提升非接触式卡安全,MIFARE推出了MIFARE Plus和MIFARE DESFire(高安全)卡,以及MIFARE Ultralight卡。MIFARE DESFire卡芯片有完整微处理器和极大改进的安全特性,如三重DES加密标准。

MIFARE DESFire和MIFARE Classic EV1(最新)卡包含片上备份管理系统和相互三次认证。EV1可容纳最多28个不同应用和每个应用32个文件。

中国魔术卡

(13.56MHz)MIFARE Classic 1k卡是现存最广泛使用的RFID卡之一。基于ISO14443 A/B标准,这些卡相对廉价,约每张1美元。

MIFARE Classic 1k非接触式智能卡提供16个扇区,每个扇区含(4)16字节块,总1,024字节卡上存储。扇区0通常只读,包含如UID、访问位和制造商信息等。为成功完整克隆卡或标签,扇区0需可写以便覆盖卡出厂设置的UID和相关数据。

恰名中国魔术卡允许扇区0写入,重写能力广告达100,000次。生产中有许多扇区0可写卡,但购买时需注意可靠性,尽职调查。

MIFARE Classic 1K卡扇区0配置

RFID读写器

Proxmark3是强大通用RFID工具,设计用于嗅探、监听和模拟从低频(125kHz)到高频(13.56MHz)的所有卡和标签。价格适中270美元,是任何严肃RFID研究员工具箱的必备品!软件安装可能稍麻烦,但几次尝试后,我发现遵循Iceman分支的指令可快速启动运行。

NFC ACR122U是成本友好的高频(13.56MHz)读、写和克隆选项。不仅支持有用开源软件,读写器还可与符合NFC的手机的近场连接功能接口。

Easy MF RFID读写器(仅13.56MHz)是我研究RFID项目众多选项时偶然发现。25美元非常廉价,但代价是设置和操作指令难以遵循(因中文翻译问题),需时启动运行。它提供WebSocket GUI,但即使访问GUI也稍晦涩。尽管如此,我最终能在几个Mifare Classic 1k卡上读写数据。

RFID-RC522读写器是极廉价(仅3美元)电路板,设计易于与Arduino系列接口。搜索互联网,有许多基于Arduino的RFID项目可用于实验读写RFID(高频(13.56MHz)卡和标签。我将在本文后续介绍一些这些项目。

手持RFID写入器是另一非常廉价设备,使克隆HID(仅低频125kHz)卡和标签极其容易。这手持读写器由两节AAA电池供电。简单使用手柄上开/关开关供电。将源卡靠近读写器(左上),按READ按钮,等待绿色(通过)LED亮起。用目标卡替换源卡,按WRITE按钮,等待绿色LED亮起。

长距离读数器

虽然更常见卡读数系统范围很短,以英寸计,但HID MaxiProx 5375和HID R90长距离读数器可操作范围达6英尺(与HID ProxPass有源卡使用时超过25英尺)。这些读数器在从车辆打开停车场门时非常有效。HID R40 iClass SE是多级读数器,通常用于门禁,范围约5英寸(因iClass卡类型而异)。

  • HID MaxiProx 5375长距离读数器(125kHz)HID ProxCard II
  • HID R90长距离读数器(13.56MHZ)HID iClass
  • HID R40壁挂单元(13.56 MHz)HID iClass SE

所有读数器(短距和长距)的共同点是,在从RFID卡或标签接收位流后,它们与访问控制器(通常基于PC)通信以转发信息进行访问确认(或拒绝)。Wiegand(https://en.wikipedia.org/wiki/Wiegand_interface)指用于卡读数器和传感器的技术,可追溯至1980年代初。这系统是有线通信接口,使用最少三线:GND、Data-0和Data-1/CLK。原始Wiegand格式有一个奇偶校验位、8位设备代码、16位ID代码和尾随奇偶校验位,总26位。

奇偶校验位用作传输二进制数据准确性的非常简单质量检查。格式程序设计者将决定每个奇偶校验位应为偶或奇。选定数据位组将与一个奇偶校验位联合,总位数应结果为偶或奇数。

在上例中,前导奇偶校验位(偶)链接到前12数据位。如果12数据位结果为奇数,奇偶校验位设为一使13位总数为偶。最后13位类似设为奇总数。

Proxmark3会话:KeyWe RFID标签

图像1(上)显示Proxmark3-RDV2、一个“扇区0可写”(魔术卡)和预编程KeyWe智能锁RFID标签。KeyWe RFID标签是高频(13.56MHz)设备。Proxmark3定向暴露13.56MHz线圈天线(125kHz侧朝下)。

图像2(上)显示定位读取的KeyWe RFID标签 图像3(上)显示定位写入(克隆)的扇区0可写卡

Mifare Classic 1k克隆程序

  1. 将KeyWe RFID放在Proxmark3高频(13.56MHz)线圈上,如图像-2
  2. 打开终端并导航到 /proxmark3/client/

搜索卡 以下截图显示我们对KeyWe RFID标签执行高频搜索。搜索结果提供UID(唯一标识)、ATQA(请求应答)和SAK(选择确认)。如前所述,SAK值08指示标签遵循Mifare Classic 1k(ISO14443A)标准。ATQA值指示UID字节长度,此案例4字节。

检查密钥 既然我们确定有Mifare Classic 1k标签,我们可以检查标签所有已知A和B密钥并确定是否缺少任何。此检查使用默认已知密钥列表执行,但也可修改以查找特定手动输入密钥。你需要所有密钥以使用“hf mf dump”命令。

嵌套攻击 使用嵌套攻击和已知好密钥查找缺失密钥。从截图我们看到,使用已知密钥“ffffffffffff”,发现缺失A密钥:9b7c25052fc3,以及B密钥:c22e04247d9a。我们现在有所有密钥(保存到dumpkeys.bin)并可成功克隆卡。

恢复 从Proxmark3移除KeyWe RFID标签,并放置扇区0可写卡在Proxmark3上,如图像-3。快速搜索显示此卡UID出厂设为“b6 dd 33 3d”。另注意卡检测为中国魔术后门(GEN 1a)卡。继续“restore”命令,我们看到Proxmark3转储先前读取并保存到dumpdata.bin的数据到可写卡。另注意,扇区0的第一块(含UID等)此时不能写入。这是因为此类扇区0可写卡需要特殊解锁命令 prior to 写入。这正常,将在我们发出“csetuid”命令时 shortly 处理。

设置UID 成功写入剩余块(1-63)后,我们可以发出特殊命令解锁“扇区0 – 块0”以写入UID、访问控制位和制造商信息(见以下截图)。我们使用已知KeyWe RFID标签的UID:01 8a 44 54发出“csetuid”命令。后续快速搜索指示UID现在匹配原始KeyWe RFID标签。使用KeyWe智能锁测试此克隆卡证明我们成功克隆了原始标签。

测试克隆RFID卡

替代读写器

尽管Proxmark3是所有RFID工具箱的 definite ‘must-have’,但对想实验RFID技术的人可能不可行“入门级”选项。也就是说,有许多关于NFC和HID卡读写器的替代选项。在以下部分,我将涉及三种相对廉价方式实现类似Proxmark3的结果。具体将访使用NFC ACR122U卡读写器、基于Arduino Nano/RC522的工具和Android手机读写Mifare 1k Classic卡。

NFC ACR122U读写器使用开源mfoc-hardnested工具和nfc-tookit

1
2
3
4
git clone https://github.com/nfc-tools/mfoc-hardnested
autoreconf -vistool
./configure
make && sudo make install

放置原始RFID标签在读写器上

执行mfoc-hardnested -O mykeywecard.mfd -k ffffffffffff转储标签信息包括已知密钥到输出文件“mykeywecard.mfd”。此命令要求至少一个密钥已知(此案例使用默认密钥‘ffffffffffff’)。首先,将使用默认密钥表尝试认证所有扇区。如以下截图所见,为KeyWe标签所有扇区找到密钥,除扇区10。 <片段> 此时,过程继续硬嵌套暴力攻击以确定(猜测)两剩余密钥(A/B)。如以下截图,我们看到找到密钥A,用密钥A读取数据揭示密钥B。既然所有扇区已认证,密钥将转储到文件。 <片段> 如以下所见,扇区10含块40 – 43和认证扇区读写的密钥“9b7c25052fc3” <片段> 扇区0(由块0 – 3组成)含UID,后随BCC(校验和)、SAK(卡类型)、ATQA和制造商信息

用空白中国Mifare卡替换KeyWe RFID标签

执行nfc-mfclassic w b mykeywecard.mfd拉取转储到文件mykeywecard.mfd的数据/密钥并写此信息到目标卡。更仔细检查截图显示64块中63块写入!这是因为扇区0只读。尽管我们使用中国魔术卡,它是Gen-1(第一代)卡,需要发送特殊解锁命令(0x43 0x40) prior to 写块-0。如所见,魔术卡出厂设置UID(6d 94 94 3d)未修改。如果我们使用Gen-2卡,我们将完成克隆。幸运的是,我们可以通过执行nfc-mfsetuid 018a4454发出解锁命令。这将修改魔术卡UID反映KeyWe标签的UID 01 8a 44 54。

我们现在有原始KeyWe RFID标签的工作副本!

成本有效学习选项

幸运的是,实验和理解RFID技术可通过使用极廉价Arduino Nano板带RFID-RC522读写器电路板和几个开源Arduino草图完成。有大量实践实验室, complete with 草图和接线图,可用于学习基础。在自己检查许多这些选项后,我决定为本文包括几个我的最爱。

Arduino Nano v3带RFID-RC522(成本8美元) https://www.arduino.cc/en/software https://github.com/miguelbalboa/rfid(Arduino rfid库)

DumpInfo草图(转储Mifare Classic卡内容到串行控制台) ReadAndWrite草图(演示读取一些数据,修改并写回,和验证) arduino_code_for_rfid_reader草图(演示使用RFID卡或标签进行门禁认证)

我为使组装快速容易,包括了硬件设置的彩色编码图(上),以及几张图片(下)。

例1:读卡并转储信息到串行端口

在上例中,所有扇区(除下扇区0)含相同信息

例2:以下Arduino草图(“ReadAndWrite”)读卡(或标签)到内存,写一些测试数据到扇区1,块4,然后执行另一读以验证数据已更改。

例3:以下短Arduino草图(“arduino_code_for_rfid_reader”)读卡(或标签)获取UID并通过与代码内合法UID比较验证所有者是“授权访问”。此例中,“合法访问UID”是“75 56 33 3D”

Android工具克隆Mifare 1k Classic卡

也完全可能使用符合NFC的Android手机成功读、写和复制Mifare RFID卡和标签。有许多应用可从Google Play商店下载。在我看来,两个更流行应用是wakdev开发的NFC Tools和ikarus23开发的MIFARE Classic Tool。

NFC启用手机只能读无源高频RFID(13.56MHz)卡和标签,且必须在极近距离读取,通常几厘米内。简单持高频Mifare卡到NFC启用手机下侧将提示你选择手机上现有应用或工具(见下)。选择NFC Tools将显示读卡结果。

MCT(Mifare Classic Tool) 使用MCT Mifare Classic Tool克隆Mifare Classic卡相对容易 https://github.com/ikarus23/MifareClassicTool – 可在Google Play商店下载。

重要信息:为成功写入扇区0,目标中国魔术卡必须是Gen-2版本卡。Gen-1卡需要发送解锁代码(0x43 0x40)用于写扇区0,而MCT不为扇区0写入发送解锁代码。

使用MCT移动应用克隆 按照以下所示步骤,我们可以使用任何NFC兼容android手机克隆Mifare Classic卡和标签(本文撰写时无iOS支持)。此例中我们的源卡将是UID“0EFF84C1”的Mifare 1k Classic卡,我们的目标卡将是UID“60FA353D”的中国魔术卡Gen-1。

  1. 打开应用并放置源卡 against 你的NFC启用手机下侧
  2. 读源 by 点击“READ TAG”,后随“START MAPPING AND READ TAG”
  3. 编辑转储 by 点击扇区1,改前6字节从000000到123456,放置目标卡 against 你的手机下侧
  4. 写目标 by 点击“3点”下拉菜单并选择“WRITE DUMP”、“WRITE DUMP”、“OK”、“START MAPPING AND WRITE DUMP”
  5. 读/验证目标 by 点击“READ TAG”,后随“START MAPPING AND READ TAG”

注意尽管我们成功更改了扇区1中的字节,源UID未写入扇区0因我们的目标卡是Gen-1魔术卡。多次卡UID将在允许访问或确认卡合法性前被验证。此案例中,为完成此克隆我们可以使用早先提到的NFC ACR122U读写器,发出“nfc-mfsetuid 0eff84c1”并更改目标卡UID为源卡的。同样,我们本可以开始就使用Gen-2魔术卡。

还应提到我们示例中无任何“缺失密钥”。如果有MCT不知的加密密钥,写入那些特定扇区将失败。有几种方式解决此问题。如果我们已知密钥,我们可以输入它们到MCT内的“密钥文件”。

如以上图所示,我们可以点击“EDIT/ADD KEY FILE” – “std.keys”并点击输入(编辑)我们已知密钥 或者,我们可以创建含我们密钥的文本文件并通过点击“TOOLS” – “IMPORT/EXPORT FILES” – “IMPORT KEYS”输入它们到MCT

查找未知密钥 如果“缺失”密钥未知,有开源基于Linux的工具(

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计