IC卡介紹

上篇文章我們已經介紹了ID卡的工作原理與破解方法。這篇文章在此介紹IC卡的原理及破解方法。 IC不同於ID卡的是其卡內數據不僅僅是一串寫死的ID序列號,其內部有扇區以儲存IC卡內包含的大量數據,且可經過反覆擦寫。即IC卡可支持讀取與寫入。IC卡可以分爲:接觸式IC卡、非接觸式IC卡和雙界面IC卡。

M1卡介紹

這次我們主要介紹的是非接觸式IC卡。M1卡就是非接觸式IC卡中應用最廣泛的卡。M1卡就是Mifare非接觸式感應卡,M1卡數據保存期爲10年,可改寫10萬次,讀無限次。無電源,自帶天線,工作頻率爲13.56MHZ.M1卡內含加密控制邏輯和通訊邏輯電路。M1卡主要有兩種,一種是S50和一種是S70。主要應用:門禁、考勤、會議簽到、身份識別、物流、工業自動化、各種會員卡、如售飯、地鐵、公交代幣卡、俱樂部等電子消費、電子門票、動物識別、目標跟蹤、洗衣管理、各種一卡通等等。

M1卡存儲空間

M1卡分爲16個扇區,每個扇區爲4塊,每塊16個字節,以塊爲存取單位。每個扇區的塊0、塊1、塊2爲數據塊,可用於存儲數據。而每個扇區的塊3爲控制塊,包括密碼keyA,存取控制,密碼keyB。存取控制的作用是控制對應扇區記錄的讀寫權限與keyA和keyB的關係。由於每個扇區都有獨立的key和存取控制,因此M1卡可以做到一卡多用互不干擾。

每一張M1卡的0扇區0塊都稱作絕對地址塊,這一串是在卡片出廠時廠商賦予的,代表着這張卡獨立的身份識別信息。絕對地址塊的內容已被固化,無法更改。

M1卡控制位計算

以下爲控制位的結構,前6位爲密鑰A,中間4位存取控制,後6位密鑰B。4位控制位中前3位是真實的控制位,第4位是備用控制位,一般用不上,因此我們可以只分析前3位。

三個控制位以正和反兩種形式存在於存取控制字節中,決定了該塊的訪問權限。1個字節等於8個比特,而一個扇區有4個塊,每個塊有3個控制位,以下是控制位以比特形式的結構圖,_b表示取反存儲,這邊用紅色字體已標出。

以FF078069默認控制位爲例,我們將FF078069的16進制轉化爲2進制如下:

FF=11 1 1 1 1 1 1;07= 0 0 0 0 0 1 1 1;80=1 0 0 0 0 0 0 0 ;69=忽略

將以上的2進制數填入表格:

將取反的數再次取反以獲得原來的控制位:

存取控制中每個塊都的三個控制位定義如下,同時填入上表數據:

塊0,塊1,塊2控制位均是000,存取控制權限可對應以下表:

塊3控制位001,存取控制對應如下表:

可見塊0,塊1,塊2通過密鑰A或者密鑰B認證後可讀,可寫,可進行加值和減值操作。塊3密鑰A不可讀,但可通過認證密鑰A或B修改。驗證密鑰A或者密鑰B後,可讀可改寫存取控制。驗證密鑰A或者密鑰B後,可讀可改寫B密碼。

綜上,存取控制FF078069極不安全,我們可以自定義存取控制進行修改,只要利用上述步驟將想要的控制位列出逆向推回去即可。

M1卡認證原理

這裏介紹M1卡的認證原理即三輪認證。三輪認證是保障M1卡安全的重要手段,整個過程採用Crypto-1算法加密。以下是三輪認證的過程。

 1. 讀寫器指定要訪問的區,向卡發送身份驗證請求,並選擇密鑰A或B。
 2. 卡從位塊讀取密鑰和存取控制條件。然後,卡向讀寫器發送明文4字節隨機數Nt。(第一輪)
 3. 讀寫器利用密鑰和隨機數Nt計算生成一個新隨機數Nr,並將兩個隨機數一起加密爲8個字節的數據發送給卡片。(第二輪)。
 4. 卡解密得到Nt與Nr,驗證Nt,若通過再一次加密Nr併發送給讀卡器(第三輪)。
 5. 讀寫器解密得到Nr,驗證通過。

三輪認證在其原理上是可靠的,但是外國研究人員發現了該算法僞隨機數生成的漏洞,使得加解密所用到的僞隨機數可被正確預測,從而逆向計算出了三輪認證中的扇區密鑰。該漏洞的利用在後面會講到。

M1卡破解

對M1卡進行復制,修改的前提是破解出扇區讀寫對應的key,這邊介紹幾種key破解方式。

暴力破解法

暴力破解法原理簡單,在此不再贅述,在pm3終端輸入hf mf rdbl 00 A FFFFFFFFFFFF或hf mf rdsc 00 A FFFFFFFFFFFF命令,意思是使用keyA密碼FFFFFFFFFFFF讀取00塊/00扇區數據。

默認密碼破解法

使用hf mf chk *4 ? t命令,pm3會採用全球通用的12個默認密碼進行掃描,原理也較爲簡單,在此不再贅述。

嵌套認證攻擊

上部分我們講到,三次認證過程本身合理安全,但除了其僞隨機數可被預測外,還包含了一個重要漏洞。卡片在通過第一次三輪認證後就會將其他扇區的數據加密後發送給讀卡器,每個扇區中塊3用來存放密鑰,獲取了加密後的扇區數據就等於獲取了加密後的密鑰信息。此時,我們可以使用獲得的加密信息輔助暴力破解,大大降低了對48位密鑰的搜索空間,縮短了獲取密鑰的時間成本。這個漏洞利用的前提是必須獲得一個扇區的keyA或keyB,也就是我們常講的“知一密求全密”。

命令:hf mf nested1 0 A FFFFFFFFFFFF,已知0扇區密鑰A爲FFFFFFFFFFFF,進行嵌套認證攻擊。

Prng 攻擊

M1卡傳輸數據時會分爲若干個1bit的塊加密傳輸給讀卡器。而當讀卡器發送的加密數據中的某8bit部分全部正確而其他內容錯誤時,M1卡會給讀卡器發送一個加密的4bit的否定響應,而這4bit的響應有助於我們不斷枚舉卡內數據,結合算法的漏洞可以破解出某個扇區的密鑰,之後再進行知一密求全密等。終端輸入hf mf darkside命令進行,但是該漏洞僅針對部分全加密卡,我這邊的卡漏洞都已修復。

嗅探密鑰

上圖講到沒有Prng漏洞,建議我們進行嗅探攻擊。嗅探攻擊原理是使用硬件對卡片和讀卡器見進行中間人攻擊,目的在於獲取卡片與讀卡器三次認證中出傳輸的數據和UID號,再對Crypto-1算法進行逆向破解出真正的密鑰。將全加密卡降爲半加密卡,再進行嵌套認證攻擊。

終端輸入hf 14a snoop開始嗅探,將 PM3 高頻天線放置讀卡機之上,讓讀卡機正常讀卡。如果 Reader 正常工作,Proxmark3 就能監聽到正常通信數據,此時綠色燈亮。保持嗅探狀態多讀取幾次,板子上紅色燈與綠色燈會交替變亮,等到綠、黃燈都是亮的狀態時可以停止嗅探。嗅探完成後,連接PM3,按下button等待指示燈都暗掉,輸入命令hf list 14a即可列出數據。

PM3的文檔告訴我們,60表示keyA進行身份驗證,61表示用keyB進行身份驗證。因此我們在獲得大量數據的第一步是尋找60或61開頭的數據。

以下爲搜索到的keyA數據,我們可以分析卡片與讀卡器之間的對話。

 04 00:卡片表明了自己的類型。
 93 20:讀卡器請求卡片發送自己的UID號。
 7e b4 60 d2 78:卡片發送自己的卡號。
 60 03 6e 49:驗證03塊的keyA密鑰,6e49爲該命令CRC校驗位(忽略)。
 88 fd b7 42:隨機數Nt
 3c df c7 d1 8c 6de4 65:加密後的Nt和Nr。
 88d2 60 5a:解密後的隨機數Nr。

將以上信息輸入Crypto-1算法的逆向軟件中,得出該塊最終的key。之後可利用嵌套認證攻擊,得出全部密鑰。

M1卡複製

前文說到,每一張M1卡的0扇區0塊都是出廠時廠商賦予的絕對地址塊,我們無法在M1卡內直接修改它。假設有一家公司的一卡通是通過絕對地址塊進行索引,將其他數據存儲在後臺數據庫的話,我們有辦法進行攻擊嗎?說到這不得不提一下M1卡的複製子卡——UID卡,FUID卡,CUID卡。

UID卡

UID卡是一種IC卡,卡片的絕對地址塊可以任意修改,重複修改,此卡可以修改任意扇區,作爲M1複製的子卡,主要應用在IC卡複製上,但一些刷卡設備會檢測卡片的00塊是否可重寫,以此判斷是否爲複製卡而屏蔽,這時就需要用 FUID或CUID代替。

FUID卡

FUID是最早出來避免檢測的特殊芯片,但FUID卡一旦寫入,備份的dump文件便固化了,成爲一張普通的M1卡,喪失了UID卡的特點,專門對升級的防復卡和防復讀頭。FUID卡的防屏蔽作用目前爲止仍是最好的,但他的缺點是成本太高,無法重複利用。

CUID卡

CUID卡可無限次修改0扇區,一般都可以替代FUID卡。無需鎖卡自動起防屏蔽作用,可重複擦寫使用無廢卡,不會像FUID鎖死後才起到防屏蔽作用,更不會因爲鎖卡而變成一次性卡,無法更改卡內數據成爲廢卡。但仍有被檢測出來的幾率,所以建議先使用CUID再使用FUID。

綜上,我們可以利用M1卡的複製進行攻擊,如某公司以卡內00塊爲識別碼進行索引,那麼可以複製修改00塊,冒用他人身份通過門禁,飯卡消費等。另外如水卡等將金額信息寫入扇區內的,假如我們無法成功分析扇區內信息,也可記錄下水卡某一時刻金額,消費後再將記錄時刻的數據寫入,就達到了將金額變回記錄時刻數值的效果。

實戰扇區分析

這裏拿到一張金博電梯的電梯卡,AB密碼均是FFFFFFFFFFFF,因此我們直接獲取到了扇區數據,我將有數據的一塊扇區放到excel中便於我們觀察。如圖:

事實上及時我們獲取到了扇區數據也不一定可以完美破解,有些廠商會將明碼存於扇區中,有些則是加密後的暗碼,需要破解其算法纔行,但難度較大且需要大量的樣本。幸好,我拿到的這張電梯卡廠商並沒有設置成暗碼,給了我們可趁之機。

現在我們需要猜一下卡內可能會存在什麼數據,首先是電梯樓層的權限,小區的樓號。前兩天我的電梯卡過期了,保安把我的卡在讀卡機上刷了改了一下於是就可以,並且問了我的房號。所以我懷疑裏面還包含日期和房號信息。

A3:E3和F3:J3我感覺像某個日期2022/1/1/00:00和2022/02/28/23:59,尤其是後者我懷疑是到期時間,那麼前者應該是開卡時間,至於爲什麼開卡年份是2022暫未想明白,可能系統只校驗過期時間,或者系統的時間就是2022年。於是3行就沒有其它數據了,暫時排除。

我的房號是513,在裏面搜索發現M2:N2=05 0D,分別轉換爲10進制就是513,那麼樓層數和樓號一定在前面。

我的樓號是1幢,樓層權限應該是1樓,5樓,3樓(物業所在樓層)。首先我定位在3B=01,這應該是我的樓號,一般通卡的樓層是00或FF,於是我將其改爲00。

樓層的位置我找了很久和1,3,5有關的數據,如何用16進制儲存樓層信息這個問題困擾我。最後定位在2J=15。將15轉換成2進制是0 0 0 1 0 1 0 1,正好第1,3,5個是1。那麼將其改成FF:1 1 1 1 1 1 1 1 就可以所有樓層都有權限(很簡單吧)。我這幢樓有10多樓,那麼以此類推將I2和H2均改成FF。最後我修改後的扇區如下:

結論

以上爲M1卡的工作原理與破解原理。所以我個人建議IC卡的安全分以下幾個要點:

 1. 扇區不使用暗碼或滾動碼代替明碼儲存。如有條件將金額等敏感數據存於後臺數據庫,根據卡號進行索引。
 2. 不使用默認或弱密鑰,每一個扇區的keyA與keyB均設置不同,做到一卡一密,且修復卡的Prng漏洞。
 3. 不使用默認的存取控制FF078069,根據需求合理設置安全的控制位,否則容易扇區鎖死。推薦08 77 8F 69(塊012 keyAB均可讀,僅keyB可寫。塊3 keyA和keyB均不可讀,只能用keyB寫入。控制字節keyAB均可讀,只有keyB可寫。
 4. 升級更新讀卡器,識別基礎UID與CUID複製卡。
 5. 完善管理制度,提高人員安全意識,不將卡片隨意給予他人。

*本文作者:zyh0830,轉載請註明來自FreeBuf.COM

相關文章