文章的最開始,先來致敬RadioWar。一直手癢RFID這個領(lǐng)域,準(zhǔn)備了一段時間,開始入門RFID。
先來普及一下基礎(chǔ)知識:
RFID即為射頻識別。NFC近場通信。很多人把NFC和RFID混為一談,但實際上NFC可以理解為“以RFID技術(shù)為基礎(chǔ)的一種產(chǎn)品”。
RFID技術(shù)中所衍生的產(chǎn)品大概有三大類:無源RFID產(chǎn)品、有源RFID產(chǎn)品、半有源RFID產(chǎn)品。根據(jù)RFID Tag的工作方式,有可分為被動,主動、半主動三種。最常見的就是被動式的了。我們目前接觸的多的就是無源、被動式產(chǎn)品,其中最為廣泛常見的就是MIFARE Classic 1K卡,簡稱M1卡、S50卡。M1卡有從0-15共16個扇區(qū),每個扇區(qū)配備了從0-3共4個段,每個段可以保存16字節(jié)的內(nèi)容。每個扇區(qū)的03段是用來保存KeyA,KeyB和控制位的,因為M1卡允許每個扇區(qū)有一對獨立的密碼保護,這樣能夠更加靈活的控制數(shù)據(jù)的操作,控制位就是這個扇區(qū)各種詳細(xì)權(quán)限計算出來的結(jié)果。每張M1卡都有一個全球唯一的UID號,這個UID號保存在卡的00扇區(qū)的00段,也稱為廠商段,其中前4個字節(jié)是卡的UID,第5個字節(jié)是卡UID的校驗位,剩下的是廠商數(shù)據(jù)。并且這個段在出廠之前就會被設(shè)置了寫入保護,只能讀取不能修改,當(dāng)然也有例外,有種叫UID卡的特殊卡,UID是沒有設(shè)置保護的,其實就是廠家不按規(guī)范生產(chǎn)的卡。
更多的資料請百度、谷歌之,就目前來說我們簡單了解下就夠了,有了這些大體的了解,我們就開始今天嘗試破解一張水卡(洗澡用,宿舍常見)試試。
工具:ACR122U-A9,UID可寫白卡,待破水卡
平臺&軟件:Win7x64、XP:RadioWar的NFCGUI-Pro,簡化版的mfocgui。
Kali平臺:mfoc,,nfc-mfclassic。
0×00開頭
關(guān)于ACR122U-A9這個讀卡器,雖然比不上PM3那么神通廣大,但是對于入門學(xué)習(xí)來說絕對算得上神器了。某寶上一搜一堆,很多店都賣165元左右(爆個內(nèi)幕;其實都是一家)。然后就是UID可寫的卡了,大約3元一張。平臺選擇這兩個是因為入門來說自然首選Win平臺,但是其中出現(xiàn)了一些問題,雖然失敗但也貼出來供大家查錯。
0×01分析、確定卡片
首先確定卡片是M1卡,且數(shù)據(jù)是保存在卡里而不是服務(wù)器上的。通過圖1,我們可以看到機器只有電源線,沒有網(wǎng)線,且機器已經(jīng)很老了,肯定不能是無線方式聯(lián)接。
我想到了一種“非正式”的一種鑒別方法,大多數(shù)注明“不記名不掛失”的卡片都是數(shù)據(jù)存放在本地的IC卡,否則他們完全可以提供記名掛失的功能的,對吧?
所以我們有把握這肯定就是IC卡,金額數(shù)據(jù)存放在卡里的了。那么對于這種卡,我們有兩種讓錢“無限”的方式:1.直接復(fù)制現(xiàn)有的卡,因為金額可以任意復(fù)制,C/V模式,但是這樣太沒有技術(shù)含量,而且成了純粹的為了利益了;2.嘗試了解卡片內(nèi)數(shù)據(jù)塊的實際意義作用,找到數(shù)據(jù)加密方法。對應(yīng)的寫出解密方法,這樣卡內(nèi)余額就我們隨意控制了。當(dāng)然,第二種方式是以第一種方式為基礎(chǔ)的,所以我們一步一步來嘗試。
0x02Win嘗試
根據(jù)網(wǎng)上提供的資料(http://bobylive.com/static/1491),我們嘗試使用驗證漏洞,也就是利用mfocgui破解M1卡的密鑰。先是Win7 x64,點擊按鈕即可一鍵自動破解,但是出現(xiàn)了問題。當(dāng)試到05扇區(qū)的時候,程序就開始報錯,然后ACR122U莫名與PC斷開聯(lián)接。網(wǎng)上搜索無果。嘗試RadioWar的NFCGUI-PRO,同樣的問題。同樣的軟件,后來換到XP,問題依舊。說明在Win平臺上還是多少有點問題。不如Linux上的兼容性好。
0x03Kali嘗試
值得一提的是,Kali原生支持ACR122U的,而且里面內(nèi)置了很多的NFC安全研究的工具,極大的方便了我們的工作。(注意盡量不要用Win上的Kali虛擬機,因為USB口還是通過Win平臺,所以兼容性問題還是可能存在,我的就會出現(xiàn)Usb Timeout錯誤)
進入Kali我們能看到很多RFID/NFC的工具。我們用到的是mfoc和nfc-mfclassic這兩個工具。Mfoc是利用驗證漏洞破解key的一個工具,而nfc-mfclassic則是對卡片進行讀寫的工具,我們可以從卡片里dump出來數(shù)據(jù)到本地,然后利用hexeditr分析編輯,再將數(shù)據(jù)導(dǎo)入到卡里去。
由于網(wǎng)上很少有這類工具的中文使用說明,我在此一并給大家介紹了:
mfoc: invalid option — '-'
Usage: mfoc [-h] [-k key]… [-P probnum] [-Ttolerance] [-O output]
h 打印幫助
k 將一個新的密鑰添加到密鑰表里
P 每扇區(qū)測試多少個密鑰(默認(rèn)20)
T 隨機和隨機范圍
O 輸出到的文件
為了以后使用方便,我們將破解的命令寫成shell腳本:crack2file
if [ $# -lt 1 ]
then
echo "Usage:"
echo " readto dumpFile"
else
mfoc -k ffffeeeedddd -O $1 #這句是我們真正用到的命令,這里的key以后可以換成我們破解出來的key,加快速度
fi
我們連接上ACR122U到電腦,輸入./crack2file tmp/unknow.mdf,就會開始自動破解了。
如果這張卡存在默認(rèn)密碼的話,理論上我們就能得到全部密鑰。稍等幾分鐘,我們看到mfoc提示成功,dump文件已經(jīng)得到,保存?zhèn)浞輲状巍H缓笪覀冊俅稳ニ畽C處刷卡,消費1元之后余額為8.00。因為我們已經(jīng)有卡的加密密鑰了,所以我們不必再次破解,我們通過使用nfc-mfclassic工具,使用已經(jīng)有的導(dǎo)出文件再次導(dǎo)出卡內(nèi)數(shù)據(jù)。
同樣再給些中文使用幫助:
r|R|w|W 從卡片中讀取數(shù)據(jù)到文件中(r),讀取文件然后寫入到卡片中(w)。或者如果你是使用uid可寫卡,使用強制讀取R,強制寫入W可以改寫uid。
a|A|b|B 使用keyA還是keyB,當(dāng)有錯誤的時候就停止(a,b)或者忽略錯誤(A|B)
<dump.mfd> dump到的文件
<keys.mfd> key文件
F 如果UID不一樣的話也繼續(xù)
我們使用命令:nfc-mfclassic r A 600.mfd tmp/unknow.mfd f(建議寫成腳本)。
0×04分析導(dǎo)出的Dump文件
成功導(dǎo)出變化了的dump文件。然后我們用hexeditor(這個會自動變成正常閱讀順序,當(dāng)然某些數(shù)據(jù)不懂時我們可以嘗試使用hexdump,這個是反端的順序,可能會有新的發(fā)現(xiàn))。打開分析。通過對比文件變化,我們發(fā)現(xiàn)有一部分內(nèi)容變化了。
04 0A 52 18 7B EF 03 20 00 6A C8 01 00 3C00 1E
4F 4B 18 7B EF 03 20 00 6A C8 01 00 3C 001E 00
04 0A 4B 18 7B EF 03 20 00 6A C8 01 00 3C00 1E 8.00
04 0A 52 18 7B EF 03 84 00 7C EB 01 00 3C00 1E
4F 4B 18 7B EF 03 84 00 7C EB 01 00 3C 001E 00
04 0A 4B 18 7B EF 03 84 00 7C EB 01 00 3C00 1E 9.00
這其中hex(900)=0×384,hex(800)=0×320,所以這三行的對應(yīng)數(shù)值就是金額。后面7C EB 01和6A C8 01是變化的內(nèi)容。然后拿這張卡我再去刷一次,確定金額已經(jīng)正確分析出來,但是后面的6A C8 01變?yōu)榱?A C8 02。既然這三次變化沒有規(guī)律,為了確認(rèn)后面的變化部分是否與時間有關(guān),我同一個數(shù)據(jù)復(fù)制了兩張卡,然后先后到機器上刷了一樣的錢,然后回來再dump出來,發(fā)現(xiàn)兩張卡內(nèi)的數(shù)據(jù)一模一樣,所以推斷與時間無關(guān)。但是!就因為最開始下的這個結(jié)論,導(dǎo)致我在解密的路上越走越偏。那么我猜測可能是金額與UID或者某部分內(nèi)容通過異或,或,與等常見的運算。我嘗試算了很長時間很多種可能性,最終沒能算出來。暫時只好將卡多復(fù)制幾次,繼續(xù)慢慢嘗試。
0×05轉(zhuǎn)折點
接連刷了幾天,得到了很多數(shù)據(jù)。直到12月2號中午,再次把所有數(shù)據(jù)放在一起對比時,忽然發(fā)現(xiàn)卡里面內(nèi)容有點奇怪。當(dāng)我用變化的6A C8這部分?jǐn)?shù)值與UID異或的時候,組成的內(nèi)容再加上后面的01好像有點規(guī)律了:
最開始測試 繼續(xù)測試 昨天 今天
112701 112702 112901 120101 120201
怎么忽然從1127變成1201然后是1202了?今天是12月2號!也就是說我前幾天測試的時候應(yīng)該是11月27日。112701,112702,是指第一次刷卡,第二次刷卡。然后至于那次單獨測試是不是與時間有關(guān),因為我是在同一天測試的數(shù)據(jù),而它只記錄日期。所以自然數(shù)據(jù)就一樣了。
知道了這些,我們就把卡上所有信息都掌握了。其他字段都是些無關(guān)緊要且不會變的東西,因為卡是匿名買的,不記名不登記。
了解了這些,我們修改為8888即為88.88元試試,hex(8888)=0x22b8。然后寫入卡內(nèi),去刷,成功了!
但是,當(dāng)我再次刷準(zhǔn)備拍照的時候發(fā)現(xiàn)卡失效了,換一個機器,發(fā)現(xiàn)刷一次之后卡就失效了。經(jīng)過多次測試發(fā)現(xiàn),卡內(nèi)余額只要大于50元錢,當(dāng)前卡就臨時失效,而我們購買單張卡時,單張卡內(nèi)有的余額正好就是50。也就說機器內(nèi)固化了檢測卡內(nèi)余額的功能,實在是想不通為什么要這樣的雞肋功能,對于機器的可升級維護性造成了負(fù)擔(dān)。
至此,這張卡我們就徹底弄清楚如何修改金額了。雖然這只是一個較為簡單的數(shù)據(jù)存放案例,但是作為M1卡入門還是不錯的教程。希望這篇文章能為大家在RFID安全方向上起一個拋磚引玉的作用!