0x00 前言
前两篇从蚁剑的介绍,编解码器的功能讲解,到源码分析和解码器的改造,其实已经实现了大部分流量的加密传输,只要在设计一个简单的加密算法即可,比如异或算法,用字符串和key做异或即可,这样其实能过掉绝大部分的WAF了,但我们的流量里还有一点小瑕疵,也就是第一章提到的其他参数,其他参数由于固定了编码方式,如base64、hex,很容易被解析检测到,也没有提供设置让我们可以进行调整,所以还需要进一步的改造,让其他参数随机化,即添加可变长度前缀。
这个其实已经有人实现了这个功能了,在最后的参考链接里,并且还实现了蚁剑版的jsp一句话,在这里先膜拜大佬,我也一直有jsp改造的想法,但迟迟没开工,现在有现成的,美滋滋。他实现的参数随机化,目前只做了php的,其他脚本照抄就行,第二篇的改造成果,我就直接迁移到这位大佬修改后的蚁剑上了,然后再修改其他脚本随机化即可,也算是站在前人的肩膀上。
0x01 参数随机化调优
改造的细节我就不赘述了,参考我最后留的大佬博客链接,界面如下。
我这里就说下,在他基础上额外的调整吧,他随机前缀默认的长度为2,但考虑到像php/aspx使用base64编码其他参数,而asp使用hex编码其他参数,base64前缀不能为4的倍数,hex不能为偶数,所以我就调整默认值为5。
source\modules\shellmanager\list\form.js
然后他里面其实有个bug,说bug之前,我得先说下是怎么实现给其他参数编码添加随机化前缀的。
source\core\base.js
在这个文件里,有个format函数,原本输入参数为encode,即字符编码,改造后换成opts,否则无法获取到随机前缀长度值,而encode也可以通过opts获取。
这个format是用于字符串编码的,比如base64编码,用于请求发送的其他参数值编码,
改造后在这里新增了一个newbase64函数,在base64编码后,通过之前传入的opts里设定的random-prefix,为base64编码添加一个随机长度前缀,我在这个基础上做了一个倒序处理,进一步加强混淆吧,因为实现比较简单,我就顺手加上了。
所以bug在于,没有将所有调用format位置的传入参数都替换成opts,有的位置还是传入的encode,估计大佬只做了php的,也只测试了php,所以忘了asp/aspx,以下为部分修改调整位置。
source\core\asp\index.js
source\core\aspx\index.js
0x02 asp/aspx参数随机化改造
在改造asp/aspx之前,因为我对参数值做了逆序,所以我得先调整php模板。
source\core\php\template\filemanager.js,改造如下,arg1使用newbase64进行编码,编码逻辑为base64->随机前缀->逆序,所以在代码里,对提交的参数,反向操作,strrev逆向->substr去随机前缀->base64解码。(这里#randomPrefix#在发送之前会被替换成长度值)
其他php代码模板差不多的处理。
接下来就是做asp/aspx的改造,其实看了php的,你基本也知道怎么改了,就是语法函数不一样。
asp里原本是使用hex编码参数值,所以根据newbase64的方式造呗,哈哈。
source\core\base.js,newhex
因为有的地方调用的是buffer函数,还得造个newbuffer,这个和hex有啥区别,区别在于hex进行了字符编码转换。
然后在source\core\asp\template\filemanager.js等地方调用。
aspx改造和上面没啥两样,就举个例子就好了,source\core\aspx\template\filemanager.js。
到此,改造基本结束。
0x03 随机化参数测试
php测试,可以看到%3D,就是把base64倒序了。
<?@eval($_POST["test"]);?> |
倒序后,将去前缀和不去前缀的字符串,进行base64解码,可以看到效果如下
asp是hex编码,就更不好识别了。
然后我加一个jsp演示,这个yzddMr6做好的,因为java的特殊原因,传输的payload的编码方式都是写死的,只支持base64和hex。
对应webshell如下,因为少了AES算法加密步骤,所以看起来就更小了。
效果如下,ant值删减了部分,因为传输的是java字节码太长了看不到其他参数。
最后给大家展示一张使用异或编解码的效果图,这是对key和value都做了异或+base64,除主payload以外,其他参数值额外做了随机前缀+逆序(这个操作为内置的,无需操作),整体流程没有什么复杂的算法,但已做到很好的加密效果,过WAF是妥妥的了。
0x04 总结
蚁剑改造过WAF系列,目前就告一段落,回过头看整个过程,其实没啥难理解的地方,就是一些小技巧的结合,从解码器改造,到随机前缀+逆序等改造,就能达到通信流量免杀的效果了。如果大家对蚁剑改造的过程有啥想法,大家也可以一起讨论下。我也是现学现卖,大家也自己动手试试,动过手就会知道,对菜刀、蚁剑这一类webshell工具通信原理更清晰了,不管是进行下一步的改造还是制作自己的webshell客户端都有帮助。
最后,再次感谢yzddMr6大佬的分析文章和蚁剑。
可能有人会提到上传免杀和落地免杀怎么办,这个其实在做这个系列的时候都搞定了,只是文章里没有提到,这个网上都有很多免杀绕过文章了,我再重复提也没啥意思,有些检测规则绕过很没道理的,就不断尝试,fuzz啥的。另一方面这种文件内容免杀,不像流量免杀,特征还是比较容易提取的,传多了就不免杀,我可能今天发出来,明天就凉了。
0x05 参考
https://yzddmr6.tk/posts/antsword-diy-2/
https://github.com/yzddmr6/antSword/tree/v2.1.x