天天看點

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

一提到,我們可能會想到acr122、proxmark3這些裝置,還有radiowar出售的專業級rfid裝置,實際上我們完全可以自己使用arduino單片機和rc522這種rfid模組制作簡易且足夠使用的rfid讀寫器,并實作簡單的攻防實驗。為了實作這個目的,我們需要了解一些基本的rfid協定和射頻收發器的基本參數知識

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

mf

rc522是應用于13.56mhz非接觸式通信中高內建度的讀寫卡晶片,是nxp公司針對“三表”應用推出的一款低電壓、低成本、體積小的非接觸式讀寫

卡晶片,是智能儀表和便攜式手持裝置研發的較好選擇。 mf

rc522利用了先進的調制和解調概念,完全內建了在13.56mhz下所有類型的被動非接觸式通信方式和協定。支援14443a相容應答器信号。數字部

分處理iso14443a幀和錯誤檢測。此外,還支援快速crypto1加密算法,用語驗證mifare系列産品。mfrc522支援mifare系列更

高速的非接觸式通信,雙向資料傳輸速率高達424kbit/s。 作為13.56mhz高內建度讀寫卡系列晶片家族的新成員,mf rc522與mf

rc500和mf rc530有不少相似之處,同時也具備許多特點和差異。它與主機間通信采用spi模式,有利于減少連線,縮小pcb闆體積,降低成本

mf522-an子產品采用philips

mfrc522原裝晶片設計讀卡電路,使用友善,成本低廉,适用于裝置開發、讀卡器開發等進階應用的使用者、需要進行射頻卡終端設計/生産的使用者。本子產品可

直接裝入各種讀卡器模具。子產品采用電壓為3.3v,通過spi接口簡單的幾條線就可以直接與使用者任何cpu主機闆相連接配接通信,可以保證子產品穩定可靠的工作、

讀卡距離遠

工作電流: 13—26ma/直流3.3v

空閑電流: 10-13ma/直流3.3v

休眠電流: <80ua

峰值電流: <30ma

工作頻率: 13.56mhz

支援的卡類型

1. mifare1 s50

2. mifare1 s70

3. mifare ultralight

4. mifare pro

5. mifare desfire

産品實體特性: 尺寸: 40mm×60mm

環境工作溫度: 攝氏-20~80度

環境儲存溫度: 攝氏-40~85度

環境相對濕度: 相對濕度5%~95%

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

mfrc522 是一個用來讀寫/操作rfid卡的外接模組,我們對卡的所有的操作,都必須借助mfrc522封裝并向外提供的api接口進行,mfrc522作為 rfid讀卡器,需要将上位機發送的二進制資料封裝為指定格式(類似tcp/ip的封裝),同時也要解析來自rfid卡發送的封裝好的資料,這個過程對 rfid卡來說也是一樣的

需要明白的是,rfid卡本身也是一個單片機具備簡單的資料處理能力,它自身維護着一個類似狀态機的存儲結構,我們通過rc522向rfid卡發送的指令,實際上一段約定格式的binary串,這個串的各個bit區域對應不同的功能性說明(感覺有點類似分控和殭屍電腦程式的協定通信方式)

例如,rfid讀卡器和rfid卡的認證請求,就是由rfid讀卡器向rfid卡發送一段: [picc_authent1a/picc_authent1b + 塊位址 + 扇區密碼 + 卡序列号] 的二進制bit流,随後讀卡器和卡之間會進行"基于預配置設定密鑰的三次握手認證"

我們如果研究過基于彙編操作硬體程式設計實驗,應該會知道,一般來說要操作一個外設硬體完成一個功能,從彙編角度要進行如下幾個步驟

rc522的寄存器清單如下

上位機(可以是arduino uno)通過mfrc522預設的指令集來間接的操作rfid射頻卡(讀寫指定扇區資料),rc522支援的指令操作如下

前面說過,arduino向mfrc522發送指令本質上就是arduino向mfrc522的指令寄存器寫入2位元組的指令,等待mfrc522讀取并執行、響應

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論
用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

1. mcm中設有專用的密碼存儲器(key-ram),用于存儲3個密碼集keyset0,keyset1,keyset2,每一個keyset又包含了各個扇區的key a 及key b  

2. authentication操作就是将key-ram中的密碼與卡中對應的密碼進行三次互相認證 

3. authentication操作的卡應答以ae位給出 

    1) ae=1: 密碼出錯,未能通過認證 

    2) ae=0: 密碼正确,通過認證

1. read/write均需整塊操作

2. read

    1) 發送指令碼30h+塊位址(0~63)

    2) 接收指定塊的資料(16b)

    3) 通常用2次讀并比較是否一緻來校驗是否正确讀

3. write

    1) 發送指令碼a0h+塊位址(0~63)

    2) 接收ack/nak應答來校驗是否正确接收指令

    3) 發送塊資料(16b)

    4) 接收ack/nak應答來校驗是否正确寫入eeprom

1. mifare卡專門為公交/地鐵等行業的定額收費系統設有值操作指令,包括            

    1) increament

    2) decreament

    3) transfer

    4) restore

2. 對某塊進行值操作的前提是該塊已被初始化為"值塊"(value block)并且access bits允許值操作

rfid卡的分類方式有很多種,取決于從哪個角度看問題

rfid卡的分類種類繁多、樣式也各有不同,同一張卡可以歸屬于多個類别中,一張卡具備哪種屬性取決于卡内的晶片、epprom讀寫權限、是否接觸式等等因素,因為制作工藝的不同,有的卡可以做成鑰匙扣,有的可以做成卡片

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論
用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

滴膠卡

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

t4443卡

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

所謂接觸式ic卡,是指ic卡讀寫資料的方式由ic卡的觸電與ic卡讀寫裝置的觸電進行解除讀寫資料的一種ic卡。卡内封裝的內建電路晶片,可以記錄并重新整理所存儲内容,在使用時,通過有形的電極觸電将卡的內建電路與外部接口裝置直接接觸連結,進行資料交換

ic卡又稱為智能卡

ic卡需要做初始化工作(即加密)(不管是否接觸)

在實際使用中,ic卡常常被作為可編輯的id卡使用

t577卡是t5557卡、t5567卡的更新版,具有防磁、防靜電、抗破壞性和耐用性強,防僞性好,存儲資料安全等特點,按照iso7816标準執行

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論
用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

很多時候我們談到hack mifare classic/m1,實際上是在談如何通過讀寫篡改卡中的資料,如何逆向卡内eeprom資料的加密算法,這裡需要明白的是,可以向卡内寫入資料并不意味着就已經 hack掉了這張卡,通過m1的密碼驗證向卡内寫入資料隻是第一步(進了大門),真正的工作在于如何解讀讀到的不同扇區、不同塊的資料,這相當于不同的 m1對應的業務場景(例如飯卡、水卡、公交卡),我認為hack一張m1 rfid卡,實際上是在hack它對應的資料存儲加密算法(不同bit位對應不同的業務場景)

要hack一張m1卡類型的rfid卡,需要以下幾個方面

m1 卡分為 16 個扇區,每個扇區由 4 塊(塊0、塊1、塊2、塊3)組成,(我們也将 16 個扇區的 64 個塊按絕對位址編号為 0~63)

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

每張m1卡一定都有16個扇區

0 扇區的塊 0(即絕對位址 0 塊),它用于存放廠商代碼,已經固化,不可更改(前4位元組是卡序列号,第5位元組是卡容量,6、7位元組是卡類型、剩下是廠商定義的資訊)。每個扇區的塊0、塊

每個扇區的塊 3 為控制塊,包括了密碼 a、存取控制、密碼 b。具體結構如下

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

每個扇區的密碼和存取控制都是獨立的,可以根據實際需要設定各自的密碼及存取控制。存取控制為 4 個位元組,共 32

位,扇區中的每個塊(包括資料塊和控制塊)的存取條件是由密碼和存取控制共同決定的(類似于x86的記憶體讀寫管理r/w/rw),在存取控制中每個塊都有

相應的三個控制位,定義如下

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

三個控制位以正和反兩種形式存在于存取控制位元組中,決定了該塊的通路權限(如進行減值操作必須驗證 key a,進行加值操作必須驗證 key b,等等)

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

塊0的存取控制位c10 c20 c30=1 0 0時,驗證密碼a或密碼b正确後可讀;驗證密碼b正确後可寫;不能進行加值、減值操作

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

例如:當塊3的存取控制位c13 c23 c33=1 0 0時,表示  

也就是說,對任何一張m1卡,要想對它進行讀寫操作,需要keya、keyb、存儲控制位

這3者綜合判斷的結果,而且大多數情況下存儲控制位所在區塊是不允許寫操作的,這就像一個保險櫃的鑰匙放在保險櫃裡并加鎖了,隻提供外面的一些僅有的界面

提供操作,無法直接拿到裡面的鑰匙

rfid m1卡采用一種典型的認證雙方預配置設定(協商)好一對相同的密鑰,通過各自生成的随機種子,并使用該密鑰加密并發送給對方,向對方證明自己是可信的

m1卡和m1相容卡的keya和keyb分别對應不同的授權控制,最後的讀寫控制由keya、keyb、通路控制位共同決定,一般情況下,我們隻要破解keya就可以進行大都數的卡操作

rc522在和m1卡進行auth認證時,如果目前傳入的密鑰不對,則m1的整個三向握手會失敗,m1和清空目前會話(此前的選卡、鎖卡全部無效),是以對于m1卡的爆破需要不斷重複整個選卡->鎖卡->認證過程。可以使用eeprom來存儲密鑰破解過程的中間值

可以按照此方法破解出所有扇區的密碼,值得注意的是,keya、keyb的破解時間成本都是(2 ^ 8) ^ 6次,即最多要進行這麼多次的"尋卡-選卡-auth認證"才能得到一個扇區的密碼,而得到所有扇區還要再乘16

dump整個卡的binary其實就是周遊所有區塊read出資料,這裡要注意的是read前需要通過auth認證,m1和auth成功和失敗都是一樣的,一旦成功/失敗,之前的尋卡-選卡-鎖卡的狀态全都要清零重來,是以我們依然需要通過eeprom來儲存我們目前read的區塊index

受到寫保護控制位的限制,我們無法修改整個m1卡,但是可以找一張不帶寫保護的白卡直接将dump資料寫入,直接通過篡改目标m1卡特定區段的資料達到"免費洗澡"、"免費吃飯"等目的已經逐漸沒有探索空間了,現在大多數rfid卡及其業務場景都是采用id卡或者準id卡(可編輯的id卡)模式,卡本身隻儲存一個id号,所有的扣費、充值邏輯都在server端完成

小區門卡原始資料

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

将這份資料寫入到一張0區塊可檫寫的白卡中

用ARDUNO自制RFID讀寫器、複旦M1卡初探1. 為什麼要用Arduino2. RC522晶片(讀卡器)簡介2. RFID卡分類3. 常見RFID卡産品4. Mifare Classic/M1/IC卡/智能卡5. 實驗過程及相關Arduino6. 攻防讨論

在實際實驗中,由于小區門卡從sector 3開始就不是采用預設密鑰ff,故無法完整dump出整張原始卡,嘗試了爆破但是時間消耗太大,最終放棄,不過這也引出後文對目前rfid卡安全的讨論

限制密鑰b在可讀條件下的使用權限,取消此時的認證功能

在晶片層工程實作密碼層的防禦措施

有很多規模不大的m1卡應用系統從來沒有密鑰管理的概念,發出的卡不僅所有扇區的密鑰相同,而且所有卡的密鑰都一樣。一旦一張卡被破解,系統内所有的卡都等于被破解。簡單的解決辦法是先産生一個主密鑰然後對每張卡使用強度足夠的分散算法分散出每張卡的密鑰,還可以繼續分散出每個扇區的字密鑰

這方法雖然不能阻止對每張卡的分别破解,卻給大規模破解增加了難度

繼續閱讀