AD Certificate Templates
SpecterOps 完成并作为白皮书发布的研究表明,可以利用配置错误的证书模板进行权限提升和横向移动。根据错误配置的严重性,它可能允许 AD 域上的任何低特权用户只需单击几下即可将其权限提升为企业域管理员的权限!
简介
在之前,我们利用AD证书来进行权限提升和持久化
ADCS是微软的公钥基础设施(PKI)实现。由于AD在组织中提供了一定程度的信任,因此它可以用作CA来证明和委托信任。AD CS用于多种用途,例如加密文件系统,创建和验证数字签名,甚至用户身份验证,这使其成为攻击者的有前途的途径。
我们不但能利用证书的缺陷进行权限提升。就像域持久化当中所说的,我们通过伪造根证书以让我们保持域访问权限,并且不受凭据轮换影响,由于伪造的证书不由CA颁发,所以根本无法将其吊销,只能吊销其被恶意利用的证书。
组织往往太大,无法让管理员手动创建和分发每个证书。这就是证书模板的用武之地。AD CS 的管理员可以创建多个模板,这些模板可以允许具有相关权限的任何用户自行请求证书。这些模板具有指示哪个用户可以请求证书以及所需内容的参数。SpecterOps发现,这些参数的特定组合可能具有令人难以置信的毒性,并被滥用于权限提升和持久访问!
证书模板枚举
我们可以利用sysinternels工具包的certutil来获取证书模板信息
certutil -v -template
我们正在寻找的特定毒性参数集具有以下内容:
- 我们具有请求证书的相关权限或我们拥有具有这些权限的帐户的模板
- 允许客户端身份验证的模板,这意味着我们可以将其用于 Kerberos 身份验证
- 允许我们更改主题备用名称 (SAN) 的模板
相关权限
我们需要具有生成证书请求的权限才能使此漏洞利用起作用。它通常以AD组为单位分配权限
查看所有证书权限通常是明智的,因为它可能会将指向一个可以泄露的帐户的方向。
客户端身份验证
我们应该寻找具有Client Authentication的EKU, 因为该EKU允许我们利用其进行kerberos身份验证, 还有其他方法可以利用证书,但对于这个房间,这个 EKU 将是主要关注点。
指定SAN
我们需要验证模板是否允许我们(证书客户端)指定主题备用名称 (SAN)。SAN 通常类似于我们要加密的网站的 URL。例如:tryhackme.com。但是,如果我们有能力控制 SAN,我们就可以利用证书为我们选择的任何 AD 帐户实际生成 kerberos 票证
获取应设置为 1 的CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 属性标志。这表明我们可以自己指定 SAN
从certutil导出的证书模板当中,我们找到这么一个模板
Template[31]:
TemplatePropCommonName = UserRequest
TemplatePropFriendlyName = User Request
TemplatePropEKUs =
3 ObjectIds:
1.3.6.1.5.5.7.3.2 Client Authentication
1.3.6.1.5.5.7.3.4 Secure Email
1.3.6.1.4.1.311.10.3.4 Encrypting File System
TemplatePropCryptoProviders =
0: Microsoft Enhanced Cryptographic Provider v1.0
TemplatePropMajorRevision = 64 (100)
TemplatePropDescription = User
TemplatePropSchemaVersion = 2
TemplatePropMinorRevision = a (10)
TemplatePropRASignatureCount = 0
TemplatePropMinimumKeySize = 800 (2048)
TemplatePropOID =
1.3.6.1.4.1.311.21.8.13251815.15344444.12602244.3735211.11040971.202.13950390.3651808 User Request
TemplatePropV1ApplicationPolicy =
3 ObjectIds:
1.3.6.1.5.5.7.3.2 Client Authentication
1.3.6.1.5.5.7.3.4 Secure Email
1.3.6.1.4.1.311.10.3.4 Encrypting File System
TemplatePropEnrollmentFlags = 19 (25)
CT_FLAG_INCLUDE_SYMMETRIC_ALGORITHMS -- 1
CT_FLAG_PUBLISH_TO_DS -- 8
CT_FLAG_AUTO_ENROLLMENT_CHECK_USER_DS_CERTIFICATE -- 10 (16)
TemplatePropSubjectNameFlags = 1
CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT -- 1
TemplatePropPrivateKeyFlags = 1010010 (16842768)
CTPRIVATEKEY_FLAG_EXPORTABLE_KEY -- 10 (16)
CTPRIVATEKEY_FLAG_ATTEST_NONE -- 0
TEMPLATE_SERVER_VER_2003<<CTPRIVATEKEY_FLAG_SERVERVERSION_SHIFT -- 10000 (65536)
TEMPLATE_CLIENT_VER_XP<<CTPRIVATEKEY_FLAG_CLIENTVERSION_SHIFT -- 1000000 (16777216)
TemplatePropGeneralFlags = 2023a (131642)
CT_FLAG_ADD_EMAIL -- 2
CT_FLAG_PUBLISH_TO_DS -- 8
CT_FLAG_EXPORTABLE_KEY -- 10 (16)
CT_FLAG_AUTO_ENROLLMENT -- 20 (32)
CT_FLAG_ADD_TEMPLATE_NAME -- 200 (512)
CT_FLAG_IS_MODIFIED -- 20000 (131072)
TemplatePropSecurityDescriptor = O:LAG:S-1-5-21-3330634377-1326264276-632209373-519D:PAI(OA;;RPWPCR;0e10c968-78fb-11d2-90d4-00c04f79dc55;;DA)(OA;;RPWPCR;0e10c968-78fb-11d2-90d4-00c04f79dc55;;DU)(OA;;RPWPCR;0e10c968-78fb-11d2-90d4-00c04f79dc55;;S-1-5-21-3330634377-1326264276-632209373-519)(OA;;CR;0e10c968-78fb-11d2-90d4-00c04f79dc55;;AU)(OA;;CR;a05b8cc2-17bc-4802-a710-e7c15ab866a2;;AU)(A;;CCDCLCSWRPWPDTLOSDRCWDWO;;;DA)(A;;CCDCLCSWRPWPDTLOSDRCWDWO;;;S-1-5-21-3330634377-1326264276-632209373-519)(A;;CCDCLCSWRPWPDTLOSDRCWDWO;;;LA)(A;;LCRPLORC;;;AU)
Allow Enroll LUNAR\Domain Admins
Allow Enroll LUNAR\Domain Users
Allow Enroll LUNAR\Enterprise Admins
Allow Enroll NT AUTHORITY\Authenticated Users
Allow Auto-Enroll NT AUTHORITY\Authenticated Users
Allow Full Control LUNAR\Domain Admins
Allow Full Control LUNAR\Enterprise Admins
Allow Full Control LUNAR\Administrator
Allow Read NT AUTHORITY\Authenticated Users
EKU中允许利用进行身份验证,同时还设置了CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT,并且允许了domain users组进行注册
组合在一起,该模板允许我们可以控制SAN,为任何用户请求证书,并且进行身份验证
生成恶意证书
我们确定了可以利用的证书模板,是时候生成证书请求了。如果您愿意,您可以从命令行执行此步骤
通过mmc进行请求证书和导出证书都相当简单,这里我就不再记录
通过证书进行用户模拟
现在我们使用Rubeus来利用证书请求TGT
有了tgt,我们能做很多事情,我们可以通过各种工具来利用tgt,比如mimikatz
这里我们使用Rubeus修改账户密码
然后使用runas注入凭据,值得注意的是这里不要加/netonly参数,因为我们要进行本地访问而不仅仅只是网络通信需要使用注入的凭据