前几天看到个 java remote debug端口开着 发现能直接命令执行 于是试着反弹个shell 回来
结果发现不行 看了下poc代码 发现用的是 Runtime.exec的方法 结果反弹bash shell不成功
后来查了查才知道 管道符、输入输出重定向 只有在bash环境下才能用 而在这里
我们使用的是java为我们提供的命令执行环境,不支持管道符、输入输出重定向等。因此需要bash64编码一下。
具体解释:
有时这是因为重定向和管道字符的使用方式在正在启动的进程的上下文中没有意义。 例如,ls > dir_listing在shell中执行应该将当前目录的列表输出到名为的文件中dir_listing。 但是在exec()函数的上下文中,该命令将被解释为获取>和dir_listing目录的列表。
其他时候,其中包含空格的参数会被StringTokenizer类破坏,该类将空格分割为命令字符串。那样的东西ls “My Directory”会被解释为ls ‘“My’ ‘Directory”’
payload可以改成
bash -c {echo,base64的payload}|{base64,-d}|{bash,-i}
最后成功反弹shell