webshell查杀逃逸技术研究
2017-09-20王亚丽
◆王亚丽
(62101部队 湖北 430010)
webshell查杀逃逸技术研究
◆王亚丽
(62101部队 湖北 430010)
对于webshell查杀来说,查杀的难点是脚本语言灵活多样,同样的数据可以通过多种方式来呈现,使得webshell变异方式灵活多样,对webshell查杀尤其是静态查杀提出了一定的挑战。本文以收集的PHP webshell为例进行分析,总结样本中使用的逃逸技术,得到的结果为webshell查杀引擎的设计提供了借鉴。
webshell查杀;webshell变异;逃逸技术
0 引言
攻击者通过应用漏洞或者系统漏洞植入webshell文件后,可以进行信息窃取、商业勒索,组建僵尸网络等[1],被植入webshell能否被及时发现,在很大程度上决定了危害的程度。
目前webshell检测方式主要分为源码静态检测、动态检测、基于日志的检测。源码静态检测由于对服务器性能消耗低,检测速度快,因而使用更为广泛。针对目前的检测方式,webshell普遍存在变异以期逃避检测。由于地下交流等,使得一旦攻击者发现了一种逃逸方式,这种逃逸方式很快就会在攻击者间扩算,使得危害性迅速增加。因此分析与总结已有的webshell逃逸方式,提升检测引擎对新变异webshell的检测能力具有重要意义。
1 webshell检测技术
目前webshell检测既有webshell运行前的静态检测,运行时的动态检测[2],也有运行后的基于日志的检测技术[2]。
1.1 webshell静态检测
webshell静态检测指利用源码运行前所能得到的信息,如文件的创建事件、修改时间、文件的权限、源码本身等进行检测的技术。
目前webshell静态检测技术可以细分为:①特征值检测;②模式匹配检测;③webshell源码特征检测;④webshell非源码特征检测。
1.2 webshell动态检测技术
webshell动态检测技术主要分为:基于流量的webshell检测、基于文件执行动态监控的webshell检测。
1.2.1 基于流量的webshell检测
通常情况下webshell文件主要通过文件上传漏洞上传到Web服务器,通过远程文件包含,或者其他系统漏洞动态生成。不论最终的webshell文件是在Web服务器上,利用远程文件包含漏洞放在其他服务器上,webshell文件的文件名后缀是否是相应的脚本文件名后缀(服务器存在解析漏洞时,文件名后缀可以不是脚本文件名后缀),最终webshell在服务器上执行都会产生相应的流量。通过对流量进行相应的分析即可进行相应的检测。
1.2.2 基于文件执行的webshell动态检测
webshell文件动态执行监控:主要是监控脚本执行行为,判断是否执行了相应的危险操作来进行判断,进一步判断是否为webshell。脚本所在环境既可以是真实环境,也可以是蜜罐环境。根据动态的执行行为,结合webshell的访问特征(IP、User-Agent、cookie)、访问路径、访问的时间序列与操作,可以有效识别隐藏的恶意行为。
1.3 webshell日志检测
对日志进行统计分析,能够得到访问频率、功能页面或者特定功能被请求的次数,能提取出访问请求中相应的字段。利用相应的检测模型(如信息熵等),可以判断出用户发送相应请求中请求字段是否异常、请求返回的信息是否是webshell响应的特征、请求的行为是否异常。
2 webshell逃逸技术
由于大部分Web 服务器都会部署一定的webshell查杀软件,因此目前很多webshell都会进行一定的变异以躲过查杀。变异主要通过调用编码解码函数、加密解密函数、字符串操作函数、使用隐藏位置传递参数以及对文件进行混淆。目前webshell逃逸技术主要可分为两种:隐蔽位置传递荷载和构造法绕过检测。
2.1 隐蔽位置传递荷载
通常大部分的HTTP请求都通过请求中的GET、POST、Cookie传递数据,因此几乎所有的WAF与webshell查杀软件都会对这些常见位置中的数据进行分析。当查杀软件对其他字段的内容没有进行扫描时,攻击者即可利用这些字段传递荷载。如利用User-Agent 字段实现荷载传递:
其他的字段还有“Accept-Language”、“Accept-Encoding”、“Referer”等字段。此外,还可以将webshell相应的数据放在其他类型的文件的描述信息中。如图片的exif信息,包含以下字段Manufacturer、Model、software、Data and time、Flash信息等等。这些附加信息对图片的显示没有影响,但却可以作为载体隐藏一定的信息。如下代码将特定数据隐藏于图片的exif信息中。
2.2 构造法绕过检测
通常如果直接将需要执行的命令传入system、eval等函数很容易被webshell检测软件查杀。一般的检测软件会过滤 system、passthru这样的字符串,这时可以用构造法绕过关键字检测。构造法的本质是PHP中每一个字符都对应一个二进制值,对每个字符可以使用数值计算得到,同时对函数名可以使用字符串拼接动态生成函数名,从而避免出现敏感关键字。如“$__=("#"^"|");$__=("."^"~");$__=("/"^"`");$__=("|"^"/");$__=("{"^"/ ");”这四条语句分别可生成字符“_”、“P”、“O”、“S”、“T” , 因此“("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/")”可得到字符串“_POST”。这一类绕过措施,函数名动态构造得到动态调用是其最明显的特征。由于动态函数调用在正常脚本文件中也存在,单纯的字符串匹配并不能确定执行的函数,因此动态函数调用只能作为Webshell的一个特征。
3 webshell检测讨论
webshell变异方式多种多样,但几乎绝大多数都可以归为以上几类,变异形式通常为多种方式的灵活使用。不同的逃逸技术有不同的使用场景。隐蔽位置传递荷载利用检测引擎中未考虑的位置传递荷载,这种在检测引擎中使用污点分析技术可以相对容易地检测出来。
对于动态执行监控,通常也需要结合污点分析或者静态分析确定出代码可疑位置,结合实际的行为确定是否为webshell。动态执行监控,webshell本身也可以进行一定的检测,使得存在特定的动态监控时不表现恶意行为,从而躲避检测。
4 结语
webshell检测与逃逸本身就是相互博弈的过程。除去隐藏位置传递荷载法,其余的逃逸方法都会使代码的数据流更加复杂,污点分析时的污点传播路径更加复杂。可以预见,不久的将来webshell将会更加复杂,使得污点分析的难度更大。正常的程序中,数据的变换通常都具有一定的实际意义,不会单纯为了变换而变换(如多个字符串的直接拼接在正常程序中可能直接以字符串常量的形式存在)。Webshell的各种逃逸技术越复杂,数据流就越复杂,与正常的程序代码在数据流复杂度与对数据的操作行为上会有比较大的差异,数据流复杂度与对数据的操作(主要是数据变换操作)序列可能会是未来检测webshell考虑的一个重要方向。
[1]Web Shells-Threat Awareness and Guidance [EB/OL].2017-01-31.https://www.us-cert.gov/ncas/alerts/TA1 5-314A.
[2]杜海章,方勇. PHP Webshell实时动态检测[J].网络安全技术与应用,2014.