这个命令是使用 Impacket 工具包中的
GetUserSPNs
脚本来查询并请求 Kerberos 服务票据(Service Tickets),具体作用如下:命令分解:
impacket-GetUserSPNs
Impacket 工具中的一个脚本,用于查询 Active Directory 中注册了 SPN(Service Principal Name) 的用户账户(通常是服务账户)。
request
自动请求这些 SPN 的 Kerberos TGS(服务票据),并以哈希格式(Hashcat/JtR 兼容格式)输出。这些哈希可用于离线破解(如 Kerberoasting 攻击)。
dc-ip 10.10.132.146
指定域控制器(Domain Controller)的 IP 地址。
oscp.exam/web_svc
oscp.exam
:域名(Domain)。web_svc
:用于认证的服务账户用户名(需要提供密码或凭据)。
用途:
- Kerberoasting 攻击
通过查询 SPN 绑定到的用户账户(通常是权限较高的服务账户),并请求其 TGS 票据。这些票据使用用户密码加密,可被离线破解获取明文密码。
- 信息收集
列出域内所有注册了 SPN 的服务账户,帮助识别高价值目标(如
MSSQL
、HTTP
等服务的运行账户)。输出示例:
成功运行后,你会看到:
- 所有绑定 SPN 的用户账户列表。
- 如果加了
request
,会输出对应的 TGS 哈希(如$krb5tgs$23$user$DOMAIN$SPN$hash...
),可用于破解。
注意事项:
- 需要有效凭据
需要提供
web_svc
账户的密码(或通过其他方式如 Pass-the-Hash 认证)。- 隐蔽性
这种行为会在域控日志中留下记录(如
Kerberos TGS Request
事件 ID 4769)。- 合法授权
仅在授权测试中使用,未经许可使用可能违反法律。
这是渗透测试中常见的横向移动技巧,尤其在 OSCP 考试中可能会遇到类似场景。
这个命令会输出其他账户的 Kerberos TGS(服务票据)哈希,是因为它利用了 Kerberoasting 攻击技术,具体原理如下:
1. Kerberoasting 攻击原理
(1)SPN(Service Principal Name)的作用
在 Active Directory(AD)中,服务账户(如
MSSQL
、IIS
、HTTP
等)会注册 SPN,以便客户端通过 Kerberos 协议认证并访问服务。例如:
MSSQLSvc/sqlserver.oscp.exam:1433
HTTP/webserver.oscp.exam
(2)TGS(服务票据)的加密方式
当用户(如
web_svc
)请求访问某个 SPN 绑定的服务时:- 用户向域控(DC)请求 TGS(服务票据)
- 域控会返回一个用 服务账户密码加密的 TGS 票据(因为 SPN 绑定到该账户)。
- TGS 票据可被离线破解
- 由于 TGS 是用服务账户的密码加密的,攻击者可以尝试暴力破解或字典攻击来恢复明文密码。
2. 为什么 GetUserSPNs -request
能获取其他账户的哈希?
(1)命令执行流程
GetUserSPNs
首先查询 AD,找出所有注册了 SPN 的服务账户(如sqladmin
、iis_service
等)。
request
参数会让脚本自动为每个 SPN 请求 TGS 票据,并提取其加密部分(即 TGS-REP 哈希)。
(2)输出示例
假设 AD 中有以下 SPN 账户:
运行命令后,你会得到类似这样的哈希:
这些哈希可以交给 Hashcat 或 John the Ripper 进行破解:
3. 为什么能获取其他账户的哈希?
web_svc
只需要普通域用户权限- 在默认 AD 配置中,任何域用户 都可以查询 SPN 并请求 TGS 票据(即使他们没有访问服务的权限)。
- TGS 票据是用服务账户密码加密的
- 即使你是低权限用户(如
web_svc
),也能请求高权限服务账户(如sqladmin
)的 TGS 哈希。
4. 防御措施
- 强密码策略:确保服务账户使用长且复杂的密码(>25 字符)。
- 启用 AES 加密:AES 加密的 TGS 比 RC4-HMAC 更难破解。
- 限制 SPN 查询权限:通过 AD 组策略限制普通用户查询 SPN。
- 监控 Kerberos 请求:检测异常的 TGS 请求(事件 ID 4769)。
总结
关键点 | 说明 |
攻击方式 | Kerberoasting |
依赖条件 | 任何域用户权限 |
获取的数据 | 服务账户的 TGS 哈希 |
利用方式 | 离线破解(Hashcat/JtR) |
防御方法 | 强密码、AES 加密、限制 SPN 查询 |
这个命令之所以能获取其他账户的哈希,是因为 Kerberos 协议的设计允许任何域用户请求 SPN 绑定的服务票据,而票据的加密方式使得攻击者可以尝试破解。