netcat 监听和发送结果的魔法

Ale*_*tos 2 bash netcat

我正在尝试netcat连接到远程机器,为来自远程机器的每个文本运行 bash 并将命令的结果发送回远程机器。

是的。完全哈克。

我有点让它像这样工作:

在我的本地机器上,我运行 netcat -l -p 8765

在远程的防火墙机器上,我运行 netcat <ipofmylocalmachine> 8765 | bash -

当我tail -f /tmp/output在远程机器上执行 a 时,我可以看到我的命令的结果,然后输入一个echo "test" > /tmp/output

但是我怎样才能在我的本地机器上看到 bash 命令的结果呢?

我可以使用 Python 和 Perl 来完成,但是如何仅使用 bash 来完成呢?

作为说明,我知道反向 shell 解释,例如http://blog.safebuff.com/2016/06/19/Reverse-shell-Cheat-Sheet/,但请注意,我正在寻找的是一点不同的。不是打开服务器的端口,而是打开的端口在没有防火墙的客户端上。

phe*_*mer 10

基本上你想要做的是将netcat的STDOUT连接到bash的STDIN,将bash的STDOUT连接到netcat的STDIN。

Bash 有多种启动命令的方法,但只有一种方法可以启动命令并能够读取命令和写入命令。Bash 称其为coproc

所以让我们看一下最终的脚本,让我们做我们想做的事,然后我们将剖析它。

#!/bin/bash
coproc netcat -l -p 8765
exec bash <&${COPROC[0]} >&${COPROC[1]} 2>&1
Run Code Online (Sandbox Code Playgroud)

因此,第一行在netcat后台启动,将 STDOUT of 分配给netcat存储编号的文件描述符,${COPROC[0]}并将 STDIN ofnetcat分配给编号存储在${COPROC[1]}.
所以现在我们需要将这些文件描述符重定向到 bash 的 STDIN/STDOUT/STDERR。但是,当 bash 运行脚本时,它正在从脚本文件中读取命令,并且无法告诉它切换到从文件描述符中读取。所以我们重新执行 bash,将 STDIN 连接到${COPROC[0]},STDOUT 连接到${COPROC[1]},STDERR 也连接到${COPROC[1]}