Skip to content

Latest commit

 

History

History
51 lines (41 loc) · 2.98 KB

File metadata and controls

51 lines (41 loc) · 2.98 KB

JS Runtime执行命令(JsExec)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖:无(仅需目标存在可执行 JS 表达式的引擎/入口)

作用

生成一段直接调用 java.lang.Runtime.getRuntime().exec("<cmd>")JavaScript 表达式字符串。它是 JS 表达式家族的终止 sinktagsEND),不加载字节码、不衔接下游,直接以命令执行收尾。适用于目标本身会对攻击者可控字符串做 JS 求值(Nashorn/Rhino)的场景。

链接标签

  • 入口 tagsJs_ExprExpressionEND —— Js_Expr/Expression 表明产物是 JS 表达式;END 标记本 gadget 是链尾 sink,不再接后续环节。
  • 衔接 nextTags:无(空)—— 因为它是终点。
  • excludes:无。

源码剖析

@Param(name="命令", description="eg: cmd /c calc")
public String cmd = "cmd /c calc";
public static String jsTemplate = "java.lang.Runtime.getRuntime().exec('%s')";

private String getObject() {
    return String.format(jsTemplate, this.cmd);
}

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

逐段解释:

  • 注意 invoke 不调用 chain.doCreate(context) ——它没有内层对象,是真正的链尾产物。
  • getObjectString.format 把用户配置的 cmd 字段填入模板 java.lang.Runtime.getRuntime().exec('%s'),直接返回一段可执行命令的 JS 表达式字符串。
  • 当该字符串被 Nashorn/Rhino 引擎求值时,Runtime.getRuntime().exec(cmd) 触发系统命令执行。
  • JsConvert* 系列的对比:JsConvert* 产出「加载任意字节码」的 JS,能力更强(可落地内存马、复杂逻辑);JsExec 只产出「执行单条命令」的 JS,构造简单、无字节码依赖,但受 exec 的参数拆分与转义限制(单字符串形式对复杂命令需 cmd /c / bash -c 包装)。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 要执行的系统命令,如 cmd /c calc cmd /c calc

适用版本与原理要点

  • 无显式 JDK 依赖声明,但实际生效取决于目标是否存在 JS 求值入口(Nashorn 见于 JDK 8~14,Rhino 见于更早/第三方引擎)。
  • 单参 Runtime.exec(String) 会按空白拆分 token,复杂命令(管道、重定向)须借助 cmd /c(Windows)或 sh -c/bash -c(*nix)包装。
  • 作为 END sink,可直接接在任意「消费 JS 表达式」的上层 gadget 之后收尾。

所属预设链

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

关联

  • 上游(产出/消费 JS 表达式的环节,tagsJs_Expr):各 JS 表达式载体 gadget。
  • 功能对照(同为 JS 表达式家族,但走字节码加载而非直接命令):JsConvertJsConvert2JsConver3