APP下载

PHP webshell 免杀技术实践与探索*

2020-12-23陈艺夫

通信技术 2020年12期
关键词:复杂度静态防火墙

陈艺夫,王 平

(1.张家界航空工业职业技术学院 图书信息中心,湖南 张家界 427000;2.湖南省武冈市公安局 科技与信息大队,湖南 邵阳 422400)

0 引言

Webshell[1]是一种在一般情况下以文件形式存在的命令执行环境。基于web 服务的中间件环境存在着不同类型的webshell。一般webshell 的文件类型为php、jsp、asp 等。主要用于应对不同的文件运行环境而进行开发的web 服务。php 是“超文本传输处理器”,是一种动态脚本语言。php 具有使用灵活的特点。该特点决定了相较于jsp、asp 更容易实现“免杀”的特点。本次探究就针对php 进行免杀分析。

在一般情况下,webshell 脚本的权限基于运行容器的主体的权限。是否查杀也与运行权限相关,故不在本文讨论范围内,在此特别说明。

1 当代通用查杀技术概述

1.1 webshell 查杀的三种主要方式

得益于国家对于网络安全的日益重视,各种防火墙针对webshell 的查杀愈发精准。但是查杀方法却依然以下列三种方法为主。

1.1.1 静态查杀[2]

静态查杀主要利用规则进行字符匹配,常用的匹配方法为正则匹配。

1.1.2 动态检测查杀

动态检测是通过webshell 的动态特征来进行检测。攻击者在上传木马之后总是会让其执行,而执行所表现的特征就是所谓的动态特征,但是webshell 的执行一般基于web 容器,特性也是由web 容器显示出来。

1.1.3 日志检测[3]查杀

主要通过分析日志进行查杀。通过大量的日志文件建立“分析请求库”或者“执行模型”。

1.2 三种查杀方法的优劣势分析

1.2.1 静态查杀优劣势分析

静态查杀是对已知的webshell 进行特征匹配,所以检索速度快。同样的,在面对大量webshell 时“查准率较高”。但其缺点也十分明显。对于新的webshell 的写法完全无法应对。针对其免杀的方式是使用0day-webshell。在实际应用中容易被绕过。

1.2.2 动态检测webshell

动态检测webshell,针对的是webshell 的执行特征进行分析。凡是webshell 都存在命令执行。如果当该文件执行权限之外的命令时,动态查杀软件就可以将其列为怀疑对象。在有足够的动态特征的时候确定其为webshell。这种方式能够极大地提高针对未知webshell 的查杀率。但是劣势也十分明显。webshell 的执行一般基于web 容器进行,特性也是由web 容器显示出来的,而web 容器一般本认为是可信的,所以动态查杀一般存在于沙盒查杀中。

1.2.3 日志查杀优劣势分析

这种检测技术在拥有大量的数据的时候,针对未知访问能极快做出反应。例如,当网站日常使用正常访问日志达到一定量级后,杀软可以针对性地建立访问模型[4]。当数据访问方式或者路径存在于访问模型之外,即可将其视作危险访问。解决了静态检测很难针对的未知变种webshell 的查杀缺点。也解决“亡羊补牢”式病毒查杀的缺点。但是其自身缺点也很明显。首先需要大量访问数据作为基础,其次处理大量的日志文件极大地压榨着服务器的性能,在极端情况下还会影响正常业务的正常运行。再次,由于模型之外的都认为是可疑文件,那么相对应的误报率也极大提高。

1.3 传统免杀方法

1.3.1 混淆免杀

该方法一般使用base64、url 编码、压缩、解压缩[5]、混淆[6]等方式进行加密。这里列举gzinflate、base64_decode 结合免杀(注:如无特殊说明,本文采用的D 盾防火墙查杀软件均为windwos 操作系统下D盾2.1.5.4版本,测试时间为2020年8月20日)[7]。代码实现如下:

实现效果如图1:

图1 混淆免杀及运行效果

使用“D 盾防火墙”进行查杀,效果如图2:

图2 混淆免杀效果

该文件被识别为“加密后门”。由此可以明显看出,普通的混淆加密很难通过绕过特征库的方式绕过查杀软件。

1.3.2 引用免杀

以上被查杀的最主要原因是“防火墙”具有特殊函数溯源功能[8]。当文件中出现特殊函数(这里指一般情况下能够当作webshell 执行的函数,如:eval、system、assert 等),防火墙将追踪该函数最终传参的的变量的来源。为了规避这种查杀方式,接下来尝试使用引用的方式逃避变量源字符的追溯。代码实现如下:

运行效果如图3:

图3 引用免杀的运行效果

使用“安全狗”进行查杀效果如图4:

图4 引用免杀效果

该方法依然被查杀软件查杀。但是安全级别由5 下降至4。说明在一定情况下,该免杀方法能够起到些许作用。

1.3.3 引用内容逃脱免杀

以上webshell 无法免杀的原因在于eval 函数(eval并不是函数,为方便理解本文将其称作函数,且后文不再赘述)向上追溯的时候,可以在最顶层发现最初源头为$_GET。那么尝试将初始地址值置空。让其在追踪源头的时候获得的值为空。代码实现如下:

运行效果如图5:

图5 引用内容逃脱免杀运行效果

使用“安全狗”进行查杀效果如图6:

图6 应用内容逃脱免杀效果

该文件的威胁等级依然被定为4,但是查看“说明”,该文件由eval 后门直接更变成了参数未知、可疑eval。虽然小有成果,但是这样的思路依然无法让webshell 直接逃脱查杀软件的查杀。

2 现代webshell 免杀原理的探究

无论以上哪种免杀方式都是为了规避特征进行的免杀,在一段时间内都可以做到免杀。但是在“下一代防火墙”[9]的深入特征分析的时候,这些传统的免杀方法就显得捉襟见肘。主要问题表现在:(1)编码无法让人识别,但是防火墙依然可以追踪数据的来源。(2)代码“运行范围”太窄,业务逻辑简单,所设计的运行路径简单直接,且容易被追踪。

针对以上问题,继续使用其他思路进行免杀。

2.1 动态调用

主要思路:利用动态的字符绕过字符特征的追踪。代码实现如下。

具体代码写法与实现的运行效果如图7。

图7 动态调用运行效果

使用“D 盾防火墙”进行查杀的效果如图8。

图8 动态调用的查杀效果

由图8 可以发现,简单的动态调用无法实现绕过查杀。

2.2 回调免杀

使用回调函数的方式运行命令执行函数[10],让特殊字符以字符串参数的方式出现在文件中,降低查杀软件对其的风险认知。代码实现如下:

免杀效果如图9:

这里的webshell 依然被查杀软件查杀。被查杀安全等级为4。但是值得注意的是,这里显示的不再是后门,而是针对array_map 函数的参数的特征查杀。

图9 回调免杀效果

2.3 尝试使用生僻回调函数

在隐藏了特殊字符的静态特征后,以上webshell 被查杀的原因可能是使用的回调函数太常用,被查杀软件匹配到回调函数的静态规则。但是查杀引擎有可能无法匹配使用同种方法的其他较为生僻的回调函数[11]。这里使用filter_input 函数进行尝试。代码实现如下:

运行效果如图10。

图10 使用生僻回调函数免杀

查杀效果如图11。

图11 生僻回调免杀效果

至此,免杀成功,而免杀的基础探究也基本完成。总结得到webshell 免杀的基本思路为:(1)拓展代码运行的深度,让查杀软件很难深入追寻代码逻辑。(2)使用生僻的字符特征,防止查杀软件在运行逻辑查杀失败后依然可以使用静态特征匹配的方式进行查杀。

3 webshell 免杀的具体实现

根据以上结果可以继续尝试拓展webshell 代码运行的逻辑复杂度和特征生僻度进行免杀探究。

3.1 使用“函数”继续拓展语法逻辑复杂度

首先是使用普通的一句话webshell 测试危险程度。使用assert 进行测试。

运行效果如图12。

图12 普通webshell 运行效果

查杀出现的安全级别为4,查杀效果如图13。

图13 普通webshell 查杀效果

而使用了“函数”概念的webshell 的代码实现如下:

运行效果如图14。

图表14 运行效果

与之相对应的使用了“函数”概念的查杀效果如图15。

图15 函数免杀效果

由图15 可见,危险级别明显下降。且在“说明”栏对于文件的描述由“assert 后门”变成了“assert”与“可疑”。但是依然将其视为可疑威胁。

3.2 结合函数隐藏静态特征免杀

由上图可以看出,威胁级别直接从最开始4 降低到2。最后识别威胁的原因为assert 关键字可疑,接下来尝试使用字符串的方式拼接隐藏字符串特征。用来避免assert 特征字符。下面尝试使用chr函数绕过静态特征。代码实现如下:

运行效果如图16。

图16 函数与静态特征免杀运行效果

使用了“函数”与静态特征绕过的免杀效果如图17。

图17 函数与静态特征免杀效果

由图17 可以发现,利用变量嵌套的方式成功规避了assert 关键字特征,但也引入新的$x($x)这样的危险特征,导致查杀结果虽然绕过了assert 字符特征,但是依然被查杀。

3.3 提升使用函数免杀的语法复杂度并规避常见规则

在3.2 节的内容中,使用变量嵌套变量的方法组成函数,这样会被报出可疑。接下来尝试在能够规避静态规则的前提下固定函数的内容为可控的webshell 执行字符串,并且进行特征隐藏。代码实现如下:

运行效果如图18:

图18 函数与特征免杀扩展运行效果

查杀效果如图19:

图19 函数与特征免杀扩展查杀效果

由图19 可见,利用函数和特殊字符的规避可以达到免杀效果。利用此webshell 继续测试了“火绒杀毒”“安全狗防火墙”,均未被查杀。结果如图20、图21 所示。

图20 安全狗查杀结果

从以上结果可以看出,使用“增加复杂度”“规避静态规则”的思路是可以绕过查杀软件的。将以上webshell 上传到在线查杀网站进行查杀(https://www.virscan.org/),结果如图22。

图21 火绒杀毒软件查杀

图22 在线查杀结果

该webshell 在49 个查杀引擎中全部查杀通过,无一警告。至此完成了webshell 免杀的实践内容。

4 webshell 免杀探索

按照上面的思路:(1)拓展代码逻辑复杂度。(2)规避静态规则。两个方法就能实现免杀。那么如果尝试使用语法逻辑复杂度或者运行逻辑复杂度更高的方法也应该能够免杀成功。

4.1 使用“类”提高语法逻辑复杂度

尝试将无法免杀的代码放入“类”中[12],查看是否能够免杀。首先测试没有“类”概念的webshell。代码实现如下:

图23 是无“类”的webshell 查杀结果。

具有类结构的webshell 代码实现如下:

图23 无类的查杀结果

图24 是加入了“类”概念的查杀结果。

图24 加入类概念的查杀结果

继续尝试将该webshell 上传到云查杀[13](https://www.virscan.org/)进行检测。检测结果如图25 所示。

图25 “类”webshell 查杀结果

由图23、图24 可以看出,D 盾无法深入“类”中进行查杀。既无法溯源查杀,也无法通过字符特征进行静态查杀。这直接验证了第一条免杀思路。当语法逻辑复杂度过高的时候,溯源查杀失效。启用静态特征分析。但是当引入语法逻辑复杂度太高的“类”的时候,则直接绕过所有查杀方式。

由以上结果可以基本确定,目前市面上绝大多数杀毒软件无法深入“对象”进行查杀。最大的能够查杀的代码逻辑复杂度基本处于“函数”状态,无法进入“对象”中进行查杀操作。

4.2 提高运行逻辑复杂度,使用运算免杀。

在尝试拓展语法逻辑复杂度之后,尝试使用提高运算逻辑复杂度的方式进行免杀。但是实践中,必须满足以下几个条件:(1)运算方式特殊;(2)运算变化多样。前者有可能绕过溯源查杀,后者可能绕过静态查杀。这里尝试使用“异或”运算[14]。实验证明,在没有隐藏$_GET 全局变量的时候,会被静态查杀。代码实现如下:

具体查杀效果如图26。

图26 仅做异或不处理静态特征

由图26 的说明可见,webshell 被查杀的主要原因是关键字。上述webshell 依然可以使用异或运算隐藏关键字$_GET。代码实现如下:

查杀效果如图27 所示。

图27 规避静态特征后的异或免杀效果

通过这种特殊的运算,就可以直接获得一个能够免杀的webshell。

4.3 PHP7 之后的拓展与延伸实验

在php7 版本之后无法使用assert 作为函数进行灵活变换[15]。但是依然可以尝试使用eval(‘eval($_GET)’)的方式进行webshell 的书写。这里,可以将eval($_GET)进行异或成字符。代码实现如下:

运行效果如图28 所示。

图28 PHP7 版本之后的异或免杀

查杀效果如图29 所示。

图29 PHP7 版本之后的异或免杀

将该webshell 上传到云进行查杀(https://www.virscan.org/)。查杀结果如图30 所示。

图30 PHP7 版本下的webshell 云查杀结果

5 结语

(1)通用免杀技术主要包含混淆、加密等方式,在“下一代防火墙”的查杀下已经很难保持免杀了。

(2)使用生僻的回调函数就可以绕过普通查杀软件的查杀,但是可以保持免杀的时间由查杀软件收集特征库的速度决定。原理是被查杀的方式基于静态特征。

(3)实验所研究的查杀思路主要有两点:首先是提高语法逻辑复杂度;其次是提高运算逻辑复杂度。在此基础上完成静态特征字符的绕过即可。

(4)新版本的PHP 针对web 安全进行了很多提升,其中就包括了改变assert 函数的实现方式,限制其灵活运用的方式。但是通过实验可知,通过前文第三条总结的思路方法依然可以实现免杀。

(5)“下一代防火墙”虽然叫做下一代防火墙,但是针对复杂度越来越高的webshell 依然受限,严重情况下导致无法查杀。

除本实验中所提方法之外,依然存在很多种免杀方法。但是依然可以以文中的思路进行免杀。也希望以后的研究者能站在攻击者的角度继续思考攻防对抗中的免杀。

猜你喜欢

复杂度静态防火墙
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
毫米波MIMO系统中一种低复杂度的混合波束成形算法
全民总动员,筑牢防火墙
Kerr-AdS黑洞的复杂度
构建防控金融风险“防火墙”
非线性电动力学黑洞的复杂度
某雷达导51 头中心控制软件圈复杂度分析与改进
在舌尖上筑牢抵御“僵尸肉”的防火墙
油罐车静态侧倾稳定角的多体仿真计算