0x00 前言
知道自己在做什么,本文是基於學校領導批准下進行實驗
一次復制門禁卡的機會發現學校飯卡是M1卡,於是嘗試對飯卡的數據進行分析
嘗試偽造,檢驗是否有被人非法充值“漏洞”
本文只技術交流分享,濫用者自行承擔責任,與本文作者無關
這是一張偽造的飯卡,能改為任意卡號、姓名、學號、金額、交易流水記錄
0x01 過程
通過PN532上位機讀取數據,讀出12-14扇區數據
(以下數據經過修改,過機消費驗證,廠家敏感信息用XX打碼)
12 扇區 0區塊:3427001137270011001021310082BF81 1區塊:EABBEABBEABB0000000000000000EF51 2區塊:0124082088888800132284440000E274 3區塊:1380XX76XX0DFF0780694346A053464A 13 扇區 0區塊:00000000000000000000000000000000 1區塊:66660000CC00BE05020209000014007C 2區塊:66660000CC00BE05020209000014007C 3區塊:B40DF82BC32DFF0780694346A053464A 14 扇區 0區塊:00000000000000000000000000000000 1區塊:00000000000000000000000000000000 2區塊:001000BE2D000400BD2C000400BC33DB 3區塊:0755XXXX0268FF0780694346A053464A
不斷讀出每次刷卡的數據
可用控制變量法,例如固定的刷卡機,金額等
然后就是頭腦風暴,連蒙帶猜去驗證。
0x02 數據分析
12扇區
0區塊:3427001137270011001021310082BF81 1區塊:EABBEABBEABB0000000000000000EF51
0區塊:1021310082 是學號 1區塊:EABBEABBEABB 是姓名 GBK內碼轉換為:昊昊昊
檢驗位
不難發現,基本每區塊的最后四位是檢驗位
網上教程的檢驗位運算無非就這幾種:相加、取反、異或
於是進行嘗試,發現是累加和、異或和檢驗位
BF 是前面所有數據十六進制下相加的和(累加和)
BF = 34+27+00+11+37+27+00+11+00+10+21+31+00+82
81 是前面所有數據相異或的和(異或和)
81 = 34xor27xor00xor11xor37xor27xor00xor11xor00xor10xor21xor31xor00xor82
13 扇區
1區塊:66660000CC00BE05020209000014007C 2區塊:66660000CC00BE05020209000014007C
6666 十進制儲存的金額:66.66元 CC00 金額檢驗位 CC = 66 + 66; 00 = 66 xor 66 BE 流水號,對應14扇區流水,滿清 0502 消費日期 5月2日 0209 經過大數據分析,應該是刷卡機序列號 14 當天消費總額 7C 累加和檢驗位
14扇區是 流水記錄
2區塊:001000BE2D000400BD2C000400BC33DB
第BE次消費10元對應刷卡機2D
0x03 一卡一密分析
卡號存放在0扇區0區塊前8位
如0區塊:25F2AF275F0804006263646566676869 卡號是:25 F2 AF 27
密碼分KEYA,KEYB,KEYA在控制位FF078069左邊
如3 區塊: 56CE885DC32DFF0780694346A053464A
KEYA是56CE885DC32D
KEYB是4346A053464A
怎么看、算出來的呢?在同學的幫助下拿到10+人不同卡的數據
自己比較對比,發現密碼是一個個字符計算的
並且卡號相同的字符對應密碼的字符也一樣,如下圖同色的
圖中上面前8位是卡號,卡號下面的是密碼
上面都是一卡一密的數據,一眼就看出規律了
一卡一密算法(根據上述卡號密碼)
[假裝自己會C語言 寫的“偽代碼”]
num[8]="25F2AF27"; char pas[12];
pas[0] = num[6] xor 7 ; //2 xor 7 = 5 pas[1] = num[7] xor 1 ; //7 xor 1 = 6 pas[2] = num[4] xor 6 ; //A xor 6 = C pas[3] = num[5] xor 1 ; //F xor 1 = E pas[4] = num[2] xor 7 ; //F xor 7 = 8 pas[5] = num[3] xor A ; //2 xor A = 8 pas[6] = num[0] xor 7 ; //2 xor 7 = 5 pas[7] = num[1] xor 8 ; //5 xor 8 = D pas[8] = 'C' pas[9] = '3' pas[10] = '2' pas[11] = 'D'
pas[] = "56CE885DC32D"
0x04 結果
隨着一卡一密算法攻破,可以說飯卡徹底失守了
學校飯卡黑名單依據是卡號,也就說只要卡號變了,黑名單就禁不了這張卡
但是,一卡一密也不是沒用的,這時你的卡片密碼要對的上相應的密碼
刷卡機讀卡是根據卡號算出這張卡獨一無二的密碼,然后再用密碼訪問/修改金額
可惜一卡一密算法已經看出來了,我們能偽造任意的卡號以及對應的密碼
每區塊最后4位的檢驗位也有了,偽造數據輕而易舉
那么現在好玩了,飯堂內部沒有監控,只要我改掉卡片的個人信息,偽造金額,就能消費了
甚至如果寫出軟件或用單片機做出修改卡號、密碼、個人信息、金額、流水的功能
每次刷完卡后都更改上述信息,想抓到使用者簡直是天方夜譚
遺憾:鑒於高三時間緊,目的只是為了安全,沒有找到最大金額,稍微遺憾
0x05 后記
正好趕上校方換人臉識別門禁,以前的M1+2.4G復合的厚卡不用了
加上洗衣機需要加裝刷卡機,於是整個一卡通系統換成CPU卡了
最后,首先感謝學校老師的大力支持,給與一個包容、開放的環境。同時也為自己學校瘋狂打call!
未來:通過逆向飯卡數據,大概了解飯卡的數據儲存結構,為以后單片機開發飯卡刷卡系統做准備。
“實踐是檢驗真理的唯一標准”,黑客電影說過“光在電腦搞是入侵不了的,還需要實地入侵”很贊同
版權聲明:本文全是原創,一字一圖打上去的,禁止任何形式的轉載,分享,不正當獲利!