本文梳理Kerberos的相关攻击手法
Reference:《内网渗透体系建设》
Kerberos基础
域渗透中,Kerberos是最常用的,针对整个域的基础认证协议
Kerberos基础认证流程
- Kerberos认证协议是基于票据(Ticket)的一种认证方式
- 三部分:
- 用户(Client)
- 服务器(Server)
- Key Distribution Center(KDC,密钥分发中心)
- Authentication Server(AS,认证服务器)
- Ticket Granting Server(TGS,票据授权服务器)
- AS_REQ:Client向AS发起AS_REQ
- AS_REP:AS使用Client密码哈希值进行解密,解密成功,返回用krbtgt的NTLM-hash加密的TGT票据
- krbtgt是Kerberos中的一个特殊账户,用于存储和管理Ticket Granting Ticket(TGT)
- 在Kerberos认证系统中,krbtgt账户是一个系统级别的账户
- TGT包含PAC,PAC包含Client的相关权限信息
- 只有KDC能制作和查看PAC
- 如果攻击者获取到了krbtgt hash,便可以任意伪造TGT,即黄金票据,从而跳过AS验证
- TGS_REQ:Client通过TGT向TGS发起针对需要访问服务的TGS_REQ请求
- TGS_REP:TGS使用krbtgt的NTML-hash对TGT进行解密,解密成功便返回用服务NTLM-hash加密的TGS票据(ST),并附带PAC
- 这里不论用户有没有访问服务的权限,只要TGT正确,就返回ST
- AP_REQ:Client利用ST请求服务
- AP_REP:服务使用自己的NTLM-hash解密ST,如果结果正确,将PAC交给KDC解密,KDC由此判断是否有访问服务的权限
- 如果没有设置PAC,就不会交给KDC验证,这便是白银票据成功的原因
Kerberos攻击分类
Kerberos的攻击主要关注点为“票据”,即票据传递攻击Pass The Ticket(PTT)
AS_REQ & AS_REP attack
域内用户枚举&密码喷洒攻击
本质就是爆破,利用Kerberos协议认证过程当用户不存在时,返回包提示错误,当用户名存在时,密码正确/错误返回包也不同
https://github.com/ropnop/kerbrute
域内用户枚举:kerbrute_windows_amd64.exe userenum --dc x.x.x.x(域控ip) -d x.com(域名) x.txt(字典)
密码喷洒攻击:kerbrute_windows_amd64.exe passwordspray --dc x.x.x.x -d x.com x.txt 123.com
AS_REP Roasting attack
- 如果被攻击账号设置“不需要Kerberos预身份验证”,AS_REP的过程中就可以任意伪造用户名请求票据
- 随后AS会将伪造请求的用户名NTLM hash加密后返回,于是便可以进行爆破
- 但该攻击条件默认是不勾选的,因此可利用程度较低
Golden Ticket attack
- 在Kerberos认证中,每个用户的票据都是由krbtgt的NTLM hash加密生成的,因此获得krbtgt hash,便可以伪造任意用户的票据
- 攻击需要:
- 域名
- 域sid
- krbtgt hash
- 伪造的用户
- 攻击过程:
在DC上mimikatz.exe "LOG" "Privilege::Debug" "lsadump::lsa /patch" "exit"
得到krbtgt hash之后,利用mimikatz生成黄金票据并导入,注意这里传入的sid值要去掉最后一个“-”后面的内容
kerberos::golden /admin:Administrator /domain:x.com /sid:x-x-x-x-x-x-x /krbtgt:[hash value] /ticket:ticket.kirbi
Kerberos::ptt ticket.kirbi
TGS_REQ & TGS_REP attack
Kerberoast attack
- SPN(Service Principal Name)是服务器所运行服务的唯一标识
- Kerberoast attack利用了TGS_REP阶段使用服务的NTML hash返回加密数据,对于域内的任何主机,都可以通过查询SPN,向域内的所有服务请求ST(因为KDC不会验证权限)
- 爆破域用户的SPN(机器账户的SPN每30天会随机更换128个字符的密码),这里高度依赖爆破字典
Silver Ticket attack
- 未配置PAC的情况下,通过伪造ST访问特定服务器上的部分服务
- 如果得到DC机器账户的hash
- 使用白银票据访问其LDAP服务执行DCSync
- 伪造CIFS服务实现远程文件访问
- 攻击需要:
- 域名
- 域sid
- DC机器账户的hash
- 伪造的任意用户名
- 攻击过程:
在DC上mimikatz.exe "log" "privilege::debug" "sekurlsa::logonpasswords"
得到DC机器名的hash和域idkerberos::golden /domain:x.com /sid:x-x-x-x-x-x-x /target: dc.x.com /service:ldap /rc4:机器hash /user:xxx /ptt lsadump::dcsync /domain:x.com /user:krbtgt
获取krbtgt用户的hash从而制作黄金票据
委派攻击
委派:服务A和服务B不在同一台机器上,用户访问服务A的时候需要使用到服务B中的数据,服务A代用户请求服务B中的数据,这个过程称为委派
非约束委派攻击
上图中,当service1的服务账户开启了非约束委派,user访问service1时,service1会将user的TGT保存在内存中,于是service1便可以用user的身份访问域中任意user可以访问的服务,当这个user是域管理员时,便获得了域管理员权限,攻击过程如下:
- 在域内主机查找非约束委派用户
AdFind.exe -b "DC=hack-my,DC=com" -f "(&(samAccountType =805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
- 当主机设置为非约束性委派的时候,其userAccountControl属性包含TRUSTED_FOR_DELEGATION这个flag值,对应0x80000
- 其中524288对应0x80000,805306369对应0x0000000(代表机器账户)
- 可以利用Spooler打印机服务让域控主动连接开启非约束委派的服务
- Spooler服务默认开启的情况下,域用户可以利用Windows打印系统远程协议(MS-RPRN)强制任何运行了Spooler服务的域内计算机通过Kerberos或NTLM对任何目标进行身份验证
- 利用SpoolSample强制DC进行认证,从而抓取TGT
- Rubeus导入TGT:
Rubeus.exe ptt /ticket:base64
- mimikatz进行dscync获取hash值,制作黄金票据接管域控
约束委派
微软在Windows Server 2003中引入约束委派,构建了S4U协议,具体可分为S4U2Self和S4U2proxy:
- S4U2self用于生成本身服务TGS票据
- 上图中service1代表用户请求的自身可转发ST
- 不能以该用户身份请求其他服务
- S4U2proxy用于“代理”相关用户申请其他服务票据
- service1以S4U2self阶段的可转发ST代表用户申请请求service2的ST
- S4U2proxy过程中通过判断msds-allowedtdelegateto里的 SPN确定是否可以申请到service2的ST
上述过程中,如果获得了service1的权限,就可以伪造S4U先请求service1本身的ST,然后利用该ST伪造任意用户请求service2的ST:
域内主机查找约束委派主机
Adfind.exe -b "DC=xx,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
假设已获取该主机的相关权限,已经知道服务用户密码明文和hash值,用keoeo请求TGT
tgt::ask /user:win2008-web /domain:xx.com /NTLM:xxx /ticket:s4u.kirbi
伪造S4U,以Administrator用户权限访问受委派的服务
tgs::s4u /tgt:xxx.kirbi /user:Administrator/service:cifs/dc.xx.com
mimimikatz导入S4U2proxy阶段生成的ST
另:如果可以直接获取上述WIN2008-WEB机器账户的TGT,就可以直接利用Rubeus进行攻击Rubeus.exe s4u /user:WIN2008-WEB$ /rc4:xxx[NTLM hash] /domain:xx.com /impersonateuser:Administrator /msdsspn:cifs/dc.xx.com /ptt
基于资源的约束委派
TLDR;
:)
https://exp10it.io/2023/08/resource-based-constrained-delegation-attack-summary/
PAC Attack
MS14-068
- KDC无法正确检查PAC中的有效签名,因为其实现签名的加密允许所有的签名算法
- 客户端可以制定不需要相关密钥的算法,例如MD5,便可以实现伪造构造PAC
keoeo.exe "exploit::ms14068 /domain:x.com /user:username /password:password /ptt" "exit"
CVE-2021-42278 & CVE-2021-42287
- CVE-2021-42278
- 安全绕过漏洞,允许通过修改机器账户的sAMAccountName属性冒充域控
- 与标准用户账户相比,机器账户名称末尾附加了
"$"
符号,但AD并没有验证域内机器账户中是否具有"$"
- CVE-2021-42287
- 允许通过冒充域控,使KDC创建高权限票据
攻击过程:
- 创建一个机器用户,假设为
HACKME$
- 清除机器账户
HACKME$
的servicePrincipalName
属性 - 修改机器账户
HACKME$
的sAMAccountName
属性,使其指向不带"$"
符号的域控账户 - 利用账户
DC-1
请求TGT - 将新建的机器账户的
sAMAccountName
属性恢复为其原始值HACKME$
- 利用S4U代表域管理员请求对应服务的服务票据ST
- 伪造域管理员账户获得相应服务的ST
https://www.cnblogs.com/-meditation-/articles/16619406.html
noPac.exe -domain x.com -user 1nvqaq -pass 12346abc /dc DC-1.x.com /mAccount HACKME /mPassword 123456 /service cifs /ptt