Skip to content

RFID学习

· 5,685 字 · 研究

前言#

RFID又称射频识别技术,是通过无线电波来识别物体,并执行读取、写入等操作。还有一种相似的技术叫NFC,也归类于RFID,NFC更聚焦于短距离内的数据交互。 本文主要的学习方向就是这类卡片,通常分为IC卡、ID卡、CPU卡等。详细的概念请寻找官方文档等权威文章,本文的作用只是帮助快速了解RFID卡片。

ProxMark3#

环境配置、固件刷取#

Proxmark3 是一款用于 RFID/NFC 调试与安全研究的工具,支持低频 125/134kHz 和高频 13.56MHz 的多种非接触式卡片协议,可用于读卡、写入可写卡、模拟、嗅探和协议分析。 源项目来自国外,目前较为常用的固件型号为iceman。国内电商平台出售的大部分都是厂商自己魔改的。特别避雷一下龙达科技的PM3终极版,宣传说是rdv4的基础上进行修改的,其实本质上也就是rdv2的魔改版,并且还不兼容iceman固件。 我手里的这款pm3是比较早期的产品,型号为rdv3 easy,就200+的价格,天线的信号不是很好。 259

make clean && make all
./pm3 -p com3 --flash --unlock-bootloader --image bootrom.elf --image fullimage.elf
./pm3

使用#

本章节不做任何介绍。

hf mf info 读取卡片信息
hf mf autopwn 自动破解卡片并读取数据

嗅探#

pm3拥有嗅探其他读卡器和卡片之间交互的能力,可以嗅探到读取或者写入了哪一个block的数据,也可以嗅探到读卡器和卡片之间的认证过程。以ISO14443-A类型的卡片为例,输入指令 hf 14a sniff开始进行嗅探

模拟#

手头上的这款PM3 Easy模拟卡片的效果很差,所以如果需要模拟卡片,最好还是选择变色龙。

hf mf eload -f hf-mf-95056C1A-dump-003.bin 这里需要模拟的是M1卡,先载入需要模拟的卡片数据
hf mf sim --1k -i 开始模拟,-i是强制在前台交互

具体效果可以如下图所示,[PM3-DIAG]的日志可以忽略,是我修改iceman固件进行debug使用的,要结束模拟只需要按下pm3设备的侧边按钮即可。

高频卡#

M1卡(Mifare Classic 1K)#

基础概念解析#

M1卡属于非接触式IC卡,为高频卡。一共存在16个扇区,每个扇区4个block,其中每个扇区的最后一个block,称为扇区尾块。扇区尾块一共有16字节,由KeyA(6字节)、访问控制位(3字节)、通用字节(1字节)、KeyB(6字节)四个部分组成。 KeyA、KeyB为卡片扇区密钥,每个扇区的密钥都不固定,即第5扇区的KeyA只在第五扇区有效。卡片通过挑战应答机制和读卡器发起认证,挑战应答机制用到的密钥无论是KeyA还是KeyB都可以。但是通过挑战应答机制以后,不代表就可以读写卡片数据了。每个扇区的KeyA、KeyB拥有的权限,都由访问控制位决定,例如一张卡片的第5扇区,KeyA只能用于读取数据,而KeyB才具备写权限。 在M1卡的16个扇区中,第0扇区较为特殊,第0扇区的第0 block为整张卡核心的信息块。由UID(4字节)、BCC(1字节)、SAK(1字节)、ATQA(2字节)、厂商数据(8字节)组成。UID即每张卡片的编号,BCC则是卡片UID的异或校验位,SAK和ATQA负责处理应答防冲突机制。SAK字段负责告诉读卡器自己是什么类型的卡片,例如:MIFARE Classic、Ultralight、DESFire 等,具体还可以详细到是1K卡还是4K卡。ATQA字段负责告诉读卡器更详细的卡型,例如:ISO14443-A。 接下来先介绍一下卡片与读卡器之间的认证流程,前面也说过了是挑战应答机制,一共有三次握手。首先读卡器向卡片指定目标扇区和Key,接下来进入认证流程。卡片生成随机数NT给发卡器,发卡器接受到随机数NT后,需要使用密钥得到正确的响应值,以及生成一个随机数NR一起返回给卡片。卡片先校验NT的响应值是否正确,正确再返回NR的响应值给发卡器。至此双方都认为对方拥有正确的Key。 防冲突机制也是一个值得研究的点,当读卡器的感应区中出现多张卡片时,就会触发防冲突机制,主要作用是帮助读卡器按一定顺序轮流读取卡片。例如现在感应区中一共有2张卡片,卡片A和卡片B。假设卡片A的UID为11223344,卡片B的UID为12223344。

卡片A和卡片B的UID差异主要在于第一个字节中的低位,即把0x11和0x12转化成bit
0x11 0001 0001
0x12 0001 0010
差距位于bit2

读卡器读取卡片UID时是逐bit进行的,也就是当他读到bit2时会发现存在分支,也就是0和1两条路线,那么读卡器就会根据自己的调度策略来优先选择路线,在一条路线读取完毕后,会返回到冲突bit位读取剩下的卡片。 使用pm3执行指令”hf mf info”同时读取多张卡片时,就会出现如下报错:

Multiple tags detected. Collision after Bit 4

实验#

只了解概念显然不能帮助我们了解清楚M1卡和读卡器之间的通讯流程,所以接下来将使用PM3的嗅探能力,抓取读卡器和卡片的通讯,了解清楚防冲突机制、挑战应答认证、实际的读卡写卡等场景。

防冲突机制#

原版的IceMan固件虽然具备一定的识别多卡的能力,但是其遇到多卡的情况下,选择逻辑是简单粗暴的选择bit冲突位为1的分支进行读取,至于其他卡片则不会进行识别。所以实际在使用的时候,遇到感应区里放了多张的卡片时,就会出现一边报错一边正常读取的情况,就是遇到UID冲突时直接走固定分支的结果。

挑战应答认证#

在上方的基础概念解析中,我们已经介绍过了读卡器想要指定读取m1卡中的block时,需要先通过对应扇区的KeyA、KeyB认证,这个认证过程是挑战应答式的。 比如我们输入 hf mf rdsc -s 11 -bk ffffffffffff 指令,即尝试读取第11扇区的数据,使用KeyB密钥进行认证。那么嗅探到的通讯过程就是如下图所示:

低频卡#

近年来,由于NFC卡片需要承担更多的需求,例如记录用户数据以及需要更高自由度的数据交互,所以低频卡的市场逐渐被高频卡替代,目前只有很少的场景仍然在使用低频卡。 低频卡和高频卡最主要的区别在于读卡器和卡片之间的数据交互方式。对于高频卡来说,如果设备想要知道卡片的第11扇区的数据,那么就会先通过挑战应答通过认证,再点名要求自己需要读取第11扇区的数据,如果业务层面有进行加密,就需要把卡片数据的密文解密成明文,随后得到明文。低频卡的交互则看起来像是卡片在自言自语,首先读卡器提供载波场为卡片供能,随后卡片根据自身的调制协议,改变自身的负载,在读卡器的载波场上产生可被检测的幅度、频率和相位变化。读卡器检测这些变化,按照调制协议解调为bit流,再解析成卡片数据。

上行协议#

由卡片发送给读卡器的信号,我们称之为上行协议。低频卡进入读卡器产生的载波场后,就会不断根据page0的block0规定的调制协议发送空口波形,上行协议与下行协议采取的调制方式很大概率上是不一致的。这也就意味着,能够通过PM3来获取卡片上行协议发送的空口波形,不代表就可以读取到卡片的page0和page1的全部数据。所以很大程度上,想要复制一张低频卡,大部分情况下都只能复制其上行协议的空口波形,如果想要复制整张卡,包括下行协议,那么就要求获取下行协议的调制方式,大部分情况下是有标准的下行协议可以使用,如果遇到卡片采用了非标准的下行协议,那么就无法读取全部的block数据。

负载调制#

卡片的负载调制,本质上是通过等效抗阻实现的。读卡器通过给线圈回路施加交变电压,从而产生交变电流,交变电流产生交变磁场,也就是载波场。卡片线圈因电磁感应产生交变电压和电流,自然也会有磁场,那么根据磁耦合就可以反作用于读卡器。此时借助等效抗阻,从而改变电流大小,读卡器就可以捕捉到这些载波幅度、电压、电流、相位等变化,从而获得类似高低状态的数字样本。 这里的数字样本可以通过PM3获取,如下所示:

-66 -103 -123 -123 -123 -123 -123 -123 -123 -123 -123 -123 -123 -123 -123 127 127 127 127 127 127 127

不过这里存在一种不可忽视的情况:PM3获取到的数字样本,他不一定是完整的循环,以曼彻斯特编码为例,一个bit的数据会由两个半位组成,一个半位由16个数字样本组成。PM3捕获到的数字样本不一定是循环最开始的数字样本捕获的。因此这里要引入一个概念,候选时间窗口,解调程序将这16个样本当成一个半位,接着按照解调协议尝试转化成bit流,如果最后的结果明显不对,再更改候选相位,即偏移值。最后得到正确的时间窗口。这里还有一个概念要澄清,数字样本本身不代表高低电平,解调程序通过候选时间窗口把一组样本组成一个半位,通过半位的样本平均值和阈值比较,从而判定当前接受链路下,当前样本的高低状态。

调制方式#

调制方式可以理解成,卡片通过改变自身的什么来让读卡器感应到

线路编码#

线路编码决定如何表示0和1

曼彻斯特编码(Manchester)#

曼彻斯特编码的核心,就是在每个半位之间加入跳变,比如以下32个样本数据,组成两个半位,一个bit

-120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120 -120
120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120

第一个半位的平均值是-120,相对于阈值0是小于的,可以认为是低状态,第二个半位的平均值是120,相对于阈值0是大于的,可以认为是高状态,那么可以等效认为这两个半位形成了01,中间有一次跳变,这两个半位形成的bit就是0。反之10则表示1。 如果两个半位都是00、11,中间没有跳变,那么曼彻斯特编码就会把这两个半位当成无效半位对。

其他#

符号极性#

符号极性主要用于表示哪一种物理状态标识0,哪一种表示1。比如高电平表示1,低电平表示0。

字节位序#

字节位序这块还挺关键的。主要是包括字节端序和位序。比如大端序和小端序,这个都老生常谈了,0x1234,大端序表示12 34,小端序表示34 12。位序则是关于单个字节内部的,比如0x12 = 0001 0010,一共有两种位序:MSB-first和LSB-first,MSB-first从高位开始发送,即 0001 0010,LSB-first从低位开始发送,即0100 1000。位序通常是根据卡片类型来决定的,不会被block0配置块的更改所影响,这一点在实际伪造卡片时需要注意。

下行协议#

下行协议相对来说更难伪造一点,因为厂商可以进行私有协议的设置,PM3此类的设备都只能发送标准的下行协议,下行协议通常存储于读卡器的固件中,所以在逆向上存在一定难度。如果需要伪造卡片的话,推荐只实现上行协议即可,写到已知下行协议的空卡上。 下行协议用来表示读卡器给卡片发送的信号,一般只有可写的低频卡才具备下行协议,如EM4100这种ID卡,就只有上行协议,t55xx系列的可写低频卡,都具备下行协议。下行协议分私有和标准两种方式,厂商可以通过魔改私有协议,来阻止其他人覆写卡片,或是指定读取卡片的完整block数据。

T55XX卡#

T55XX是一种低频可写卡。常见包括:T5557、T5567、T5577等,其中T5577是数量最多的。大多数低频卡都是非接触式ID卡,无法改变卡号,并且也没有可供业务程序读写的用户数据区。而T55XX属于低频非接触式IC卡,具备用户数据区,可以实现类似于M1卡的效果。 以T5577为例,其一共有2个page,11个block,其中page0包括8个block,从block0到block7。page1包括3个block,从block1到block3。有一个极其容易混淆的规则,无论是page0还是page1,访问block0永远只能访问到page0的block0,block0是一个配置块。 page0包括配置块block0以及用户数据block1-block7 page1包括原厂信息block1-block2以及通讯设置block3 每个block都包括4个字节,同时拥有类似于M1卡的trailer的控制标识位,每个block的第0bit是lock bit,lock bit=0可继续写入,lock bit=1无法写入。

奇奇怪怪的设备#

这个章节用来记录接触到的有关RFID的设备,但不是所有的设备都进行了逆向,仅供参考。

人体存在感知传感器#

手头上的这款是tuya的,设备名称:Wi-Fi Human presence detector 大概的作用是可以检测当前环境下的亮度以及是否有人体活动 495