跳转至

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的内部工作原理,攻击过程也可归纳为:

  1. 扫描Active Directory以设置SPN值的用户帐户。
  2. 使用SPN值从AD请求服务票证
  3. 将服务票据提取到内存并保存到文件
  4. 暴力破解攻击这些密码直到破解

举个例子:

  1. 利用SPN扫描探测含有SQL服务的主机服务;
  2. 识别目标后,利用piwehsell脚本请求此服务主体名称(SPN)的服务票据;请注意,请求的服务票证是具有RC4加密类型
  3. 一旦客户端接收到票据以后,可以利用mimikatz或其他工具在用户的内存中导出所有kerberos票证;(不涉及权限提升)
  4. 最后,将票据导出后,将票据文件拷贝到正在运行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信息

https://www.cnblogs.com/backlion/p/9267100.html