作者选择了 Electronic Frontier Foundation Inc作为 Write for Donations计划的一部分接受捐款。
介绍
安全威胁不断变得更加复杂,因此开发人员和系统管理员需要采取主动的方法来捍卫和测试他们的应用程序的安全性。
测试客户端应用程序或网络服务的安全性的一种常见方法是 _fuzzing,这涉及反复向应用程序发送错误或错误的数据并分析其响应,这有助于测试应用程序对意外输入的弹性和强度,其中可能包括损坏的数据或实际的攻击。
Radamsa是一个开源的混淆工具,可以基于用户指定的输入数据生成测试案例。
在本教程中,您将安装和使用Radamsa来使用自己的测试案例来模糊测试命令行和基于网络的应用程序。
<$>[warning] 警告: Radamsa 是一个渗透测试工具,可以让你在某些系统或应用程序中识别漏洞或弱点。你不得使用与 Radamsa 发现的漏洞进行任何形式的粗心行为、伤害或恶意剥削。
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个 Ubuntu 18.04 服务器通过遵循 初始服务器设置与 Ubuntu 18.04设置,包括一个 sudo 非根用户和启用防火墙来阻止非必不可少的端口。
- 一个命令行或基于网络的应用程序,您希望测试,例如 Gzip, Tcpdump, Bind, Apache, jq,或您选择的任何其他应用程序。
<$>[警告] 警告: Radamsa 可能导致应用程序或系统运行不稳定或崩溃,因此只在您为此做好准备的环境中运行 Radamsa,例如专用服务器。
一旦你已经准备好了,登录你的服务器作为你的非根用户开始。
步骤 1 – 安装 Radamsa
首先,您将下载并编译 Radamsa 以便在您的系统上开始使用它. Radamsa 源代码可在 GitLab 上官方存储库中找到。
首先,更新本地包索引,以反映任何新的上游变化:
1sudo apt update
然后,安装必要的gcc
,git
,make
和wget
包,将源代码编译成可执行的二进制:
1sudo apt install gcc git make wget
在确认安装后,apt
将下载并安装指定的包和所有所需的依赖。
接下来,您将下载 Radamsa 源代码的副本,将其从 GitLab 上托管的存储库中克隆:
1git clone https://gitlab.com/akihe/radamsa.git
这将创建一个名为radamsa
的目录,其中包含应用程序的源代码。
1cd radamsa
接下来,您可以使用make
开始编译过程:
1make
最后,您可以将编译的 Radamsa 二进制安装到您的 $PATH:
1sudo make install
一旦完成,您可以检查已安装的版本,以确保一切正常工作:
1radamsa --version
您的输出将看起来如下:
1[secondary_label Output]
2Radamsa 0.6
如果您看到radamsa:命令未找到
错误,请双重检查所有所需的依赖性已安装,并且在编译过程中没有错误。
现在您已经安装了 Radamsa,您可以开始生成一些样本测试案例,以了解 Radamsa 是如何工作的,以及它可以用于什么。
步骤2 - 生成混乱的测试案例
现在Radamsa已安装,您可以使用它来生成一些模糊的测试案例。
一个 test case 是一个数据,它将被用作您正在测试的程序的输入,例如,如果您正在模糊地测试一个档案程序,如 Gzip,测试案例可能是您试图解压缩的文件档案。
<$>[注] 注: Radamsa 将以各种不同的意想不到的方式操纵输入数据,包括极端重复, bit flips,控制字符注入等。
首先,向Radamsa传递一个简单的文本,看看会发生什么:
1echo "Hello, world!" | radamsa
这将操纵(或模糊)输入数据并输出测试案例,例如:
1[secondary_label Output]
2Hello,, world!
在这种情况下,Radamsa在你好
和世界
之间添加了一个额外的字符号,这可能看起来不像是一个显着的变化,但在某些应用中,这可能会导致数据被错误地解释。
让我们再试一次,运行相同的命令. 你会看到不同的输出:
1[secondary_label Output]
2Hello, '''''''wor'd!
这一次,在字符串中插入了多个单个引文('
),包括在世界
中重写l
的引文,这种特定的测试案例更有可能导致应用程序出现问题,因为单个/双重引文通常用于分离列表中的不同数据。
让我们再试一次:
1[secondary_label Output]
2Hello, $+$PATH\u0000`xcalc`world!
在这种情况下,Radamsa插入了一个壳注射字符串,这将有助于测试您正在测试的应用程序中的 命令注射漏洞。
你已经使用 Radamsa 来混合输入字符串并产生一系列测试案例,接下来,你将使用 Radamsa 混合命令行应用程序。
步骤 3 – 模糊命令行应用程序
在此步骤中,您将使用 Radamsa 来混淆命令行应用程序并报告发生的任何故障。
混淆每个程序的精确技术大大不同,不同的方法对于不同的程序来说将是最有效的,但是,在本教程中,我们将使用jq
的例子,这是一种用于处理JSON数据的命令行程序。
您可以使用任何其他类似的程序,只要它遵循某种形式的结构化或非结构化数据的一般原则,用它做一些事情,然后输出结果。
如果你还没有安装jq
,你可以使用apt
来安装它:
1sudo apt install jq
jq
现在将被安装。
要开始混淆,创建一个样本 JSON 文件,您将使用它作为 Radamsa 的输入:
1nano test.json
然后,将以下样本 JSON 数据添加到文件中:
1[label test.json]
2{
3 "test": "test",
4 "array": [
5 "item1: foo",
6 "item2: bar"
7 ]
8}
您可以使用jq
来解析此文件,如果您希望检查 JSON 语法是否有效:
1jq . test.json
如果 JSON 是有效的,则 jq
会输出该文件,否则会显示错误,您可以在需要时使用它来纠正语法。
接下来,使用 Radamsa 混合测试 JSON 文件,然后将其传输到jq
。这将导致jq
读取混合/操纵的测试案例,而不是原始有效的 JSON 数据:
1radamsa test.json | jq
如果 Radamsa 将 JSON 数据合并成一种仍然是语法有效的方式,那么 `jq' 将输出数据,但不管 Radamsa 对其做出的任何变化。
或者,如果 Radamsa 导致 JSON 数据变为无效,则jq
会显示相关的错误。
1[secondary_label Output]
2parse error: Expected separator between values at line 5, column 16
另一个结果是,jq 无法正确处理混淆的数据,从而导致数据崩溃或行为不当,这就是你正在寻找的混淆,因为这可能表明一个安全漏洞,如 缓冲过度或命令注入。
为了更有效地测试此类漏洞,可以使用Bash脚本(LINK0)来自动化混淆过程,包括生成测试案例,将其传送到目标程序并捕获任何相关的输出。
创建名为 `jq-fuzz.sh 的文件:
1nano jq-fuzz.sh
精确的脚本内容将取决于您正在混淆的程序类型和输入数据,但在jq
和其他类似程序的情况下,以下脚本就足够了。
将脚本复制到您的 jq-fuzz.sh
文件:
1[label jq-fuzz.sh]
2#!/bin/bash
3while true; do
4 radamsa test.json > input.txt
5 jq . input.txt > /dev/null 2>&1
6 if [ $? -gt 127 ]; then
7 cp input.txt crash-`date +s%.%N`.txt
8 echo "Crash found!"
9 fi
10done
此脚本包含一个而
来使内容循环反复。每次脚本循环,Radamsa将基于test.json
生成一个测试案例,并将其保存到input.txt
。
然后,input.txt
测试案例将通过jq
运行,所有标准和错误输出都被重定向到/dev/null
,以避免填充终端屏幕。
最后,检查jq
的输出值.如果输出值大于127
,这表明发生了致命的终止(崩溃),那么输入数据在名为crash-
的文件中保存为更晚的日期进行审查,随后以Unix秒和纳米秒的当前日期保存。
将脚本标记为可执行,并将其设置为运行,以便自动开始模糊测试 jq
:
1chmod +x jq-fuzz.sh
2./jq-fuzz.sh
您可以随时发出CTRL+C
,以终止脚本,然后通过使用ls
查看包含已创建的任何故障文件的目录列表来检查是否发现任何故障。
您可能希望改进您的 JSON 输入数据,因为使用更复杂的输入文件可能会改善您混淆的结果的质量。 避免使用大文件或包含大量重复数据的文件 - 理想的输入文件是大小的,但仍然包含尽可能多的复杂
元素。
您已经使用 Radamsa 来混淆命令行应用程序,接下来,您将使用 Radamsa 混淆网络服务的请求。
步骤 4 – 模糊网络服务请求
Radamsa 还可以用来混淆网络服务,无论是作为网络客户端还是服务器,在此步骤中,您将使用 Radamsa 混淆网络服务,而 Radamsa 作为客户端。
混淆网络服务的目的是测试一个特定的网络服务对发送错误和/或恶意数据的客户的弹性。许多网络服务,如网页服务器或DNS服务器通常暴露在互联网上,这意味着它们是攻击者的共同目标。
混淆网络服务的具体技术因网络服务而异,但在本例中,我们将使用Radamsa来混淆提供静态HTML内容的基本Web服务器。
首先,您需要设置 Web 服务器用于测试,您可以使用内置的开发服务器,该服务器配有php-cli
包,您还需要curl
来测试您的 Web 服务器。
如果您没有安装php-cli
和/或curl
,您可以使用apt
来安装它们:
1sudo apt install php-cli curl
接下来,创建一个目录来存储您的 Web 服务器文件并移动到它:
1mkdir ~/www
2cd ~/www
然后,创建一个包含一些样本文本的HTML文件:
1nano index.html
将以下内容添加到文件中:
1[label index.html]
2<h1>Hello, world!</h1>
您现在可以运行您的PHP网页服务器,您需要能够查看网页服务器日志,同时仍然使用另一个终端会话,所以为此打开另一个终端会话和SSH到您的服务器:
1[environment second]
2cd ~/www
3php -S localhost:8080
这将产生类似于以下的东西:
1[secondary_label Output]
2PHP 7.2.24-0ubuntu0.18.04.1 Development Server started at Wed Jan 1 16:06:41 2020
3Listening on http://localhost:8080
4Document root is /home/user/www
5Press Ctrl-C to quit.
您现在可以重新切换到原始终端会话并测试网页服务器是否使用弯曲
:
1curl localhost:8080
这将输出您之前创建的样本 index.html
文件:
1[secondary_label Output]
2<h1>Hello, world!</h1>
您的 Web 服务器只需要本地访问,因此您不应该为其打开防火墙上的任何端口。
现在你已经设置了测试 Web 服务器,你可以开始使用 Radamsa 来模糊测试它。
首先,您需要创建一个样本 HTTP 请求以作为 Radamsa 的输入数据使用。
1nano http-request.txt
然后,将以下样本 HTTP 请求复制到文件中:
1[label http-request.txt]
2GET / HTTP/1.1
3Host: localhost:8080
4User-Agent: test
5Accept: */*
接下来,您可以使用 Radamsa 将此 HTTP 请求提交到您的本地 Web 服务器. 为了做到这一点,您需要使用 Radamsa 作为 TCP 客户端,这可以通过指定 IP 地址和端口来连接到:
1radamsa -o 127.0.0.1:8080 http-request.txt
<$>[note] ** 注意:** 请注意,使用 Radamsa 作为 TCP 客户端可能会导致网络上传输恶意/恶意数据。
最后,如果您查看本地 Web 服务器的输出日志,您会看到该服务器接收了请求,但很可能没有处理它们,因为它们是无效的/错误的。
输出日志将在您的第二终端窗口中可见:
1[secondary_label Output]
2[Wed Jan 1 16:26:49 2020] 127.0.0.1:49334 Invalid request (Unexpected EOF)
3[Wed Jan 1 16:28:04 2020] 127.0.0.1:49336 Invalid request (Malformed HTTP request)
4[Wed Jan 1 16:28:05 2020] 127.0.0.1:49338 Invalid request (Malformed HTTP request)
5[Wed Jan 1 16:28:07 2020] 127.0.0.1:49340 Invalid request (Unexpected EOF)
6[Wed Jan 1 16:28:08 2020] 127.0.0.1:49342 Invalid request (Malformed HTTP request)
为了获得最佳结果,并确保记录故障,您可能希望编写类似于步骤 3 中使用的自动化脚本,您还应该考虑使用更复杂的输入文件,其中可能包含额外的添加,如额外的 HTTP 标题。
您使用 Radamsa 作为 TCP 客户端的网络服务被混淆了,接下来,您将把网络客户端与 Radamsa 作为服务器混淆。
步骤5:模糊网络客户端应用程序
在此步骤中,您将使用Radamsa来模糊测试网络客户端应用程序,通过拦截来自网络服务的响应并模糊它们,然后在客户端接收它们之前实现。
这种混淆的目的是测试网络客户端应用程序对接收网络服务的错误或恶意数据的韧性,例如,测试一个网络浏览器(客户端)从网络服务器(网络服务)接收错误的HTML,或者测试一个DNS客户端从DNS服务器接收错误的DNS响应。
与混合命令行应用程序或网络服务一样,混合每个网络客户端应用程序的精确技术大大不同,但是在本示例中,您将使用whois
,这是一个简单的基于TCP的发送/接收应用程序。
whois
应用程序用于向WHOIS服务器提出请求,并以响应方式接收WHOIS记录。WHOIS通过TCP端口43
在清晰的文本中运作,使其成为基于网络的混乱测试的良好候选人。
如果你还没有可用的whois
,你可以使用apt
来安装它:
1sudo apt install whois
首先,您需要获得一个样本whois
响应,以作为您的输入数据使用。您可以通过创建一个whois
请求并将输出保存到一个文件中来做到这一点。
1whois example.com > whois.txt
接下来,您将需要将Radamsa设置为服务器,该服务器提供这种whois
响应的混合版本。一旦Radamsa在服务器模式下运行,您将需要能够继续使用您的终端,因此建议您为此打开另一个终端会话和SSH连接到您的服务器:
1[environment second]
2radamsa -o :4343 whois.txt -n inf
Radamsa 现在将在 TCP 服务器模式下运行,并且每次连接到服务器时都会提供一个混合版本的 `whois.txt,无论接收了哪些请求数据。
您将需要对您选择的任何域进行正常的whois
请求(不一定是样本数据的同一域),但有whois
指向您的本地 Radamsa 服务器:
1whois -h localhost:4343 example.com
答案将是您的样本数据,但被 Radamsa 混淆了. 只要 Radamsa 运行,您可以继续向本地服务器提出请求,并且每次都会提供不同的混淆响应。
与混淆网络服务一样,为了提高这个网络客户端混淆测试的效率,并确保捕获任何故障,您可能希望编写类似于步骤 3 中使用的自动化脚本。
在这个最后一步中,您使用Radamsa进行网络客户端应用程序的模糊测试。
结论
在本文中,您设置了Radamsa,并使用它来混合命令行应用程序、网络服务和网络客户端. 您现在有必要的基本知识来混合测试自己的应用程序,希望其结果能提高其强度和抵抗攻击性。
如果您想进一步探索 Radamsa,您可能希望仔细查看 Radamsa README
文件,因为它包含更多的技术信息和工具如何使用的示例:
您可能还想检查一些其他混淆工具,例如美国混淆(AFL),这是一个先进的混淆工具,旨在以极高的速度和精度测试二进制应用程序:
【美洲狂欢狂欢】(LINK0)