ADCS证书服务

前言:实战碰到了,这边开始学习下下ADCS证书服务以及相关的攻击链路,这边主要是先了解ADCS证书服务的概念,关于攻击链路放在其他的笔记里面进行学习。

参考文章:https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
参考文章:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-pkca/4e5fb325-eabc-4fac-a0da-af2b6b4430cb
参考文章:https://forum.butian.net/share/1578
参考文章:https://kvazar.wordpress.com/wp-content/uploads/2008/12/unencrypted.pdf

什么是公钥基础设施PKI

公钥基础设施PKI (Public Key Infrastructure) 是一种用于创建、管理、分配、使用、存储和撤销数字证书的机制。

这些数字证书可以用于在公开网络上验证个体的身份,以及加密和解密数据。

公钥基础设施主要组件包括:

  • 证书颁发机构(CA):颁发、更新和撤销证书。

  • 注册机构(RA):处理证书申请,执行某些级别的身份验证,然后指示证书颁发机构(CA)颁发或撤销证书。

  • 证书:包含公钥以及其他身份信息。

什么是PKINT

参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-pkca/4e5fb325-eabc-4fac-a0da-af2b6b4430cb

PKINIT是Kerberos协议的一个扩展,它允许使用公钥密码学进行初始用户身份验证。这样可以避免使用传统的用户名/密码凭据,而是使用由可信任的证书颁发机构颁发的数字证书来进行身份验证。

这边还需要知道一个知识点,应用程序在操作时使用该证书中的密钥对作为该用户的身份证明,那么也就是说我们如果有该证书中的密钥对,那么我们就获取该用户的NTLM哈希,具体情况如下

在微软的文档里有一段话"当使用PKCA时,KDC在权限属性证书(PAC)中会返回用户的NTLM",也就是说当使用证书进行Kerberos认证的时候,返回票据的PAC包里面还有NTLM票据,故可以用于获取用户NTLM Hash。

关于AD CS证书服务

AD CS(Active Directory Certificate Services) 是 Microsoft 提供的 PKI(Public Key Infrastructure)实现,构建在 Active Directory 技术上。它主要用于在 Windows 域环境中创建、分发和管理数字证书。

AD CS支持6种角色服务

  • 证书颁发机构:该组件的主要目的是颁发证书、撤销证书以及发布授权信息访问(AIA)和撤销信息。

  • 联机响应程序:可以使用该组件来配置和管理在线证书状态协议(OSCP)验证和吊销检查。在线响应程序解码特定证书的吊销状态请求,评估这些证书的状态,并返回具有请求的证书状态信息的签名响应。

  • 网络设备注册服务(NDES):通过该组件,路由器、交互机和其他网络设备可从ADCS获取证书

  • 证书颁发机构Web注册:该组件提供了一种用户使用未加入域或运行Windows以外操作系统的设备的情况下颁发和续订证书的方法。

  • 证书注册WEB服务(CES):该组件用于运行Windows的计算机和CA之间的代理客户端。CES使用户、计算机或应用程序能够通过使用Web服务连接到CA:

    • 请求、更新和安装办法的证书
    • 检索证书吊销列表(CRL)
    • 下载根证书
    • 通过互联网或跨森林注册
    • 为属于不受信任的ADDS域或未加入域的计算机自动续订证书
  • 证书注册策略Web服务:该组件使用户能够获取证书注册策略信息。结合CES,它可以在用户设备未加入域或无法连接到域控的场景下实现基于策略的证书服务

ADCS证书服务搭建

zpchcbd.com 192.168.75.202

adcs.zpchcbd.com 192.168.75.156

在服务器管理器面板中中选择"添加角色和向导",这里主要注意的两个地方就是如下

这边选择的是Active Directory证书服务,如下图所示

这边勾选证书颁发机构Web注册,如下图所示

安装成功的结果如下所示

这边继续来配置对应的ADCS服务配置

这边配置的加密选项为RSA2048bit

接着指定CA服务器的名称

配置成功的结果如下所示

这边可以通过其他域机器来执行命令certutil来检测域林中存在的证书服务器,如下所示,可以看到WIN-6R2MMNGJLI3.zpchcbd.com存在证书服务

同样也可以通过certutil -config - -ping来进行定位

如何注册证书

  • 客户端创建公钥和私钥

  • 客户端向企业CA服务器发送证书请求 (CSR)

  • CA会判断,证书模板是否存在?证书模板是否允许 CSR 中的设置?用户是否允许注册证书?

  • 若符合上面条件CA 生成证书并使用 CA 私钥对其进行签名

其中证书可以通过以下的几种方式注册:

  • 通过Windows客户端证书注册协议(MS-WCCE)

  • 通过ICertPassage远程协议(MS-ICPR)

  • 在ADCS开启了对应Web服务的情况下,使用Web服务注册

  • 在服务器安装了对应服务时,通过证书注册服务(CES)注册

  • 在服务器安装了对应服务时,使用网络设备注册服务

手动申请证书

  • 客户端产生密钥对

生成1024bit的rsa私钥

openssl genrsa -out server.key 1024

生成对应上面rsa私钥对应的公钥

openssl rsa -in server.key -pubout -out public.key

  • 客户端向企业CA服务器生成证书请求 (CSR)

openssl req -new -key server.key -out server.csr

接着提交server.scr证书请求,这边访问ADCS服务器的web服务(前提安装的时候支持WEB服务),如下图所示,将上面的证书请求内容base64编码后输入进去即可

控制台申请证书

域内机器可以使用certmgr.msc来申请用户证书 / certlm.msc来申请机器证书。

certtmpl.msc可以打开证书模板控制台 / certsrv.msc可以打开证书颁发机构

certmgr.msc申请证书,这边创建个人证书,点击申请新证书,如下图所示

然后打开证书颁发机构来进行如下,可以看到对应的颁发证书

LDAP中的ADCS信息

ADCS在ldap容器中位置默认存储于CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>

比如要观察当前ADCS服务器中的所有证书模板,这边可以查看CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=zpchcbd,DC=com,<default domain> [WIN-MG4C5QO445H.zpchcbd.com],这边如果想要自动化检测ADCS的证书模板,那么就可以遍历一次该目录下的证书模板即可

证书PKINIT在Kerberos的认证流程抓包分析

在原来的kerberos认证协议中,如下图所示

可以看到在AS-REQ认证部分是通过用户HASH加密时间戳来进行Kerberos预身份认证的。

而ADCS服务可以和ADDS紧密搭配使用,那么自然会猜想,能否利用证书来进行Kerberos预身份认证呢?

其实前面提到过,应用程序在操作时使用该证书中的密钥对作为该用户的身份证明,那么也就是说我们如果有该证书中的密钥对,那么我们就获取该用户的NTLM哈希。

答案是可以的,在RFC4556 Public Key Cryptography for Initial Authentication in Kerberos (PKINIT) 中引入了对Kerberos预身份验证的公钥加密技术支持,可以使用证书的私钥来进行Kerberos预身份认证。

PKINIT协议为kerberos协议的一个扩展协议,可通过X.509证书来获取kerberos的TGT票据,PKINIT与kerberos差别主要在AS阶段,正常kerberos认证一种是基于对称密钥加密的认证方式,而PKINIT是基于非对称密钥加密的认证方式。

证书认证AS-REQ

如图所示,使用Rubeus执行如下命令用证书administrator.pfx进行Kerberos认证。

certipy auth -pfx aliguai.pfx -dc-ip 192.168.75.202

  • 首先可以看到在AS-REQ认证流程中,跟正常kerberos认证的不同点是证书认证AS-REQ在AS-REQ中是客户端将当前证书里面的私钥加密的时间戳来进行发送

  • 接着在AS-REP,KDC通过CA证书链验证客户端的身份,并获取到客户端证书里面的公钥,因为PKINIT是基于非对称密钥加密的认证方式,所以这边的话是用公钥解密时间戳,并判断时间戳是否符合规定时间,若上述身份验证通过,并且时间戳符合规则则返回TGT与一个会话密钥(其中会话密钥使用Diffie-Hellman Key Delivery/Public Key Encryption Key Deliveryq其中的一个算法生成),该会话密钥也就是在正常kerberos中交互的sessionkey。

posted @   zpchcbd  阅读(608)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示