域学习
域是什么?
先来了解一下域,域是windows网络中的独立运行单位,是基于window的(但实际上linux也可以加入ad域的,需要用于支持其加入ad域的软件包,可参考linux系统加入AD域)
域的存在就是为了方便各计算机之间的互相通信以及管理
域的创建
这里我是跟着柠檬师傅的gihtub上建的
没啥好注意的,跟着一步一步建就行,唯一走的弯路就是装错了家庭版导致不能加域…
Kerberos协议(MS14068
MS14068是经典的一个域提权漏洞,原理和kerberos协议有关
关于这个协议,底下这篇文章已经说的非常清楚了
我就说点自己的理解和总结
kerberos协议的过程
kerberos协议用于在非安全网络环境下两台计算机之间证明身份的过程。
在正常的net use
过程中就会通过kerberos验证,用于验证用户是否有权限访问
他由a计算机告诉b计算机一个由这两台计算机都知道的key加密的内容来向b计算机证明a的身份
但如果两台计算机一直用同一个key加密内容来证明自己的身份,这个过程再受到监听导致明文和密文泄露的话,这个key是很容易暴露的,而采用不同的key则无法保证两台计算机之间有那么多相同的key,且能每次保持同步,所以keyberos协议选择用第三方可信主机向两台计算机发送key,两台计算机再用收到的key来加密内容(内容为时间戳)证明身份。
这就是kerberos的主要过程(建议看上面那个,真的写的很详细易懂
然后是涉及到的过程中的几个重要数据包,我做了个图方便理解
为了让我们获取更高级的权限,关键就在伪造PAC上了
在poc中,伪造的PAC被放在了KRB_TGS_REP中,这也是这个漏洞的成因:
放在其他地方的PAC被KDC解析到了正确的位置,且KDC会用收到数据包中指定的加密方式去检验加密内容,poc用md5加密并将将加密用的密钥也塞到了数据包中,KDC正确解析了这个密钥并拿去认证了poc构造的PAC,且认证的PAC签名表示该用户是域控管理员,所以通过了验证得到了管理员的身份。
微软官方补丁的说明也是补丁更新了windows Kerberos对签名的验证行为,这也认证了问题的出处
于是poc的思路为先向KDC请求KRB_AS_REP,获取KEYa-kdc和TGT;根据用户名,密码,sid伪造PAC;将KEYa-kdc加密的时间戳和TGT和PAC打包为KRB_TGS_REP,获取TGS的返回包,并解析生成证书文件。
一个疑问
由于怕A和B收到的时间不同所以靠A传递给B密文B,密文B是用B密码加密的KEYa-b和A的PAC,KEYa-b在5过程中能被A拿到,PAC是3过程中A发出的加密PAC,也就是说明文A能拿到,密文A也能拿到,甚至加密方式也能拿到,这不会导致安全问题么(问题回到了MD5的安全性上…)
poc利用
先用mimikatz清除票据
whoami /all
查询用户sid后带入poc生成证书
格式为MS14-068 -u 域用户名@域名 -p 域用户密码 -s 域用户sid -d 域控名
完成后会生成一个文件,再用mimikatz将这个文件写入
我们就得到了域控的权限
能执行net user /add /domain
说明确实是Administrator组的权限
当然,这个洞都是很早以前的了,要利用都只能碰运气域控机器上没打补丁。
拿到域控权限了可以做什么
一些常规的操作就跟后渗透一样了,像是复制远控后门过去
或者映射磁盘
at命令执行呀之类的(at用于win7之前的版本)
一个域中的时间是相同的,所以不用特地远程读时间
要注意你拿到的权限是域中的管理员权限,需要用域名去远程执行,用平常的ip地址访问的话是局域网中普通的权限。
又或者是像上一个模块中创建新用户并提到管理员组
net group "Domain Admins" fuck /add /domain