Skip to content

Latest commit

 

History

History
56 lines (42 loc) · 2.74 KB

File metadata and controls

56 lines (42 loc) · 2.74 KB

生成 ApusicV9 命令执行明文回显的字节码(ApusicEcho)

  • 类别bytecode 别名:— 优先级:—
  • 作者:ReaJason
  • 依赖:无第三方依赖或未在注解中声明
  • 实现Gadget

作用

生成面向 Apusic V9 的命令回显字节码。Gadget 本体只负责把 header 写入模板类,真正的行为在 ApusicEchoBytecode 的静态初始化中完成。

链接标签

  • 入口 tagsBytecodeEchoEND
  • 衔接 nextTags:无
  • excludes:无

源码剖析

关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:

public byte[] getObject() throws Exception {
        JavassistHelper javassistHelper = new JavassistHelper(ApusicEchoBytecode.class);
        javassistHelper.modifyStringField("header", this.header);
        return javassistHelper.getBytecode();
    }

public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        chain.doCreate(context);
        return this.getObject();
    }

getObject()ApusicEchoBytecode 为模板创建 JavassistHelper,只改写一个静态字段 header,返回修改后的 class 字节码。invoke() 调用 chain.doCreate(context) 对齐链构建约定,然后把这段字节码交给上游字节码载体。

模板类加载后从当前线程的 threadLocals.table 里寻找类名包含 InvocationContext 的对象,再取 top.request / top.response。它用配置的请求头读取命令,通过 ProcessBuilder 按 Windows 或类 Unix 分支执行,并把标准输出写回响应 writer。

触发条件不是普通方法调用,而是模板类被定义并初始化;因此它通常作为 Bytecode 标签的链尾 sink,被 BytecodeConvertTemplatesImpl、Spring XML 等载体继续包装。

参数(@Param)

字段 名称 说明 默认 可选值
header 请求头 key 执行命令的 Header 头 "X-Authorization"

适用版本与原理要点

  • 依赖条件:无第三方依赖或未在注解中声明。
  • 依赖 Apusic 请求上下文对象仍保存在当前线程 ThreadLocal 中;如果目标线程模型或字段名变化,反射取 InvocationContext/top/request/response 会失败并被静默吞掉。
  • END 标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。

防御与检测

关注内存中新定义类名、对 threadLocals.table / InvocationContext / getHeader / ProcessBuilder 的组合反射,以及异常响应中出现命令输出。

所属预设链

自由构件,未直接出现在预设链中。

关联

  • 机器可读元数据:index/gadgets.json
  • 完整反编译源码:。