发布于2022年10月18日3年前 理论知识 在传统的kerberos认证的时候,是使用用户密码进行认证的。回顾下申请TGT的过程。 用用户hash加密时间戳作为value,type为PA-ENC-TIMESTAMP, 放在PA_DATA上。KDC收到请求,使用用户hash解密value的值得到时间戳跟当前时间做比对,如果在合理的范围(正常五分钟),就认证通过。 事实上也可以使用证书作为认证,这也是这次spectorops关于ADCS研究的最大亮点,后面漏洞紧紧围绕这点。 RFC4556引入了对 Kerberos 预身份验证的公钥加密支持。这个RFC 的title是Public Key Cryptography for Initial Authentication in Kerberos,后面我们使用简称PKINIT来介绍使用证书进行kerberos身份认证这种方法。 PKINIT同样也使用时间戳,但不是使用用户密码派生密钥加密消息,而是使用属于证书的私钥对消息进行签名。 测试环境 DC windows server 2019 AD CS Windows Server 2008 非域内机器windows 7 测试准备 certtmlp.msc - 证书模板控制台 certsrv.msc - 证书颁发机构 certmgr.msc - 证书管理 给一域用户安装个用户证书 win+r运行certmgr.msc,选择个人,右键,所有任务->申请新证书。请求证书选择用户(即可生成当前用户的一个证书) 安装后如下 执行certutil -user -store My可以看到用户证书 场景模拟 假设一台域内机器带有一个用户证书要怎么利用他? 先把这个证书dump下来(需要包括私钥)可以用certutil或者直接用certmgr.msc dump certutil -user -exportPFX <SHA1 hash> test1.pfx 1 (dump的时候需要给证书设置个密码(如果该证书默认没密码的话)) (使用certutil导出) 这里有一种情况不能通过这两种方式dump,有些证书在导入的时候需要密码或者不勾选标志此密钥为可导出的密钥,需要mimikatz dump dump出现如下问题 使用mimikatz的crypto::capi修改lsass,然后在dump (这个报错也不影响,具体原因不知) (这证书dump下来如果导入的时候设置了密码也没用,验证根本过不了,也不知道有啥用) crypto::capi #修改lsass crypto::certificates /systemstore:local_machine /store:my /export 1 2 (没以administrator权限执行) (以administrator权限执行) 尝试用Rubeus进行申请票据 知道证书密码或者dump证书的时候没设置不可dump可自己设置密码 Rubeus.exe asktgt /user:csadmin /password:123456 /certificate:admin.pfx /domain:joker.local /dc:WIN-0ASLVBO5ID9.joker.local #123456是私钥密码(dump证书的时候设置的) 1 利用过程 理论点 在域内利用 Rubeus.exe申请票据导入到当前进程,然后获取hash用wmiexec.py连接之类的 (清空原有的票据进行测试) Rubeus进行申请票据 获取hash 不在域内利用 将pfx移动到win7,并导入证书。在hosts文件添加域控IP和加入被控制机器的IP和机器名或者DNS改为域控的IP (代理进内网) 利用keke获取ntlm,然后用wmiexec.py连接之类的 tgt::pac /subject:csadmin /castore:current_user /domain:joker.local 1 直接利用mimikatz令牌注入用psexec连接AD CS服务器 (pth ntlm到新进程psexec连接) 常见搜索证书的位置 我们经常可以在邮件,磁盘里面看到证书,我们一般按照后缀来搜索证书的,我们一般关注以下后缀 1、key后缀的,只包含私钥 2、crt/cer 后缀的,只包含公钥 3、csr后缀的,证书申请文件,不包含公钥,也不包含私钥。没啥用 4、pfx,pem,p12后缀的,包含公私钥,我们最喜欢的。 搜索文件后缀的每个人使用的工具不一样,我个人比较喜欢的是SharpSearch,.Net的项目,支持内存加载,可以写成CNA插件。
创建帐户或登录后发表意见