Get-GPODelegation
Hi, I know you guys mentioned this before, but I've not this implemented. I wrote Get-GPODelegation that finds users with write permissions on Group Policy objects, for a potential privilege escalation path. As requested, moved into dev branch.
This commit is contained in:
parent
095988269b
commit
2501e8e912
|
|
@ -18764,6 +18764,66 @@ Custom PSObject with translated domain API trust result fields.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get-GPODelegation
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Finds users with write permissions on GPO objects which may allow privilege escalation within the domain.
|
||||||
|
|
||||||
|
Author: Itamar Mizrahi (@MrAnde7son)
|
||||||
|
License: GNU v3
|
||||||
|
Required Dependencies: None
|
||||||
|
Optional Dependencies: None
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
|
||||||
|
.PARAMETER GPOName
|
||||||
|
The GPO display name to query for, wildcards accepted.
|
||||||
|
|
||||||
|
.PARAMETER PageSize
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-GPODelegation
|
||||||
|
Returns all GPO delegations in current forest.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-GPODelegation -GPOName
|
||||||
|
Returns all GPO delegations on a given GPO.
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param (
|
||||||
|
[String]
|
||||||
|
$GPOName = '*',
|
||||||
|
|
||||||
|
[ValidateRange(1,10000)]
|
||||||
|
[Int]
|
||||||
|
$PageSize = 200
|
||||||
|
)
|
||||||
|
|
||||||
|
$Exclusions = @("SYSTEM","Domain Admins","Enterprise Admins")
|
||||||
|
|
||||||
|
$Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
|
||||||
|
$DomainList = @($Forest.Domains)
|
||||||
|
$Domains = $DomainList | foreach { $_.GetDirectoryEntry() }
|
||||||
|
foreach ($Domain in $Domains) {
|
||||||
|
$Filter = "(&(objectCategory=groupPolicyContainer)(displayname=$GPOName))"
|
||||||
|
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
|
||||||
|
$Searcher.SearchRoot = $Domain
|
||||||
|
$Searcher.Filter = $Filter
|
||||||
|
$Searcher.PageSize = $PageSize
|
||||||
|
$Searcher.SearchScope = "Subtree"
|
||||||
|
$listGPO = $Searcher.FindAll()
|
||||||
|
foreach ($gpo in $listGPO){
|
||||||
|
$ACL = (([ADSI]$gpo.path).ObjectSecurity).Access | ? {$_.ActiveDirectoryRights -match "Write" -and $_.AccessControlType -eq "Allow" -and $Exclusions -notcontains $_.IdentityReference.toString().split("\")[1] -and $_.IdentityReference -ne "CREATOR OWNER"}
|
||||||
|
$GpoACL = New-Object psobject
|
||||||
|
$GpoACL | Add-Member Noteproperty 'ADSPath' $gpo.Properties.adspath
|
||||||
|
$GpoACL | Add-Member Noteproperty 'GPODisplayName' $gpo.Properties.displayname
|
||||||
|
$GpoACL | Add-Member Noteproperty 'IdentityReference' $ACL.IdentityReference
|
||||||
|
$GpoACL | Add-Member Noteproperty 'ActiveDirectoryRights' $ACL.ActiveDirectoryRights
|
||||||
|
$GpoACL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
#
|
#
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue