一种基于STIX信息交互的渗透测试协作方案研究*
2018-12-25张海峰杨秉杰
刘 岳,张海峰,张 良,杨秉杰,边 帅
(国家互联网应急中心河南分中心,河南 郑州 450000)
0 引言
在日常开展的网络安全测试工作中,网络安全工作人员经常接触到来自各个渠道、自行编写或同行分享的测试工具代码。因为工具代码使用在某些方面存在效率瓶颈,影响了日常工作开展的质量和效率。其中包括:
(1)在实际使用POC进行测试的时候,代码的编写者一般有自有习惯,不太明确应当传入怎样的参数,各参数采取怎样的格式。因为通常不会附带详细的文档说明,往往需要进行很多尝试,降低了效率。
(2)在实际使用POC进行测试的时候,对于该POC将达到怎样的效果不明确,不知道返回的结果会采取怎样的格式,且返回的信息不够详细。
(3)由于各个POC的输入、输出情况不明确,不同的POC之间无法进行互操作,如很难将不同POC连接使用来完成测试目标,难以自动使一个POC的输出成为另一个POC的输入,无法实现自动化测试。
(4)多个工作人员一起进行渗透测试协作时常有较多不便,一名测试人员测试得到的结果必须详细向另一名测试人员描述,如已经在目标主机上上传脚本,但所上传目录没有执行权限,需要另一名测试人员进行提权或者移动脚本至其他目录。测试人员无法系统化描述其测试的中间结果,只能使用低效的口头描述方式。
网络安全渗透测试工作由于以上的一些效率瓶颈,事实上还处在手动进行、各自为战的工作协作状态,已完成的测试工作只能通过语言描述,效率较低。本文拟提出一种基于STIX信息交互的渗透测试协作方案,可有效提高渗透测试工作的标准化、规范化程度,并可一定程度上实现自动化测试。
1 STIX介绍
结构化威胁信息表达式(Structured Threat Information eXxpression, STIX)是结构化信息标准促进组织(Organization for the Advancement of Structured Information Standards,OASIS)的网络威胁情报技术委员会(Cyber Threat Intelligence Technical Committee,CTITC)通过的用于机器可读威胁情报(Machine-Readable Threat Intelligence,MRTI)的实时信息共享的委员会规范。
STIX 2.0是个概念性数据模型,用于描述攻击指标(IOC),凸显网络攻击序列中可影响技术栈的其他各种元素。包括攻击者所用战术、技术和规程(TTP),威胁执行者的潜在动机和意图、恶意软件属性,受害目标确定的各种特征以及其他元素。
STIX 2.0的主体架构是一个由节点和边组成的图,“节点”是Domain Objects(SDOs),“边”是Relationship Objects(SROs)。SDO描述了网络安全攻击情报的方方面面,包括Campaign、Identity、Indicator、Malware、Intrusion Set、Vulnerability等。SROs描述了SDO之间的关系,包括Relationship、Sighting。
一种SDO类别Observed Data提供了对各种可以被观察到的对象的结构化描述,其中包括了大部分IOC指标中所涉及的数据类型,如域名、IP地址、目录、文件、进程、注册表项、证书等。每一种类型的Observed Object都拥有一定数量的基本属性和扩展属性(extensions)。
STIX具有高度的可扩展性,如Observed Data可以进行基于对象(Custom Observable Objects)、基于扩展(Custom Object Extensions)和基于属性(Custom Object Properties)的定制。
STIX 2.0将网络攻击情报和IOC用SDO及SRO进行系统性的描述,然后通过标准格式使用XML或者JSON承载,生成文件在公司和组织之间完成网络安全威胁信息交互的功能。
2 方案介绍
本文提出的基于STIX信息交互的渗透测试协作方案,可以有效解决上述工作中的效率瓶颈问题,旨在建立一个高效普适的渗透测试协作系统,该系统如图1所示,由中央控制单元以及与中央控制单元相接口的渗透测试人员和自动化测试软件组成。中央控制单元与测试人员和测试软件都通过基于STIX的渗透测试描述文档进行交互,即中央控制单元向测试人员和测试软件都可以发送“测试任务书”,也可以从后者获取“测试结果报告”,“测试任务书”和“测试结果报告”都是基于STIX的XML文档(在本文中称为PEN_STIX文档),测试人员之间和测试软件之间可通过中央控制单元进行交互。此方案中将测试人员和测试软件作为同等的测试单元,每个测试单元所完成的工作都通过基于PEN_STIX文档记录,具有某方面特长的渗透测试人员可以获取适合他的“测试任务书”完成某个测试环节,实现渗透测试工作的流水线化作业,提升测试效率。
图1
为完成流水线化作业,必须解决测试单元的信息交互问题。信息交互的场景可能发生在以下的几种情况:
(1)所编写的针对某一类漏洞的测试工具,对此工具提供必要的信息进行调用,调用者可能是测试人员或者其他测试软件,因此发生人对软件或者软件对软件的信息交互。
(2)所编写的针对某一类漏洞的测试工具,执行完成后得到的结果,需要供外界使用,使用者可能为测试人员或者其他测试软件,因此发生软件对人或者软件对软件的信息交互。
(3)不同的测试人员进行测试协作,可能是某种形式的众测,测试进行到某一步骤的中间信息可能需要互相交流,此时发生人与人之间的信息交互。
(4)实现某种形式的测试平台时,可能会由平台调用众多不同的渗透测试代码,因此平台需要将目标主机信息传送到测试代码,此时发生软件与软件的信息交互。
众多信息交互场景需要一种系统性的描述测试信息的方式,可以消除歧义,也可以消除安全人员随手写下测试脚本的随意性。
STIX本身即是一种标准化传输威胁信息的方式,其定义的类别Observed Data可以用来传输各种渗透测试中所需要使用的数据,但是标准中定义的类型和属性有限,必须使用其支持的扩展定制功能进行扩展,以满足实际渗透测试的需求。
方案继续利用Directory、Domain Name、File、IPv4 Address、IPv6 Address、MAC Address、Email Address、Email Message、Network Traffic(包含HTTP、ICMP、TCP等多个扩展,表示网络请求、网络访问情况等)、Process、Software、User Account、URL、Registry、Certificate等。
为更加适合渗透测试需要进行一些定制。如增加Network Service表示目标服务器上存在的网络服务如SSH、FTP等。在User Account中增加SSH等服务相应的extension。增加Database表示主流数据库系统。IPv4 Address中增加Port属性,并增加两种Observed Object:IPv4 Range和IPv4 CIDR,分别表示普通的IP地址段和CIDR形式的IP地址段等。具体情况如表1所示。
表1 添加定制
如下代码段为给某次测试的输入信息,包括目标主机IP及主机上运行服务的信息。
[
{
"type":"observed-data",
"id":"observed-data--b67d30ff-02ac-498a-92f9-32f845f448cf",
"created_by_ref":"identity--f431f809-377b-45e0-aa1c-6a4751cae5ff",
"created":"2018-10-29T15:58:16.000Z",
"modified":"2018-10-29T15:58:16.000Z",
"objects":{
"0":{
"type":" ipv4-range",
"value":"198.51.100.15-198.51.100.23",
"port":"8080",
"description":"待测试主机IP地址"
}
"1":{
"type":"Network Service",
"value":"Weblogic",
"port":"8080",
"description":"待测试主机运行服务信息"
}
}
}
]
如下代码段为测试的输出信息,如在服务器某路径上传脚本及检测到服务器上运行FTP服务等。
[
{
"type":"observed-data",
"id":"observed-data--b67d30ff-02ac-498a-92f9-32f845f448cf",
"created_by_ref":"identity--f431f809-377b-45e0-aa1c-6a4751cae5ff",
"created":"2018-10-29T16:10:16.000Z",
"modified":"2018-10-29T16:10:16.000Z",
"objects":{
"0":{
"type":" ipv4 address",
"value":"198.51.100.19",
"port":"8080",
"description":"测试输出相关IP地址"
}
"1":{
"type":"URL",
"value":"http://198.51.100.19:8080/bea_wls_internal/abc.jsp",
"description":"上传后门脚本"
}
"2":{
"type":"Network Service",
"value":"FTP",
"port":"4400",
"ip_ref":"0",
"description":"目标主机存在FTP服务"
}
"3":{
"type":"file",
"hashes":{
"SHA-256":"35a01331e9ad96f751278b891 b6ea09699806faedfa237d40513d92ad1b7128f"
},
"extensions":{
"script-ext":{
"type":"jsp",
"url_ref":"1",
"path":"/var/aaa/bbb/abc.jsp"
"description":"后门脚本物理路径"
}
}
}
}
}
]
如上示例的输入信息可用于测试人员之间的信息交流,亦可输入测试IOC,由测试IOC选取必需的目标参数进行测试。而输出的信息可作为中间信息传递给其他测试人员,亦可传入另外的测试脚本。
3 方案实现
Github上有python-stix和java-stix等STIX规范的实现,对代码加以修改,添加对定制对象和属性的支持,即可实现PEN_STIX文档的生成和读取;将代码封装成为库函数import_module和export_module。import_module负责解读PEN_STIX文档,解析为输入参数集合;export_module负责生成PEN_STIX文档,将测试工作完成所得结果元数据表达为PEN_STIX文档。具体可分为测试代码和测试人员两种情况:
(1)对测试代码情况,为使测试代码可以使用STIX方式获取传入数据,需在测试代码入口处使用import_module,解析传入的PEN_STIX文档,即获得了此测试任务的全部输入参数,且这些输入参数全部是标准格式。测试代码选取其需要的参数进行测试工作,得到结果后,在程序的出口处使用export_module,将结果记录在PEN_STIX文档,供下一步测试使用。
(2)对测试人员情况,测试人员可自行读取PEN_STIX文档,或者使用import_module编写简单的读取工具,来获取此测试任务的全部输入参数,并使用这些参数进行测试。在测试完成后,测试人员可以使用export_module编写简单的生成工具,将自己在测试中所发现的或者完成的工作记录为PEN_STIX文档,供下一步测试使用。
中央控制单元按照测试项目的工作规划使用import_module和export_module将测试任务表达为PEN_STIX文档,根据任务特征将文档分别发往测试软件和测试人员,测试人员反馈的PEN_STIX文档如包含了新发现的服务器或系统应用,即可根据这些特征将PEN_STIX文档派发给相应的测试软件。如果某个测试人员没有得到最终结果而只是中间结果,即可将反馈的PEN_STIX文档派发给其他测试人员和测试软件。如此循环,可高效协作完成测试任务。
4 结束语
本文提出了一个基于STIX信息交互的渗透测试协作方案,该方案利用STIX威胁情报标准交换格式,添加适合渗透测试工作场景的定制对象和属性等,制定了一种进行渗透测试工作时的完善、高效、准确的信息交换方式,利用该方式既便于渗透测试人员对测试工具的使用,便于测试POC使用其他测试工具产生的测试结果,也便于测试人员之间的信息交互,可有效提高渗透测试工作的效率。