渗透测试与漏洞利用系列课程【第四课】

2018-04-1107:00:32 发表评论

渗透测试与漏洞利用系列课程【第四课】

漏洞挖掘

静态检测

软件静态安全检测技术是针对未处于运行状态的软件所开展的安全分析测试技术。静态安全检测技术可以用于对软件源代码可执行代码的检测。

源代码的检测

静态安全检测技术是软件源代码的主要安全检测技术。

  • 不需要构建代码运行环境
  • 分析效率高,资源消耗低

  • 存在较高的误报率,但仍然在很大程度上减少了人工分析的工作量。

目前常用的静态安全检测技术:

  • 词法分析
  • 数据流分析
  • 污点传播
  • 符号执行
  • 模型检查
  • 定理证明
部分内容被隐藏
需登陆后可查看

 

渗透测试与漏洞利用系列课程【第四课】

使用HOOK技术,可以使得原有的调用strcpy的函数,变成调用我们自己的相关函数,而我们自己的相关函数可以有效的记录相关的执行行为,进而为漏洞检测提供基础数据。

如何实现一般函数的HOOK

首先,了解API HOOKPE文件的关系

Api hook技术的难点,并不在于hook技术,而在于对PE结构的学习和理解。如何修改api函数的入口地址?这就需要学习PE可执行文件如何被系统映射到进程空间中,学习PE格式的基本知识。

PE文件提供了一个输入符号表imported symbols table来定义了所调用的函数的入口地址。

pe格式的基本组成
DOS文件头以4D5A的16进制即MZ开头
PE文件头以50450000的PE00开头
可选头文件包含下面的数据目录
数据目录函数入口地址 / 基地址 / 内存 / 文件对齐粒度之类信息
节表维护一个所有节的信息
节表1具有同类特征的信息,文件的主体部分
节表2
...
节表n

我们需要从数据目录数组中的第二个元素——输入符号表的位置,它是一个IMAGE_DATA_DIRECTORY结构,从它中的VirtualAddress地址,找到api函数的入口地点。

使用LordPE打开一个PE文件 -- 点目录,可以看到目录表 -- 点输入表的右侧第一个按钮,可以看到所调用的函数的入口信息

所调用的函数,主要由两部分:DLL文件及DLL文件中的函数。因此,DLL注入是HOOK的一个基本实现方法。

这样的话,一种实现HOOK的方式就是:

  • 利用DLL注入,定义自己的函数。比如,我们想将KERNEL32.DLL的函数进行HOOK,那么使用VC IDE建立一个DLL动态链接库工程,将相关的函数按照KERNEL32.DLL中的函数原型进行重新定义,命名为自己的函数
  • 利用有关工具改写PE文件中的函数调用信息

动态检测

软件动态安全检测技术是针对运行中的软件程序,通过 构造非正常的输入 来检测软件运行时是否出现故障或崩溃等非正常的输出,并通过检测软件运行中的内部状态信息来验证或者检测软件缺陷的过程,它的分析对象是可执行代码。

动态安全检测技术是通过实际运行发现问题,所以检测出的安全缺陷和漏洞准确率非常高,误报率很低。

  • 模糊测试
  • 智能模糊测试
  • 动态污点跟踪

模糊测试

模糊测试(Fuzzing)是一种自动化或半自动化的安全漏洞检测技术,通过向目标软件输入大量的畸形数据并监测目标系统的异常来发现潜在的软件漏洞

模糊测试属于黑盒测试的一种,它是一种有效的动态漏洞分析技术,黑客和安全技术人员使用该项技术已经发现了大量的未公开漏洞。

它的缺点是畸形数据的生成具有随机性,而随机性造成代码覆盖不充分导致了测试数据覆盖率不高。

知名的模糊测试工具包括SPIKEPeach等。

模糊测试需要根据目标程序的多种因素而选择不同的方法,这些因素包括目标程序不同的输入、不同的结构信息、研究者的技能以及需要测试数据的格式等。然而不管针对何种目标程序采取何种方法,通常的模糊测试过程基本都采用以下几个通用的步骤。

  1. 确定测试对象和输入数据由于所有可被利用的漏洞都是由于应用程序接受了用户输入的数据造成的,并且在处理输入数据时没有首先过滤非法数据或者进行校验确认。对模糊测试来说首要的问题是确定可能的输入数据,畸形输入数据的枚举对模糊测试至关重要。所有应用程序能够接收的数据都应该被认为是输入数据,主要包括文件、网络数据包、注册表键值、环境变量、配置文件和命令行参数等,这些都是可能的模糊测试输入数据。
  2. 生成模糊测试数据一旦确定了输入数据,接着就可以生成模糊测试用的畸形数据。根据目标程序及输入数据格式的不同,可相应选择不同的测试数据生成算法。例如,可采用预生成的数据,也可以通过对有效数据样本进行变异,或是根据协议或文件格式动态生成畸形数据。无论采用哪种方法,此过程都应该采用自动化的方式完成。
  3. 检测模糊测试数据检测模糊测试数据的过程首先要启动目标程序,然后把生成的测试数据输入到应用程序中进行处理。在这个过程中实现自动化也是必需的和十分重要的。
  4. 监测程序异常在模糊测试过程中,一个非常重要但却经常被忽视的步骤是对程序异常的监测。实时监测目标程序的运行,就能追踪到引发目标程序异常的源测试数据。异常的监测可以采用多种方法,包括操作系统的监测功能以及第三方的监测软件。
  5. 确定可利用性一旦监测到程序出现的异常,还需要进一步确定所发现的异常情况是否能被进一步利用。这个步骤不是模糊测试必需的步骤,只是检测这个异常对应的漏洞是否可以被利用。这个步骤一般由手工完成,需要分析人员具备深厚的漏洞挖掘和分析经验。

    所有类型的模糊测试技术,除了最后一步确定可利用性外,所有其它的四个阶段都是必须的。尽管模糊测试对安全缺陷和漏洞的检测能力很强,但并不是说它对被测软件都能发现所有的错误,原因就是它测试样本的生成方式具有随机性。为了弥补它的这个缺点,有实力的研究机构和公司采用了多台测试服务器组成的集群进行分布式协同测试,甚至测试用的服务器达到几十台。通过这种增加物理资源的手段,在一定程度上弥补了模糊测试的不足。

智能模糊测试

模糊测试方法是应用最普遍的动态安全检测方法,但由于模糊测试数据的生成具有随机性,缺乏对程序的理解,测试的性能不高,并且难以保证一定的覆盖率。为了解决这个问题,引入了基于符号执行等可进行程序理解的方法,在实现程序理解的基础上,有针对性的设计测试数据的生成,从而实现了比传统的随机模糊测试更高的效率,这种结合了程序理解和模糊测试的方法,称为智能模糊测试(smart Fuzzing)技术。

智能模糊测试具体的实现步骤

部分内容被隐藏
需登陆后可查看

渗透测试与漏洞利用系列课程【第四课】

  • <name></name>:被测试软件及其处理文件类型的名称
  • <fileName>+<fileDescription>:填写被测试文件类型
  • <sourceFile>以及<sourceDir>:由于FileFuzz程序利用了直接暴力方式修改测试的思想,那么它首先需要一个进行修改的原始文档文件,然后将对这个 文件进行不断地修改保存,接着将这些保存后的文件作为测试文件让被测试软件打开,从而发现软件存在的漏洞。
  • <app>:填写被测试文件处理型软件的程序名称,以及程序所在的物理路径信息。
  • <target>:指被测试文件所在的路径,这里保持与<sourceDir>一栏一致。

保持修改后的targets.xml的文件,然后重新运行FileFuzz程序,这时就能够在软件上方的列表中找到想要测试的文字处理型软件

在C盘ppt2003目录下建立原始文档文件test.ppt,这里演示漏洞MS06-028。请暂时重新安装到SP2的最初版本11.6564.6568,以便测试分析。

新建一个空白的test.ppt文件,用分别以单、双字节的0f进行fuzz,能重现这个漏洞。

渗透测试与漏洞利用系列课程【第四课】

FileFuzz配置成上图。

  • Target:用来替换原始文档文件内容的数据,这里修改为0f、2个字节。
  • Scope:关于修改模式的选项
    • All Bytes是逐个字节修改
    • Range是对原始文档文件的某个范围进行修改
    • Depth是按照阶梯的形式来修改原始文档文件
    • Match则是使用替换指定字节的方式来生产测试文件

单击Create按钮,FileFuzz就会按照要求在<targetDir>栏指定的目录下生成测试文件。

生成待测文件后,以进行Fuzz测试。

单击Execute按钮,切换到测试面板,并将Start FileFinish File修改为刚刚生成的测试文件的起始序号。

接下来单击Execute按钮,FileFuzz将会开始进行自动化的安全测试工作。一旦FileFuzz检测到被测试软件在处理某个测试文件时发生了错误,FileFuzz程序会马上在程序的最下方显示错误信息,如下图所示。

渗透测试与漏洞利用系列课程【第四课】

 

  • FileFuzz程序在很大程度上简化了我们手工发掘文字处理型软件漏洞的过程,自动化的程序测试可以节省大量的时间。
  • 自动动手写简单的Fuzzer程序
    1. 判断目标程序的需要
    2. 思考提供什么样的数据作为测试
    3. 如何实现暴力测试
    4. 如何获得结果,结果如何输出

    overflow.exe


#include <stdio.h>
#include <string.h>
void overflow(char *b)
{
char des[50];
strcpy(des,b);
}
void main(int argc,char *argv[])
{
if(argc>1)
overflow(argv[1]);
else
printf("usage: overflow XXXXX\n");
}

对该exe文件进行模糊测试的话,根据该exe文件要求提供一个输入字符串、对字符串格式无要求的事实,所编写的Fuzzer只需要构造不同长度的输入字符串就可以达到模糊测试的目的。

明确了输入的要求和暴力测试的循环条件后,可以写出如下的代码

部分内容被隐藏
需登陆后可查看

 

  1. 通过一个for循环构造不同的字符串作为输入,通过ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL);来实现对目标程序的模糊测试。上述Fuzzer的调用格式为:Fuzzing X 1X表示目标程序,1表示递增暴力测试。

动静结合检测

目前普遍应用的动静结合安全检测技术主要包括两种

  1. 第一种是先对源代码进行静态分析,发现潜在的漏洞,然后构造输入数据在程序动态运行时验证其真实性。这种方法没有更多地发挥动态分析的作用。
  2. 第二种是对可执行代码进行反汇编,通过对汇编代码或者中间语言进行静态检测分析获取的信息指导动态漏洞分析。这种办法结合了动态污点分析技术的优点,然而汇编代码的语义信息较难提取,并且跟踪可执行代码运行信息的技术难度较大。

将动态分析和静态分析结合起来对二进制进行分析,这种技术比单纯的动态和静态分析更加复杂,比较有代表性的是BitBlaze

BitBlaze由三部分组成:TEMUVINERudder

  • TEMUBitBlaze的动态分析模块,其实质是一个虚拟机,可执行程序在该虚拟机上执行,并记录下执行的指令、操作数等,生成追踪的记录。TEMU借助虚拟机实现了全系统模拟,不但可以跟踪用户控件的指令流,而且可以跟踪进入系统内核,记录其指令流和操作数。
  • VINEBitBlaze的静态分析模块,它分为前端和后端两部分,前端将二进制指令提升为VINE中间语言(VINE Intermediate Language: VINEIL)。后端用来在VINEIL上做静态分析,包括函数调用图和控制流图建立,数据流分析,符号执行等。此外,VINE的后端模块记录追踪路径的约束条件,可将某个路径约束取反,生成满足新路径约束条件的输入,供Rudder模块使用。
  • Rudder模块层次在TEMUVINE模块之上,是一个混合进行符号执行和实际执行的一个模块。如果检测到符号输入影响到执行路径的选择,Rudder会将具体执行和符号执行结合起来,探测多条可执行的路径。探测多条路径的具体过程是,Rudder首先随机生成一个输入数据,利用TEMU进行跟踪,利用VINE记录路径约束,然后将其中的约束条件取反,利用约束求解器生成能够满足新的路径约束的输入数据,再将TEMU追踪该输入数据,如此循环往复,从而保证每次的输入数据执行的是一条尚未执行过的路径。BitBlaze本质上是一个动态Fuzzing工具,它可以保证每次执行的都是不同的路径,以此来提高测试的有效性。
CE安全网
CE安全网广告位招租

发表评论

您必须登录才能发表评论!