一次蜿蜒曲折的RFID破解之路


前言

早一段時間看到一篇看雪論壇關於邏輯嗅探破解接觸式IC卡口令的文章,激起鄙人對rfid的興趣。遂准備拿學校的卡一展身手。

0×00 前期准備

經過初步了解,學校的rfid卡片分為兩種。校園卡采用MIFARE Classic 1K,澡卡采用Atmel T5557。之前看過無數M卡的破解文章,於是決定跳過此卡(后通過proxmark3成功破解)轉向更為小眾更具挑戰的T5557卡。

通過閱讀T5557的文檔,淘寶了如下工具:

·T5557讀卡模塊(加USB轉TTL)
·T5557白卡
·USB 邏輯分析儀
·杜邦線若干

0×01 制作T5557卡讀寫器

本來准備淘寶一個現成的讀卡器的,發現價格參差不齊。知網看了幾篇T5557讀寫器設計,大概了解到讀寫器原理。

讀寫器 = 讀卡模塊 + usb轉TTL(與電腦通訊模塊)

0×02 T5557科普

特征:

·非接觸方式的讀/寫數據傳輸
·從100 KHz到150KHz的無線電載波頻率
·與e5550產品兼容並擴展的應用模式
·小容量, 其結構與國際標准 ISO/IEC11784/785相容
·在芯片上掩模有75pF的諧振電容
·包括32bit密碼區在內的7x32bit的E2PROM存儲空間
·單獨開設有64 bit存儲空間作為廠商可追溯的數據區
·32-bit配置寄存器在E2PROM中可作如下設置:
·數據速率:RF/2 到RF/128或e5550的固定值(通常使用在RF/32或RF/64)
·調制/編譯碼:FSK、PSK、曼徹斯特、雙相、NRZ(典型為:曼徹斯特)
·其他的選項:密碼模式、最大區塊特性、按請求回答(AOR)模式(默認值:PASS=0、MAXB=7、AOR=0);反向數據輸出、直接訪問模式、序列終結符、寫保護(每一塊完全鎖位)、OTP功能等。
·存儲體結構:存儲體是330bit的E2PROM,安排在0和1頁的10個塊中,每個塊(包含被同時規划的bit鎖塊位)有33 bit。第0頁有8個存儲塊,其中的塊0包含配置/控制數據,在正常讀操作期間是不被傳輸的。塊7可以被用戶當作寫保護密碼使用,與最大區塊的顯示值配合,可設置某些塊值或第7塊密碼值不可見,只有知道密碼的合法用戶才能訪問卡片中的數據塊。每塊存儲體的位首,即第0bit,是該塊不可查看但可一次性改寫的鎖塊控制位(即OTP特性。為安全起見,一應提供改寫各塊第0位的OTP功能)。第1頁的塊1和塊2包含可追溯數據,並且被Atmel在制造測試期間進行其數據規划並且鎖定。

還有些特征在此不再贅述,具體的在參考給出的鏈接文檔中。

0×03 首戰告捷

安裝好USB轉TTL的驅動,用賣家給的技術文檔通過串口助手發送相關指令。后來懶得看指令直接問賣家要了個他寫軟件(存在卡片與讀卡器匹配問題,建議在充分閱讀T5557技術文檔的情況下操作!)。

撒花O(∩_∩)O哈哈~

通過上圖可以初步斷定:

1.卡片存在密碼,只能進行塊讀。
2.塊二和塊四前面2個字節為卡片金額,即為¥8.01

然后拿張賣家送的白卡把數據一套,抱着試一試的心態拿去澡堂洗澡去了,居然能夠使用。這一點我思考了好久,可能是白卡塊0區設置的是不需要密碼讀寫,然后澡卡機器采用的是密碼寫 70 bit (PWD=1),從而忽略了與密碼匹配的過程。

0×04 再次深入!

其實到0×03已經達到目的了,但鄙人不是搞黑產的鄙人是Geek啊,本着Geek精神決定再次深入,試着破解相關數據關聯。

冷靜的分析了下,想出了三個方案:

·猜!腦洞大開的猜!
·通過充值軟件,分析出數據聯系。(希望不大)
·邏輯分析澡卡機器,得到數據關系。

0×05 腦洞大開的猜!

開始幾天死了好多腦細胞,一直在想金額后面2個字節是干啥的。可能是校驗碼但一直想不到是什么校驗。

后來瀏覽官網發現這樣一句話:

數據傳輸過程中CRC校驗

刷卡記錄

1st       2nd
00024xxx  00024xxx   可能為學號
1111F16C  0810FB30   金額及校驗碼
01440000  01440000   卡的類型(用戶卡、管理卡巴拉巴拉)
1111F16C  0810FB30   同上
00003D3O  00003D3O   校驗數據
00003D3O  00003D3O   同上

塊1-6通過CRC校驗得到相同的校驗碼,所以 CRC(塊二/快四) == CRC(塊五/六)

本來准備通過crc校驗碼逆向的,后來看看又是移位、異或什么的麻煩的要死,遂正向暴力破解簡單粗暴(^__^) 嘻嘻…… 。

草草幾行python代碼

import crcmod
import string

#create CRC16 calculator
crc16 = crcmod.predefined.mkCrcFun('crc-16')

#wait for user input

hstr = '00 00 8D 7F'
blah = ''.join(chr(int(c, 16)) for c in hstr.split())
check = hex(crc16(blah))  

for i in range(0, 255 + 1):
    for j in range(0, 255+1):
        str_hex_i = hex(i)[2:].upper() #format string like 'EE'
        str_hex_j = hex(j)[2:].upper()
        data = '50 00 %s %s'%(str_hex_i, str_hex_j) #format string like '09 13 9F EE'
        blah = ''.join(chr(int(c, 16)) for c in data.split())
        data = hex(crc16(blah))
        if data == check:
            print str_hex_i, str_hex_j
            break

到此已得到金額以及后面2個字節校驗碼的關系了,但是還是不知道卡密是怎么組成的,到底是一卡一密還是多卡一密。還是本着Geek決定再次深入!!

0×06 Creak官網,拿到軟件??

本來設想進官網拿到軟件的,准備一展身手的。拿到shell之后發現啥都沒有,一大堆客戶資料貌似可以社工,算了也不喜歡弄那個遂放棄。郵箱系統可能存在蛛絲馬跡,無奈才疏學淺。

此非本文的重點,故拿站過程跳過 。也不存在技術含量,慣用套路而已。

0×07 邏輯分析澡卡機器

是時候亮出下一個奇門遁甲了。

USB 邏輯分析儀

拿到澡卡機器后一番解剖,右下角的紅圈的芯片就是我們要邏輯嗅探的對象。通過芯片的文檔找到input、output和gnd的針腳。

連接好的效果圖

安裝好saleae軟件后,參考T5557文檔給出的數據編碼方式以及命令格式

然后在浩如煙海的數據流中找到該序列(此過程需要極大的耐心,需充分了解數據調制方式,因篇幅簡化了分析過程)

Protected write:

1p + Password 32 + L + Data 32 + Addr

1p :頁面選擇(10/11)
Password :32位密碼
L :鎖位, 是否鎖定該塊數據(0/1)
Data:32位數據
Addr:塊地址位,例如塊5(101)

通過保護寫的格式再結合數據圖得到密碼為:92 10 92 40(hex)

0×08后記

破解基本上告一段落,但還是無法通過卡號直接推導出密碼。哎!以后有空慢慢分析吧這個也急不來。

前后大約歷時3周,說下經驗總結吧。

·書本上的知識還是有用的!當時破解時計算機組成原理、數字邏輯基本上忘得一干二凈,無奈又重讀了一遍。要是還記得的話,估計進度可以提前幾天。
·英語很重要啊!要不然文檔都看不懂,中文翻譯有時候很水。
·基礎很重要,這一起都會變得游刃有余。

參考文檔

T5557技術文檔

U2270B文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM