1. 程式人生 > >[原創]用邏輯嗅探破解接觸式IC卡口令

[原創]用邏輯嗅探破解接觸式IC卡口令

還得 否則 containe 接下來 高電平 不想 根據 單位 BE

最近兩周對接觸型IC卡很感興趣,就動手實踐了一下,最終實現的效果是通過破解IC卡口令實現對數據修改,然後就可以隨意洗衣服嘍~
IC卡從數據傳遞方式上劃分為接觸型和非接觸型兩種。接觸型的卡片表面有金屬貼片,用於連接卡內芯片和外界器具(洗衣機,電表,打水器)。而非接觸性的卡片則是通過射頻信號與器具進行信息傳遞。IC卡本身是無源的,需要依靠外部器具提供的能量驅動內部電路。
時下更流行是非接觸型的IC卡或稱射頻卡,如公交一卡通、校園一卡通。從時間上來說射頻卡出現的更遲,常搭載CPU使得其更為智能,擁有更復雜的數據處理能力。隨著M1破解的新聞,有關於射頻卡的破解討論就遍地開花了。不過現實中,射頻卡的破解要考慮的不僅僅是卡片自身,比如校園一卡通的數據在服務端也有記錄,單方面的數據修改可能使卡被鎖技術分享圖片



接觸型的IC卡經歷了從單純的數據存取卡,加密卡,CPU卡的演變,其應用範圍也很廣,至今一些單位,校園,小區的洗衣卡,電卡仍沿用著接觸型IC卡,只是被掩蓋在射頻卡的光芒之中,變得不那麽起眼了而已。直觀上感覺由於其出現的較早,安全性缺陷可能更為顯著,所以對於IC卡的DIY活動就從接觸型IC入手了。
為此,首先要入手的就是讀卡器:查看卡內數據是了解IC卡信息最直觀的橋梁(我使用的是ACR38讀卡器,這類使用U口連接電腦的讀卡器免去了筆記本沒有串口滋生的煩惱技術分享圖片)。讀卡器配套的軟件和SDK實例代碼很多,但嘗試了一圈覺得CardTool是最靠譜的一個工具。接觸式IC卡有很多種,他們的存儲空間不盡相同,控制指令各有千秋,加密與否不能一概而論,時序邏輯千差萬別,讀卡器也只能兼容常見的類型的IC卡,難免有漏網之魚。讀卡器能夠產生操作IC卡所需要的時序邏輯電平(發出IC卡所需要的控制字)以讀取或修改卡內數據。
電腦操作讀卡器需要控制字,讀卡器操作IC卡也需要控制字,這一前一後的兩種控制字要區分開來加以看待。讀卡器的控制字只有一套,寫在讀卡器配套的手冊中,並在SDK中實現了通過U口發送這些控制字的函數。而IC卡的控制字有很多套,因卡而異,需要到該種類型IC卡的手冊中查詢(這部分對用戶透明,屬於讀卡器操心的事兒)。本次操刀的IC卡類型是SLE4442,西門子公司的加密卡產品,該類型的卡片還算比較常見,我用的洗衣卡,電卡,打電動的會員卡都屬於此類型。
如何判斷IC卡類型是眼下亟待解決的事兒,我認為可以有三種方法:

1.使用CardTool時,類型挨個試,看哪個能正常操作卡片,最初對IC卡了解有限,所以就用此法土法校驗了一下。隨便選擇一種類型,然後點擊重置,根據返回的標識信息,就能判斷選擇是否正確了,選擇正確時,重置操作會返回卡片類型標識特征字。
技術分享圖片
技術分享圖片
2.如果沒有讀卡器,僅根據外觀判斷也是可行的,taobao上各商家銷售的接觸式IC卡樣圖是主要的參考依據,比對金屬片的花紋劃痕就很容易確定卡類型。
3.幸運的話,有些卡背面就有寫自己的類型
一旦確定了類型,就可以使用CardTool配合讀卡器對卡片進行操作了。在此之前先介紹一下我使用SLE4442的加密卡,所謂加密是指卡片的寫操作權限受口令保護。卡片存儲區域包含3個部分,應用存儲區,口令存儲區,和寫保護控制區,前兩個區域是要重點關註的。
應用存儲區大小為256字節,其中前32個字節存放西門子的廠商信息,我手頭的這些SLE4442的該區域數據內容完全相同。下圖表示在重置後發出讀指令(FF B0 00 00 00 20,這是讀卡器的控制字),讀取卡片前32個字節的內容,返回了32個字節和9000(表示操作未產生錯誤)。

技術分享圖片
前32個字節受寫保護,一次寫入無法修改(從硬件上燒斷熔絲來阻止重寫操作)。應用存儲區的33-256字節就是不同單位使用卡片時自行定制的了,通常包含的數據可以有:卡標識(說明卡的用途),余額,次數,身份ID,校驗值…隨卡使用者所需功能變化萬象。
口令存儲區包含卡片三個字節的口令,以及一個字節口令嘗試次數計數器(允許最多錯誤3次,超過就鎖卡)。每次口令嘗試失敗都會導致計數器數值減少,口令校驗成功會把計數器恢復初始最大次數。
卡片應用區的數據可以被任意讀取,不受限制,但修改數據的操作前需要先通過口令驗證,否則寫操作是無效的。SLE4442默認口令是FF FF FF(不過你放心,卡片使用者都會更改的)。口令校驗成功前如果發出讀命令去讀口令存儲區,返回當前計數器的數值和三個零,校驗過後讀出來的內容是計數器數值和三個字節的口令值。
在剛拿到讀卡器的時折騰半天並讀出來卡數據時就已經很興奮了~終於窺探到這個小片子裏面的東西了哈。讀洗衣卡的內容如下:
技術分享圖片
由於洗衣卡所存儲的數據很少,也沒有經過什麽變換,另找一張洗衣卡對比,就一下發現了數據的規律。
90 72 4c 69 66 74 91 02 應該是洗衣卡的一種標識,表明這張卡是洗衣卡而不是幹其他的,把它插進其他設備就不會誤讀。裏面可能還包含公寓樓信息等,但不管怎樣,對於我們樓這個字段是固定值,不操心它具體含義了。
FF FF 00 00 00 00 00 00 00 00 這個數據是洗衣卡剩余次數的標識,10個字節全為0代表還剩余10次,全是FF就說明剩余次數為0了,現在8個0就表示剩余8次。如果能修改這個0的個數不就能改變洗衣卡剩余次數了嗎,那洗衣服這檔子事兒以後就可以擺脫樓管拖拉換卡的困擾了~

至此,任務已經很明晰了,就是更改卡內的數據,所要更改的內容也是確定的,即10個0。但目前沒有口令的情況下,這還只是個設想。抱著僥幸的態度還是先試了一次FF FF FF口令,返回給我的是驟減的計數器數值。由於洗衣機肯定能發出正確口令給卡片,所以只要插一下洗衣機計數器就回歸最大值了。
破解口令的第一個思路就有了,每次嘗試一個口令,然後再插一次洗衣機。三個字節的口令空間是2^8*2^8*2^8,4000萬個口令吧,根據生日定理,要嘗試2^12才能達到50%的口令破解概率。這個方法也不是沒有可行性,只是技術含量稍微低了一點。

另外從網上搜羅了兩個想法,需要借助硬件電路實現一些部件。
千言萬語,消化理解,一言蔽之:


  • 搭線偵聽卡片和洗衣機的通信過程
  • 思路二是雙卡聯立,一張插入洗衣機,另一場插入讀卡器,然後通過讀插在洗衣機裏的卡內容直接獲取到卡口令。


此處建議先看一下這兩個思路的原文【http://topic.csdn.net/u/20071110/15/cfc7e731-8e43-4c95-ad73-840c5dcfdc64.html】,很短,說的很還算很明確。特別是思路二看了很動心,當時我連電路簡圖都畫好了急於動身呢~
技術分享圖片
不過兩搭的硬件電路包含各種開關導線電阻焊接,沒準還得單片機示波器啊,而且在卡上焊接多少會在金屬片上留下點點銀斑,到歸還卡片的時候就不太好解釋了,下面兩張圖是參考鏈接中制作讀卡器的達人們焊接的效果圖,和本例無關。
技術分享圖片
技術分享圖片
再說身邊也沒有這種復雜硬件平臺條件,更不想去其他人的實驗室搞這個不太仗義的事兒。就在google尋尋覓覓冷冷清清淒淒慘慘戚戚,看有沒有一些現成的裝備能簡化這個硬件平臺的搭建。期間居然直接找到了SLE4442的口令破解器,介紹說把卡插到上面就能立刻顯示出口令內容,廣告都打到國外各種IC技術論壇上面了,不過基本都是零回復。我琢磨著這破解器可能利用SLE4442的什麽隱藏的陷門控制字直接查看到口令的,但設備不菲且不隨便銷售,況且用它哪還有破解這個口令的樂趣呢。
直到Logic Sniffer (基本就是邏輯分析儀) 這麽個詞兒閃現眼前時候,突然讓我看到搭線真挺的可行性。示波器幹嘛的應該都清楚,邏輯分析儀功能類似,只不過只能顯示數字信號。一般電子電路實驗室都有這兩個東西,好一點的上個百萬價位都不足為奇。但搜到了Logic Sniffer【http://dangerousprototypes.com/open-logic-sniffer/】,就意味著民間原來也有人做了一些功能簡單的邏輯分析儀,能采樣觸點的高低電平並實時傳遞給電腦。到taobao上還真找到了不少這種簡易的分析儀,價位都在幾十幾百的,算可以接受,遂訂了一臺。
至此綜合前兩種思路(前面思路略微冗余,還是抽練著理解一下的好,不然就繞暈了技術分享圖片),制定的口令破解策略如下:
把邏輯分析儀連到卡片,再插到洗衣機,然後電腦采樣到卡片和洗衣機的通信數據電平,分析數據就可以看到洗衣機發送驗證口令的數據階段了。思路再簡單不過了,現在就是要解決這個電路的搭建問題了:盡量不用焊接和復雜的工具,手頭能有的東西就最好了;要保證偵聽成功率高,即接觸不良的情況盡量避免;還要保證整體設備輕便,開坦克搶銀行就有點囧了。
整個制作過程經過了很多嘗試,透明膠,502,雙面膠,剪刀,鉗子…在此省點筆墨,都是體力活熟練工,等真動手了就知道它的難度了。導線來自於一個鼠標,如下圖所示

技術分享圖片
拆了取出U線,然後分離內部的四條線就能拿來當導線了,剩下的部分插電腦上還能在紅線上產生5V電平,可以用來測試邏輯分析儀的工作狀態。第一個圖是首個比較成功的連線效果,然後是是最終完美版的連線效果。
技術分享圖片
技術分享圖片
有以下兩點是制作中心得:

  • 鼠標線中的導線特別的細,剝線的時候像我這樣用剪刀的就需要特別的細膩,稍有不慎就把銅線弄斷了
  • 根據上面兩個圖應該註意連接時鐘那根線要很細才行,不能保留外面的膠皮。導線太粗會把卡和洗衣機的讀卡觸點擠開,觸點無法到接觸卡片就不能正常通信了。


線接好後就可以插入讀卡器試試效果了,讀卡器工作正常就說明你的接線沒有影響到讀卡器和卡片的通信,再接上邏輯分析儀看看是否能偵聽到通信數據,下圖所示的通信為讀數據的過程。

技術分享圖片
準備工作就緒,現在只需要把卡插到洗衣機就能截獲和洗衣機的通信了。這一天淩晨5點我就爬起來,保證洗衣房無人幹擾。我,電腦,邏輯分析儀,卡片來到洗衣機面前。截獲到數據就趕緊跑回來分析這些電平序列。實際的電平遠不如上圖用讀卡器產生的序列那樣完美,時鐘電平經常會被數據電平的下降沿給拉下來,去偽存真時和逆向一段加花的匯編一樣很需要耐心的。
再稍微說兩句關於控制字的事兒,截獲的時序需要參考SLE4442手冊而不是讀卡器的手冊(這是我最初犯的錯誤)。每個指令都在時鐘高電平時數據下降沿後開始,數據從低位到高位的順序發送。發送的命令格式為 一個字節指令類型 一個字節地址 一個字節數據,然後時鐘高電平數據電平上升沿代表本次命令結束,隨後數據線上就會產生命令的反饋。
我們關註的指令類型為0x33,用於校驗口令。發送命令格式為

1 2 3 0x33 0x01 s1 0x33 0x02 s2 0x33 0x03 s3


洗衣機會依次發送該數據包到卡片,其中s1 s2 s3拼在一起就是那三個字節的口令了!
下圖是電平的分析,不過前提是先在浩如煙海的數據流中找到該序列,這就是一段慢慢‘F7’的過程了。去偽存真的工作我用紅色補全了(本來應該是符合手冊上的理想狀態電平序列,只是世事左右了他們)~
技術分享圖片
高電平後數據下降沿代表命令開始。發送的命令前兩個字節為0x33 0x01 說明是在驗證口令第一個字節。接下來的一個字節內容如下圖,為0x66,這就是口令的第一個字節。
技術分享圖片

下面再尋覓到第二個字節驗證片段0x33 0x02 0x04 所以口令第二個字節是0x04
技術分享圖片
技術分享圖片

第三個字節的分析不防自己動手試試吧:
技術分享圖片
到此就分析出了卡口令,插入讀卡器,輸入口令就能夠修改數據了。洗衣卡內的數據結構很簡單在不需要洗衣機內源程序的情況下也能辨析這些數據的含義。僅依靠卡口令保護是不能勝任數據篡改的。
既然方法已經成形就順便對電卡也測試了一下,電卡內的數據就復雜的多了,包含很多字段,通過到卡務中心給卡充錢,到電表處劃卡,補辦新卡等各個操作環節我記錄到很多組卡內數據情況,對比分析也辨識出一些字段的含義。如下所示

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 A2 13 10 91 FF FF 81 15 FF FF FF FF FF FF FF FF FF FF FF FF FF D2 76 00 00 04 00 FF FF FF FF FF sle4442的廠商信息 68 03 11 01 31 44 43 62 電表號 02[00 02 05 00]15 4D 16 卡內有205度電 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 80 15 00 00 15 00 18 電表余額 02 00 17 87 00 00 00 00 00 00 62 16 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 02 FF FF FF FF FF FF FF FF FF FF FF FF FF


電卡相比洗衣卡難度大大提升了,首先電表鎖在一個小黑屋,需要到樓管處借鑰匙和電卡才能打開小黑屋去充電,且不能耽擱太久還鑰匙和卡,不然鬼知道你拿他們幹什麽去了。所以我只好把用完就趕緊把鑰匙和電卡歸還,但在此之前我已經復制了該卡的數據到一張空白的SLE4442卡內,並且留著小黑屋的門沒鎖。
這次需要在沒有原卡的情況下去獲取卡口令了,方法和前面洗衣卡比較類似,初始隨便給卡設個口令,然後偵聽電表和卡片的通信。電表會先嘗試口令的第一個字節,發現不對就停止了口令嘗試,每次偵聽只能獲取一個字節的口令。然後把對應的口令字節設置到卡內,保證下一次比對時該位正確以換取下一位的比對通信包。加之線路接觸不良,整晚跑了20幾趟小黑屋才算是最終獲取了全部的口令字節。從下圖看電卡的時序電平比洗衣機稍好但也趕不上讀卡器的優美平穩。

技術分享圖片
有了口令就能夠修改余額字段了,改完插到電表上,未果。看來僅修改余額字段是解決不了問題的,可能其他字段還有校驗功能。電表是一卡一表,而不是洗衣機那種一機多卡形式。無狀態的卡片只要每次都還原數據內容和口令,與前一次相同就能不斷重復使用(比如對於洗衣卡,即使不知道數據含義,但只要每次還原內容,就能保證總有剩余次數)。但電卡和電表可以有狀態字段存在,即每次通信會在電表和電卡內留有一個狀態,由於不知道怎樣通過一個狀態計算下一個狀態並填寫到卡內,所以卡數據就不會被電表認可。如何計算卡下一狀態字段恐怕也就卡務中心充電的電腦才知道。如果需要進一步分析就需要能夠拿到電表內或者卡務中心充電電腦內的程序了,這事兒就比較困難了。畢竟不打算以此謀取私利,只是想研究下大概原理圖個樂呵,所以還是就此hold住了~

參考
讀取SLE4442內的數據:
http://dangerousprototypes.com/2009/08/31/bus-pirate-sle4442-smart-card-update/
http://hackaday.com/2008/11/25/how-to-read-a-fedex-kinkos-smart-card-sle4442/
SLE4442中文手冊:
http://wenku.baidu.com/view/a792c4335a8102d276a22ff1.html


有人悄悄話問我ACR38SDK中文的哪有下載,其實你隨便找家賣家淘寶店跟店長索要都能拿到~你買產品當然人家應該給你提供軟件了
不過還是在此提供一下我使用的版本吧
: http://pan.baidu.com/share/link?shareid=23817&uk=1006929398

[原創]用邏輯嗅探破解接觸式IC卡口令