蚁剑改造
前言
蚁剑和菜刀一样是一款优秀的webshell管理工具(shll控制端),与菜刀相比,蚁剑具有开源,自定义能力强,跨平台等优点。但是蚁剑也有许多比较明显的特征,容易暴露从而被waf拦截。所以,需要进行一些改造。
UA头修改
蚁剑的UA头
可以看到蚁剑的UA头直接就是antSword
,这很容易就被waf识别并进行拦截,所以我们需要进行修改,到.modules/request.js
里面
修改下面两个文件
1
2
3
4
5antSword/modules/request.js //新版本似乎不用修改这个文件了
21行 user-agent
antSword/modules/update.js
153 165行的user-agent
也可以直接在连接shell的时候修改header头。
当然也不止UA头,还有一些PHPSESSID,之前我们利用的Referer,accept–Language等等。总之就是让他像一个正常的浏览器发出的请求,那里不对改哪里。
流量中的特征–编码器修改
现在的蚁剑中引入了base64,chr,chr16,rot13。这些编码器,防止直接传输信息,被查杀,但是我们可以抓包看看这些编码器的包。
base64
rot13
可以看到最后都有一个eval()
,这个特征码就很容易被捕捉到。
修改🐎之全base加密
比较简单的做法是,直接修改🐎,让🐎直接就接受base64加密的数据就可以了,即把🐎变成下面这样。
1 | <?php |
接收到的数据是 base64 格式的,先解码,然后再传给 eval。
打开编码管理写编码器
1 | /** |
这个其实可以直接把他最后的包提取出来,然后base64加密下就行。base64可以,那么chr等都可以这样进行修改,只要在🐎里面有相应的解密函数就行。
修改完成之后再发包就是这样了,eval等也被base64加密了,不容易被识别。
修改🐎之zlib_deflated_raw加密
其实蚁剑官方也有相应的加密方式 https://github.com/AntSwordProject/AwesomeEncoder
其中这个zlib_deflated_raw
加密,该方式通过将数据进行zlib压缩后进行base64编码传输给shell,这样要求shell将传输的数据先进行base64解密后通过gzinflate
将压缩数据进行解压缩,从而实现流量混淆:
1 | /** |
把之前的免杀shell进行修改即可,即将传输数据进行gzinflate(base64_decode($_POST['']));
传送的数据就像下面这样,
像这样我们可以把数据进行多次嵌套加密,拼接等等,只要修改下我们的🐎就行。
流量中的0x修改
可以看一下我们之前截取的发包图片,基本都是两个参数,第一个0x**************
,第二个是密码,那么如果waf一看,盲猜你是蚁剑的流量,直接给你拦截了。又要怎么破解呢?
我们可以看一下这些数据
1 | ; |
需要打开开发者工具
获取到的数据
1 | //data: |
可以遍历data,把key也加密一下,然后再最后需要把马也对应改下
1 | /** |
后来我发现,这种做法实在太麻烦了,看一下编码器
1 | /** |
纠结的点就是0x问题,既然这样,看下代码,直接改成这样子岂不就行了。
1 | let randomID = `_0x${Math.random().toString(16).substr(2)}`; |
其实也不一定是token,可以看看数据中的参数,适当进行一定的修改。然后body里面再加一堆废数据混淆。
解码器
上面的这些操作,其实已经差不多了,但是我拦不住你的进入流量,但是我可以不给你响应相应的包,比如获取etc/passwd
文件内容,
或者etc/shadow
这个文件,这些文件在正常的业务都不可能会出现的,所以如果一但检测到相应的文件特征就拦截,有敏感信息就审查在放包。所以返回包也需要进行加密,不能明文发送。
base64解码
先看看蚁剑发送的php代码
1 |
|
下面是base64解码器
1 | /** |
可以在burp中抓包看看返回的数据
发现无法直接解码,可以看看我们之前发送的原始包,asenc
函数就是指定的输出内容,默认情况下直接输出明文,若我们设置了解码器,那么我们在编码器内编写的混淆函数变会替换asenc
的内容,然后服务器响应的数据通过asenc
函数混淆后输出。在往后看,有一个asoutput
函数,这个函数,它会在数据base之后的前后加入一些混淆数据。例如这个就在这个的最前面加入了28e2484
,最后加入了4b36709e8fe7
,相当于加盐操作了。不过rot13的话,因为本质是凯撒密码的变形,所以加盐也没什么用,不如用base。