域用户更改密码提示拒绝访问_Kerberos KDC域权限提升漏洞总结

a8737d40805212db4dcfeb4deac0d491.png

01漏洞起源

Windows Kerberos 对 kerberos tickets 中的 PAC(Privilege Attribute Certificate)的验证流程中存在安全漏洞,低权限的经过认证的远程攻击者利用该漏洞可以伪造一个PAC并通过 Kerberos KDC(Key Distribution Center)的验证,攻击成功使得攻击者可以提升权限,获取域管理权限。

02漏洞描述

(1)简单的相互身份验证

A向B发送信息时,会附加一个Authenticator(认证码 ,该数据结构=身份信息+时间戳)来进行彼此的身份验证。开始验证之前,A和B已经有一个有且只有二人知晓的密钥)

下面是工作流程:

22265256e6fa10e8423b997cb1694613.png

1.A用密钥加密了[信息+Authenticator(身份信息+时间戳)],将其发给B

2.B用密钥解密了A发来的Authenticator,并将其中包含的时间戳记录下来。B将这个时间戳与自己的当前时间进行比较,如果这个时间差大于某个值(windows下默认是5分钟),B认为信息不是A发来的,拒绝后续验证。如果这个时间差小于设定值,B要检查在过去5分钟内,是否存在含有更早时间戳的Authenticator,如果没有,B认为信息确实是A发来了。至此,完成了B对A的验证

3.B用密码加密Authenticator里的时间戳,然后将其发回给A,以证明自己确实是B

4.A收到后,解密出时间戳,经过自己的对比,确认了对方确实是B,至此完成了A对B的验证

(2)Kerberos描述

629cee19ac34f540c0eb324c40700c96.png

1.用户Sue登陆到自己的客户端,客户端向认证服务器发送一个TGT(Ticket Granting Ticker)请求到KDC服务

2. 认证服务器确认用户的访问权限和session key认证服务器使用用户密码HASH作为KEY去加密请求然后发送到客户端

3. 客户端后续使用这个密码去解密以后的消息。解密成功后,用户使用TGT去到TGS请求一个服务票据

4. TGS返回一个服务票据

5. 用户拿服务票据去认证

6. 开启客户端和服务端会话

(3)漏洞描述

上面的图有一个地方没有指出,无论TGT还是服务票据都包含一个PAC(Privilege Attribute Certificate),PAC包含了两个信息,一个是用户SID,另一个是用户的组。

当用户登录KDC验证服务的时候,服务会验证PAC中的签名。如果PAC携带的签名表示“Sue”是“域控管理员”安全组的成员,那么创建的登陆session会话就将Sue当成了管理员。这样的认证存在问题,攻击者可以伪造身份。

(4)漏洞危害

这个漏洞的主要危害是以普通域用户身份可以伪造域管理员身份。

如果机器上并没有打补丁 3011780 则可能存在这个漏洞能够被恶意利用。

涉及系统:

Windows Server 2003

Windows Vista

Windows Server 2008

Windows 7

Windows Server 2008 R2

Windows 8 and Windows 8.1

Windows Server 2012 and Windows Server 2012 R2

Server Core installation option

03漏洞原理

(1)PAC原理

Server收到Client发来的TGS后,要根据TGS中Client申明所在的域组,和Server上的ACL进行对,然后决定给予Client什么样的资源访问权限。微软使用PAC来表示TGS中Client申明的域组。PAC(Privilege Attribute Certificate),特权属性证书。

b6f1700c91f429d202988c3d58894fb6.png

PAC包含Client的User的SID、Group的SID。PAC决定了Client的组属性,即决定了Client的权限PAC为了保证自身的合法性,还包含2个签名,Key为krbtgt的NTLM,签名的内容除了User SID、Group SID外,还有其他部分PAC作为TGT的一部分,是加密的,密钥为krbtgt的NTLM作Client向KDC的AS模块发起认证请求,AS返回TGT时,会根据Client所在的组,生成PAC,包含Client的User SID、Group SID,以及用于确保PAC不被篡改的2个签名

(2)漏洞成因

Client在发起认证请求时,通过设置include-PAC为False,则返回TGT中不会包含PAC

a34a80b31d4074e0dc1c7886affb38c6.png

b574162c1dbe1fed3abc8479f8554025.png

KDC对PAC进行验证时,对于PAC尾部的签名算法,虽然原理上规定必须是带有Key的签名算法才可以,但微软在实现上,却允许任意签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证。因此伪造的任意内容都可以是合法的,直接加上内容的MD5值作为签名即可(第一个原因)

PAC没有被放在TGT中,放在其它地方。KDC在仍然能够正确解析出没有放在TGT中的PAC信息PAC必须是密文,经过Key加密的KDC会从Authenticator中取出来subkey,把PAC信息解密并利用客户端设定的签名算法验证签名(第二个原因)

KDC验证缺少PAC的TGT成功后,再验证不在TGT中 的PAC的合法性。如果2个均验证成功,KDC把PAC中的User SID、Group SID取出来,重新使用进行签名,签名算法和密钥与设置inclue-pac标志位为TRUE时一模一样。将新产生的PAC加入到解密后的TGT中,再重新加密制作全新的TGT发送给Client,不是TGS(第三个原因)

04漏洞利用

在做域渗透测试时,当我们拿到了一个普通域成员的账号后,想继续对该域进行渗透,拿到域控服务器权限。如果域控服务器存在MS14-068漏洞,并且未打补丁,那么我们就可以利用MS14-068快速获得域控服务器权限。

MS14-068编号CVE-2014-6324,补丁为3011780,如果自检可在域控制器上使用命令检测,如返回结果为空则说明服务器存在MS14-068。

55e6220c29cf539bf1ed670c49e88d41.png

7b08c31a309b24f76d3fdc82f3e9666d.png

存在如下拓补图:

域用户hack在域成员主机A上登陆过,域成员主机A的管理员通过mimikatz得到了域用户hack的用户名,密码,SID等值,而且域控存在MS14-068漏洞,现在域成员主机A想通过MS14-068漏洞访问域控。

86a184db742db6e00fbdb1085361b17f.png

1、生成TGT

(1)使用net config workstation命令查看工作域的名称

6f0003f05359c3f539bb10a68f0c84f7.png

(2)使用ms14-068.exe生成票据

有关ms14-068工具使用如下:

e105e475c21d28095677fbf679dc31e4.png

其中 -u 域成员名@域名

-s 域成员SID

-d 域控制器地址

-p 域成员密码

目前为止唯一不知道的是域成员SID的值,使用whoami -all命令可以查看域成员的SID值:

f28315b41dad07378f4bed0598b75ee8.png

所以使用如下命令生成票据:

d966ebff3c2540e9ae679945b9761b1e.png

398f12bc6a5c1e77d1b1a0c121ea05f8.png

2、注入TGT

(1)在域成员机器上,先使用klist命令查看自己的票据信息

1774067a562c334945cef2517ece1481.png

(2)如果存在票据,则使用klist purge命令清理掉,否则可能会导致无法成功

a8303817f8dc9711c472efe2d7a6a586.png

(3)使用mimikatz进行注入

07191cd4bc57e21863666977bc87667e.png

(4)查看票据是否注入成功

84527c899a5842bf17e49ac43bf14597.png

(5)尝试访问域服务器

6e1e65135e7262fbbe37aae87c153bb7.png

成功读取域服务器C盘文件,获得域控权限。

注意:

1.注入票据时,机器不能是03或xp,因为mimikatz不支持这两个机器注入

2. 当获取到域用户、域用户SID、密码以及可访问到域控制器的机器,并不需要机器一定在域中(如攻击者通过VPN等拨入内网),但需要把dns指向域控制器才能解析

3. 访问域控制器时,需要使用主机名,不能使用IP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行错误和内存泄漏等问题。它还支持编译检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
要创建一个Kerberos用户来访问Hadoop,您需要采取以下步骤: 1. 创建一个Kerberos用户账户。您可以使用命令行工具kadmin来创建,例如: ``` sudo kadmin.local -q "addprinc -randkey <username>" ``` 其中,`<username>`是您要创建的Kerberos用户名。 2. 为该用户生成keytab文件。keytab文件包含了用户Kerberos凭据,用于在不需要交互式输入密码的情况下进行身份验证。您可以使用命令行工具kadmin来生成keytab文件,例如: ``` sudo kadmin.local -q "ktadd -k /path/to/keytab <username>" ``` 其中,`/path/to/keytab`是您要生成的keytab文件的路径。 3. 将keytab文件分发到Hadoop集群的所有节点上。您可以使用scp命令将文件复制到每个节点上,例如: ``` scp /path/to/keytab <node>:/path/to/keytab ``` 其中,`<node>`是Hadoop集群中的节点。 4. 配置Hadoop以使用Kerberos身份验证。您需要编辑Hadoop配置文件core-site.xml和hdfs-site.xml,添加以下属性: ``` <property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property> <property> <name>hadoop.security.auth_to_local</name> <value> RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// RULE:[2:$1@$0](.*@EXAMPLE.COM)s/.*/hdfs/ </value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/path/to/keytab</value> </property> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/[email protected]</value> </property> ``` 其中,`/path/to/keytab`是keytab文件的路径,`hdfs/[email protected]`是Hadoop集群的Kerberos服务主体。 5. 重启Hadoop服务以使配置更改生效。 现在,您可以使用Kerberos用户名和keytab文件访问Hadoop集群。例如,您可以使用以下命令在HDFS上创建目录: ``` sudo -u hdfs kinit -kt /path/to/keytab <username> sudo -u hdfs hdfs dfs -mkdir /user/<username> ``` 其中,`<username>`是您的Kerberos用户名

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值