安全防御 04月06日 01:30
Kerberos协议之MS14-068分析和防御
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了MS14-068漏洞,该漏洞允许经过身份验证的用户通过伪造Kerberos票据来提升权限。文章首先介绍了Kerberos协议的认证流程,然后详细分析了MS14-068漏洞的原理、利用过程,并结合事件日志和攻击流量进行分析,最后提出了防御措施,对该漏洞的处理与防护具有参考价值。

🔑 Kerberos 协议是Windows域环境中的默认身份验证方法,通过密钥加密技术验证用户身份,涉及AS、TGS、AD等多个关键组件。

💥 MS14-068漏洞存在于KDC服务中,允许攻击者在TGT中伪造PAC,从而绕过权限验证,提升普通域用户权限。

🛠️ 漏洞利用过程包括账户信息收集、生成高权限TGT票据、清除并注入票据、访问DC共享文件夹等步骤,其中PAC的构造是关键。

🛡️ 防御措施包括安装补丁、加强账户安全、攻击检测、重装域服务等,同时可以分析流量特征和事件日志以发现攻击。

猎豹安全中心 2022-03-30 17:19

本文主要简单说明 Kerberos 协议的认证过程,然后介绍了 MS14-068 的漏洞原理和利用过程,同时

本文主要简单说明 Kerberos 协议的认证过程,然后介绍了 MS14-068 的漏洞原理和利用过程,同时结合了漏洞利用产生的事件日志和攻击流量进行分析。

Kerberos

Kerberos 是 MIT 提出的一种网络身份验证协议,它通过密钥加密技术验证用户或主机的身份。Kerberos 默认使用 UDP 端口88。

Windows 使用 Kerberos 作为其默认身份验证方法。如果将客户端加入 Windows 域,则说明将启用 Kerberos 作为从该客户端到 Windows 域中的服务以及与该域具有信任关系的所有域的身份验证的默认协议。但需要注意的是,如果客户端或服务端或两者都未加入域,Windows 将改为NTLM提供身份验证。

先看看Kerberos的角色功能。

再来看看看认证流程。

    AS REQ
    客户端用户 Client 向 KDC 发送一条消息 AS REQ 进行预验证,其中消息包含了 Client 密码 HASH 加密的时间戳、Client-info、网络地址等。

    AS REP
    KDC 请求AD查询Client,若存在该用户则用其密码 HASH 解密 AS REQ 中的时间戳,若解密成功且时间戳在5分钟之内,则验证成功。AS 会返回 Sessionkey-AS (经过 Client 密码 HASH 加密)和 TGT (包含经 KRBTGT HASH 加密的 Sessionkey-AS 和时间戳等信息,因此 TGT 无法被 Client 解密解析)。

    TGS REQ
    Client 用自身密码解密 Sessionkey-AS,再用 Sessionkey-AS 加密时间戳和 Client-info 作为其中一部分内容,和 TGT 一起发送给 KDC 中的 TGS 以认购换取 ST 票据。

    TGS REP
    TGS 首先自检是否存在 Client 所请求的服务,若存在,则使用 KRBTGT 密码 HASH 解密 TGT,解密得到 Sessionkey-AS 、时间戳、Client-info。然后再用这个 Sessionkey-AS 解密步骤 3 中的一部分内容,得到第二份时间戳和 Client-info,两者进行比较,有效时间范围,网络地址是否相同。认证成功后,TGS 会生成用 Sessionkey-AS 加密的 Sessionkey-TGS 和 Server 密码 HASH 加密的 Sessionkey-TGS (即 ST 票据)返回给 Client。

    AP REQ
    Client 先用之前本地缓存的 Sessionkey-AS 解密得到 Sessionkey-TGS。当 Client 需要访问 Server 上的服务时,Client 使用 Sessionkey-TGS 加密时间戳等信息,和 ST 一起发送给 Server。

    AP REP
    Server 使用自己密码 HASH 解密 ST 得到 Session-Key TGS,然后再解密得到时间戳等信息,与 ST 的时间戳和 Client-info 等分别进行验证对比。

这里需要提醒的是,一般地,有些服务并不需要 PAC 验证,该服务会接受 TGS 票证中的所有数据,而不与 DC 通信。

PAC

PAC 即 Privilege Attribute Certificate(特权属性证书),它是 Kerberos 票证的扩展。需要注意的是,Kerberos 以上认证过程说明了客户端是否为真实有效用户,但未声明该用户是否具有访问目标服务的权限,因为在域中不同权限的用户所能访问的资源是不同,而 PAC 解决了访问权限问题。

PAC 包含了用户或组安全标识符 (SID)。当用户在 AD 域中进行身份验证时,域控制器会将此信息添加到 Kerberos 票证中。当用户使用 Kerberos 票证访问其他服务进行身份验证时,可以读取 PAC 来确认其权限级别,而无需联系域控制器来查询该信息。

继续完善上面的认证流程。

但需要说明的是,有些服务并不需要 PAC 验证,该服务会接受 TGS 票证中的所有数据,而不与 DC 通信,而银票攻击则也正利用了这个条件。

MS14-068

MS14-068 是位于 kdcsvc.dll 域控制器的 KDC 服务中的漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中伪造插入任意的 PAC 。普通域用户可以通过呈现改变了的 PAC 的 TGT 来伪造票据获得管理员权限。

利用过程

域测试环境:

漏洞利用前,收集账户信息,查看当前权限。

使用 exp 在当前目录路径下生成一个高权限的 TGT 票据

mimikatz 清楚内存中票据信息,将 TGT 票据注入到内存。

注入成功,dir查看当前权限,可以看到已经提权成功。

漏洞成因与流量分析

以下通过 exp 结合流量分析和学习 MS14-068 漏洞原理。对 exp 设置断点 debug,并使用大鲨鱼抓包。

这里的参数pac_request为 False,说明在构建 AS REQ 消息时,Client 将向 KDC 申请一张不包含 PAC 票据,这个是微软默认的设计。

查看对应流量,确认include-pac: False

查看正常 AS REQ 请求流量,两者进行对比。

AS REP 响应,将 KDC 加密的TGT 返回给客户端。

参数tgt_a获取 TGT 票据。

构造 TGS REQ。跟进build_pac函数查看 PAC 构造。


分别提取了 domain_sid、user_id,_build_pac_logon_info构造高权限 SID 以达到提权目的。

该函数将组成员身份声明更改为包含更高特权的组,由于 PAC 包含用户或组 SID,这就使得 AD 域中具有有效 AD 凭据的计算机上的 Client 能够绕过所有已配置资源的 ACL。

往下,关注默认参数server_key=(RSA_MD5,None)server_key=(RSA_MD5,None),关注checksum函数,以及参数server_keykdc_key

关于 PAC 签名,微软也做了相应的说明。

意思就是 PAC 通过包含两个数字签名(分别为 Server 密码 HASH 与 KDC 密码 HASH)防止 PAC 被伪造。

那么这两个数字签名 PAC_SERVER_CHECKSUM 和 PAC_PRIVSVR_CHECKSUM 则对应为chksum1chksum2

跟进查看checksum函数,server_key[0]kdc_key[0]指的就是加密方式,指定为 MD5,这里server_key[1]kdc_key[1]应为 Server 和 KDC 密码 HASH 并都设置了为None

构造好 PAC 后,将其传入build_tgs_req函数构造 TGS REQ,然后发送给 KDC。

在上图中可以看到前面得到的 TGT 和通过eTYPE-ARCFOUR-HMAC-MD5加密方式的 PAC。

KDC 验证完成以后,返回 TGS REP,其中包含一张新的 TGT,它会将 exp 生成具有高权限的 PAC 包含在其中。

exp 收到上图新的 TGT 后会将其保存为TGT_user1@bbk.lab.ccache文件以方便 Client 导入到内存中使用。

在 Client 上使用 mimikatz 清除内存中现有的 Kerberos 票据,然后将 exp 生成的 TGT 导入到内存中进行提权。尝试连接访问 DC 的共享文件夹,继续抓包。

进行了两次的 TGS REQ 请求,第一次 TGS REQ 请求是使用上面exp生成的高权限 TGT 票据,然后返回了一张 win08.bbk.lab (win08是DC主机名)的 CIFS 服务的 ST 票据。

然后通过 SMB 协议拿着这个 ST 票据请求 CIFS 服务,发起 Session Setup Request(AP REQ)。

最后,返回 Session Setup Response(AP REP)响应。

此时,Client 拥有了 DC 上 CIFS 服务的有效 TGS,并且能够使用它通过 SMB 访问共享文件夹,甚至通过 psexec 远程连接。

日志分析与防御措施

以下是使用伪造 TGT 获取 TGS 以访问 DC 的 c

事件4769显示 user1@bbk.lab 使用伪造的 TGT 请求 TGS Kerberos服务票证。

事件4624显示 user1@bbk.lab 使用 TGS 服务票证登录到 DC。

事件5140显示 user1@bbk.lab 使用 ST 连接到只有管理员有权访问的目标域控制器的 c

事件4672显示 user1@bbk.lab 已成功验证(并登录到)只有域管理员才能访问的目标域控制器。

而且,此该用户具有 SeBackupPrivilege、SeRestorePrivilege、SeDebugPrivilege、SeTakeOwnership 等权限,表明该用户具有对此计算机的完全管理员访问权限。说明域控已经沦陷。

防御措施:

总结

MS14-068漏洞主要是经过身份验证的域用户向 Kerberos KDC 发送伪造的 Kerberos 票据,票据其中包含了声称该用户是域管理组成员的 PAC。KDC 在处理来自攻击者的请求时不正确地验证伪造的票据签名,从而允许攻击者以域管理员身份访问任何资源。

从接触内网渗透以来,第一次分析 Windows 提权类型的漏洞,收获良多,受益匪浅。MS14-068 虽然是14年的老漏洞,但是放在今天仍然还具有一定的影响,且对该漏洞的处理与防护,也能举一反三应用到其他漏洞上。关于 Kerberos 协议的认证流程和 exp 利用,还有很多细节没深入去挖掘出来,文章篇幅较长,如有错漏还请海涵。

参考

猎豹安全中心技术分享频道


  

    海量日志分析的预处理

    OSSEC-Execd功能模块分析

    通过流量快速识别域名信息

    从android源码看脱壳

    Ossec-Agentd模块分析

    猎豹移动DPIA系统开源

    一种新的分词方法在机器学习中的应用

    Ossec-Logcollector模块分析

    Ossec-Agent-Syscheckd模块分析

    Ossec Agent总结

    HTTP走私漏洞分析

    BurpSuite扩展插件使用分享

    webshell连接工具流量分析

    JDK7u21调用链分析

    php函数中的那些坑

    通过sqlmap源代码分析SQL注入漏洞检测流程

    猎豹移动通过“全球首个隐私信息管理体系标准”ISO/IEC 27701认证

    DGA域名检测

    基于NSL-KDD数据集的网络入侵检测分析

    采用HAN网络模型的WebShell检测

    Suricata可视化规则(简单)编辑器及规则统计告警系统开源

    SQL注入检测

    Typecho利用链分析

    ISO27701

    phpinfo里面有什么?

    Django QuerySet.order_by() SQL注入分析

    内网渗透之SOCKS代理的5类基本场景


长按下方二维码关注我们





阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MS14-068 Kerberos 漏洞分析 提权 安全
相关文章