攻击模块API概述

AppSpider是一个web应用程序安全扫描程序。其主要目的是发现网站和web服务中可利用的安全缺陷。

AppSpider拥有50多个内置攻击模块。在某些情况下,您可能需要添加特定于您的环境的其他攻击。您可以通过修改模块配置和攻击配置文件来添加或更改现有攻击模块发送的攻击有效载荷,但在某些情况下,您可能需要添加一个自定义模块,以发现新类型的漏洞,或使用与我们的攻击模块不同的方法发现漏洞。对于这些情况,您可以创建包含自定义攻击代码的自定义攻击模块。

定制攻击模块API的所有信息涵盖AppSpider 6.14.015中提供的接口和数据结构。

扫描仪的工作原理

AppSpider扫描程序分为两个组件:爬虫程序和攻击者。爬虫程序对网站进行爬网,并发现可以发送到服务器的所有请求。这些请求可以是静态页面、动态页面或web服务请求。然后,攻击者从爬虫程序获取发现数据,并审核所有漏洞请求。攻击者使用攻击模块执行实际攻击。每个攻击模块旨在发现特定类型的漏洞。但是,在某些情况下,所提供的攻击模块可能无法覆盖您需要的漏洞类型。这是您需要构建自定义攻击模块的时候。

概念

在创建自定义攻击模块之前,您应该熟悉一些关键概念。

模块声明

模块声明由几个文件组成:

  • 模块声明文件-这是一个名为module.cfg,这是一个XML文件,包含有关攻击模块的信息。有关更多信息,请参阅模块配置文件参考."

  • 攻击声明文件-这是一个名为攻击.cfg,这是一个包含攻击声明的XML文件。有关更多信息,请参阅攻击配置文件引用部分

  • 攻击模块动态链接库(DLL)-此DLL是可选的。AttackModule DLL是使用C#创建的。除了文件名必须在中正确引用之外,不要求文件名module.cfg文件名,如以下示例所示:SampleSQLi.dll.

一般来说,不要求模块DLL与配置文件位于同一目录中;这只是一个惯例。在某些情况下(例如,调试攻击模块时),可能更容易指向module.cfg文件到Visual studio输出目录中的DLL。

攻击模块从两个位置加载:

  • AppSpider内部模块位置-内部模块目录位于中C:\ProgramFiles(x86)\Rapid7\AppSpider 6\ScanEngine\Modules.

  • 用户特定位置-用于存储您开发的自定义模块的目录是您在安装期间指定的用于存储AppSpider的用户特定数据的目录。默认情况下,该目录设置为%USERPROFILE%\Documents\AppSpider.

这两个位置都包含子目录,每个子目录代表一个攻击模块。要添加新模块,应使用模块配置文件和攻击配置文件创建新的子目录。

攻击声明和默认攻击配置

模块攻击在攻击.cfg配置文件。您可以查看示例SampleSQLi以了解典型的attacks.cfg文件。此文件包含AttackConfig结构的列表。每个攻击由一个AttackConfig条目表示。

在攻击配置文件中存在多个攻击是很常见的。一次攻击的结构几乎相同,只有少数特定于某次攻击的字段。为了避免attacks.cfg文件中存在冗余数据,AppSpider允许用户在所有att中移动相同的数据确认到模块配置文件中声明的DefaultAttackConfig结构中。如果在AttackConfig结构中未定义字段,AppSpider将从DefaultAttackConfig结构中读取值。这就是SampleSQLi模块中的AttackConfig结构如此小的原因;大多数数据都是从DefaultAttackConfig结构中读取的ckConfig。

API结构

AppSpider攻击模块API的结构使得攻击模块实现的函数要么没有参数,要么只有一个整数参数(请参见C#Interface部分)。使用ModuleRunner对象检索实际执行攻击所需的其余信息(例如攻击点)(请参阅API参考部分)。ModuleRunner对象应由攻击模块在其加载函数中显式实例化:

公共空间装载(无符号整型模块(NNERID)

{

_模内=刚出现的AttackerCOMLib。模内();

_moduleRunner.SetModuleInstanceID(moduleRunnerId);

}

创建ModuleRunner后,可以通过其接口直接或间接访问其余所需数据:攻击点对象、攻击对象、攻击配置等。

攻击点

对整个网站进行爬网后,攻击空间被划分为攻击点。此划分允许AppSpider优化攻击执行,以确保站点有效地受到攻击,并在框架级别消除许多冗余攻击。在攻击攻击点时,API允许攻击模块仅执行该攻击点允许的操作。

向攻击模块提供了几种类型的攻击点:

  • 主机攻击点-主机是网站名称的地址。例如,http://www.webscantest.com. 如果攻击模块想要执行特定于主机的攻击,则应使用此攻击点。请注意,协议被视为主机的一部分。

  • 目录攻击点-目录是站点上的目录。例如,http://www.webscantest.com/datastore/. 需要执行目录分析的模块可以使用此攻击点(例如,检查目录中可能存在的一些已知文件)。

  • 文件攻击点-文件攻击点的一个示例是http://www.webscantest.com/datastore/get\_项目\\由\\ u id.php创建.

  • 爬网结果攻击点。CrawlResult攻击点是对网站的请求,包含所有参数。如果模块希望将攻击有效负载注入现有请求,则这是模块应该使用的攻击点。

  • 参数攻击点-参数攻击点允许攻击模块在请求时将攻击有效载荷应用于特定参数。使用参数攻击点将攻击模块与请求格式的知识隔离开来;无论参数是JSON post数据、google toolkit数据还是简单查询参数的一部分,该框架都会确保将攻击负载正确插入到请求中。

AppSpider如何创建攻击点?

为了理解AppCype是如何创建攻击点的,让我们考虑一下Crawler发现的以下网页:http://www.webscantest.com/datastore/store1/get\_item\\\由\\ u id.php?id=3&name=Rake.

从爬虫程序接收到该数据后,攻击者会创建以下攻击点:

之后,模块可以决定它感兴趣的攻击点。有两种机制可以控制它:配置文件(参见攻击配置文件参考,ParameterLocations元素)或函数CalculateEnumberOfAttacks(参见C#接口部分)

请注意,如果为主机发现了许多请求http://www.webscantest.com/,只创建一个主机攻击点,因此攻击模块不必跟踪它是否攻击该主机。同样的方法也适用于其他攻击点。可能有多个参数攻击点指向相同的参数名称和值,但这些参数总是来自具有唯一其他请求参数集的不同请求。

配置和自定义参数

可以使用模块配置文件和攻击配置文件中的自定义参数配置攻击模块。下面显示了此类参数声明的示例

ParameterName

<![CDATA[ParameterData]>

有两个单独的自定义配置参数列表:

  • ModuleConfig数据结构中的一个,在module.cfg文件,并可选择使用扫描配置文件中的ScanModulesParametersList添加到。

  • AttackConfig数据结构中的一个,在module.cfg(在DefaultAttackConfig元素中)和攻击.cfg文件夹。

在模块执行期间,模块可以使用以下代码读取这些参数。

  • 对于AttackConfig数据结构中的内容:

AttackerCOMLib。IATACK配置attackConfig=_moduleRunner.GetAttackConfig();

attackConfig.CustomParameters.GetParameter(“ParameterName”);

  • 对于ModuleConfig数据结构中的模块:

_moduleRunner.GetParameters().GetParameter(“ParameterName”);

在扫描配置文件中通常找不到ScanModulesParametersList。如果要使用,必须由用户添加。ScanModulesParametersList元素是ScanConfig元素的子元素,每个模块有一个ScanModuleParameters元素。但是,如果存在需要对多个模块可用的参数,则ModuleId可以使用空Guid使参数对所有模块可用。

示例结构如下所示:

FA48FA7E33B6407B8793D1993C3FF582

模块特定参数1

特定值1

模块特定参数2

特定值2

00000000000000000000

全局参数1

全局值1

全局参数2

全局值2

无状态攻击模块

在扫描运行期间,攻击者多次调用攻击模块。每次调用模块方法时,它都会创建一个新的ICSModule对象。对于这些对象中的每一个,它都调用方法ICSModule加载以允许模块绑定到其ModuleRunner对象。例如,用于运行CalculateEnumberOfAttacks的对象将在调用该函数后立即销毁,并将构造另一个对象来运行攻击(通过调用方法ICSModule)运行攻击)。在函数调用之间无法保留对象的状态。当然,例外是ICSModule::Load方法,它总是在构造新对象后调用。

并发性

AppSpider创建多个线程以运行多个攻击。每次攻击都在同一线程中从头到尾执行。但是,可能会同时执行同一攻击模块的两个实例。如果攻击模块的代码使用共享资源,则攻击模块编写器负责同步对共享资源的访问。