ADCS攻击指北-权限提升
nospicy 历史精选 1322浏览 · 2025-03-12 08:27

背景

Active Directory 证书服务 (AD CS) 提供公钥基础结构 (PKI) 功能,该功能支持 Windows 域上的身份和其他安全功能(即文件加密、电子邮件加密和网络流量加密)。它可以为组织的内部使用创建、验证和撤销公钥证书。

根据 Microsoft 的说法,AD CS 是一个服务器角色,它允许构建公钥基础结构 (PKI) 并为组织提供公钥加密、数字证书和数字签名功能”。

AD CS Windows Server 角色是实施 PKI 解决方案。

AD CS 提供所有与 PKI 相关的组件作为角色服务。每个角色服务负责证书基础架构的特定部分,同时协同工作以形成完整的解决方案。

证书中包含的信息将一个主题身份与一个公共/私人密钥对结合起来。之后应用程序在操作时使用该密钥对作为该用户的身份证明。

证书申请流程大致过程:

1客户端产生密钥对

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

3CA检查CSR中的内容,判断是否许可获得证书

4CA通过许可,下发使用CA私钥签名的证书

773a56168e7d0751ec19e7a614ee524b_attach-24c893c6166974aa61b36855fd3535523d8ad427.png


PKI:公钥基础设施,实现证书的产生、管理、存储、分发和撤销等功能 PKINIT:初始认证的公钥加密技术(可以在Kerberos认证的初始阶段中使用)



权限提升

ESC1

配置

有权限去获取证书

能够登记为客户端身份验证或智能卡登录等

CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT开启

image.png


打开证书颁发机构

image.png


证书模板中,右键选择管理

image.png


在这里随便选择一个模板进行配置

image.png


常规中修改一下模板的名字

image.png


使用者名称这里要改成在请求中提供

image.png


扩展的应用策略中,需要有客户端身份验证/智能卡验证

image.png


安全中要有authenticated Users组或者domain users组的注册权限才行,配置完之后需要到回到证书颁发机构中的证书模板

image.png


在证书模板控制台设置好模板之后一定要在这里发布模板,不然是不能成功的!!

image.png


这里就成功发布了ECS1这个模板,接下来用Certipy来进行利用

image.png
ca 是指定ca机构的名字就是上面的CA Name -upn是指定要模拟的用户

输入完之后会生成几个文件,默认会输出txt和json(可以导入BloodHound)

image.png


image.png


这里可以看到存在一个模板有漏洞,模板名字是ECS1,下面可以看到拥有注册权限的用户组包含的Authenticated Users组(所有用户),接下来就是利用该模板申请一个证书

申请证书

image.png


这里就成功申请了一个UPN为administrator的证书,接下来可以将证书中的NTLM Hash提取出来

证书认证

image.png


使用auth进行身份验证,验证的时候会问有哪种验证方式,直接选择默认的UPN即可,接着就会导出NTLM hash



ESC2

配置

其他配置与ESC1一样

只有扩展中设置有所不同证书模板定义了 Any Purpose 类型的 EKU,Any Purpose 指证书可以用于任何目的

image.png


Certipy来搜索存在漏洞的模板

image.png


image.png


这里的Any Purpose必须为True,接着就需要去申请证书

漏洞利用

image.png




成功申请到证书之后需要用证书去申请高权限证书

image.png


然后就可以用这个高权限证书去获取hash了

ESC3

配置1

其他配置与ESC1一样

只有扩展中设置有所不同,证书模板定义了 证书申请代理的 EKU

image.png


配置2

其他配置与ESC1一样

发布要求修改如下



image.png


使用Certipy来查找带有漏洞的模板

image.png


image.png


EKU的参数为Certificate Request Agent为ESC3特征

配置一利用

利用方式和ECS2的方法是一样的

image.png


image.png


配置二利用

需要用到certify.exe



ESC4

配置

只修改一处安全组默认完全控制,拥有写入权限

工作站身份认证模板

image.png


需要有写入的权限,用Certipy来查看

image.png


漏洞利用

使用Certipy进行利用

image.png


之后去查看修改之后的权限

image.png


申请修改后的模板

接着利用修改之后的模板去申请证书

image.png


模板恢复

最后将证书模板权限恢复回来

image.png


image.png




ESC5

简介

该方法利用的前提是域之间相互信任且都搭建了AD CS服务器,然后使用LOCAL SYSTEM权限添加ESC1脆弱证书模板,并利用活动目录的同步特性将脆弱模板发布到林根域,最后可利用发布的脆弱模板申请企业管理员证书实现权限提升。



在子域通过ADSI查看ADCS的属性,可以看到当前连接到的是a.moon.lab子域的ldap,查看public key services发现信息是moon.lab根域的配置,通过同步的特性,在子域的ADCS上配置存有漏洞的模板,再去申请同步之后的证书来达到权限提升

image.png


配置

点击pks的属性查看权限,发现只有system和企业管理员有完全控制权,因此需要通过本地system权限去进行修改

image.png


需要先打开ADSI配置权限继承,需要设置一个这个对象及全部后代,后面需要用到

image.png


之后打开证书颁发模板,添加一个ESC1的证书

image.png


如果提示找不到目录之类的,就用ADSI修改一下权限

image.png


然后再去根域看,会发现刚刚创建的模板已经同步过去了

image.png


然后就去Enrollment Services中的Certificate Templates值中添加刚刚新建的模板(这里就需要上面修改system继承权限之后才能添加,否则是无法添加)

image.png


然后查看根域的证书发布发现ESC1已经发布了

image.png


漏洞利用

后面就是正常的利用

image.png


这里失败用schannel的方法就行了

image.png




ESC6

配置

企业 CA 授予低权限用户请求权限(默认);

模板中 CA 管理员审批未启用(默认);

模板中不需要授权的签名(默认);

CA+EDITF_ATTRIBUTESUBJECTALTNAME2

image.png


利用方式和ESC1相同,不同在于可以选择任意一个带有客户端身份认证的模板

用Certipy来探测

image.png


漏洞利用

显示存在ESC6漏洞,接下来直接申请一个自带的模板即可

image.png


关闭EDITF_ATTRIBUTESUBJECTALTNAME2命令

ESC7

配置

当用户或者所属组拥有管理CA权限

域普通用户所属组一般包括Domain Users、Authenticated Users Authenticated Users

image.png


Domain Users

image.png


Certipy探测漏洞

image.png


漏洞利用

因为域内普通成员可以具有管理CA的权限,所以给用户添加一个管理证书的权限

image.png


image.png


接着查看颁发证书

image.png


如果SubCA模板没有启动,可以用以下命令:

image.png


接着请求这个SubCA模板,会请求失败,这里主要是要记录id

image.png


检索颁发证书

通过管理CA和管理证书,可以用issue-request发出失败的证书请求(这一步就需要上面的id)

image.png


接着检索已颁发的证书

image.png


ESC8

ADCS网页认证地址

查看CA机器

image.png


命令行显示

image.png


ntlmrelayx.py将CA设置为中继目标

image.png


强制认证

结合场景,这里还可以使用printerbug、PetitPotam、DFSCoerce等进行强制认证

image.png


攻击之后去看监听,会发现返回了一个证书(base64格式)

image.png


注入票据

image.png


rubeus提示错误,用gettgtpkinit.py试一下

image.png


根据 Microsoft 官方文档 “4771(F): Kerberos pre-authentication failed” 的描述,该报错显示 KDC 不支持 PADATA 类型(预认证数据), Kerberos 预身份验证失败。

每次密钥分发中心未能发出 Kerberos 票证授予票证(TGT)时,都会生成此事件。当域控制器没有安装用于智能卡身份验证的证书(例如,使用 “域控制器” 或 “域控制器身份验证” 模板)、用户密码已过期或提供了错误的密码时,可能会出现此问题。



另一环境

image.png


请求到了证书之后用gettgtpkinit.py来申请

image.png


成功获取到ccache文件

Pass The Certificate(Schannel)

先用Certipy将前面的证书导出key和crt

image.png


接着用passthecert.py来设置RBCD进行攻击

RBCD

image.png


创建好之后需要设置RBCD属性

image.png


可以看到DC02$的msDS-AllowedToActOnBehalfOfOtherIdentity属性中包含了cert$账户,接下来就是用getST.py获得票据

GetST

image.png


随后导入票据进行横向移动

image.png


环境有点问题,移动失败,这里将ccache转换成kirbi再用mimikatz or rubeus进行票据传递

PTT

image.png


接着用mimikatz进行PTT

image.png


image.png




ESC9

配置

注册表默认是不需要设置,先设置一个证书模板

image.png


需要注意的是在使用者名称这里,只能选择UPN,其他不用勾选

image.png


注册也要给上,然后接着打开ADSI编辑器去设置

image.png


需要改成配置然后进去打开services->public keys services->certificate templates

image.png


找到刚刚设置的ESC9的模板然后设置属性

image.png


将这里的msPKI-Enrollment-Flag设置为524288,接着要去设置对用户的ACL

image.png


ADSI打开这个用户,属性设置

image.png


直接在安全设置中添加一个账户对他的全部控制,接着就用certipy去探测,下面就说明是配置成了

image.png


漏洞利用

通过设置影子账户来恢复hash

image.png


获得到test的hash之后需要修改test账户的UPN属性为administrator(注意,这里将upn更新为administrator并不违反upn的唯一性约束,upn通常采用电子邮件地址的格式,默认情况下ad域会给用户分配一个与其samaccountname相同的upn,如果你的账户名为test,那么默认的upn则是test@redteam.com)

image.png


更新好UPN之后就去申请证书

image.png


这里就成功获取到了一个administrator的证书了,接着需要将test的UPN给恢复回去

image.png


最后再去申请前面获取的administrator的证书,由于上面获取证书的过程并没有给域,因此需要加个参数指定一下域

image.png




ESC10

两种场景

ESC10有2个利用场景,分别是不同的配置

1、当StrongCertificateBindingEnforcement被设置为0的时候,所有模板都会忽略szOID_NTDS_CA_SECURITY_EXT,所以其利用步骤与esc9一致,只不过在申请证书时可以随意选择一个支持客户端身份验证eku的证书模板。

2、阅读白皮书,我们知道AD域默认支持两种协议进行证书身份验证:Kerberos和Schannel,第二个利用场景我们关注的是schannel。在kb5014754补丁后的环境中,微软通过向注册表添加了新的注册表项,关于schannel的子项位置在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel:CertificateMappingMethods,该值控制我们使用证书认证时的映射方法,并提出了证书强弱用户映射的概念。在kb5014754之前,该项的默认值为0x1F,在补丁之后其值默认为0x18,当其值置为0x18时,只支持s4u2slef证书映射及显式的s4u2self证书映射,这是两种更安全的强用户身份映射方法,但这可能会引起域内的一些认证问题,微软也建议将其置为0x1F,当其值为默认时,它支持3种弱用户映射的方法,其中正好包含使用upn进行弱映射。

第一种

这个和ESC9利用是一样的,只不过不同的是只需要有一个完全控制的账户就可以,不需要额外设置一个模板,请求一个正常的模板即可

image.png


改好之后直接申请,不需要指定特定的模板

image.png


第二种

需要先配置一下注册表,要新建一个CertificateMappingMethods的DWORD项,设置值为4(UPN)

image.png


利用和前面基本一样,有2个要改一下的,第一个是修改的UPN

image.png


然后去申请一个证书

image.png


接着再将UPN修改回来

image.png


最后用证书请求LDAP

image.png


然后可以设置一个RBCD进行后续攻击

image.png


image.png


ESC11

配置

需要在域控上将强制加密关闭

image.png


查找发现存在ESC11

image.png


漏洞利用

通过ntlmrealy来中继利用

image.png


之后随便使用打印机或者PetitPotam都行

image.png




ESC13

配置

创建一个组,需要是通用组,且组内不能有任何成员

image.png


接着再创建一个普通的用户,不需要添加到任何组,保留默认域成员组就行

image.png


接着去配置证书模板,用工作站模板进行复制,使用名次要选UPN去掉DNS

image.png


在扩展颁发策略里面新建一个策略

image.png


创建时候默认即可

image.png


还需要给前面新建的用户添加一下注册权限

image.png


接着去设置一下组权限给一个DCSYNC用于演示

image.png


在打开到public key services里面的OID,找到前面新建的策略

image.png
然后修改msDS-OIDToGroupLink属性为我们添加的组

image.png




漏洞利用

https://github.com/sploutchy/Certipy/tree/main 的certipy来探测,能探测出ESC13

image.png


接着去申请证书

image.png


注册到之后去获取一下票据

image.png


接着导入票据成功导出hash

image.png




ESC15

配置

利用条件:

1用户注册

2schema版本为1(默认)

3subjectName为请求中提供(默认)



image.png


在证书模板处,查看Web Server模板

image.png


添加注册权限,只能修改Web Server,不能添加,添加schema 版本就是2

利用

和ESC1方法差不多,只不过多了个添加客户端认证

image.png


紧接着去认证

image.png


会提示认证失败,因为这个证书不支持kerberos协议,所以就需要用ldap方式

image.png




微信公众号:赛博海妖

0 条评论
某人
表情
可输入 255

没有评论