Yuval Gordon Investigador de Segurança | Microsoft

Os sistemas de identidade - particularmente o Active Directory, que é o principal armazenamento de identidade para a maioria das empresas - estão constantemente a ser atacados por cibercriminosos porque são a porta de entrada para os sistemas de informação críticos de uma organização, incluindo dados valiosos dos clientes.

Aqui, vamos explorar uma tática pouco conhecida da Lista de Controlo de Acesso Discricionário (DACL) que os atacantes podem utilizar para ocultar a pertença a um grupo e possivelmente evitar a deteção. Ao utilizar o atributo ID do Grupo Primário e uma Entrada de Controlo de Acesso (ACE) específica, pode ocultar a associação a um grupo do qual já é membro - sem ter quaisquer permissões no grupo. Este truque interessante não pode funcionar em membros de grupos protegidos, como Admins. do Domínio, mas pode funcionar em membros de grupos normais, como DnsAdmins, que podem ser utilizados para escalar para Admins. do Domínio.

Leitura relacionada

Como o Active Directory lida com a associação normal a grupos

Para compreender plenamente o que esta técnica está a acrescentar, temos primeiro de ter um conhecimento básico da forma como as associações de grupo são tratadas pelo Active Directory. Cada controlador de domínio num domínio armazena uma base de dados do Active Directory (ntds.dit). Em cada ntds.dit existe uma coluna chamada DNT (Distinguished Name Tag), que é como o ID do objecto na base de dados. Quando adicionamos um utilizador a um grupo, o controlador de domínio adiciona uma linha a uma tabela chamada "link_table" que guarda uma ligação entre o DNT do membro (backlink_DNT) e o DNT do grupo (link_DNT).

Bastante simples até agora, mas isso não é tudo o que existe para a associação de grupo. Existe outro atributo chamado PrimaryGroupID (PGID) que especifica o Identificador Relativo (RID) do grupo primário do utilizador, que é a última parte de um SID principal (SID principal = SID do domínio + RID). Por predefinição, este atributo é definido como 513 (Utilizadores do Domínio) para novos utilizadores, 515 (Computadores do Domínio) para novos computadores, 516 (Controladores do Domínio) para controladores do domínio e 521 para Controladores do Domínio só de Leitura. Este atributo também pode ser definido clicando no botão "Definir grupo primário" no separador "Membro de" na ferramenta Utilizadores e computadores do Active Directory, se o acesso de escrita necessário estiver presente no utilizador alvo.

Definir o grupo primário no Active Directory
Definir o grupo primário

Utilizando esta ferramenta, podemos definir o grupo primário apenas para um grupo do qual o utilizador já é membro. O aspecto especial deste atributo - e a razão pela qual os administradores do Active Directory devem estar cientes do mesmo para se protegerem contra abusos por parte de adversários - é que , ao definir o Primary Group ID (PGID), desactiva a ligação de associação entre o grupo e o membro. Por outras palavras, a ligação é removida da link_table acima mencionada.

"Mas como é que isso é possível, Yuval? Quando procuro membros do grupo Administradores do domínio, também vejo utilizadores que têm o Grupo principal definido como administradores do domínio!" Óptima pergunta, leitor!

A maioria das ferramentas que consultam a associação estão realmente a perguntar duas coisas. Vamos imaginar que queremos obter todos os membros do grupo Admins do domínio:

  1. A ferramenta irá consultar o atributo member, o que fará com que o DC verifique a tabela link_table e devolva os objectos que têm uma ligação de membro com o grupo Domain Admins.
  2. A ferramenta irá consultar qualquer objecto que tenha um valor de 512 (RID de Admins. do Domínio) no atributo PrimaryGroupID.

Por que razão é necessário monitorizar a utilização do ID do grupo primário

Ao utilizar o ID do grupo primário, faz com que a associação a um dos grupos seja escrita dentro de um atributo no lado do membro. Para compreender melhor o que pode ser conseguido com esta acção, vejamos isto da perspectiva de um atacante.

Imagine que pretende ocultar a associação de um utilizador a um dos seus grupos. Com a associação normal, pode simplesmente especificar uma entrada de controlo de acesso (ACE) do Active Directory para negar a entrada a todos em "ler associação de grupo". Mas essa abordagem tornará a associação do utilizador quase vazia (o grupo principal continuará a ser mostrado), o que pode parecer suspeito. Além disso, com esta abordagem, ocultou a associação apenas do lado do membro e não do lado do grupo. Assim, se alguém tentar ler um dos membros do grupo, o utilizador continuará a ser listado.

É aqui que o PGID entra em acção: Ao especificar o grupo primário, você pode fazer com que a associação seja listada apenas no lado do membro. Agora, se adicionar um ACE para negar a todos a leitura do PGID no objecto, então uma das associações de grupo está agora oculta - tanto do lado do membro como do lado do grupo.

Como os atacantes podem utilizar o ID de grupo primário para ocultar utilizadores maliciosos

Utilizando uma função simples do PowerShell, pode ocultar o utilizador "haxer" do grupo "atacantes", alterando o PGID para o RID do grupo "atacantes" e, em seguida, adicionando uma leitura negada no PGID.

Associação do lado do utilizador
Associação do lado do utilizador

The primary group now shows <None>. Odd, but still might go unnoticed.

Participação no Active Directory do lado do grupo
Adesão do lado do grupo

O código seguinte pode ser utilizado para ocultar a pertença a um grupo específico do qual o utilizador já é membro, se o utilizador em execução tiver Write DACL (Modify Permissions) no utilizador alvo. Por exemplo, para me ocultar (haxer) do grupo de atacantes do qual já sou membro (RID 2607), utilizei a função mostrada acima. Coloquei o sinalizador "AddWritePGIDToCurrent" como verdadeiro porque não tinha as permissões necessárias - tinha apenas a permissão WriteDACL.

function Hide-Membership {
  param (
    [parameter(Mandatory = $true)]
    [string]$TargetDN,
             
    [parameter(Mandatory = $true)]
    [int]$RID,

    [parameter(Mandatory = $false)]
    [bool]$AddWritePGIDToCurrent = $false
  )

  $target = [ADSI]"LDAP://$TargetDN"
  $identityReference = (New-Object System.Security.Principal.NTAccount("everyone")).Translate([System.Security.Principal.SecurityIdentifier])
  $guid = New-Object Guid "bf967a00-0de6-11d0-a285-00aa003049e2" # Guid of primaryGroupID attribute

  $target.PsBase.Options.SecurityMasks = "Dacl"

  if ($AddWritePGIDToCurrent) {
    $identityReferenceCurrentUser = ([System.Security.Principal.WindowsIdentity]::GetCurrent()).User
    $aceAllow = New-Object System.DirectoryServices.ActiveDirectoryAccessRule @($identityReferenceCurrentUser,"WriteProperty","Allow",$Guid)
    $target.PsBase.ObjectSecurity.AddAccessRule($aceAllow)
    $target.CommitChanges()
  }

  $aceDeny = New-Object System.DirectoryServices.ActiveDirectoryAccessRule @($identityReference,"ReadProperty","Deny",$Guid)

  $target.PsBase.ObjectSecurity.AddAccessRule($aceDeny)
  $target.CommitChanges()
  $target.primarygroupid = $RID 
  $target.CommitChanges()
}
Hide-Membership -TargetDN "CN=haxer,CN=Users,DC=f047-d01,DC=lab" -RID 2607 -AddWritePGIDToCurrent $true

Note que esta técnica não funcionará em membros de qualquer grupo que esteja protegido pelo processo SDPROP e AdminSDHolder, uma vez que estamos a contar com a DACL, que nesse caso será apenas revertida para a DACL de AdminSDHolder a cada hora ou assim.

Detectar a utilização maliciosa do ID do grupo primário para ocultar a filiação

Pode detectar a utilização do PGID para ocultar a associação, monitorizando os ACEs definidos para negar a leitura desta propriedade. Mas isso pode ser uma tarefa difícil sem as ferramentas ou sistemas adequados.

Uma opção é utilizar periodicamente a linha de comandos abaixo para procurar qualquer utilizador com um PGID que não consiga ler. Não tenho conhecimento de qualquer razão legítima para um utilizador ter um PGID inexistente ou ilegível, mas pode acontecer, por isso pode ver alguns falsos positivos.

Get-ADUser -Filter {-not(primaryGroupID -like "*")}

Uma forma mais fácil de monitorizar a utilização maliciosa desta técnica: o Directory Services Protector da Semperis inclui um indicador que monitoriza e alerta sobre os utilizadores com a configuração "Users and computers without readable PGID".

Proteger o Active Directory contra a contínua barragem de ataques pode ser um desafio. No entanto, ao monitorizar continuamente o seu ambiente relativamente às várias formas como os atacantes podem explorar determinadas configurações, pode identificar e corrigir as intrusões antes que estas se tornem violações em grande escala.