缩小ysoserial payload体积的几个方法

ysoserial中不少payload使用TemplatesImpl进行构造,在学习ysoserial的过程中,发现可以通过修改createTemplatesImpl方法的一些代码使ysoserial生成的payload更小一些。

先看下ysoserial中createTemplatesImpl方法的主要流程,首先创建一个TemplatesImpl对象,使用javassist开始构造恶意类,首先获取一个ClassPool对象,将StubTransletPayload类和AbstractTranslet类添加到pool的类加载路径中,然后获取StubTransletPayload类,并使用javassist对类进行修改,插入静态代码块,然后将父类设置为AbstractTranslet,设置TemplatesImpl对象的_name,_tfactory,_bytecodes字段。

以下测试使用CommonsCollections3生成payload执行open /Applications/Calculator.app命令

1. 修改_bytecode字段内容

在ysoserial中,_bytecode数组中包含两个元素,一个是用于代码执行的类,另外一个是没有内容的类,跟进TemplatesImpl类的defineTransletClasses方法。

与命令执行相关的两个重要的字段分别是this._classthis._transletIndex,这段代码对_bytecode数组中的类进行遍历,如果类的父类是AbstractTranslet类,那么就把_transletIndex设置成对应的index,所以只要恶意类在_bytecode数组中,并且父类是AbstractTranslet即可

于是可以将

Reflections.setFieldValue(templates, "_bytecodes", new byte[][] {classBytes, ClassFiles.classAsBytes(Foo.class)});

修改为以下代码

Reflections.setFieldValue(templates, "_bytecodes", new byte[][] {classBytes});

生成的payload从3562字节缩小到3084字节

2. 删除_tfactory字段

ysoserial中对_tfactory进行了赋值

Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance());

TemplatesImpl类中_tfactory字段被transient修饰,是不参与序列化的,所以可以直接删除,既然是不参与序列化的,所以删除之后payload大小不会发生改变

3. 修改StubTransletPayload类

StubTransletPayload类代码继承了AbstractTranslet实现序列化接口,并重写了transform方法。

点击收藏 | 3 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖