Skip to content

Latest commit

 

History

History
56 lines (42 loc) · 2.41 KB

File metadata and controls

56 lines (42 loc) · 2.41 KB

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

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

作用

生成面向 Tomcat Coyote 线程模型的命令回显字节码。

链接标签

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

源码剖析

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

public byte[] getObject() throws Exception {
        JavassistHelper javassistHelper = new JavassistHelper(TomcatEchoBytecode.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()header 写入 TomcatEchoBytecode,返回模板字节码;invoke() 不消费内层对象,只把模板字节码作为链尾产物。

TomcatEchoBytecode 从当前线程组的 threads 数组寻找名字包含 http 的工作线程,经 target.this$0.handler.global.processors 找到 Coyote RequestInfo,再从 req 取得 request/response。请求头值作为命令输入,响应通过 doWrite(ByteChunk|ByteBuffer) 写回。

模板里还包含一段以 eyJeXA 为标记的加密参数处理逻辑:命令与响应可走 XOR + Base64 编码分支;未命中该分支时按明文命令执行。

参数(@Param)

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

适用版本与原理要点

  • 依赖条件:无第三方依赖或未在注解中声明。
  • 适用于保留经典 Coyote processor/global 结构的 Tomcat 分支;不同 Tomcat 版本的 doWrite 参数类型差异由模板内 ByteChunk/ByteBuffer 双分支兼容。
  • END 标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。

防御与检测

关注新加载类遍历 ThreadGroup.threads、访问 processors/req、读取可疑请求头并调用 doWrite 的行为。

所属预设链

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

关联

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