MS14-068提权漏洞
一、PTT简介
票据传递攻击(Pass The Ticket,PTT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法。PTH基于NTLM认证进行攻击,而PTT基于Kerberos协议进行攻击票据传递攻击,目的是伪造、窃取凭证提升权限。
常用的攻击方式有:MS14-068、黄金票据、白银票据等。
二、MS14-068漏洞
1、漏洞简介
2、PAC
微软在Windows平台上对Kerberos协议进行了一些扩充,其中最重要的扩充就是增加了认证过程中的权限认证,也就是在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书
在一个域中,通过User的SID和所在组Group的SID来确定该用户所拥有的权限。所以PAC包含Client的User的SID、Group的SID。PAC为了保证自身的合法性,还包含2个签名
(1)Client向AS请求认证,验证完Client的身份后,AS在返回TGT时,生成PAC,以及用于确保PAC不被篡改的两个签名,一个签名的密钥为KDC用户(krbtgt)的NTLM Hash,另一个签名的密钥为Server的NTLM Hash,而签名的内容主要为User SID、Group SID
(2)Client向TGS发送请求,来获取访问Server得Ticket。TGS对TGS Request中的TGT解密,并通过两个签名来验证PAC的合法性。若验证通过,TGS会重新生成两个新的签名保证PAC不被篡改。第一个签名的密钥为Server的NTLM Hash,第二个密钥为Server与Client的临时会话密钥Session Key(Server-Client)。新的PAC会被放置在签发的访问票据Ticket中,使用Server得NTLM Hash进行加密
(3)Client使用Ticket向Server请求相应的资源,Server收到请求,将Ticket解密并验证,校验PAC中的两个签名,验证PAC的合法性,之后根据PAC得知Client的权限,让其访问对应资源
3、漏洞产生原理
Client在向AS发送请求时,可以设置一个名为include-pac的字段为False,而后AS生成的TGT并不会含有PAC,该字段默认为True。在Client收到不含PAC的TGT后,可以添加一个PAC放于TGS Request的数据包中,而TGS收到这个请求的数据包时,仍能正确解析出放在TGS Request中其他位置的PAC信息,因为KDC允许用户使用这样的构造
在KDC对PAC进行验证时,对于PAC中的签名算法,虽然原则上规定使用密钥加密的签名算法,但微软在实际场景中却允许Client指定任意签名算法。所以Client构造一个PAC,其中添加高权限的User SID与Group SID信息,并指定使用MD5进行签名,只要TGS Request数据不丢失,那么该伪造的PAC就能被验证通过
PAC验证通过后,KDC会将PAC中的User SID、Group SID取出来,重新使用KDC用户(krbtgt)的NTLM Hash和Server的NTLM Hash分别生成两个新的签名,之后生成一个新的TGT,并把PAC放入其中,加密后发送给Client,而不是发送Ticket给Client
三、漏洞复现
1、实验环境
域:woniuxy.com
域控制器(DC):Windows 2008 R2
域内计算机:Windows 7
普通域用户:zhangsan
MS14-068漏洞利用工具:MS4-068.exe (https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068)
Windows 密码获取工具:mimikatz.exe
2、复现过程
将我们的Window2018 R2、Windows7、Windows2003全部重启,CS里面的数据也全部都清空
我们使用域普通账号zhangsan进行登录
用户名:woniuxy\zhangsan
密码:User123
1、域信息获取
使用net time /domain 命令查看所在域的时间与域服务器的名字
使用ipconfig /all,查看DNS服务器地址,单域中DNS与DC一般在同一服务器上
可以使用ping命令进行校验
2、获取用户SID,使用命令:whoami/user
3、使用MS14-068生成伪造的kerberos协议票据:
使用命令:
使用这条命令的前提是:用户名、域名、用户密码、用户SID、DC的IP
这里面只有用户密码有点难弄
我们使用mimikatz这个工具看看能否获取到用户的密码
发现无法获取,因为权限不够,所以我们要将域普通用户提权至SYSTEM用户
我们先将木马程序(http_beacon_64.exe)进行上线
Windows7上线成功
使用插件是dump Hash和获取明文密码,发现无果,因为权限不够
所以我们使用插件里面的功能进行提权,选择权限提升,然后再选择MS14-058
然后添加一个新的监听器,为HTTP_Beacon,这个监听的意思是临时生成一个新的木马来上线
提权成功,变成SYSTEM权限
接下来我们就能使用SYSTEM权限来dump Hash了
然后我们再来获取一下明文密码
接下来我们使用MS14-068来生成伪造的kerberos协议票据:
首先将这个工具复制到Windows7的目录下
然后在终端开始使用这个工具,命令写法看上面
执行之后发现没有出错
然后就给我们生成了一个临时的票据
即TGT_zhang@woniuxy.com.ccache
生成临时的票据之后,我们进入mimikatz
使用如下命令看看目前已有的票据,由于我们要自己伪造一个,所以这些票据不能用
kerberos::list
既然不能用,我们就使用以下命令将这些票据删除
kerberos::purge
然后再使用kerberos::list,发现已经没有票据了
这个时候,我们使用如下命令将我们生成的临时的票据导入进去
kerberos::ptc TGT_zhangsan@woniuxy.com.ccache
导入成功
然后我们再使用一下kerberos::list来查看一下我们导进去的票据
这样我们就完成了票据的导入
这个时候我们打开Windows7的命令行
输入dir \\dcadmin\c$
发现可以进行访问了
如果我们把这个票据给清空,那么将无法访问到域控主机的C盘
注意,票据生成用过一次就不能够再次使用了,得重新生成票据,然后再去访问
剩下的就是往里面写木马,进行上线,和之前的操作一模一样,就不演示了
大致操作:
有票据的话,我们直接在文件夹里进行访问,比在命令行里访问方便得多
然后将木马复制到自启动那个目录下,等到域控主机再次启动的时候,该木马就会被运行,域控主机也就能够上线成功
这次我们通过CS来进行操作
我们使用插件进行提权,然后凭证也获取到了
凭证里面的administrator不是域控管理员的,是本机的本地管理员的
我们使用域普通用户这个Beacon进行一个主机扫描
当然也可以用net view 进行扫描,发现扫出一个112.158这台主机
然后去targets查看一下多了112.158,我们也可以手动将112.158这台主机给加入进去
既然没有域控管理员的权限,我们就不能获取112.100,也就无法横向移动到112.100
因为这个administrator是本机管理员,不是域控管理员
我们进入到这台主机的文件浏览,然后把那个MS14-068.exe上传上去
传上去之后执行命令即可,如下图所示
执行成功,没有报错
然后shell dir 就能看到生成的票据
接下来就是运行mimikatz
在命令行里面直接输入mimikatz kerberos::list,看看已经存在的票据
然后使用命令mimikatz kerberos::purge清空里面的票据
接着我们去看看能否访问域控主机的C盘,使用如下命令
shell dir \\dcadmin\c$
访问失败
然后我们将生成的票据导入进去
使用如下命令
mimikatz kerberos::ptc TGT_zhangsan@woniuxy.com.ccache
导入成功
接下来我们继续去访问域控主机的C盘
然后发现可以访问到了
控制域控后,运行各种木马上线的命令拿下域控
上线成功,拿下域控
拿下域控后,可以利用域控管理员账户登录任意其他域客户机,实现全域控制
我们使用SYSTEM权限的,是域控管理员登录的进行一个Hash dump,也就是第一行的这个
高亮部分就是我们想要的
然后我们横向移动,拿下112.158
填入数据,然后launch
然后Windows2003就被我们移动过去了