
做内网渗透这几年我越来越觉得比拼的不只是某几个工具的熟练度而是一套工具栈的组合能力。很多人一提到内网渗透就想到 Metasploit 魔鬼训练营把 msfconsole 的命令刷得滚瓜烂熟但真到实际项目里单一工具很容易卡壳Metasploit 的 payload 可能被杀软拦掉Impacket 脚本能打穿 Windows 的 admin$ 但缺少信息收集维度CrackMapExec 做口令喷洒效率极高却不擅长权限维持mimikatz 能拿到 lsass 里的明文凭据却必须先落到一台主机上。把四个工具串成一条链路才是内网渗透实战的正确打开方式。这篇文章以我自己的项目经验为主线讲清楚这套工具栈的分工、实战流程和踩坑细节。内容适合安全测试、红队评估、应急响应相关人员参考也适合刚入行想做内网渗透的朋友建立整体框架。我会尽量把每个步骤背后的原理讲透因为内网渗透不是背命令而是理解 Windows 认证协议、网络服务行为、权限模型之后再有针对性地选工具。希望读完之后你能从“会敲命令”进阶到“能设计一条完整攻击路径”。1. 从场景说起为什么内网渗透需要一套工具栈1.1 单兵工具 vs 工具链的差别很多人最开始接触内网渗透时习惯把工具分成一个个孤立的点爆破就用 Hydra漏洞利用就用 Metasploit抓密码就用 mimikatz扫描就用 Nmap。这种做法不是不行但在真实的内网环境中会碰到一个很现实的问题每台目标机器的系统版本、补丁情况、防护软件、网络隔离都不一样单一工具往往只能覆盖其中一小段路径。举一个很常见的例子你通过 Web 漏洞拿到了边界服务器的一个普通用户权限接下来要做的是信息收集、权限提升、横向移动、最终到达域控。这个链路里Metasploit 可以把 Session 立起来但要用它去找域内其他主机的开放 SMB 服务、批量验证口令、快速判断哪些机器可以 psexec效率其实不高。CrackMapExec 就是为这类批量操作设计的一条命令扫一个网段几分钟就能拿到可用的管理员账号和主机列表。然后你再决定是用 Impacket 的脚本直接执行命令还是回到 Metasploit 里做更深入的载荷控制。所以说工具链的意义不是“用更多工具秀操作”而是让每一类操作都落到最合适、最高效的工具上。信息收集阶段要快、要广口令喷洒要稳、要隐蔽横向移动要能适配多种执行方式权限维持要可控、可回连。四个工具刚好分别覆盖这些维度组合起来才是一条完整的技术链路。1.2 四个工具的分工与数据流向我从实际使用角度把这四个工具串成了一条很简单的数据流先由 CrackMapExec 完成信息收集和口令喷洒拿到一批有效的账号密码或哈希然后用 Impacket 提供的远程执行脚本在目标机器上执行命令、释放载荷紧接着用 Metasploit 接收回调的 Session做进程迁移、权限提升、内网路由等后渗透操作最后在目标主机上运行 mimikatz从内存中提取明文密码、哈希或 Kerberos 票据再拿这些凭据回到 CrackMapExec 或 Impacket 继续下一轮横向移动。这个循环可以一直扩大直到覆盖整个域环境。我把它整理成一张非常直白的分工表。阶段工具核心能力典型输出信息收集与批量验证CrackMapExec网段扫描、SMB 指纹识别、口令喷洒、共享枚举有效账号、可访问主机列表远程命令执行与横向移动Impacketpsexec、wmiexec、atexec、smbexec 等远程执行方式目标机器上的命令执行权限后渗透会话管理Metasploit反弹 Session、进程迁移、权限提升、路由与代理稳定的控制通道凭据提取与票据攻击mimikatz读取 lsass 内存、提取明文/哈希/票据、哈希传递可用于继续横向的凭据数据流向是环形的拿到新凭据后回到第一步继续扫这也是内网渗透中“横向扩散”的本质。理解了这张表后面看具体操作就不会迷路。2. 工具栈全景与分工逻辑2.1 Metasploit模块化后渗透中枢Metasploit 在整个工具栈里的角色更像是一个“中枢”而不是唯一的爆破工具。很多人把它当成漏洞利用框架用它打永恒之蓝、打 Web 应用这些都很常见但在内网渗透实战里我更看重的是它的 Meterpreter Session 和后渗透模块。Meterpreter Payload 最大的优势是落地之后能提供一个相对稳定的交互式通道不需要每次执行命令都重新与目标建立连接。你可以在这个通道上做端口转发、上传下载文件、加载扩展模块、抓取屏幕截图、获取系统信息。还有一个特别好用的功能是run autoroute把攻击机的路由表加到目标内网网段之后 Metasploit 自带的路由能力可以让其他模块也直接访问内网里的其他机器。后渗透还有一个关键是进程迁移。Meterpreter 初始进程可能只是一个临时生成的 payload 进程目标机器一查进程列表就可能暴露。我会先把 Session 迁移到一个合法的系统进程比如 explorer.exe 或 svchost.exe降低被管理员发现的概率。这个动作虽然简单但在实战里很管用。需要注意Metasploit 的 Payload 杀软查杀率近年来明显上升所以它不是万能的。如果目标机器有 EDR一个裸的 Meterpreter 很容易被拦。这时候 Impacket 反而更轻量因为它在没有落地文件的情况下也能执行远程命令属于“无文件攻击”思路的一种实现。2.2 Impacket横向移动工具箱Impacket 是一套用 Python 编写的网络协议工具集合里面最出名的就是 exec 系列脚本psexec.py、wmiexec.py、smbexec.py、atexec.py。这四个脚本的核心作用都是“在远程 Windows 机器上执行命令”但走的协议不一样触发机制也不一样。psexec.py 是最传统的方式原理是把一个 service binary 上传到目标的 admin$ 共享然后通过 SVCCTL 协议创建服务并启动执行完再删除。这种方式兼容性好但会上传文件容易被杀软监控到。wmiexec.py 走的是 WMI 协议通过 Windows Management Instrumentation 的远程调用执行命令不会像 psexec 那样上传二进制文件更安静一些。代价是执行速度略慢而且某些精简版 Windows 可能没有启用 WMI 服务。smbexec.py 通过 SMB 协议创建服务并运行命令但命令是通过输出重定向回显的过程中会在目标上创建临时文件。atexec.py 则利用任务计划程序Schedule Service把命令包装成计划任务需要目标开启 Task Scheduler 服务。这四个工具覆盖了绝大多数 Windows 执行命令的场景。只要你有目标机器的管理员权限密码或哈希就能从中选择一个合适的执行方式。我在实战中一般优先试 wmiexec因为它落地文件最少然后看情况切到 psexec 或 atexec很少一上来就用默认参数硬怼。2.3 CrackMapExec内网信息与口令喷洒的利器CrackMapExec 是这几年的热门工具它把很多日常操作整合到了一条命令里。比如扫描网段内存活的 Windows 主机、获取主机的操作系统版本、枚举 SMB 共享、检查是否需要 SMB signing、批量验证密码和哈希等。因为它是基于 Python 开发的输出格式很统一方便配合脚本做二次处理。我最常用它做两件事第一crackmapexec smb /24快速扫网段拿到所有开放 445 端口主机的操作系统指纹和主机名第二crackmapexec smb /24 -u user.txt -p pass.txt做口令喷洒把一批用户名和密码组合批量验证。一次喷洒下来哪些账号密码有效一清二楚效率比一条条命令试高很多。CrackMapExec 还有个值得说的点是它会自动收集 SMB Signing 状态。如果目标机器没有启用 SMB Signing后续用 SMB Relay 类攻击的成功率会高很多。很多人在信息收集阶段只看主机存活和开放端口忽略了 Signing 这个细节其实这个细节直接决定了后续横向方案怎么选。当然CrackMapExec 也有限制。它默认只做 SMB 协议层面的操作不能替代完整的漏洞扫描和利用。它的价值是“在拿到一批凭据后快速确认攻击面”而不是包揽所有环节。2.4 mimikatz凭据提取与哈希传递的最后一环mimikatz 的知名度几乎可以和内网渗透画等号原因很简单Windows 系统为了登录和单点登录会把用户凭据缓存在 lsass.exe 进程的内存里mimikatz 就是用来读取这些凭据的。最经典的命令是privilege::debug开启 SeDebugPrivilege然后sekurlsa::logonpasswords从 lsass 进程里提取明文密码、NTLM 哈希和 Kerberos 票据。如果是 Win10、Server 2016 之后的系统默认开启了 Credential Guard很多明文密码会被保护起来但 NTLM 哈希往往还能拿到这时候哈希传递仍然可用。mimikatz 还有一个很常用的能力是sekurlsa::pth用 NTLM 哈希直接开启一个指定用户的交互进程相当于不需要明文密码也能模拟用户登录。这就是“哈希传递”的典型用法后面我会单独讲。关于下载安装mimikatz 在 GitHub 上的官方仓库可以下载网上也有很多第三方打包的版本。我的建议永远是只从官方仓库或可信来源获取并且拿到之后先比对哈希值再放到隔离环境里跑。毕竟这是一个权限极高的工具如果被篡改攻击者可以直接窃取你的凭据防人之心不可无。3. 实战链路拆解信息收集、横向移动、权限提升与票据攻击3.1 信息收集与口令喷洒利用 CrackMapExec 定义目标环境内网渗透的第一步永远是信息收集但不是单纯拿 Nmap 扫一遍端口而是要把目标环境的安全基线和可突破点摸清楚。我习惯先用 CrackMapExec 做一次 SMB 网段扫描命令大概是这样的crackmapexec smb 192.168.10.0/24这条命令会返回每个存活主机的 IP、主机名、操作系统版本以及 SMB Signing 是否启用。基于这些信息你立刻知道哪些机器是 Windows Server、哪些是 Windows 10、哪些可能处于比较旧的补丁状态。如果扫出来一台 Server 2008那说明目标环境的历史包袱比较重后续横向的成功率会高不少。扫描完成之后如果手里已经有一些收集到的用户名和密码字典做口令喷洒是比较高效的方式crackmapexec smb 192.168.10.0/24 -u users.txt -p passwords.txt这里有个细节CrackMapExec 默认对每台主机进行多次尝试可能会触发账号锁定策略。所以我一般会在参数里加入--continue-on-success让工具在碰到第一个有效组合后继续尝试其他账号而不是整站停止。同时我会控制密码字典规模避免在很短时间内对同一个账号发起大量尝试这在真实项目中非常容易触发告警。拿到有效的账号密码之后CrackMapExec 还会列出该账号能在哪些主机上获得管理员权限输出里会标明Pwn3d。看到这个标记就意味着你可以用 Impacket 在这台机器上执行命令了。3.2 横向移动利用 Impacket 的 psexec/wmiexec 执行命令信息收集和口令喷洒结束之后横向移动是最容易卡壳的环节因为不同机器对不同执行方式的反馈很不一样。我通常的做法是先用 wmiexec 执行一条基础命令验证账号权限是否有效impacket-wmiexec domain/user:password192.168.10.20进入交互式 shell 之后先执行whoami和ipconfig /all确认当前身份和网络位置。如果 wmiexec 因为目标机器禁用了 WMI 或响应超时我会改用 psexecimpacket-psexec domain/user:password192.168.10.20psexec 有时会因为杀软拦截服务创建而失败这时再看目标机器是否开启了 Task Scheduler可以换 atexec 试试。有一类机器比较特殊屏蔽了 SMB 的默认端口但开放了 WinRM 端口 5985/5986这时候直接用 Impacket 的脚本不一定能成功我会切换到 evil-winrm 这类工具。多备几种执行方式的另一个原因是为了规避检测。psexec 创建服务的行为在 Windows 事件日志里非常明显而 wmiexec 和 atexec 相对隐蔽一些。大规模横向移动时我会优先选择落地文件更少的执行方式降低被流量监控设备发现的概率。3.3 主机控制与权限维持用 Metasploit 做模块化后渗透拿到远程命令执行权限后我不建议一直停在 Impacket 的交互式 shell 上因为它的功能比较单一不适合做复杂的后渗透。更好的做法是在目标主机上下载一个 Meterpreter Payload并把 Session 回连到攻击机。在实战中我会先用一个很小巧的 exe 或 PowerShell 无文件加载方式把 Payload 跑起来。例如用 Metasploit 的 web_delivery 模块通过 PowerShell 从远程加载 Payload尽量减少写入磁盘的动作。Session 建立之后有几个必须优先做的操作sysinfo查看目标系统的基本信息确认架构和版本。getuid确认当前权限如果机器上有域管缓存可能直接就是高权限。run post/multi/recon/local_exploit_suggester做本地提权漏洞探测。ps查看进程列表找一个合适的进程做迁移。把 Session 迁移到系统进程后我还会设置set AutoRunScript migrate -f之类的启动行为让 Session 在异常退出后能自动迁移到其他进程增加稳定性。Metasploit 还能配置路由把流量通过当前 Session 转发到内网深处这一点对后续继续横向非常重要。3.4 凭据提取与哈希传递mimikatz 的关键姿势mimikatz 的使用场景很明确你已经通过某种方式在目标主机上获得了 SYSTEM 或管理员权限想进一步提取这台机器缓存的所有凭据。第一步先提权到 debug 权限privilege::debug如果没有出现20 0之类的成功标志说明当前进程没有 SeDebugPrivilege需要先确认是否以管理员身份运行。接着执行sekurlsa::logonpasswords这条命令会在内存中逐个列出当前主机上登录过的用户并尝试提取他们的明文密码、NTLM 哈希、Kerberos 票据。在旧版本 Windows 上明文密码的出现概率很高在新版本上大概率只能拿到 NTLM 哈希。光拿到哈希并不算完。如果后续要横向可以直接使用 mimikatz 的哈希传递功能sekurlsa::pth /user:admin /domain:target-domain /ntlm:aaaa...执行后它会弹出一个小窗口这个窗口里的应用会以指定用户的身份访问网络资源。在实际的红队任务里配合dir \\dc\c$或者远程执行命令工具就能用这个身份继续横向。如果拿到了 Kerberos 票据还可以通过sekurlsa::tickets /export导出票据然后在其他机器上注入票据这个技术通常被叫做票据传递。关于 mimikatz 的下载安装我最后再强调一次官方仓库在 GitHub安装前一定要校验文件哈希。内网中还有一类情况是安全团队把 mimikatz 作为应急响应工具用于排查被入侵主机上是否残留了凭据窃取行为这时候更要确保工具的完整性。4. 实操记录一次模拟内网渗透的完整走查4.1 环境准备与攻击机配置为了演示这套工具栈我搭了一个三网段的模拟环境包含一台攻击机、一台边界 Web 服务器、三台内网业务服务器以及一台域控。所有机器都在独立虚拟机里运行攻击机和目标内网之间通过边界机做路由转发相当于模拟真实网络中的纵深隔离。攻击机装的是 Kali里面自带 Metasploit、Impacket、CrackMapExecmimikatz 则单独从官方仓库下载了一份。这里有个经验Kali 自带工具的版本通常不是最新的部分新版本协议支持不完整比如 Impacket 某些脚本在新版 Windows 上可能会报错。所以我会定期用 pip 升级 Impacketpip3 install --upgrade impacket目标环境里域控是 Server 2019业务服务器分别是 Server 2016 和 Windows 10均开启了 SMB 和默认共享并关闭了 Windows 防火墙最大限度还原真实但可控的内网环境。模拟演练之前我会把所有账号密码提前记录在本地文档里防止测试过程中把凭据搞乱。这个习惯在真实项目里非常重要因为渗透测试本身就是在批量操作没有记录就会出现重复攻击或者误操作。4.2 从网段扫描到拿到第一台主机我的第一步是对边界机所在网段做端口扫描发现一台对外开放 80 端口的服务器。通过 Web 漏洞拿到它的初始权限之后在边界机上运行 CrackMapExec 扫描内网网段crackmapexec smb 172.16.20.0/24扫描结果显示内网里有三台主机在线分别是 172.16.20.10、172.16.20.11、172.16.20.12其中最后一台的身份是域控。基于边界机上获取到的本地管理员信息我先整理了一个用户名字典然后运行口令喷洒crackmapexec smb 172.16.20.0/24 -u users.txt -p passwords.txt --continue-on-success很快 172.16.20.10 上返回了一组有效的管理员凭据并且输出结果里出现了 Pwn3d 标记说明这台机器的本地管理员密码和内网机器存在复用情况。这个现象很常见很多企业管理员为了省事会在一批服务器上设置相同的本地管理员密码渗透测试只要抓到其中一个就能批量横穿。4.3 横向到域控的路径设计有了 172.16.20.10 的管理员权限我先用 Impacket 的 wmiexec 开启了一个控制通道impacket-wmiexec ./administrator:ComplexPass172.16.20.10在 shell 里执行net localgroup administrators确认用户组成员再用 Metasploit 生成一个 Meterpreter Payload通过 wmiexec 把它执行起来。Session 稳定之后上传 mimikatz执行privilege::debug sekurlsa::logonpasswords在这台机器上提取到了一个域管理员账号的 NTLM 哈希。接下来我没有直接登录域控而是回到 CrackMapExec 验证这个哈希是否能在域控上使用crackmapexec smb 172.16.20.12 -u domain-admin -H aaaa... --local-auth返回结果成功说明域控允许通过哈希传递直接访问。最后我用 Impacket 的 psexec 登录域控并执行whoami和ipconfig /all确认已经拿到域控权限。整个过程看起来不复杂但每一步的选择都跟目标环境的反馈有关扫描到机器喷到密码提取到哈希再验证哈希这是很标准的一条渗透路径。5. 常见问题与排查技巧实录5.1 横向移动报错的典型原因我在使用 Impacket 远程执行脚本时遇到最多的报错是connection refused或rpc_s_access_denied。前者一般是目标机器没有开放对应端口比如 SMB 的 445 端口被防火墙规则屏蔽或者目标机器并没有启用 SMB 服务。后者说明当前账号虽然知道密码但没有在目标机器上获得管理员权限Impacket 需要 admin 权限才能创建服务或连接远程 IPC。还有一种情况比较隐蔽账号密码明明是对的但域名填写错误。Impacket 命令里的域名参数可以写目标机器的计算机名或 NetBIOS 名如果随便填一个不存在的域名认证阶段可能就会失败。我建议在这种时候先用 CrackMapExec 验证一下凭据因为它能直接告诉你凭据是否有效以及有什么权限能省去很多无意义的试错。连接超时也是一个高频问题尤其是 wmiexec。WMI 服务在某些 Windows 版本上启动较慢或者目标机器负载很高命令执行几秒后就没有回显。我的处理办法是先把超时参数调大或者改用 atexec 做一次轻量验证因为计划任务的执行路径跟 WMI 完全不同很多时候能绕开超时问题。5.2 mimikatz 提取不到明文凭据怎么办新版本的 Windows 系统默认启用 Credential Guard 后lsass 进程的凭据会受到虚拟化安全机制保护sekurlsa::logonpasswords大概率拿不到明文密码只能拿到 NTLM 哈希。很多人看到没有明文就觉得工具失效了其实不是。拿到 NTLM 哈希就能做哈希传递这不影响横向移动。如果确实需要明文密码可以考虑两个方向一是找目标机器上是否有旧版本系统或未启用 Credential Guard 的主机把凭据提取放到那些机器上做二是结合键盘记录器层面的操作等待用户自己输入密码但这个方式复杂度和风险都比较高一般不建议在常规渗透测试里使用。还有一种情况是 mimikatz 执行时报错Error 0x00000000或卡在Get-Credential。这通常是因为当前进程权限不够没有开启 SeDebugPrivilege。请务必先执行privilege::debug如果仍然失败检查当前用户是否属于本地管理员组某些高完整性进程也需要先用工具提升权限才能访问 lsass。5.3 CrackMapExec 执行结果为空/超时的定位思路CrackMapExec 默认走 SMB 协议如果你扫网段时发现很多主机没有回显不要立刻怀疑工具版本先确认目标机器的 445 端口是否可达。我用一个很简单的方法nc -vz target-ip 445或nmap -p445 target-ip快速验证一下。另外CrackMapExec 也有依赖问题。它在不同 Python 版本下可能出现兼容性异常输出乱码或直接卡死。我的习惯是优先在 Kali 稳定版本上跑或者用 docker 封装好的镜像避免本地 Python 环境干扰。还有一个容易被忽略的是工作组和域环境的差别。如果目标机器只是独立服务器没有加入域那么在用 CrackMapExec 做口令喷洒时要指定--local-auth否则工具会按域账号来认证很多本机管理员账号反而验证失败。5.4 免杀与AV对抗的边界问题Metasploit 的 Payload 和 mimikatz 在最新版本的杀软面前很容易被查杀这是内网渗透中非常现实的问题。常见的对抗思路有编码、加密、分离加载、白名单利用等但我要特别强调一个边界问题免杀技术本身是中性的但把它用在未授权目标上就是违法行为。在授权测试中我通常不会追求极致的免杀效果而是优先选择不落地文件的执行方式。PowerShell 远程加载、利用系统自带工具下载执行、通过 WMI 和计划任务远程触发这些方式都尽量不把恶意文件写到磁盘上既能降低查杀概率也能减少测试痕迹。mimikatz 这种非常敏感的工具我会在目标机器上用完立刻删除避免给后续的应急响应留下不必要的风险。另外提醒一句不要在真实的非授权系统上测试免杀样本。一旦被安全设备捕获溯源到你的网络出口后果远比“工具被查杀”严重得多。6. 合规与风险提示内网渗透必须守住的底线6.1 授权范围与测试边界无论你用的是 Metasploit、Impacket、CrackMapExec 还是 mimikatz都必须先确认自己的测试行为在授权范围内。正规的渗透测试项目会明确写出测试时间、测试 IP 段、允许使用的技术手段、禁止影响的业务范围。这些内容不是走流程而是保护自己和委托方的基本前提。我经历过一个项目虽然拿到了内网测试授权但授权文件里只写了“允许对 192.168.1.0/24 网段进行测试”结果我用 CrackMapExec 扫网段的时候因为路由配置问题不小心把扫描范围扩大到了相邻网段对方安全团队立刻发来告警邮件。最后虽然没有造成实质影响但解释工作非常麻烦。所以我的经验是在跑任何批量扫描和口令喷洒之前先自己确认一遍目标 IP 列表用静态路由或白名单机制把范围卡死。另外有些工具自带一些比较激进的功能比如自动清除攻击痕迹、横向扩张到所有可达主机、开启远程桌面等。这些功能在授权测试里也可能被限制使用因为它可能影响业务连续性。操作前多问一句自己这个动作是必要的吗6.2 工具滥用背后的真实风险很多初学内网渗透的人最容易被那些“一条命令控制整个域”的演示吸引但工具能力的背后是巨大的风险。你用一个密码喷洒工具扫了上千台机器可能只需要几分钟但目标环境的账号锁定策略、安全日志、EDR 告警都会立刻记录下这批行为。如果这是在未授权环境下等待你的不只是一句“请停止测试”还有可能面临法律后果。即使是在授权范围内我也建议遵循最小化原则。能只测一台机器就不扫一个网段能用一个账号验证就不批量试密码能在内存里执行就不落地文件。因为渗透测试的核心价值是帮助客户发现问题而不是制造新的风险。mimikatz 这类的凭据提取工具尤其要控制使用范围。提取出来的密码和哈希属于高度敏感的信息测试结束后要按保密协议销毁不能把它们留在个人笔记或共享文档里。我见过有测试人员把域管哈希写进报告附件后来报告被人转发出去整个域环境面临重大风险。工具本身没有善恶但使用者的专业素养和职业操守决定了这套工具栈最终是保护系统还是破坏系统。回到最开始的话题内网渗透工具栈从来不是“四个工具的简单叠加”。真正让你在一场演练里站住脚的是你能不能在最短的时间里搞清楚目标环境的认证机制、权限模型和安全防护然后知道用哪个工具的哪个模块以最合适的方式走通一条完整链路。Metasploit、Impacket、CrackMapExec、mimikatz 恰好覆盖了这条链路上最关键的四个环节每一个都值得花时间深入研究。我个人的建议是先把每个工具的常用命令练到肌肉记忆再开始组合使用等到你能根据报错信息快速判断目标环境和工具适配性问题时这套工具栈才算真正属于你了。