RFID近场克隆攻击
作者:Ray Felch
引言
在整理KeyWe智能锁配件并完成此前两项研究(《逆向工程智能锁》和《机器在中间BLE攻击》)后,我发现了几个KeyWe RFID标签。尽管对RFID(射频识别)技术已有一定了解,我决定借此机会不仅结束智能锁研究,更深入探索这种迷人的无线通信方式。
按照KeyWe锁设置指南,我编程了一个RFID标签,并验证了只需将标签靠近锁几厘米即可成功开门。拥有可工作的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标准)还在其MIFARE Classic 1k卡上实现了专有(NXP)加密算法Crypto1,使用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标准的手机的NFC(近场连接)功能接口。
Easy MF RFID读取器/写入器(仅13.56MHz)是我在研究RFID项目的许多选项时偶然发现的。25美元,这个设备非常便宜,但确实有代价。设置和操作指令很难遵循(由于中文翻译问题),需要一些时间才能启动和运行。它提供了一个Web套接字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卡的类型而变化)。
所有读取器(短距离和长距离)的共同点是,在从RFID卡或标签接收位流后,它们与访问控制器(通常基于PC)通信以转发信息进行访问确认(或拒绝)。Wiegand https://en.wikipedia.org/wiki/Wiegand_interface 指的是卡读取器和传感器中使用的技术,可追溯到1980年代初。这个系统是一个有线通信接口,使用至少三根线:GND、Data-0和Data-1/CLK。原始Wiegand格式有一个奇偶校验位、8位设施代码、16位ID代码和一个尾随奇偶校验位,总共26位。
奇偶校验位用作传输二进制数据准确性的非常简单质量检查。格式程序的设计者将决定每个奇偶校验位应为偶数还是奇数。一组选定的数据位将与一个奇偶校验位结合,总位数应为偶数或奇数。
在上面的例子中,前导奇偶校验位(偶数)链接到前12个数据位。如果12个数据位导致奇数,奇偶校验位设置为1,使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克隆过程
将KeyWe RFID放在Proxmark3高频(13.56MHz)线圈上,如图像-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可写卡在写入前需要特殊解锁命令。这是正常的,将在我们发出“csetuid”命令时很快解决。
设置UID 成功写入剩余块(1-63)后,我们可以发出特殊命令解锁“扇区0 – 块0”以写入UID、访问控制位和制造商信息(见以下截图)。我们使用已知KeyWe RFID标签的UID:01 8a 44 54发出“csetuid”命令。随后的快速搜索表明UID现在与原始KeyWe RFID标签匹配。使用KeyWe智能锁测试此克隆卡证明我们成功克隆了原始标签。
测试克隆RFID卡
替代读取器/写入器
尽管Proxmark3是所有RFID工具箱的必备品,但对于那些想实验RFID技术的人来说,它可能不是一个可行的“入门级”选项。也就是说,有许多关于NFC和HID卡读取器和写入器的替代选项。在以下部分,我将介绍三种相对便宜的方法来实现与Proxmark3类似的结果。具体来说,将访问使用NFC ACR122U卡读取器/写入器、基于Arduino Nano/RC522的工具和Android手机读取和写入Mifare 1k Classic卡。
使用开源mfoc-hardnested工具和nfc-tookit的NFC ACR122U读取器/写入器 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(第一代)卡,需要在写入块-0前发送特殊解锁命令(0x43 0x40)。如所见,魔术卡的工厂设置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草图完成。有大量实践实验室可用,包括草图和接线图,用于学习基础知识。在自己检查了其中许多选项后,我决定在本文中包括几个我最喜欢的。
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”
克隆Mifare 1k Classic卡的Android工具
也可以使用符合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。
打开应用程序并将源卡放在启用NFC的手机下方 通过点击“READ TAG”读取源,然后“START MAPPING AND READ TAG” 通过点击扇区1编辑转储,将前6个字节从000000更改为123456,将目标卡放在手机下方 通过点击“3点”下拉菜单并选择“WRITE DUMP”、“WRITE DUMP”、“OK”、“START MAPPING AND WRITE DUMP”写入目标 通过点击“READ TAG”然后“START MAPPING AND READ TAG”读取/验证目标
请注意,尽管我们成功更改了扇区1中的字节,但由于我们的目标卡是Gen-1魔术卡,源UID未写入扇区0。多次卡的UID将在允许访问或确认卡合法性前被验证。在这种情况下,要完成此克隆,我们可以使用前面提到的NFC ACR122U读取器/写入器发出“nfc-mfsetuid 0eff84c1”并将目标卡的UID更改为源卡的UID。同样,我们也可以从一开始就使用Gen-2魔术卡。
还应提到,在我们的例子中没有任何“缺失密钥”。如果有MCT不知道的加密密钥,写入那些特定扇区将失败。有几种方法可以解决这个问题。如果我们已经知道密钥,我们可以将它们输入到MCT内的“密钥文件”中。
如上图所示,我们可以点击“EDIT/ADD KEY FILE” – “std.keys”并点击输入(编辑)我们已知的密钥 或者,我们可以创建一个包含我们密钥的文本文件