网页挂马常见漏洞分析与检测
一、CVE-2018-8373漏洞的初步分析
2018年8月15日,趋势科技披露了他们发现的一起浏览器漏洞攻击事件。在检测到的攻击流量中,攻击者使用了cve-2018-8373这个漏洞来攻击IE浏览器,访问存在该漏洞的页面可能导致远程代码执行。有经验的研究员应该了解,在大部分的EK工具包中,针对IE浏览器的漏洞经常被用来做网页挂马,国外通常称为“Drive-By-Download”攻击。
该漏洞使用的混淆方式和之前披露的 CVE-2018-8174 类似,漏洞利用代码估计是同一批人所编写的。而趋势科技在报告中提到他们通过启发式分析检测到了该流量,目前来说主流的浏览器漏洞检测方式分为静态和动态两类,静态检测是匹配其触发漏洞以及漏洞利用的关键代码特征,动态检测则是检测浏览器的敏感行为,当然也有利用机器学习对恶意网页进行分类、检测的技术,不再详述。接下来先简单分析下 CVE-2018-8373。
由于没有拿到攻击样本,只能依据简单的poc来进行分析、复现。poc的代码如下:
接下来我们有两种调试的方式,第一种是利用windbg加载IE浏览器,并通过开启页堆来跟踪漏洞的触发点。第二种是将其中的vbscript代码提取出来,写入到vbs脚本文件中,利用wscript.exe程序加载vbs脚本,再进行分析。由于该demo并没有使用到document相关的api,加上使用wscript.exe调试起来相对简单点,所以这里使用第二种方法进行调试,接下来通过调试来看下poc中对应的二进制程序的代码实现。在win环境下,由vbscript.dll对vbs脚本进行解释执行,通过ida打开vbscript.dll并且加载符号,可以看到一些意义性较强的函数,大致能根据这些函数名称来定位具体的vbs脚本中的代码。
在poc中,将MyClass通过new进行创建并赋值给指定变量cls,该操作首先会触发类的创建以及初始化,创建类的函数由vbscript!VBScriptClass::Create函数完成,在初始化类的各项属性后,将该class封装为一个variant变量,class的创建如下:
最后会将该class封装成一个variant类型的变量
在微软的官网以及windows kits的头文件中均可以查到variant types的定义,部分如下:
针对不同类型的variant变量解释如下:
创建类成功后则会调用vbscript!VBScriptClass::InitializeClass函数对class的内容进行初始化 :
在vbscript!VAR::IsFunction函数中获取class指针
随后调用class的虚函数vbscript!CScriptEntryPoint::Call 进行初始化,最终的调用栈如下:
调试过该vbs漏洞的研究人员应该了解,vbscript!CScriptRunTime::RunNoEH负责对编译后的vbs代码进行解释执行。这里执行类的初始化操作,主要包含了array数组的定义以及Class_Initialize函数的执行。vbscript中创建数组的函数为vbscript!MakeArray,如下:
其中参数a1代表传入的数组的维度个数,由于poc中定义的数组维度为空,因此a1为0,因此直接返回0,array数组并没有构造成功。
随后在函数Initialize_Class中,利用Redim函数将array数组重新定义为一个数组长度为3的一维数组。但由于上次创建数组失败,其实这里并没有如同趋势科技中的报告所说,调用vbscript!RedimPreserveArray函数来对数组进行重新分配,而是再次调用了vbscript!MakeArray这个函数创建了一个数组。在调试过程中分别对vbscript!MakeArray以及vbscript!VBScriptClass::InitializeClass下断点,会发现先命中MakeArray后命中InitializeClass,紧接着再次命中MakeArray。
vbscript中的数组类型为tagSafeArray,结构如下:
一、CVE-2018-8373漏洞的初步分析
2018年8月15日,趋势科技披露了他们发现的一起浏览器漏洞攻击事件。在检测到的攻击流量中,攻击者使用了cve-2018-8373这个漏洞来攻击IE浏览器,访问存在该漏洞的页面可能导致远程代码执行。有经验的研究员应该了解,在大部分的EK工具包中,针对IE浏览器的漏洞经常被用来做网页挂马,国外通常称为“Drive-By-Download”攻击。
该漏洞使用的混淆方式和之前披露的 CVE-2018-8174 类似,漏洞利用代码估计是同一批人所编写的。而趋势科技在报告中提到他们通过启发式分析检测到了该流量,目前来说主流的浏览器漏洞检测方式分为静态和动态两类,静态检测是匹配其触发漏洞以及漏洞利用的关键代码特征,动态检测则是检测浏览器的敏感行为,当然也有利用机器学习对恶意网页进行分类、检测的技术,不再详述。接下来先简单分析下 CVE-2018-8373。
由于没有拿到攻击样本,只能依据简单的poc来进行分析、复现。poc的代码如下:
接下来我们有两种调试的方式,第一种是利用windbg加载IE浏览器,并通过开启页堆来跟踪漏洞的触发点。第二种是将其中的vbscript代码提取出来,写入到vbs脚本文件中,利用wscript.exe程序加载vbs脚本,再进行分析。由于该demo并没有使用到document相关的api,加上使用wscript.exe调试起来相对简单点,所以这里使用第二种方法进行调试,接下来通过调试来看下poc中对应的二进制程序的代码实现。在win环境下,由vbscript.dll对vbs脚本进行解释执行,通过ida打开vbscript.dll并且加载符号,可以看到一些意义性较强的函数,大致能根据这些函数名称来定位具体的vbs脚本中的代码。
在poc中,将MyClass通过new进行创建并赋值给指定变量cls,该操作首先会触发类的创建以及初始化,创建类的函数由vbscript!VBScriptClass::Create函数完成,在初始化类的各项属性后,将该class封装为一个variant变量,class的创建如下:
最后会将该class封装成一个variant类型的变量
在微软的官网以及windows kits的头文件中均可以查到variant types的定义,部分如下:
针对不同类型的variant变量解释如下:
创建类成功后则会调用vbscript!VBScriptClass::InitializeClass函数对class的内容进行初始化 :
在vbscript!VAR::IsFunction函数中获取class指针
随后调用class的虚函数vbscript!CScriptEntryPoint::Call 进行初始化,最终的调用栈如下:
调试过该vbs漏洞的研究人员应该了解,vbscript!CScriptRunTime::RunNoEH负责对编译后的vbs代码进行解释执行。这里执行类的初始化操作,主要包含了array数组的定义以及Class_Initialize函数的执行。vbscript中创建数组的函数为vbscript!MakeArray,如下:
其中参数a1代表传入的数组的维度个数,由于poc中定义的数组维度为空,因此a1为0,因此直接返回0,array数组并没有构造成功。
随后在函数Initialize_Class中,利用Redim函数将array数组重新定义为一个数组长度为3的一维数组。但由于上次创建数组失败,其实这里并没有如同趋势科技中的报告所说,调用vbscript!RedimPreserveArray函数来对数组进行重新分配,而是再次调用了vbscript!MakeArray这个函数创建了一个数组。在调试过程中分别对vbscript!MakeArray以及vbscript!VBScriptClass::InitializeClass下断点,会发现先命中MakeArray后命中InitializeClass,紧接着再次命中MakeArray。 www.wnhack.com
vbscript中的数组类型为tagSafeArray,结构如下:
无奈人生安全网