前言
早一段時間看到一篇看雪論壇關於邏輯嗅探破解接觸式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周,說下經驗總結吧。
·書本上的知識還是有用的!當時破解時計算機組成原理、數字邏輯基本上忘得一干二凈,無奈又重讀了一遍。要是還記得的話,估計進度可以提前幾天。
·英語很重要啊!要不然文檔都看不懂,中文翻譯有時候很水。
·基礎很重要,這一起都會變得游刃有余。
參考文檔









