- 类别:
bytecode别名:— 优先级:— - 作者:—
- 依赖:无第三方依赖或未在注解中声明
- 实现:
Gadget
生成面向 Tomcat Coyote 线程模型的命令回显字节码。
- 入口
tags:Bytecode、Echo、END - 衔接
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 编码分支;未命中该分支时按明文命令执行。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
header |
请求头key | 执行命令的Header头 | "X-Authorization" |
— |
- 依赖条件:无第三方依赖或未在注解中声明。
- 适用于保留经典 Coyote processor/global 结构的 Tomcat 分支;不同 Tomcat 版本的
doWrite参数类型差异由模板内 ByteChunk/ByteBuffer 双分支兼容。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。
关注新加载类遍历 ThreadGroup.threads、访问 processors/req、读取可疑请求头并调用 doWrite 的行为。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。