T1558-003-windows-基于SPN凭证获取
来自ATT&CK的描述
攻击者可能滥用有效的Kerberos票证授予票证(TGT)或嗅探网络流量以获得可能容易受到暴力攻击的票证授予服务(TGS)票证。
服务主体名称(SPN)用于唯一标识Windows服务的每个实例。为了启用身份验证,Kerberos要求SPN与至少一个服务登录帐户(专门负责运行服务[3]的帐户)相关联。
拥有有效的Kerberos票证授予票证(TGT)的攻击者可以向域控制器(DC)请求任何SPN的一个或多个Kerberos票证授予服务(TGS)服务票证。以使用RC4算法对这些票证的一部分进行加密,这意味着与SPN相关联的服务帐户的Kerberos 5 TGS-REP etype 23哈希将用作私钥,因此容易受到离线蛮力攻击可能暴露明文凭据的攻击。
可以使用从网络流量中捕获的服务票证执行相同的攻击。
散列的破解可能会通过访问有效帐户来实现持久性,特权升级和横向移动。
SPN(Service Principal Name)服务主体名
服务主体名称(SPN)用于唯一标识Windows服务的每个实例。要启用身份验证,Kerberos要求SPN与至少一个服务登录帐户(专门负责运行服务的帐户)相关联。
拥有有效Kerberos票证授予票证(TGT)的攻击者可以从域控制器(DC)请求任何SPN的一个或多个Kerberos票证授予服务(TGS)服务票证。这些票证的一部分可以使用RC4算法加密,这意味着与SPN关联的服务帐户的Kerberos 5 TGS-REP etype 23哈希被用作私钥,因此容易受到离线暴力破解攻击,可能会导致明文凭据泄露。
可以使用从网络流量捕获的服务票据来执行相同的攻击。
先来介绍一下SpnEndpointIdentity和UpnEndpointIdentity。这两个EndpointIdentity是Windows认证下服务身份的两种表现形式。前者被称为服务主体名(SPN:Service Principal Name,以下简称SPN),另一种被称为用户主体名(UPN:User Principal Name,以下简称UPN)。
如果你对Kerberos有一定的了解,相信一定对SPN不会感到陌生。对于一个运行在域环境中某台机器上的服务,它能被访问它的客户端认证的先决条件是:客户端能够唯一标识该服务,而SPN就可以看作是这个标识符。在默认的情况下,如果服务寄宿进程在机器帐号(或者系统帐号,比如LocalService, LocalSystem, or NetworkService等)下,服务身份通过SPN表示;如果执行服务寄宿进程的是一个域用户帐户,则采用UPN表示服务身份。WCF中的SPN和UPN的格式如下。如果客户端预先指定SPN/UPN表示服务身份,它通过执行服务寄宿进程帐号对应的Windows凭证和SPN/UPN进行比较,从未确定服务运行在预先设定的机器或者某个域用户帐号下。
详细介绍你可以参考WCF安全系列:https://www.cnblogs.com/artech/archive/2011/06/12/Authentication_043.html
测试案例
SPN攻击原理
Active Directory环境中发现服务的最佳方式是通过SPN扫描
攻击者通过SPN扫描的主要作用是不需要连接到网络上的每个IP以检查服务端口。SPN扫描通过LDAP查询域控制器以便发现服务。由于SPN查询是正常Kerberos票证执行的一部分,所以很难被安全设备探测到,而network端口扫描是相当明显的,容易被发现。
即使您不完全了解Kerberos的内部工作原理,攻击过程也可归纳为:
- 扫描Active Directory以设置SPN值的用户帐户。
- 使用SPN值从AD请求服务票证
- 将服务票据提取到内存并保存到文件
- 暴力破解攻击这些密码直到破解
举个例子:
- 利用SPN扫描探测含有SQL服务的主机服务;
- 识别目标后,利用piwehsell脚本请求此服务主体名称(SPN)的服务票据;请注意,请求的服务票证是具有RC4加密类型
- 一旦客户端接收到票据以后,可以利用mimikatz或其他工具在用户的内存中导出所有kerberos票证;(不涉及权限提升)
- 最后,将票据导出后,将票据文件拷贝到正在运行kerberoast的kali linux主机(或其他主机)。利用wordlist密码字典,可以进行破解与票据相关的服务账户密码。
注意:获得服务票据不需要提高权限,也不会向目标发送任何流量。
检测日志
windows 安全日志
Netflow流量
测试复现
测试环境准备
windows server 2012域控 需安装powershell AD模块
windows server 2016被控主机 需安装powershell AD模块
具体可参考:https://zhuanlan.zhihu.com/p/25942591
测试过程
1.安装powershell AD模块
PS >Import-Module ServerManager ; Add-WindowsFeature RSAT-AD-PowerShell
2.查询当前域内SPN服务
setspn -T domain.com -Q */*
3.请求指定的TGS
$SPNName = 'MSSQLSvc/DC1.test.com'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
4.执行后输入klist查看内存中的票据,可找到获得的TGS.
5.使用mimikatz
kerberos::list /export
测试留痕
windows 安全日志4769
Netflow 加密方式、服务名称
检测规则/思路
sigma规则
title: SPN服务扫描蜜罐账户
description: 0day.org模拟测试结果
references: https://adsecurity.org/?p=3458
tags: T1558-003
status: experimental
author: 12306Bro
logsource:
product: windows
service: security
detection:
selection:
EventID: 4769 #已请求 Kerberos 服务票证。
ServiceName: abcc #服务信息>服务名称(蜜罐账户用户)
Clientaddress: ::ffff:* #网络信息>客户端地址
Ticketoptions: 0x40810000 #附加信息>票证信息
Ticketencryptiontype: 0x17 #附加信息>票证加密类型
condition: selection
level: medium
建议
注意:此规则无法直接利用,仅提供检测思路。需要域内内置蜜罐账户用户,当攻击者对蜜罐账户发起扫描、请求TGS时,此规则可被触发。
参考推荐
MITRE-ATT&CK-T1558-003
https://attack.mitre.org/techniques/T1558/003
SPN扫描SQL服务主体脚本
https://github.com/PyroTek3/PowerShell-AD-Recon/blob/master/Discover-PSMSSQLServers
powershell探测脚本
https://github.com/PyroTek3/PowerShell-AD-Recon
Active Directory中获取域管理员权限的攻击方法
https://www.cnblogs.com/backlion/p/7159296.html
使用KERBEROASTING提取服务帐户密码
https://blog.stealthbits.com/extracting-service-account-passwords-with-kerberoasting/
Active Directory中服务主体名称的说明
https://thebackroomtech.com/2018/08/21/explanation-of-service-principal-names-in-active-directory/
检测Kerberoasting活动
https://adsecurity.org/?p=3458
检测Kerberoasting活动第2部分
https://adsecurity.org/?p=3513
Active Directory PowerShell模块收集AD信息