刷卡機讀取失敗
網上關于刷卡機讀取失敗的刷卡知識比較多,也有關于刷卡機讀取失敗的問題,今天第一pos網(yadikedp.com)為大家整理刷卡常見知識,未來的我們終成一代卡神。
本文目錄一覽:
1、刷卡機讀取失敗
刷卡機讀取失敗
閱讀之前,譯者有話說
一口氣看完這篇技術文檔,感覺是什么?《職業特工隊》和《諜影重重》的混合體。原文沒有插圖,所以請耐著性子看完。
作者科迪·布羅修斯何許人也?美國人也。一名Mozilla開發工程師,著名手筆有Linux上購買iTune上的音樂(學生時期)、破解iPhone(就是越獄)、破解腦-機接口并開源(就是用人腦控制計算機),還有就是破解酒店門鎖。
我能理解作為一名破解黑客,而不是駭客本身的心情。本來想花心思,卯足全力挑戰那個久負盛名的難題(就是酒店安全門鎖),卻赫然發現遠低于自己預想難度(當然比我等的水平高了很多),輕易就被破解了,而且漏洞百出。就如同連續復習了一個月,考試難度堪比作業的感覺。
而這篇技術文檔所在的網站,即科迪自己的網站,首頁簡潔到不能再簡潔了,卻沒有這篇文檔的直接鏈接。但這篇文檔依然留在他網站的服務器里。這意味著什么?慢慢猜吧,我不猜了,信息量太大了。
好了,不說廢話了,鄭重呈上技術翻譯作。
介紹
在本文中,我們來探討酒店使用的Onity HT門鎖系統的設計和內部原理。全球現役大約有一千萬套Onity HT酒店門鎖,占有全球約三分之一酒店數目或超過一半酒店門鎖比例。
我們希望能以獨特視角來揭秘Onity HT系統的工作原理,以及潛在不同的隱患。
Onity門鎖系統設計原理
Onity門鎖系統中分為幾個部分:
·編碼器:用來制作門禁卡,也儲存了所有種類信息。(例如客房列表、時間表等等)它可接入便攜式編程器。
·便攜式編程器(以下稱為PP):向門鎖寫入客戶鑰匙編碼、主管編碼、時間表和其他信息。
·門鎖:在這里我們說的門鎖,主要指的是實際判斷門的開關邏輯操作過程的電路板。有好幾種門鎖配置,例如外門和客房門等,但我們主要探討客房門鎖。
雖然編譯器在整個系統中,因其處理門禁卡上的密碼編碼而顯得很重要,但我們首要關注的是PP和門鎖。
重要概念
源代碼
它由Onity隨機生成的32位編碼, 代表客房在酒店內唯一的身份標識,同時也是通往整個系統安全的關鍵。源代碼用于對門卡編碼/解碼、對門鎖編程及開鎖。
此等緣故,源代碼不對任何人公開,甚至酒店擁有者。
鑰匙編碼值
鑰匙編碼值包括24位數據,用來獲取開鎖權限。而門鎖除了包含客人鑰匙編碼外,還生成一個或多個主管鑰匙編碼。
與其為每個客人重新對門鎖編程,或是需要制作多幾份主管門禁卡,行業上采用了“卡循環”這個概念。賦值門鎖一個提前量,通常是50,意思是讓一張門卡在多少張新卡投入使用前仍能有效開鎖。加入一位客人手上的鑰匙編碼是123,而門鎖的鑰匙編碼是100,那么提前量最少也要是23才能使得那張門卡有效。當一張有效卡塞入門鎖時,門鎖的鑰匙編碼則變為該卡的鑰匙編碼。因此,門鎖就能在新卡啟用時自動對老卡銷戶。(譯者注:方便與安全是成反比的。)
特別強調的是提前量對鑰匙編碼數量可能降低了不少。一個24位編碼值就有約一千六百七十萬個不同可能(譯者注:即2的24次方。),但卻要除以提前量加一這個數,讓在提前量范圍內的每一張卡生效。因此,假設你手頭上有一張標準型提前量為50的門卡,它的密鑰可能數則少至328965個。當提前量放到最大,即255時,密鑰可能數則降為可憐的65536個。這意味著在最背的時候,你在一道鎖上需要嘗試32768張門卡才能打開它。這么一來,另一個問題出現了。
倘若兩道門的鑰匙編碼很相近,近到加上提前量后產生了交集,那會否產生一張原本用于開一道門的門卡也能在同一酒店內開另一道門呢?為這些門編制初始編碼時,它們每個是前后相差1000而減少那發生的可能。不過,酒店內所有門并不是同時進行編碼的,而總有些客房比起其他房間更加客如輪轉,直接導致鑰匙編碼很可能發生越界重復現象。
識別碼
每一張卡包含一個16位識別碼。在一張客人卡上這分為兩部分:卡指定能開的房門,及卡的某個拷貝版本。在主管門卡上,指定能開房門的部分被員工編號代替了。
當入住酒店時,你一般會選擇是否要多一張門卡,那就是拷貝。將識別碼除以6取余數,就能得知卡是第幾份拷貝。0則是原卡,1至4是特別標號拷貝,5則可能是任何門卡的第五份拷貝或以上。門與門之間根據數據庫被分隔開來,允許“門卡拷貝范圍”現象出現。
需要特別強調的是,門鎖并不曉得它自己的標識碼是什么。標識碼純粹是用來標識門卡,例如用編碼器讀取的時候,然后儲存在門鎖的審核日志中。
審核日志
另一個叫法是開機日志,包含哪些卡用于開鎖的記錄(用識別碼來確定),使用在PP的開鎖功能,及新客人門卡。每道記錄是由一個16位標識(或在特殊場合下例如PP的開鎖功能使用時產生的虛假標識)及尾隨的16位時間戳組成的。
特殊門卡
在一些特殊門卡中,我們的探討中最重要的是編程卡和備份卡。當一張編程卡塞入門鎖后,在塞入一張備份卡,那張備份卡就變為這門的客人門卡了。
編程卡和備份卡通常用于編碼器出錯導致客人無法進入客房,而普通門卡又沒做出來的場合。不過,這又招致新的危機——一旦做出了編程卡,任何酒店客房形同虛設。
可以知道,編程卡是由酒店物業的源代碼加密編碼而來,而備份卡和其他卡差不多,不包含任何加密,僅簡單包含一個流水編號。
敘述流程
觀察日常使用下的系統情況能使事物之間聯系變得緊密些。以下以普通常見方式敘述酒店的門鎖系統。
安裝
在由Onity人員安裝編碼器時,酒店內的門就以指定標識碼和初始鑰匙編碼方式錄入數據庫內。然后酒店員工就用編碼器將房門數據載入到便攜式編程器內。當門鎖在酒店內安裝時,它們都被便攜式編程器賦予了特定鑰匙編碼和主管編碼。這種情況也在門鎖沒電導致數據丟失,然后更換門鎖電池時發生。
客人入住
當客人進入一家酒店入住時,Onity系統的第一步是生成1張或多張門卡。房門號被輸入至編碼器,緊隨的是逗留天數(為自動失效)及生成門卡數。門卡按序放置,將客房特定數據編碼其中。
當客人第一次在鎖中插入門卡,幾件事發生了:
門卡的填充位數據生效,或數據不完整時門卡即時被拒。
門卡由門鎖上的源代碼解碼。
經過校驗,門卡生效或門卡校驗不符被拒。
寄存器和轉碼器檢測過期日,如果過期則被拒。
最后,檢查鑰匙編碼。若酒店門卡上的提前量不超過門鎖則門鎖開啟。
酒店門卡上到底有什么
前面討論了一些門卡數據片段,下面就來完全拆解它的數據結構:
16位識別碼
8位標志字節
16位到期日
8位授權字節(和本討論無關)
24位未知數據(零)
24位鑰匙編碼
這些數據然后以酒店的源代碼進行加密,儲存在標準磁條卡的第三磁軌上。加密算法在本文附錄B有說明。
門鎖交互
和門鎖之間的交互以單線雙向方式進行。在門鎖底部,門板的外面,有一個直流電源接口,通常用作供電,也將數據通過傳輸線接到其他設備上。
在其之上,是高層次的數據傳輸,允許讀取內存信息和開鎖。便攜式編程器中還有其他幾個功能,但因為和本文描述的漏洞無關,開鎖設備也不需要,在此不表。
線路協議
基本概念
我們先定義能和門鎖產生交互的設備為“主人”,主導所有交互功能。
在上拉電阻作用下,線路閑置在3.3伏高電平。“主人”和門鎖要產生交互,需要產生一段時間的低電平信號(接地),稱為脈沖。交互信息以瞬發方式進行,我們稱之為“數據組”,即“主人”發送每段20微秒同步脈沖,之間間隔200微秒(兩個脈沖邊緣之間)。實際的交互在這些同步脈沖之間進行。如果一組12微秒數據脈沖在這些同步脈沖中出現,則設備之間交換了1比特信息。數據脈沖的缺失則視為一個零比特。
這里的重點是,無論“主人”還是門鎖都能用數據脈沖進行交互,但同步脈沖只能由“主人”產生。
數據組結構
如上所述,數據組包含重復的同步脈沖,當中也許有數據脈沖,也許沒有。要注意一下,所有數據組都有一個同步跟蹤脈沖,當中并沒有數據脈沖在內。
根據實驗所得,數據組之間時間間隔不少于500微秒,而基本時序記錄是2700微秒。
要在“主人”與門鎖之間發送數據,無需一個起始信息,只要將數據組按次序發送即可。不過,正因為門鎖本身無法生成自己的同步脈沖,它必須提示“主人”它希望得到信息。做到這一點,在線路閑置時將其中電平信號降低120微秒即可。門鎖做到上一點的話,“主人”就開始生成同步脈沖,并監察門鎖發送的數據脈沖信號。
高層傳輸協議
下面將會講到相關高層控制指令的細節。注意:當提到“字節”時,意思是從最低有效位開始的8個比特位。
校驗上的注意事項
每個高層指令看起來都有自己的校驗值,其實只是指令值對自己和指令特定常量的異或運算。我們不清楚這些常量哪里得到的,也許它們單純是硬編碼隨機量而已,只是為了將傳輸協議搞得更加復雜罷了。
讀取指令
讀取命令會用到一個16比特內存地址,然后返回該地址的16字節信息。這意味著如果你從地址0讀取信息后,再讀取地址1時,會有15字節信息重復。通常你每次讀取信息時,是希望得到每行不重復的16字節信息的。
讀取指令中,單個數據組用以下的格式編碼:00000000000000000000000000000000000000001010001111AAAAAAAA1BBBBBBBB1CCCCCCCC。A字節是內存地址高8位信息,B是低8位,C字節是一個校驗值,由A^B^0x1D異或運算得到。
當這條信息發送時,門鎖會發出信號,傳出165比特為一數據組的信息。頭13比特信息作用不明,隨后有16個9比特字節(就是每個8位字節后跟隨1個比特),在最后就是用于校驗的8比特信息。(每個常規通信都是如此)
開鎖指令
開鎖指令需要用到32位的源代碼,假如門卡身份信息與門鎖內信息吻合,馬上就開。
開鎖指令用到好幾個數據組,下面是它們傳輸的格式與順序:
00000000000000000000000000000000000000001010001001AAAAAAAA1BBBBBBBB1CCCCCCCC1DDDDDDDD1SSSSSSSS000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110101111001010
上面的A、B、C和D字節分別為源代碼的第一、第二、第三、第四字節。S字節是校驗結果,由A ^ B ^ C ^ D ^ 0xDD異或運算得到。
無論運算結果正確或錯誤,門鎖都不對“主人”作回應,只是源代碼計算正確的話,就會開啟。(譯者注:這句看起來好矛盾,但如果還記得文章中門鎖的定義,那就好理解了。門鎖不對門卡進行消息反饋例如失敗什么的,反正門卡沒有耳朵眼睛,但是我們人有,所以通常開鎖失敗時候閃紅燈,那是給人看的,不是給卡片看的。)
門鎖內存信息
從前面詳細敘述門鎖通信協議細節來看,我們能做到讀取所有內存信息,然后給予一個源代碼來開鎖,只是你必須清楚源代碼到底在內存地址當中哪個位置。
下面是普通客房門鎖當中幾個關鍵內存地址。而其他類型的門,例如墻上刷卡機(多數用作酒店外部的門)和客房門鎖的內存映射有一點點差異。
· 源代碼:在0×114有4個字節 · 編程卡編碼:在0×124有3個字節 · 鑰匙編碼:在0x412C 鑰匙編碼所在的地址包括了一系列不同的值。首先是客人的值,共3個字節,后面跟隨了一個0×00字節。再之后,就能得到一些“主人”編碼,每個有效“主人”由3個字節及后面跟隨一個0×80字節組成。如果不是,則后面跟隨的字節為0xFF。最后一行記錄(帶有0xFF結尾的)一定是無效用戶。
門卡加密
前面提過,門卡是通過源代碼作為鑰匙進行加密。在本文發布前,通常認為算法是自定義的、不公開的。而這一說法還沒得到證實,但是一個用Python寫的實例附在了本文附錄B中。
對算法缺陷的研究一直在進行中,但是給予一個狹小的密鑰可能空間(只有32比特)以及已知明文攻擊,簡單的暴力破解是能做到的。
漏洞
前面提到了很多Onity門鎖系統內部工作原理,但還是應該難以理解,何以所有岔子都走在一塊了。
開鎖功能
只要有能力讀取門鎖內存,以及得知源代碼在內存哪個位置,讀取其中的源代碼然后以開鎖指令格式發送回去簡直是小菜一碟。這樣就能馬上獲得開門權限,在審核日志當中不過只是顯示PP(便攜式編程器)曾經用過門鎖。
這個過程在四分之一秒內能夠完成,在附錄A中有破解設備例子可以參考。
制作主管門卡
因為我們有能力讀取門鎖內存,以此類推,將主管鑰匙編碼讀出門鎖,制作自己的主管門卡成為了可能。和賦予員工編號差不多,只要有主管編碼,任何門都是可進的。
當然,一卡在手還是不能進所有的門的。因為就算是酒店的主管們也分幾等。舉例來說,酒店會將主管們分為三類,而客房部的主管們則人手一張主管門卡。因為這樣的分類配置,拿到了一張主管門卡只能讓你擁有酒店三分之一的權限。
編程卡制作
能夠存取內存,我們就能獲得酒店的源代碼及編程卡編碼。有了這些,我們就能夠為每把鎖做一張編程卡。做一張備份卡無需對酒店或一切鎖的了解,而且能提前為未來準備完成。
在對門鎖使用了編程卡后,只要插入備份卡,門鎖就能開啟。(譯者注:其實就像是單位門禁卡管理中,不看說明書強行為下屬獲取門卡的主管,一個勁在門上刷,碰巧和前面步驟相符就能制作新卡,完事后還一個勁抱怨工作辛苦什么的。)日后,這張備份卡能夠不斷反復使用進入房門,能熬到新客人入住為止。
偽造備份卡
缺乏加密,以及備份卡能逐漸制作出來,那么偽造備份卡獲得進入另一個房間也是可行的。
舉個例子,一臺編碼器故障了,住戶們正由酒店員工手工發放備份卡進行入住手續。你獲發一張編號為1234的備份卡,但你能夠將其改為1233或1235,然后嘗試進入其他房門。雖然沒有其他情報下,判斷這能具體開酒店哪個房門幾近妄想,但卡本身增加的特性還是讓你進入酒店某間房可能增加不少。
基本密碼學破解
密鑰可能空間狹小,以及門卡上缺乏真正的加密,有不少簡單破解手段能夠付諸實行。在后面會提到,我們仍需在分析密碼上下多點工夫。
從門卡加密的結果來看,每個字節的加密只用到了源代碼的一小部分,加上已知關系推敲聯系,就能確定源代碼。舉例來說,你入住一間客房,獲得兩張門卡。兩張門卡的區別僅僅是識別區的一個字節信息。同樣,如果你知道幾張卡的到期日,就能利用之間的差異作為破解提示。(譯者注:這活脫脫就是明文攻擊。)
這過程沒有技術含量,不需要一個密碼專家就能完成,在之后會有更多的研究需要去做。無需多言,這里牽扯到的密碼學對安全毫無助益,對這32位加密空間涂鴉級別作品遮遮掩掩其秘密超過二十年,這樣的產品不值信任。
設計兇殺案陷害酒店員工
擁有了讀取門鎖全部內存信息的能力,那就可能獲取主管門卡編碼。以上這些,結合源代碼進行加密編碼,就能做出主管門卡,從而獲取開啟酒店門鎖的權限。
且看看這樣一個假想情況:
· 破解者用前面提到的漏洞讀取門鎖的內存信息。 · 破解者利用源代碼和主管門卡編碼生成一張或多張主管門卡。 · 破解者利用主管門卡進入一間客房。 · 破解者在客房內殺害受害人。 · 破解者逃離現場。
而在司法偵察過程中,刑事探員們往往會查閱門鎖的審核日志,以查看在何時為何人進入房門。在這當中,他們會看到某個特定員工(因為門卡在識別編碼范圍內是唯一編號的)在受害人死亡相近時間用主管門卡進入客房。
這樣一個充分證據,將一名員工在死亡時間推進客房,在謀殺案審判中可置其萬劫不復,最差也能讓那員工成為頭號嫌疑人。而其他因素(例如閉路電視、目擊證人等)也許會對該名員工有利,但我們卻無從知曉門鎖審核日志的真偽性了。(譯者補充:于是某些酒店為了平息事件,淡出公眾視野,直接開除嫌疑人撇清責任……)
總結
在本文中,我們列舉了針對Onity酒店門鎖提供的安全措施每個層次破解方法。
· 門鎖通信端口不可靠,能夠直接對內存操作,任意讀取內存信息。加上對系統的基本了解,破解者能夠直接開門、制作主管門卡,甚至制作整個酒店的編程卡。 · 門卡上的密碼系統有先天缺陷。密鑰空間太狹窄,甚至最普通的暴力破解也能湊效。在這點上,未來將繼續深入研究系統的加密算法。
· 審核日志一直以來被認為是門鎖使用的安全記錄,因能利用內存信息制造門卡這點上,可說是蒙人的存在。接下來的研究,在門鎖通信協議中允許寫入內存這點上,將對審核日志直接修改。
這些漏洞無可饒恕,它們系統本身的缺陷是我們強烈建議不要使用Onity門鎖,直到充分修補這些漏洞為止。
對于任何酒店的住戶,我們建議使用門鏈或插銷,只要能提供額外安全保障就行。電子鎖的門閂能夠被門鎖機械系統解除,它唯一的用處只有防暴而已。
披露信息
揭露出這些顯而易見的漏洞(除了那不常見的通信協議外),他們的震驚,以及消除這方面影響的困難,我無法輕易決定將這篇消息公開。我們無法確定,但我們有理由相信這些問題在Onity內部能夠引起注意,讓他們將這些門鎖投放市場前,給多超過十年改進時間。
不過,在權衡之下,揭露造成的短期潛在效應遠遠不及對酒店行業和公眾長期危害,尤其是只有少數人知道這一秘密的情況下。
未來的研究
未來的研究方向有很多,大致分為這么幾類。
密碼學
當前實現的算法在分析上也許不是最優的。編輯整理好的算法,外加一個簡單實例,對密碼學者來說應該有所幫助。
這也許是個自定義算法,也有可能是現成就有的算法,或已有算法的某個變種。
逆向通信協議
比起讀取門鎖內存來說,寫入內存更為可行。實際上,便攜式編程器就是如此。盡管對便攜式編程器通信方式還在研究,確定寫入內存指令的格式只是遲早問題。
門鎖內存映射
我們只了解門鎖內存空間的很少部分,僅在酒店客房部分。對不同門鎖用特定變量進行編程,或將其置于不同情況下,將所有Onity門鎖的完整內存映射確定下來應該不難。
確定現有研究對保險柜鎖是否適用
我們懷疑Onity商用鎖(保險柜)所用的通信協議和他們的酒店門鎖也是大同小異的。如果是的話,就能進行相似的操作乃至破解保險柜鎖。
附錄A:開鎖設備
本附錄詳細列明在Arduino平臺下制作及編程一臺開鎖設備。
附注
這臺設備上有些瑕疵,以至于不能作用在一些鎖上。現階段,暫且認為是計時出錯,以至于每個字節的第一個比特錯誤。
補充一點,基于特定司法區域的防盜相關法律下,擁有這個設備可能違法,在做一臺開鎖設備前最好咨詢一下法律顧問。利用這臺設備獲取你無法進入區域的權限或為非法。本文不保證,也不承擔任何責任,也就是說,責任自負。
硬件安裝
需要的硬件:
· Arduino Mega 128 · 5.6千歐電阻 · 直流電源接口,外徑5毫米,內徑2.1毫米。
將Arduino上3.3伏電源和數字IO引腳3用電阻連接,再將數字引腳3和直流接口內部相連,最后將直流接口外部和Arduino一起接地。
詳細代碼可到原文查看
《開源雜志》微信請搜:開源雜志 ,官網oszine.com 關注開源硬件與創新,通過推廣開源文化將創意實現的門檻降低
以上就是關于刷卡機讀取失敗的知識,后面我們會繼續為大家整理關于刷卡機讀取失敗的知識,希望能夠幫助到大家!
轉載請帶上網址:http://yadikedp.com/shuaka/72751.html