在拿到一个内网初期的立足点之后,大多数人会陷入一种“不知道下一步该干嘛”的状态。弱口令进了一台机器,或者钓鱼打到一台主机,shell就在手边,但接下来从“打进”到“打穿”中间的这段路,恰恰是最暴露功力的部分。这篇文章想聊的就是这条路上最常用的一套工具栈:Metasploit、Impacket、CrackMapExec、mimikatz。它们不是同一个厂家的套装,也不是某个框架里的插件,而是分别负责内网渗透链路上不同环节的“单兵武器”。把这四个组合明白,基本就能覆盖从权限获取到凭据收集、再到横向移动的完整闭环。
适合看这篇文章的,一是刚入门内网安全、想把工具链串起来的人,二是有一定基础但习惯依赖单一工具、想拓展思路的人。我不会按官方文档复述命令,而是从实战顺序出发,讲清楚每一类工具解决什么问题、为什么在这个环节用它、以及哪些参数和细节会在真实环境里救你一命。
1. 工具栈的定位逻辑:为什么偏偏是这四个
先说结论:这四个工具不是功能重复的同类竞品,它们的配合逻辑非常清晰,分别是链路上的四个节点。
1.1 从“打进”到“打穿”的完整链路
一次典型的内网渗透,按执行顺序可以拆成下面这几个阶段:
- 获取初始立足点:拿到一台机器的执行权限,不一定是system,普通用户权限也算。
- 信息收集:判断当前机器在内网的位置,搞清楚网段、域环境、信任关系、可利用的凭据。
- 凭据获取:从内存、SAM、NTDS.dit、本地文件里提取明文密码或hash。
- 横向移动:用已有的凭据访问更多机器,扩大控制面。
- 权限提升与持久化:在目标机器上拿到更高权限,并维持访问。
Metasploit在前两个阶段充当“瑞士军刀”,既能生成payload、接收会话,又有大量post模块做本机信息收集和自动提权检测。Impacket则是横向移动和远程命令执行的“命令库”,它是一组Python脚本的集合,覆盖了SMB、LDAP、Kerberos等协议的客户端实现,几乎能调用Windows内网环境里所有跟认证和远程管理相关的功能。CrackMapExec(CME)负责批量化和自动化——它的定位是“面向内网的多协议探测和利用框架”,用同一组凭据跑整个网段的机器,批量收集结果,是信息收集效率之王。mimikatz则聚焦在凭据提取这一件事上,虽然市面上提取凭据的工具很多,但mimikatz依然是最直接、最稳定、兼容性最好的一个。
1.2 每个工具解决的核心问题域
如果把内网比作一个大型写字楼,Metasploit是你已经拿到的一把钥匙,Impacket是一整套能开各种门锁的工具箱,CrackMapExec是一个能告诉你哪些房间用同一把钥匙能打开的“门禁扫描仪”,mimikatz则是从墙上的门牌号里帮你翻出备用钥匙信息的小工具。
说实话,很多新手容易犯的一个错误是“一个工具打天下”。有人只会用Metasploit的exploit模块,有人只知道mimikatz抓密码,结果一遇到复杂内网就卡住。真正稳定的一套工作流是:用Metasploit建立会话和做单点深入,用CME批量摸清内网资产和凭据适用面,用Impacket做具体的横向移动动作,需要提取凭据时再上mimikatz。这四件事配合起来,覆盖的边界远大于任何一个工具的单独能力。
2. 立足之后的第一件事:数据收集决定后续走向
很多文章上来就教你怎么提权、怎么dump hash,但我个人经验是:刚拿到初始权限的头30分钟,最重要的不是急着横向,而是把当前机器和它所在的环境摸清楚。方向错了,后续全是白费功夫。
2.1 网络拓扑与主机发现的实战顺序
这一步我通常用Metasploit的post模块和系统内置命令交叉确认,而不是一上来就跑扫描器。
先看当前主机的基本信息:
# 当前用户及权限 whoami /all net user currentdomain %USERNAME% /domain 2>nul # 网络位置与路由 ipconfig /all route print arp -a # 域环境判断 systeminfo | findstr /B "Domain OS" nltest /dclist:%USERDOMAIN%这些命令能让你快速判断三件事:当前用户有没有域权限、当前机器能不能直接访问域控、当前网段还有哪些活跃主机(arp缓存会给你一个粗略名单)。
在拿到网段信息之后,再用CME做一次批量主机存活和SMB服务探测,效率会比nmap高很多,尤其是面对大网段时:
crackmapexec smb 192.168.10.0/24这一条命令会把网段内开放SMB且接受SMB签名协商的主机全部列出来,还会自动标记出当前凭据对这些主机是否有管理员权限。CME输出的[+]和[Pwn3d!]标记,基本就是内网安全测试里最直观的“可移动目标地图”。
我习惯先手工看一两台,再用CME拉全量。原因很简单:手工命令能看到进程、服务、补丁等上下文信息,CME批量结果能帮你找范围和优先级,两者互相补充。
2.2 共享与策略探测的细节
很多测试人员在这时候会遗漏一个信息源:SMB共享列表。内网环境里的共享往往存放着大量敏感明文文件——脚本里的数据库密码、配置文件里的连接字符串、甚至备份文件里的SAM。
用CME直接拉目标主机的共享列表和访问权限:
crackmapexec smb 192.168.10.2 -u user -p 'Passw0rd!' --shares输出里会列出每个共享的相对路径、是否可读可写。如果发现C$和ADMIN$可访问,基本等于拿到管理员权限的一半了。这种直接访问管理共享的能力,在很多真实环境中因为默认共享未关闭而长期存在。
另一个容易被低估的是会话和登录会话的枚举。用CME获取目标主机当前登录的用户会话:
crackmapexec smb 192.168.10.5 -u user -p 'Passw0rd!' --sessions这会返回每个SMB会话中已认证的用户名。如果有域管账号在某一台普通机器上保持登录会话,这台机器立即就是“必打卡”的点。这一招比单纯扫漏洞的价值高得多,因为漏洞可能不存在或者补丁已打,但域管永远不会不用电脑。
Metasploit在这个阶段的价值体现在post模块,比如本地会话里直接执行系统命令、上传下载文件、以及配合run post/multi/recon/local_exploit_suggester做本机提权建议。不过说句实在话,这个模块在真实场景里经常会有误报和漏报,其输出只能作为参考,最终还是要用systeminfo的补丁列表和实际环境做判断。
3. 凭据是内网的第一货币:mimikatz的正确打开方式
内网渗透圈的共识是:拿到一个账号密码,往往等于拿到半个域。而凭据提取这件事,mimikatz依然是绕不开的角色。
3.1 mimikatz的常用姿势与适用条件
mimikatz最经典的操作用两条命令就够:
privilege::debug sekurlsa::logonpasswords第一条privilege::debug是让当前进程启用SeDebugPrivilege权限,没有这个权限,后面读取LSASS进程内存会被拒绝。第二条sekurlsa::logonpasswords会读取LSASS进程内存中缓存的登录凭据,包括明文密码(如果系统策略允许WDigest缓存)和NTLM hash。
在较新版本的Windows上,明文密码默认不再缓存,但NTLM hash基本都还在。这就够了——hash传递不依赖明文密码。
用Metasploit里的内置mimikatz也可以,不需要额外上传二进制文件:
meterpreter > load kiwi meterpreter > creds_allcreds_all输出的内容等价于sekurlsa::logonpasswords,好处是不落地文件、不触发基于文件的杀软查杀。但kiwi模块和独立版mimikatz在某些特定系统版本上解析略有差异,所以遇到奇奇怪怪的失败时,可以换另一种方式试试。
3.2 hash传递和票据获取的取舍
拿到hash之后的下一步,通常是hash传递或用hash去申请票据。这两个操作更推荐Impacket来执行:
# 用NTLM hash直接远程执行命令 impacket-wmiexec -hashes :NTMLHASH domain/user@192.168.10.5 # 用hash dump远程主机的本地账号hash impacket-secretsdump -hashes :NTMLHASH domain/user@192.168.10.5wmiexec走的是WMI协议,会比psexec的SVCCTL方式更隐蔽一些,因为不再创建服务,也不依赖ADMIN$共享。当然,隐蔽性这东西是相对的,WMI的日志同样会被记录,只能说比psexec少一步“创建服务”的动作,噪声小一点。
mimikatz在域控上还有一个不可忽视的能力:lsadump::dcsync。它允许一个拥有复制目录权限的账号(例如域管或具备DS-Replication-Get-Changes权限的账号)直接从域控同步所有用户hash,不需要在域控上执行代码,只需要一个能访问域控LDAP/SMB的网络连接:
lsadump::dcsync /domain:corp.local /user:administrator这也是从“域管账号掌握一半”到“全域尽在掌握”的关键一步。与其在一台机器上刨LSASS,不如拿到域管hash后直接去域控上把整个域的用户hash dump下来。两种思路在实战中的位置完全不同——前者是单机落地,后者是全域收割。
4. 横向移动的实战选择:从单点推进到全域覆盖
横向移动是整个内网渗透过程中动作最频繁、也是翻车率最高的环节。在这个环节,Metasploit和Impacket之间的配合尤为重要。
4.1 不同横向移动方式的场景适配
拿到一组域凭据或本地管理员hash后,横向移动方式主要有四条路:SMB服务创建、WMI远程调用、WinRM/PowerShell远程、计划任务。
用Impacket的psexec走的是SMB服务创建的方式:
impacket-psexec domain/user@192.168.10.8 -hashes :HASH它会通过ADMIN$上传一个服务二进制并创建系统服务来执行命令,每次执行完服务自删。优点是稳定、支持交互式shell,缺点是SMB协商特征明显,很多EDR都会盯着服务创建这个动作。
wmiexec则完全不落盘,直接在远程机器上调用WMI创建进程:
impacket-wmiexec domain/user@192.168.10.8 -hashes :HASH它返回的是半交互式shell,每条命令的执行结果带上一条命令的输出分隔符,虽然不落盘,但执行命令的进程树和事件日志会记录到Event ID 4688(进程创建)和WMI活动日志。讲究速度的时候优先psexec,讲究少留文件的时候优先wmiexec,这个取舍要根据目标环境的监控强度来定。
还有一个常被忽视但极其好用的方式是通过计划任务横向执行,Metasploit的exploit/windows/smb/psexec模块内部就是走的服务或计划任务路径,但在复杂域环境中,手动用schtasks或者impacket-atexec更直接:
impacket-atexec domain/user@192.168.10.8 -hashes :HASH 'whoami'atexec通过Task Scheduler远程创建计划任务执行命令,不依赖ADMIN$共享,在禁用了默认共享或SMB签名要求严格的环境里,它经常是唯一能打通的方式。
4.2 CME作为横向移动的“指挥中心”
CME在横向移动阶段的价值不只是批量探测,它还能帮你在决策上省时间。比如拿到一组账号密码,你想快速知道哪几台机器可以直接打穿:
crackmapexec smb 192.168.10.0/24 -u user -p 'Passw0rd!' --exec-method wmiexec -x 'whoami'-x参数会在所有成功认证的主机上执行指定命令,配合--exec-method指定执行方式。这一条命令跑完,你手里就有一张“哪些机器能打通”的清单,直接决定下一步的利用顺序。
CME还内置了mimikatz模块,可以批量抓取全网段主机的本地凭据:
crackmapexec smb 192.168.10.0/24 -u user -p 'Passw0rd!' -M mimikatz这个操作的速度和体感远比逐台ssh进去人工执行mimikatz要快,非常适合在拿到域管的hash之后,对整个内网做一次大规模凭据清洗。不过要注意,这个动作的动静非常大,内网的安全监控在短时间内会接到大量来自同一IP的远程登录成功告警,所以执行前务必权衡目标环境的监控水平。
5. 实战中最容易翻车的几个环节
工具链越熟练,越容易在阴沟里翻船。这几个坑我基本每次带人做项目都会遇到,值得单独列出来。
5.1 杀软与EDR的静态查杀
mimikatz原版二进制在2023年之后的杀软库中几乎是必报的,这个不用抱侥幸心理。但很多人忽略的是:不落地文件不等于不做查杀。
Metasploit的kiwi模块虽然躲过了文件扫描,但如果你在sekurlsa::logonpasswords直接在meterpreter会话里执行,EDR的行为检测一样会报警——读取LSASS进程内存这个动作本身就是一个高危行为特征,不管是谁执行的。
个人经验是几条路并行:能抓缓存会话就先抓缓存会话,能走dcsync就直接走dcsync,实在需要读LSASS的时候,优先考虑在内存中反射加载mimikatz,或者用其他更轻量的凭据提取方式(比如procdump转储LSASS后离线分析)。如果只死磕原版mimikatz落地执行,大概率会在某个环节被拦下。
5.2 SMB签名强迫症与协议降级
在某些安全要求高的网络里,SMB签名是强制开启的。这时psexec的SMB服务创建方式和-hashes传递会直接被拒。我见过不少新手在这时候以为账号密码不对,反复重试,导致账号被锁定。
正确处理方式是用wmiexec和atexec这类走不同协议的方式绕过,或者先确认目标主机SMB签名状态:
crackmapexec smb 192.168.10.20 -u user -p 'Passw0rd!' | grep signingCME输出中signing:True或者signing:False会明确标出来,支持签名的主机直接用SMB类工具大概率会被弹回。这里的建议是,建立一套自己的“横向移动工具优先级”:先wmiexec(协议层面更灵活),再atexec(不依赖管理共享),然后才考虑psexec。
5.3 账号锁定策略引发的第二次灾难
看到密码喷溅几个网段后,目标域账号触发锁定策略,造成的后果比想象中严重。一次真实的项目中,我见过测试人员在夜里跑了三个网段的密码喷洒,第二天早上域里一半的账号被锁定,业务方直接停了测试。
解决这个问题的核心是控制节奏。CME提供了--no-bruteforce参数和延时选项,实际执行时可以限制并发并设置合理的延时:
crackmapexec smb 192.168.10.0/24 -u user -p 'Passw0rd!' --exec-method wmiexec -x 'whoami' --rate 20--rate能限制每秒目标数量,虽然不是万无一失,但至少能延缓触发阈值。更重要的是,做密码喷洒之前先摸清域策略里的账号锁定阈值和锁定时长,这往往比工具本身更关键。
6. 用攻击视角做防御自检
写到最后这部分,其实是这些年做攻防项目的最大体会:一套工具栈能不能用好,跟懂不懂防守方怎么看你的一举一动,高度正相关。自己把自己摆到被监控的位置上去想,很多操作就不会那么鲁莽了。
6.1 还原攻击路径的几个关键检测点
如果你在内网里用上述工具走了一遍,防守方会从哪些地方发现你?我总结下来基本是这几个点:
- LSASS进程访问:任何形式的
sekurlsa::logonpasswords或者procdump转储LSASS,都会触发对lsass.exe进程的打开和读取,这类行为在EDR里通常有专门规则。 - SMB服务创建:
psexec留下的服务名(通常带随机字符串)和事件日志里的服务安装记录,是横向移动的关键告警点。 - WMI进程创建:
wmiexec虽然不落盘,但远程启动进程的行为会在目标机器上留下Microsoft-Windows-Shell-Core/Operational等日志记录。 - 远程登录成功:大量同一来源IP对多台机器的成功登录,在SIEM里会被聚合为“横向移动”行为。
DCsync复制目录:这个行为是域控上最敏感的一类,任何没有合法备份理由的GetNCChanges调用都应该被拦截或告警,但它往往也是整个攻击链里杀伤力最大的一步。
6.2 加固思路与自检清单
用这套工具栈审视自己的内网时,我通常会按下面这个清单做加固排查:
- 对LSASS的访问权限做限制:启用Windows Credential Guard、启用“保护LSASS进程”的LSA保护策略,mimikatz的读取难度就会直接上一个台阶。
- 对域管账号做精细权限拆分:避免所有域管账号都有
dcsync权限,限制可以复制目录的账号数量并单独监控。 - 对SMB签名做全局策略:有条件就强制启用,能有效拦掉psexec和hash传递里的很大一部分利用路径。
- 对远程管理协议做源IP白名单:WMI、WinRM、SMB管理共享都只允许跳板机IP访问,能大幅压缩横向移动的攻击面。
- 定期拉一遍“同一源IP在短时间内登录成功多台机器”的查询,这是发现CME类批量操作最直接的手段。
最后再提醒一句:内网渗透测试里的每一步都必须在获得明确授权的前提下进行,工具本身没有正邪,但用的边界和目的必须清楚。把工具栈吃透,最大的价值不是多抓几份口令,而是真正理解内网认证体系里“信任”和“凭据”这两个核心要素有多么容易被打穿,这样你在做防守设计时才会从骨子里重视这些问题。这四件工具配合起来能走多远,最终取决于你对自己所做操作的理解深度,而不是命令记了多少条。