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