RFID入坑初探——Mifare Classic card破解(一)

wyzsk發表於2020-08-19
作者: redrain有節操 · 2014/05/25 14:29

0x00 前言


之前一直想要玩無線安全,旺財大牛說門檻低(哪裡低啦=。=web狗表示我很笨啊,汪汪),於是乎入手了ACR122u,想從NFC開始入坑,就有了這篇文章,先普及下基本知識。

Mifare Classic card提供1k-4k的容量,我們經常見到的是Mifare Classic 1k(S50),也就是所謂的M1卡。M1卡有從0到15共16個扇區,並且每個扇區都有獨立的密碼,每個扇區配備了從0到3共4個段,每個段可以儲存16位元組的內容,反正從0開始數 就對了(和陣列下標為0開始一樣)。

每個扇區的第4段呢是用來儲存KeyA,KeyB和控制位的,每張卡還有一個唯一標識的UID號,具體的卡結構大家可以百度一下看看。

我們本文的研究物件就是這玩意兒,谷歌告訴我們,這種卡類的攻擊方式大概分為這麼幾種:

1)暴力破解

爆破對於M1卡的破解來說比較有效,因為M1卡是被動卡,需要讀卡器來供能,切斷供能後卡的臨時資料就丟失了,也就是說不會存在輸入過多錯誤密碼後造成的鎖死之類的情況 FFFFFFFFFFFF、A0B0C0D0E0F0等等都是M1白卡的預設密碼,所以當我們使用mfoc這樣的工具來爆破的時候基本上都是用這些預設密碼來填充剩餘扇區的密碼。

2)重放攻擊

剛剛我們說了M1卡是被動卡,當它被供能的時候會產生隨機數列,切斷供能後資料不會儲存,再次供能又會產生一模一樣的數列,然後就可以控制切斷,再次供能的時間計算出這個數列,進行重放攻擊來達到修改資料的目的。

3)克隆卡片(卡複製)

M1卡的扇區可以儲存資料,所以大部分的卡片會選擇加密扇區後儲存資料,我們可以用 uid卡來進行復制,每張M1卡在0扇區第1段都有一個唯一標識,而且是保護無法修改的,uid 卡就是沒有設定0扇區保護的卡,所以你可以隨意的修改你想要的uid,這樣我們就可以克隆出一張連uid都相同的卡片了。(但是要注意不要把00扇區弄 壞,之前測試的時候就未知原因寫壞了00扇區無法讀入了)。

4)嗅探攻擊

這裡要用到PM3這個神器,在卡和機器資料交換的時候嗅探資料,進行攻擊,利用XOR算key工具就可以把扇區的金鑰計算出來(窮逼表示根本買不起)。

0x01 細節


科普結束,接下來以一個例項來講解以下破解M1卡的姿勢(筆者才開始入坑,如有不對,請大牛斧正)。

關於暴力破解,我們此處用到這麼幾個東西,ACR122u,mfoc,libnfc。

其中ACR122u作為硬體供能,讀寫的作用,mfoc用來爆破,libnfc用來寫入資料。

enter image description here

可以看到讀出了我們的卡型別,下方的keyA keyB就是要我們破解的地方,當然,也可以使用另外一個簡化版本,更粗暴簡單一些,百度M1卡服務程式即可。

enter image description here

稍等片刻後就發現上下各16個勾勾都打上了,說明成功爆破了,成功後會在當前目錄下生成一個dump檔案,這樣,這張卡的資料就被完全dump下來了,得到dumpfile1但是隻有1k的大小,在win下操作的時候需要用到一個fixdump的工具來填充剩餘部分

fixdump dumpfile1

即可修復,大小為4k,然後我們去消費一下這張卡(讓你要修改的區域的資料改變)

enter image description here

其中前6個位元組和後6個位元組的FF FF FF FF FF FF即為秘鑰,中間的幾位FF 07 80 69即為控制位。

再次dump資料dumpfile2並修復

fixdump dumpfile2

就此,我們有了兩個樣本,然後做hex diff,linux下直接用diff,win下可以使用hexcmp2

enter image description here

diff後發現了資料變動的區域。

本文只修改簡單的金龍卡水卡功能,所以取樣兩次後就可以輕鬆找到資料所在的扇區,如果是做比較複雜的修改那麼取樣可能得多次,比如做門禁攻擊啥的。

可以看到這個扇區內的一些數值,末端的40,FF啥的都是存放數值的地址,我們不用管它,在M1 卡中本來要進行一次的取反和倒序存入,但是可能本屌的渣學校的卡居然直接進行16進位制換算為10進位制後就是水卡金額數目。。。

這裡多說兩句,一般情況下,資料存入是倒序的,比如F9 FE,其實真實資料是FE F9,然後換算為2進位制進行取反再換算為10進位制,有可能還會遇到資料的加密,我們再解密後就可以得到存入的數值了。

圖中是我成功修改了最大數值後的,金額為640.00元,hex為fa 00,做測試的時候筆者太高估了學校,多次猜測其換算的演算法,取樣了20來次後腦洞開了,直接透過10進位制轉換16進位制。。。居然就是那麼簡單!F9 FE為63998小數點請忽視。

然後使用libnfc來寫入資料

.
fc-mfclassic.exe w b dumpfile_new dumpfile_old

enter image description here

至此,破解差不多就那麼完成了(單純指做資料修改的目的,不包括解決什麼後患啊之類的情況)。

最後上一張成功改寫後的測試圖。

enter image description here

破解時長共3個小時(來回取樣浪費了不少時間)。

關於驗證漏洞攻擊,在前面科普的時候說過,每個扇區都有獨立的密碼,在通常情況下,有些儲存關鍵資料(比如飯卡里的錢)的扇區會更改密碼,比如,某張卡里的第4扇區存著錢,更改了預設密碼,但是其他扇區並沒有更改預設密碼,那麼我們怎麼透過其他扇區來操作第4扇區呢,這裡就會用到驗證漏洞攻擊,也就是nested authentication 攻擊,通常會在我們知道16個扇區中任意一個扇區密碼來破解其他扇區的時候使用。

首先我們知道,M1卡的演算法是個對等加密演算法,讀卡器中也儲存著同樣的密碼,也是用同樣的演算法加密,當卡和機器互動的時候,讀卡器首先驗證0扇區的密碼,卡給讀卡器以明文方式傳送一個隨機序列a(明文),然後讀卡器透過跟加密,同時自己產生一個加密的隨機序列b(密文)返回,卡用自己的密碼解密之後,解密出來的序列如果是自己之前傳送的a,則認為正確,然後透過自己加密演算法加密讀卡器生成的隨機序列傳送給讀卡器,讀卡器解密之後,如果跟 自己之前傳送的隨機數b相同,則認為驗證透過,之後所有的資料都透過此演算法加密傳輸。

enter image description here

在整個過程中,只有a是明文,之後的都是密文,card傳送一個a給讀卡器之後,讀卡器用錯誤的密碼加密之後傳送給card,card肯定解密錯誤,然後驗證中斷 但是,我們知道其他扇區的的密碼,驗證的時候,使用這個扇區驗證成功之後,後面所有的資料互動都是密文,讀其他扇區資料的時候,也是card首先傳送隨機數a,這個a是個加密的資料,之前說的每個扇區的密碼是獨立的,那麼加密實際上就是透過card這個扇區的密碼相關的演算法加密的a,這個資料中就包含了這個扇區的密碼資訊,所以我們才能 夠透過演算法漏洞繼續分析出扇區的密碼是什麼。

也就是因為這個原理,在驗證漏洞的時候才必須要知道至少一個其他扇區的密碼。

0x02 總結


對於才入坑的朋友來說,爆破是最簡單粗暴的辦法,交給程式自動化進行即可(有可能接下來一篇或者下下一篇寫根據重放攻擊進行破解的)。

其次,主要進行的工作就是多次的取樣和反覆diff,體力活加腦力活。

預告,等閒下來繼續研究一下mfoc的其他破解功能,比如重放之類的,或者完全破解校園卡的其他功能(因為是聯網的,所以目測得我順手拿下後勤系統吧)

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章