跳到正文

Metasploit:The Basics

地址:https://tryhackme.com/room/metasploitthebasics

浏览 msfconsole,搜索模块,配置漏洞利用程序,并管理目标系统上的会话。

Metasploit框架简介

想象一下,你刚刚受聘于 Stratford Systems ,一家中型金融服务公司,负责一项渗透测试项目。你的团队已经完成了侦察阶段。你们掌握了一份 IP 地址列表、开放端口以及一些看起来很有希望的服务。你们甚至在他们的一台服务器上发现了一个似乎已经过时的 SMB 实现。漏洞就在那里,公开的漏洞公告中已经记录了相关信息,包括 CVE 编号等等。

接下来怎么办?

你可以从头开始编写自己的漏洞利用程序,但这需要时间、专业技能和仔细的测试,以避免目标崩溃。在实际攻击中,时间紧迫,客户期望看到结果。你需要的是一个框架:一个结构化的工具包,它整合了数千个已知的漏洞利用程序,并将它们与合适的有效载荷配对,同时提供一致的界面,让你能够配置、发起和管理整个网络中的攻击。

该框架是Metasploit.

Metasploit 框架是什么?

Metasploit 框架是渗透测试行业中使用最广泛的开源漏洞利用框架。它最初由 HD Moore 于 2003 年创建,是一个可移植的网络工具,2009 年被 Rapid7 收购,并发展成为一个包含超过 2600 个漏洞利用程序和 6100 多个模块的生态系统。

理解 Metasploit 的一个比喻是:一个井然有序的工作坊。你不会只用一把锤子盖房子;你需要锯子、钻头、水平仪、卷尺和紧固件,所有工具都摆放整齐,以便你能找到适合每项工作的工具。Metasploit 的工作方式也是如此。它不会强迫你到处搜寻散落在互联网上的漏洞利用脚本,而是提供了一个集中式的漏洞利用程序、扫描器、有效载荷和后渗透工具库,所有这些都可以通过一个名为 msfconsole 的命令行界面访问。

从技术角度来看,Metasploit 支持完整的渗透测试生命周期:

  • 信息收集 :扫描目标和指纹采集服务
  • 漏洞识别 :检测目标系统中的已知缺陷
  • 利用漏洞 :提供漏洞利用代码以利用这些漏洞。
  • 后渗透阶段 :维持访问权限、收集数据并转向其他系统
  • 报告 :记录调查结果,以便撰写文档和交付给客户。

虽然 Metasploit 的主要受众是渗透测试人员,但安全研究人员和漏洞利用开发人员也依赖该框架进行漏洞研究和概念验证开发。

两个版本:专业版与框架版

Metasploit 主要有两个版本:

  • Metasploit Pro :由 Rapid7 维护的商业版本。它包含图形用户界面 (GUI)、自动化工作流程、团队协作功能和报告功能。这是一款专为专业安全团队设计的授权软件。
  • Metasploit 框架 :开源、社区驱动的版本。它完全通过命令行运行。Kali Linux、Parrot OS 和 TryHackMe AttackBox 上安装的就是这个版本,本模块也将全程使用此版本。

你通过 Metasploit Framework 学到的所有技术都可以直接应用于 Metasploit Pro。底层模块、命令和概念都完全相同;Pro 只是在其基础上添加了图形用户界面和自动化层。

框架的三大支柱

Metasploit 框架由三个核心组件构成。了解每个组件的功能将有助于您在完成后续任务时更有效地使用该工具。

1. Msfconsole

msfconsole 是 Metasploit 框架的主要命令行界面。您的大部分时间都将花费在这里。通过 msfconsole ,您可以搜索模块、配置参数、启动漏洞利用程序以及管理已入侵目标上的会话。您可以将其视为框架的驾驶舱;所有其他功能都通过它访问。

2. Modules

模块是 Metasploit 的基本构建单元。每个模块都是一段独立的代码,旨在执行特定任务。模块分为七类(漏洞利用模块、辅助模块、有效载荷模块、后渗透模块、编码器模块、NOP 指令和规避模块),我们将在下一节课中逐一探讨。目前,关键在于 Metasploit 的强大之处在于其包含数千个模块的庞大库,而非任何单一工具。

3. Tools

除了 msfconsole 及其模块之外,该框架还附带一系列独立的命令行工具。对于本模块而言,最重要的工具是 msfvenom ,它可以在 msfconsole 之外生成有效载荷,用于需要独立文件(例如可执行文件、Web Shell 或原始 shellcode)的场景。我们将在本模块的第四部分深入讲解 msfvenom 。其他工具,例如 pattern_create 和 pattern_offset 则用于漏洞利用开发,但这超出了本学习路径的范围。

本模块涵盖的内容

这是 Metasploit 模块中四个房间中的第一个:

1.Metasploit:基础知识 (本房间)——框架导航、模块理解、配置和启动漏洞利用程序、会话管理

2.Metasploit:扫描与利用 — 使用 Metasploit 数据库扫描目标、识别漏洞并利用实时系统

3.Metasploit:后渗透阶段 ——使用 Meterpreter 进行凭证收集、权限提升和目标探索

4.Metasploit:有效载荷生成 ——生成自定义有效载荷、理解编码并将有效载荷投放至目标

完成所有四个房间的学习后,你将掌握使用 Metasploit 框架从最初发现目标到利用目标以及利用后目标进行攻击的技能。

先决条件

在开始这个房间之前,你应该能够做到以下几点:

  • 基本的 Linux 命令行导航( cd 、 ls 、 cat 、 pwd )
  • 基本网络概念(IP 地址、端口、客户端-服务器通信)
  • 对漏洞(软件中可被利用的缺陷)的基本理解

学习目标

完成本房间的练习后,您将能够:

  • 请解释 Metasploit 框架是什么,并指出其核心组件。
  • 使用 msfconsole 搜索、选择和检查模块
  • 配置模块参数并对目标发起攻击
  • 管理受感染系统上的活动会话

核心概念和模块类型

您已在 Stratford Systems 的一台 Web 服务器上发现一个存在漏洞的服务。扫描结果显示该服务使用的 Apache 版本过旧,存在已知的远程代码执行漏洞。您已掌握 CVE 编号、目标 IP 地址,并且 Metasploit 也已打开。但在开始搜索模块之前,您需要了解整个 Metasploit 框架构建所依赖的三个基本概念: 漏洞 、 攻击和有效载荷 。

这三个术语将在本模块的每个房间、你撰写的每一份项目报告以及你进行的几乎每一次安全对话中出现。让我们来精确定义它们。

攻击链:漏洞、攻击、有效载荷

不妨以物理安全为例。 漏洞就像仓库门上的锁被撬开。 利用漏洞的行为就像是撬开这扇门。 有效载荷则是入侵者进入仓库后所做的事情:无论是偷窃货物、安装窃听装置,还是仅仅拍照来证明入侵成功,都属于有效载荷。

技术上来说:

  • Vulnerability :目标系统中的设计、代码或配置缺陷。缺陷本身不会造成损害,但它会创造造成损害的机会 。漏洞可能允许攻击者执行任意代码、读取他们不应该访问的文件,或者完全绕过身份验证。
  • Exploit :一段利用特定漏洞的代码。利用漏洞是攻击机制,它瞄准漏洞并以可控的方式触发该漏洞。
  • Payload :攻击成功后在目标系统上运行的代码。攻击程序打开了攻击之门;有效载荷则负责执行后续操作。有效载荷可以打开一个反向 shell 供攻击者使用,创建一个新的用户帐户,或者在目标系统上执行命令。

这三部分组成的链条至关重要。没有有效载荷的漏洞利用程序可以触发漏洞,但对攻击者而言没有任何实际意义。没有漏洞利用程序的有效载荷则无法到达目标。Metasploit 的架构正是围绕着针对特定漏洞,将正确的漏洞利用程序与正确的有效载荷进行匹配而构建的。

七个模块类别

Metasploit 将其整个模块库分为七大类。每一类模块在渗透测试工作流程中都扮演着不同的角色。

Exploits

漏洞利用模块针对特定平台上的特定漏洞。它们按目标操作系统和服务进行分类(例如, exploits/windows/smb/ , exploits/linux/http/ )。当前框架中包含超过 2600 个漏洞利用模块,是最大的类别。当您听到有人说“我使用了一个 Metasploit 模块”时,他们几乎总是指漏洞利用。

Auxiliary

辅助模块负责处理所有非直接攻击的任务,包括端口扫描器、服务指纹识别器、暴力破解登录模块、模糊测试器和网络嗅探器。如果您需要收集目标信息或测试凭据,但又不想直接实施攻击,那么辅助模块就是您的理想选择。在下一个房间扫描斯特拉特福德系统公司的网络时,我们将使用其中的几个模块。

Payloads

有效载荷模块包含在成功利用漏洞后在目标系统上执行的代码。Metasploit 提供了近 1700 个有效载荷模块,涵盖了广泛的操作系统、架构和连接方式。我们稍后将介绍不同的有效载荷类型 (单有效载荷、分阶段有效载荷和阶段有效载荷)。

Post-Exploitation

后渗透模块在您通过活动会话获得目标访问权限后运行。它们自动执行常见的后渗透任务:导出密码哈希值、枚举系统信息、捕获屏幕截图、跳转到其他网络段等等。这些模块按目标操作系统进行组织(例如, post/windows/gather/ , post/linux/manage/ )。我们将在后渗透训练室中大量使用它们。

Encoders

编码器模块将有效载荷数据转换为不同的格式。最知名的编码器是 x86/shikata_ga_nai ,它采用多态异或编码。需要特别说明的是:编码并非加密,它本身也不是一种可靠的反病毒规避技术。现代终端检测解决方案的检测范围远不止简单的签名匹配。编码器仍然有其合法的用途(例如,从 shellcode 中移除恶意字符),但将其视为一种隐蔽机制是初学者常见的误解。我们将在“有效载荷生成”环节中对此进行深入探讨。

NOPs

NOP (无操作)模块会生成 NOP 指令序列,即一系列不执行任何操作的指令。在 x86 处理器上,经典的 NOP 指令是 0x90 ,它告诉 CPU 跳到下一条指令。NOP指令序列用作填充,确保在缓冲区溢出攻击期间有效载荷落入可预测的内存地址。您很少会直接与 NOP 模块交互;Metasploit 会在需要时自动处理 NOP 指令序列的生成。

Evasion

规避模块是专门用于绕过特定安全控制措施(例如 Windows Defender 或 AppLocker)的模块。与编码器(仅对数据进行重新编码)不同,规避模块实现了实际的规避技术,例如进程规避或利用系统自带二进制文件进行攻击。这是最小的模块类别,目前包含大约十几个模块。它们的有效性各不相同,并且很大程度上取决于目标环境的安全配置。

有效载荷类型:单一的、分段式和多段式

在有效载荷类别中,Metasploit 区分了三种类型。这里仅作简要的概念介绍;我们将在“有效载荷生成”部分深入探讨分阶段有效载荷和无阶段有效载荷。

Singles (也称内联有效载荷)是自包含的。所有有效载荷都包含在一个单独的数据包中。单包有效载荷可以添加用户帐户、执行系统命令或打开绑定 shell。由于所有内容都集中在一个数据包中,单包通常体积更大,但更可靠;不会出现二次下载失败或被阻止的情况。

Stagers是一种体积小、重量轻的有效载荷,其唯一任务是在攻击者和目标之间建立通信通道。连接建立后,中间件会下载第二个组件。

Stages是分阶段器下载的较大有效载荷组件。分阶段器及其级联共同构成分阶段有效载荷 。其优点是初始占用空间较小;缺点是连接必须保持稳定足够长的时间,以便级联完成下载。

阅读命名规则

Metasploit 使用 payload 的路径来判断它是分阶段的还是单个的。shell 类型和连接方式之间的分隔符是关键:

  • windows/x64/shell_reverse_tcp — shell 和 reverse 之间的下划线 ( _ ) 表示这是一个单一的 (无阶段的)有效载荷。所有内容都在一个数据包中。
  • windows/x64/shell/reverse_tcp — shell 和 reverse 之间的斜杠 ( / ) 表示这是一个分阶段的有效载荷。首先会连接一个小型分阶段程序,然后下载完整的 shell 阶段。

这种命名模式在整个框架中保持一致。一旦熟悉了这种模式,你就能一目了然地识别任何有效载荷的类型。

有效载荷路径的一般结构如下:

1
<platform>/<architecture> /<payload_type><separator><connection_method>

再举一个例子: linux/x86/meterpreter/reverse_tcp 是一个用于 32 位 Linux 系统的分阶段 Meterpreter 有效载荷。meterpreter 和 reverse_tcp 之间的斜杠 / 表示它是分阶段传输的。它的单有效载荷版本应该是 linux/x86/meterpreter_reverse_tcp ,其中 meterpreter 替换为下划线 (_)。

image-20261011143921239

操作Msfconsole

每个工具都有学习曲线。好消息是,msfconsole 的设计目的是帮助你在不背成千上万个模块名的情况下发现所需内容。它内置了搜索、标签页补全、上下文帮助,甚至支持标准的 Linux 命令。在这个任务中,我们将启动控制台,学习如何寻找和检查模块。在下一个任务中,我们将配置并运行它们。

启动 Metasploit。你可以使用 TryHackMe AttackBox 或你自己的 Kali Linux 安装来跟进。

启动Msfconsole

打开终端,输入 msfconsole。经过短暂加载后,你会看到随机选出的 ASCII 艺术横幅,随后显示框架的版本和模块数量:

image-20261011144128274

每次启动时,横幅都会显示一个随机的 ASCII 艺术图形(纯粹是装饰性),随后是框架版本和每个类别的模块数量。具体数量会根据你上次更新框架的时间而有所不同。

我们可以看到提示词已从标准终端提示符改为 msf6 >。这告诉我们现在进入了 Metasploit 控制台。从此以后,我们输入的每个命令都由 msfconsole 解释,而不是普通 shell。

注意 :msf6 前缀反映了框架的主版本。较旧的安装可能会显示 MSF5。我们在这个房间里讲的命令和概念适用于两个版本。

在msfconsole中运行Linux命令

msfconsole 的一个方便功能是支持大多数标准的 Linux 命令。你无需退出控制台即可检查 IP 地址、读取文件或列出目录内容:

image-20261011144257310

然而,msfconsole 并不支持所有 shell 功能。例如,输出重定向不起作用:

image-20261011144538612

如果你需要将输出重定向到文件,你需要使用 spool 命令(它会将所有控制台输出记录为文件),或者退出 msfconsole,然后在普通终端操作。

寻求帮助

help命令显示了所有可用的 msfconsole 命令列表。你也可以用特定命令名来查看该命令的使用情况:

image-20261011145048911

这是你会经常使用的模式:当你不确定命令的语法或选项时,help <command> 会在不离开控制台的情况下给你答案。

历史与制表符补全

msfconsole 会记录你在会话中输入的每一个命令。使用history命令查看你最近的输入:

image-20261011145320781

你也可以像在普通 Linux 终端一样,用上下方向键滚动前一级命令。

制表符补全是 msfconsole 最有用的功能之一。它对命令、模块路径和选项名称进行操作。举个例子:如果你输入“exploit/windows/smb/ms17”并按 Tab 键,控制台要么会自动完成路径,要么显示所有匹配选项。这大大节省了大量打字时间,尤其是在深度嵌套的模块路径中导航时。

搜索模块

框架中有超过 6100 个模块,找到合适的模块是一项关键技能。search命令用来搜索。

基础搜索

最简单的形式是search后跟关键词。Metasploit 将返回所有名称、描述或引用与该关键词相符的模块:

image-20261011145647194

让我们来分析一下这个输出中的列:

  • #:数字索引。你可以用这个数字配合使用或info (例如use 0 或 info 0)等命令,而不是输入完整的模块路径。
  • Name :模块的完整路径,告诉你它的类型(exploit/、auxiliary/)、目标平台(windows/)、服务类别(smb/)以及具体模块名称。
  • Disclosure Date:漏洞公开披露的时间。对于不针对特定 CVE 的辅助模块,则为空白。
  • Rank:模块的可靠性评级。我们稍后会讲到这个。
  • Check:模块是否支持非破坏性漏洞检查( yes),还是只能通过运行完整漏洞验证( no)。
  • Description:模块功能的简要总结。

筛选搜索

针对性搜索,将关键词与筛选结合起来。日常工作中最有用的筛选条件有:

  • type:按模块类别筛选(exploit, auxiliary, post, payload, encoder, nop, evasion)
  • platform:按目标操作系统(Windows、Linux、OSX、Android 等)筛选
  • cve:按 CVE 编号搜索
  • name: 仅根据模块的描述性名称进行匹配

请考虑以下例子。你正在寻找与 SMB 相关的辅助扫描模块:

image-20261011150514367

你也可以在筛选值前加上负号来排除结果。例如,search type:exploit -platform:windows 返回所有非针对 Windows 的漏洞利用。

理解漏洞排名

搜索结果中的排名栏告诉你漏洞利用的可靠性。Metasploit 采用七级排名系统:

image-20261011150932190

等级越高并不保证成功,等级越低也不保证失败。目标配置、网络状况和安全控制等环境因素都起着作用。把排名当作起点,而不是保证。

查看模块信息

一旦你找到一个有潜力的模块, info命令会给你详细的信息。你可以用两种方式来利用info:

  • 直接从 msf6 > 的提示中模块路径:info exploit/windows/smb/ms17_010_eternalblue
  • 使用搜索结果中的数值索引:info 0

image-20261011151251616

info输出会告诉你所有判断该模块是否适合你的情况所需的信息:目标平台、所需选项、可靠性排名、漏洞工作原理描述,以及对底层 CVE 的引用。这不是帮助菜单;这是关于该模块的技术简报。

关注几个关键领域:

  • Privileged:如果yes, 成功的漏洞利用将赋予目标更高的(系统/根)权限。如果no,你将获得被利用服务自身对应的权限。
  • Check supported:如果yes, 你可以在不发送漏洞有效载荷的情况下验证目标是否存在漏洞。在生产环境中,这种做法更安全,因为服务崩溃是不可接受的。
  • Available targets:部分模块支持多种目标配置。默认通常就足够了,但在某些情况下,你可能需要选择特定目标(例如特定的 Windows 服务包或应用版本)。

关于 EternalBlue 的简要说明

在本房间内,您将多次看到 EternalBlue 漏洞利用程序( exploit/windows/smb/ms17_010_eternalblue )作为教学示例。以下是简要背景: EternalBlue 利用了 CVE-2017-0144,这是微软服务器消息块版本 1 (SMBv1) 协议中的一个严重缓冲区溢出漏洞。该漏洞最初由美国国家安全局 (NSA) 开发,并于 2017 年 4 月被一个名为“影子经纪人”(Shadow Brokers) 的组织公开泄露。一个月后,WannaCry 勒索软件利用 EternalBlue 漏洞,在全球范围内感染了数十万台系统。

我们之所以用它作为示例,是因为它文档齐全,在实验室环境中可靠,并且清晰地展示了完整的漏洞利用流程。在实际攻击中,你显然不会局限于2017年的单一漏洞利用案例。

image-20261011152514084

配置和运行模块

您已搜索到一个模块,阅读了其 info 输出,并确定它符合您的目标。现在,您需要告诉 Metasploit 攻击目标 、 如何连接以及要交付什么内容。本任务涵盖从配置到执行的完整工作流程:选择模块、设置其参数以及针对目标启动攻击。

了解你的提示

在接触任何配置命令之前,我们先来建立一个你会反复用到的参考。在使用 Metasploit 时,你会遇到五个不同的提示。每个提示都会告诉你当前所在位置以及可用的命令 :

image-20261011152824375

如果某个命令无法正常执行,首先应该检查自己当前处于哪个命令提示符下。一个常见的错误是试图在 msf6 > 命令提示符下运行 set RHOSTS 命令(此时没有模块上下文),或者试图在 Meterpreter 会话中输入 Linux 命令。

选择正在被使用的模块

use 命令会将某个模块加载到当前的上下文中。你可以指定完整的模块路径,或者使用搜索结果中的数字索引来指定模块。

image-20261011152942543

我们可以注意到两件发生的事情。首先,提示信息发生了变化,以反映当前加载的模块。其次,Metasploit 自动选择了默认的有效载荷( windows/x64/meterpreter/reverse_tcp )。当然,你可以通过 set PAYLOAD 命令来更改这个默认值。不过,对于大多数常见的攻击场景来说,默认值已经是一个不错的起点。

一个重要的细节是:加载某个模块并不会改变你的工作目录。你仍然处于同一个会话中;只不过,上下文信息会告诉 Metasploit 应该使用哪个模块的选项和命令而已。你可以通过在模块执行环境中运行任何 Linux 命令来验证这一点,确保一切正常运作。

要离开某个模块的上下文并返回到纯 msf6 > 提示符下,请使用 back 命令:

image-20261011153031980

阅读展示选项

一旦某个模块被加载, show options 就会显示所有可配置的参数。让我们来看看 EternalBlue 示例的输出结果吧:

image-20261011153058322

该输出内容分为三个部分。我们逐一来看看吧:

Module options是与漏洞利用工具本身相关的特定参数。这些参数决定了漏洞利用工具与目标的连接方式及连接位置。 RHOSTS (目标 IP 地址)为空,且被标记为 Required: yes 。这意味着,如果我们不输入该值,漏洞利用工具将无法运行。 RPORT 的值默认为 445 (即 SMB 协议的默认端口号);只有当目标的 SMB 服务运行在非默认端口上时,才需要手动更改该值。

Payload options相关参数是针对所选有效载荷而设定的各项设置。其中, LHOST (攻击机器的 IP 地址)和 LPORT (机器用于接收反向连接的端口)是两个最需要经常设置的参数。Metasploit 通常会自动检测 LHOST 的值,但您仍应自行确认其准确性,尤其是在通过 VPN 隧道进行连接时。

Exploit target指的是该攻击代码所针对的、目标软件的特定版本或配置。许多现代模块都使用 Automatic Target 来自动检测正确的配置。而较旧的模块则可能需要用户手动使用 set TARGET <id> 来选择具体的目标,比如某个特定的 Windows 服务包。

Required一栏列出了所有必须填写的参数。所有标有 yes 的参数在模块运行之前都必须有对应的值。标有 no 的参数则是可选的,可以不填写。

核心参数

虽然每个模块都有自己的一组选项,但有六个参数出现得非常频繁,你一定得记住它们的名称:

  • RHOSTS:“远程主机”。即目标的 IP 地址。可以输入单个 IP 地址( MACHINE_IP )、CIDR 地址范围( MACHINE_IP/24 )、用连字符分隔的地址范围( 10.48.12.1-10.48.12.50 ),或者是一个每行包含一个目标的文件( file:/path/to/targets.txt )。
  • RPORT:指的是目标系统中运行着该易受攻击服务的端口。通常,该端口会预先设置为该服务的默认端口值。
  • LHOST:“本地主机”。指的是发起攻击的机器的 IP 地址。目标系统会连接到这个地址,以便传输反向数据包。
  • LPORT:“本地端口”。即您机器上用于接收反向连接的端口。默认值为 4444 。您可以将其更改为任何未被使用的端口。
  • PAYLOAD:即通过该漏洞要传递的内容。通常会预先设置一个默认值,但你也可以自行更改。
  • SESSION:该参数与利用后的处理模块一起使用。用于指定该模块应在哪个现有的会话中执行。我们将在下一个任务中详细讲解会话的相关内容。

设置参数

set 命令用于为当前模块上下文中的某个参数赋值。

image-20261011154014288

设置好各项数值后,请再次运行 show options ,以确认一切正常。这是一个好习惯:如果在 RHOSTS 中输入了错误的内容,或者 LHOST 的数值有误,那么这些都很可能导致漏洞利用失败。

要清除单个参数,请使用 unset :

image-20261011154038960

要将所有参数重置为默认值,请使用 unset all :

image-20261011154052959

本地与全局:set vs setg

使用 set 设置的参数仅适用于当前模块。如果您切换到另一个模块(通过使用 use 或 back ,然后再输入 use ),这些参数将被清除。您需要重新进行设置。

setg 命令会设置一个全局值,该值在您使用 msfconsole 会话的整个过程中,都将在所有模块中保持有效。当您需要使用多个模块来处理同一个目标时,这一功能非常有用。

请想象以下情景:你希望先使用辅助模块来扫描 Stratford Systems 主机上是否存在 MS17-010 漏洞,然后再利用该漏洞进行攻击。如果不使用 setg ,那么你需要分别设置两次 RHOSTS 。

image-20261011154159159

我们可以注意到,尽管我们在攻击代码中设置了 RHOSTS 的值,但实际上,扫描器模块中已经有了该值的默认值。这就是 setg 在起作用。这个值会一直保留在各个模块中,直到你退出 msfconsole 或使用 unsetg 来清除它为止。

image-20261011154244675

一个实用的准则是:对于在整个过程中保持不变的数值,使用 setg 来表示;而对于那些因模块不同而有所差异的数值,则使用 set 来表示。例如: RHOSTS 、 LHOST 属于前者,而 RPORT 、 PAYLOAD 、 SESSION 则属于后者。

选择不同的有效载荷

当你加载某个漏洞利用工具时,Metasploit 会自动为其分配一个默认的有效载荷。若要查看当前模块所支持的所有有效载荷,请使用 show payloads 命令。

image-20261011154315576

仅显示那些与该漏洞利用工具所针对的架构和平台兼容的有效载荷。如需切换有效载荷,请使用 set PAYLOAD 后跟该有效载荷的名称或索引号:

image-20261011154650139

这实际上是用一个简单的命令行 shell 来替换了默认的 Meterpreter 载荷。关于何时以及为何要选择不同的载荷,我们将在“载荷生成”部分进行详细讨论。

正在运行的模块

一旦所有必需的参数都设置完毕,就可以使用 exploit (或其别名 run )来启动该模块了:

image-20261011154732059

让我们来梳理一下这个输出中发生了什么:

  1. Metasploit 在我们的机器上启动了监听程序,以便接收反向连接。
  2. 在发送攻击代码之前,它会先对目标系统进行快速的漏洞检测。
  3. 该攻击利用了目标系统的 SMB 服务,引发了缓冲区溢出,从而使得攻击代码得以被执行。
  4. 该载荷(Meterpreter)在目标系统上被执行后,会与我们的监听程序重新建立连接。
  5. 一个 Meterpreter 会话已建立,此时命令提示符变为 meterpreter > 。

我们现在在目标系统上进行了交互式操作。

run 别名: run 命令的作用与 exploit 完全相同。设置这个别名的原因在于:当用户运行非利用模块时(比如扫描工具或暴力破解工具),直接输入 exploit 会让人感觉不太自然。实际上,大多数渗透测试人员会使用 run 来处理辅助模块,而使用 exploit 来处理利用模块。不过,无论在哪种情况下,这两种命令都可以正常使用。

-z 标志:将 -z 添加到 exploit 命令中后,该命令会触发漏洞利用机制。会话启动后,系统会立即将用户切换到模块上下文界面,而不会让用户进入 Meterpreter 会话界面。

image-20261011154954451

利用之前先进行检查

某些模块支持 check 命令。该命令可以检测目标系统是否存在漏洞,而无需发送攻击代码。

image-20261011155139411

并非所有模块都支持 check 功能(请参考搜索结果中的“检查”一栏)。如果该功能可用,那么在 exploit 之前先执行 check 是个好习惯,尤其是在生产环境中——因为一旦利用该功能进行攻击失败,可能会导致服务崩溃或触发警报。

image-20261011155354100

会话管理

攻击已经成功实施了。你会看到 Meterpreter session 1 opened 在终端上滚动显示。在简单的实验环境中,面对单一目标时,你可以直接开始探索和操作。但在实际情况下,事情没那么简单。以 Stratford Systems 为例:你需要监控两个子网中的十几台主机。在攻击过程中,你可能需要在多台机器上开启会话——有些是通过直接攻击实现的,有些则是通过已受损的主机来进行的。如果你无法记录下每个会话所连接的目标,或者因为没有在启动下一次攻击前将某个会话置于后台状态而丢失了该会话,那你就浪费了时间,还可能让防御方察觉到异常。

会话管理虽然只涉及少量命令,但却是一项至关重要的操作技能。让我们来详细了解一下其工作流程吧。

什么是会话?

在 Metasploit 中,会话指的是攻击者使用的机器与已被攻破的目标系统之间的活跃通信渠道。当攻击成功且恶意代码被执行后,该恶意代码会与攻击者的机器重新建立连接。这种连接会被记录为一个具有唯一数字标识的会话。

根据创建会话的“有效载荷”不同,会话的类型也有所区别:

  • Meterpreter sessions 会话/会议记录它提供了一个功能丰富、交互性强的环境,内置了用于文件系统操作、权限提升、身份转换等功能的命令。这些都是最常用、最实用的会话类型。
  • Shell sessions会话提供了基本的操作系统命令行界面(例如,在 Windows 上为 cmd.exe ,在 Linux 上为 /bin/sh )。虽然使用起来更简单,但功能相对有限。
  • Protocol-specific sessions 功能是 Metasploit 6.4 中的新功能。该功能允许用户以交互方式访问 SMB、MSSQL、MySQL 和 PostgreSQL 等服务。这些功能具有针对性,主要用于有目的的枚举操作,而非一般的访问需求。

无论属于哪种类型,用于管理会话的命令都是相同的。

会话后台运行

当您处于活跃会话状态时(即能够看到目标系统的 meterpreter > 或命令行提示符),您可以无需关闭会话即可返回到 msfconsole 提示符下。这一操作被称为“置于后台”。

使用 background 命令(或其快捷键 CTRL+Z ):

image-20261011155754564

该会话仍然处于活跃状态;你只是把注意力重新转移到了 msfconsole 上而已。目标连接在后台仍然保持开启状态,你可以随时再次使用它。

在处理多个目标时,这一点非常重要。如果不使用后台处理功能,那么在尝试加载和运行另一个模块之前,就必须先结束当前的会话(从而失去对当前工作的访问权限)。而使用后台处理功能后,就可以在继续使用 msfconsole 的同时,保持多个连接状态。

列出当前活跃的会话

sessions 命令(不带任何参数时)会显示所有当前处于活动状态的会话。你可以在 msf6 > 提示符下运行该命令,也可以在任何模块的上下文中执行它。

image-20261011155833653

让我们来仔细分析一下这些列的数据:

  • ID:该会话的唯一数字标识符。您可以使用这个编号来与特定会话进行交互、终止该会话或调整该会话的流量分配。
  • Name:您可以使用 sessions -n <name> -i <id> 来为该名称添加标签。在复杂的会话中,这一功能有助于区分不同的会话。
  • Type:会话的类型和架构(例如: meterpreter x64/windows 、 shell x64/linux )。
  • Information:对于 Meterpreter 会话而言,该字段显示了用户上下文和主机名。由此可以一目了然地知道,当前用户是拥有完全权限的 NT AUTHORITY\SYSTEM 用户,还是普通用户。在 Shell 会话中,该字段可能为空。
  • Connection:包括本地和远程端的 IP 地址与端口号,从而明确显示每个会话所连接的具体的机器和端口。

在这个例子中,我们对目标机器分别执行了两次攻击。每次攻击都会连接到攻击端机器上的不同端口( 4444 、 4445 )。因此,当同时发起多次攻击时,为每次攻击设置唯一的 LPORT 值就非常重要。

与会话进行交互

要返回到某个特定的会话,请使用 sessions -i 后跟该会话的 ID:

image-20261011160117839

您现在又回到了会话 1 中,可以直接与 STRATFORD-WS01 机器进行交互。您输入的任何命令都将在该会话的上下文中被执行。

要切换到另一个会话,请先将当前会话置于后台状态(按 background 或 CTRL+Z 操作),然后再与另一个会话进行交互。

image-20261011160218728

关闭会话

要终止某个特定的会话,请使用 sessions -k 后跟该会话的 ID:

image-20261011160304588

一次性终止所有活跃会话(请谨慎使用):

image-20261011160315830

请注意其中的区别:小写的 -k <id> 只会结束单个会话;大写的 -K 则会导致所有会话都被终止。在实际情况中,如果所有会话同时丢失,那将是个巨大的损失。因此,请务必谨慎使用 -K ,只有在确实需要清理所有会话时才使用它。

会话处理模块与利用后的后续处理模块

会话不仅仅是用于交互的终端界面;它们还是连接 Metasploit 各种后渗透模块的桥梁。许多 post/ 模块都需要一个 SESSION 参数,该参数必须指向某个现有的会话。例如,那些用于在 Windows 目标系统上提取密码哈希值的模块,就需要在该目标系统上已有的 Meterpreter 会话才能正常运行。

工作流程如下:

  1. 利用目标系统来建立 Meterpreter 会话
  2. 退出会话
  3. 使用 use 加载利用后的模块
  4. SESSION 参数设置为相应的会话 ID。
  5. 运行该模块

我们将在“利用后处理”环节中深入演练这一工作流程。目前需要记住的关键点是:这些连接通道并非仅用于交互式操作;它们其实是可重复利用的连接,其他模块也可以加以利用。

image-20261011160632078

结论

在这个章节中,我们学习了 Metasploit 框架的基础知识。现在,让我们回顾一下你所学到的核心工作流程吧:

  1. 了解各个组成部分:Metasploit 将其功能划分为七类模块:利用模块、辅助模块、载荷模块、后处理模块、编码模块、NOP 指令模块以及逃避检测模块。在每次攻击中,都会结合使用这些模块。而“利用模块→载荷模块”这一流程,正是获取目标系统访问权限的核心机制。
  2. 找到合适的模块:通过使用 search 命令,再结合 type: 、 platform: 和 cve: 等筛选条件,你可以在包含 6,100 多个选项的庞大库中轻松找到所需的模块。 info 命令则能提供你所需的技术细节,帮助你判断某个模块是否符合你的需求。
  3. 配置与启动: use 、 set 、 setg 和 show options 命令可用于加载模块、设置其参数以及验证配置是否正确。 exploit (或 run )命令用于将模块发送到目标设备上,而 check 命令则允许在不触发完整攻击的情况下验证目标设备的漏洞。
  4. 会话管理: background 、 sessions 和 sessions -i 命令可以帮助您在多次交互过程中管理和切换不同的连接。这些会话并非单纯的交互界面,而是可重复使用的连接通道,攻击模块正是通过这些通道来实施其功能的。