Waf_Bypass
- 默认webshell免杀
- WAF:阿里云,云锁,安全狗,D盾
0x01 流量免杀
这里主要针对开源的蚁剑,好用且能自定义。
公开的菜刀工具,流量肯定是被监测的死死的,事实上蚁剑默认的流量都已经是混淆过的了,加上蚁剑自带的各类编码器,流量看起来已经非常复杂了。但是waf是可以解密流量的,公开的加密编码方式其实没那么好用.
在对流量分析中,菜刀默认情况下是有自带特征的,尽管不同菜刀也会对自己的流量进行各种层度的混淆,不过公开的工具嘛,流量肯定被安全厂商检测的死死的,只要是公开的就逃不掉的。
菜刀的流量特征主要是HTTP请求头特征,payload特征。
HTTP请求头
HTTP请求头特征虽然明显,但是waf不检测这个地方,不过为了以防万一,我们肯定要做点什么的。
注释掉默认USER_AGENT,实现随机UA头。
AntSword\antSword-master\modules\request.js
1 | // 请求UA |
效果图
![image-20200314151437294](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314151437294.png)
Payload流量特征
payload流量为监测重点,我想了想,在公开的加密方式可以解密的情况下,恐怕得自写加密了,然后就看到了yzddmr6大佬的数据填充法,然后抄作业。
利用大量垃圾数据的填充使得waf监测不过来,垃圾数据由自写函数生成。
实测waf情况分为:数据过多直接放弃检测,数据过多只检测一部分。
在没有对payload处理的情况下也能过Waf,且不影响对payload的各种处理,不过我觉得还对payload本身进行处理,不然别人分析了流量还是会很快暴露,以达到万无一失的结果。
AntSword\antSword-master\modules\request.js
1 | 行数 49 |
先对自有编码器进行测试,对random,base64,chr,chr16,rot13进行流量分析。均有明显的密文特征,且能被解密。
经过Waf测试,chr16加密是效果最好的加密方式了,可以达到过waf的要求,猜测waf不能解密chr16,但是chr16依旧是公开加密,密文特征也很明显,用不了多久可能也会进入waf全家桶,所以这并不是终点。
然后我发现了蚁剑的RSA编码器,通过非对称加密的方式实现密文的不可逆,不过需要对webshell进行一定的处理,然后发现处理后的免杀一句话有点长。
这样的马还有一个优点,只有自己能连,除非你把私钥分享给了别人,或者说流量重放。
流量重放的话问题不大,主要是可以通过重放来分析进行了什么操作,解决流量重放可以用蚁剑作者的时间戳.
此时流量在限定时间内有效,过时即无响应包。
1 |
|
1 | data["_"] = `if((time()-${parseInt((new Date().getTime())/1000)})>5){die();};${data['_']}`;//解决流量重放 |
经过流量分析,此时流量在没有私钥的情况下已经无法解密,此时waf已经无法解密,更不用说识别流量了。
payload去url编码的结果。
1 | D+45iuPA7sMEczA3ZXzpCLicTNR/goVvH75VNW/2XRBsJm8N3CiCYw21oi1o8r5Rj1g0lqioILuLd7bh8Bu2Yl5CJNCJ+6+fZs02 NtrP8bqs8gqFBdTDEP2WjBJEealna0oy62i0SwqB7MprZO0tEU8qNPuQ2MMa4Rh/3sY2xiY=|oPn0QtnZaSfmRey7SVZzcdFR7aw ukf/fnU05D9zTYRD0ggxJnhXheFx5OCu3SoYPyw5noE2kx/yY5YhciIv2VTN0d6mkx0L2jdv1w3Wf5TgCMNc5PAF0kdXa1cmJB3C e4BXsYJkbGb85ryu37noWz4v/cTKDSgS6IxuBiAEU2ks=|Lx0LCYoSVP/4CTig0AWNly9muBr+HBmwK5wMKHC+a4NIxhFMRXJCNf RJGCRLtggOZvOkGXAUUU7G0UKg7AdG1SjuA4mL41/Gs/cWqLa+WJp8hlP1CIMQHliR5fG9MMq4ChnrtC0Hf70ndv4j/JCBAIN+yU aaTDvEHNeImYDp66E=|r8g/9GwWB9qta87Stsd+5jkfg0vRiDN+/NH1bQkROH2EhGGVJn+ZwB+0INcbvM+NEIcj4LSa13Ge0gb3s 8tPXfJpEmtrqMigTk5jjEg2Vs9GUdKHHNgRT/v1ykrIQNGAgF0O9dzeyOYd8h80dtJ1cB7DlZnBwJ/tcNtOr3hS1fs=|JLXWPuCC hMGjZD5rqEtwwjKRpFxrXErXU2rW+1DsAy4P1LBPcJ+Gbi1H3qxcgbtGxQMlWU59JyDsUrOAQ3hMl7pUoeBfP/XuvEbaJnr4ZrIa ZuAfsGwagtOnECxMrXHvbIo+774dO+FM2F2BTZol6y/q+XI2VEPafEFkd7jiHQw=|UR1Ao61+RsFk9IoNehu7QtaMjBdovrIt2mn TqdXageeDmaK |
![](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314124155221.png)
加上之前的垃圾数据填充模块,可以实现密文的进一步隐藏,在一堆垃圾数据里面找到这段payload,真的是流量分析的梦魇。
![image-20200314124943576](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314124943576.png)
不过我也分析了一下,只有这段payload有url编码,且payload相对过长,加上每次流量的连接密码变量为相同的,且响应包为明文,所以想要分析还是有办法的。
但是,我们还可以在垃圾数据填充上做手脚,修改代码以达到我想要的目的,加长单条垃圾数据到payload水平,垃圾数据池中加入会被url编码的符号。而连接密码暂无特别好的办法,不过我已经非常满意了。
然后我又分析了冰歇的动态加密,流量无法解密,连接密码只用于获取随机密钥,建立连接后流量就全是payload了,响应包也全为密文,看上去确实无懈可击,但是问题在于它不开源,很多特征没办法修改,以至于现在流量已经能被部分waf检测到了。
不过,动态加密于蚁剑也是可以实现的,还未尝试。
0x02 Webshell持久化
关于Webshell持久化,其实并不像远控持久化那样,可以使用各种系统层面的操作。
如果都能远控持久化了,webshell也就没必要了,难道说我还要写个用于生成webshell自启动吗,感觉有点舍本逐末了,私以为webshell相对远控的好处在于安静,不用就不会有动静。
所以webshell持久化主要在于隐藏shell文件。
- 修改配置文件如php.ini,.htaccess,.user.ini
- 不死马。
- 插马到正常文件,或修改正常文件使其出现后门,例如404页面.
- 数据流隐写
- 内存马
但是实际上并没有那么好用,尤其是修改配置文件,于是我就去问了问做应急响应的表哥。
不免杀,有隐藏属性的文件,数据流隐写,配置文件,会被重点关注。
如果第一步没找到,就从文件创建时间来排查,和日志进行比对查找。
终极手段,文件完整校验,可以与cms初始文件比对,或者说有单独文件服务器,可以做hash值比对。
不然就很难发现。
所以最方便的还是 无特征免杀马+时间修改为正常文件时间+正常的四五级目录+正常文件名
1 | //将demo.php的最后修改时间改为2020年1月26日14点5分10秒 |
0x03 Sql_bypass
waf的检测形式,在于对语句的检测,关键点在于对关键语句的加花。
单一的语句不杀,连在一起才杀,注释符是个好东西。
Safedog
1 | 内联 |
Tamper
1 | # coding=UTF-8 |
云锁
1 | 注释 |
垃圾数据填充法
WAF遇到大量数据时会直接放行,也存在于sql。
云锁需要30k.
阿里云需要200+的键值对。
经过本地测试成功Bypass云锁,不过云锁还是会报警,且垃圾数据只能用于POST注入。
垃圾数据可由IDLE生成,或者由脚本生成,需要生成多少直接修改脚本内容即。
1 | #coding=utf-8 |