🏢Active DirectoryAccountsPrivileged AccessGroups

Contas Desativadas Expiradas Bloqueadas Grupos Privilegiados AD: Por Que os Direitos de Admin Persistem

Uma conta de admin desativada é uma etapa de offboarding esquecida. Uma bloqueada pode significar um ataque de password spray em andamento. Veja como encontrar as duas, além do resíduo adminCount órfão entre elas.

Younes AZABARPor Younes AZABAR10 min de leitura
Contas Desativadas Expiradas Bloqueadas Grupos Privilegiados AD: Por Que os Direitos de Admin Persistem

Contas desativadas expiradas bloqueadas grupos privilegiados AD é exatamente a lacuna que este artigo cobre: uma conta cujo próprio estado — desativada, expirada ou bloqueada — indica que ela não deveria mais ter acesso, mas que continua formalmente como membro de Domain Admins, Enterprise Admins ou de outro grupo Tier 0. Uma conta de admin desativada é quase sempre uma etapa de offboarding esquecida. Uma expirada é uma concessão de acesso com prazo definido que ninguém removeu do grupo quando o prazo terminou. Uma bloqueada pode ser apenas um chamado de helpdesk — ou pode ser o rastro final de um ataque de password spray ainda em andamento. Este artigo cobre os três estados, além de seu primo próximo, o flag adminCount órfão, e mostra como encontrá-los e corrigi-los.

ℹ️

ℹ️ Observação: este é um problema diferente das contas privilegiadas obsoletas (privilégio que ninguém usou há muito tempo, avaliado pela idade do último logon) e do desvio de acesso privilegiado (privilégio que volta a se acumular com o tempo por meio de aninhamento e ACLs). Aqui a própria conta está em um estado claramente inválido — desativada, expirada ou atualmente bloqueada — enquanto continua sendo formalmente membro de um grupo Tier 0.

Contas Desativadas Expiradas Bloqueadas Grupos Privilegiados AD: Os Quatro Estados

Cada uma dessas quatro condições tem uma definição precisa em nível de atributo, e cada uma tem sua própria forma de acabar silenciosamente dentro de um grupo privilegiado sem que ninguém tenha decidido isso.

EstadoAtributo do ADCausa típicaRisco principal se ignorado
DesativadaBit ACCOUNTDISABLE (0x2) de userAccountControlOffboarding parou em "desativar", nunca removida do grupoPrivilégio total retorna instantaneamente se a conta for reativada
ExpiradaaccountExpires (FILETIME no passado)Acesso com prazo definido; data de expiração definida em vez da remoção do grupoAssociação persiste silenciosamente além da data de término pretendida
BloqueadalockoutTime / msDS-User-Account-Control-ComputedTentativas de logon falhas — senha digitada errada ou ataque ativoPode ser o rastro final de uma execução de password spray em andamento
adminCount órfãoadminCount=1 sem associação protegida atualO SDProp não reverte o flag quando a associação é removidaACL obsoleta e ruído de auditoria que mascaram onde o privilégio realmente está

A Conta Desativada

O bit ACCOUNTDISABLE (0x2) é definido em userAccountControl; a conta não pode fazer logon interativo. (Microsoft Learn: UserAccountControl property flags) Contas desativadas se acumulam porque os checklists de offboarding geralmente param em "desativar a conta". Isso bloqueia o logon, mas não faz nada quanto à associação de grupo — o SID permanece em Domain Admins. Qualquer ferramenta de attack path que mapeia "quem poderia se tornar domain admin" — BloodHound, PingCastle ou também o EtcSec — ainda conta essa conta, porque esses grafos são construídos sobre associação de grupo, não sobre userAccountControl. Se a conta for reativada — por engano, por um chamado de ITSM atrasado, ou por um atacante que obteve direitos para alternar um único bit —, seu privilégio antigo volta a valer imediatamente, sem nenhum trabalho adicional.

A Conta Expirada

accountExpires contém um valor diferente de 0 ou do sentinel "nunca expira" 9223372036854775807, e esse valor (um FILETIME do Windows) está no passado. (Microsoft Learn: Account-Expires attribute) Esse atributo é frequentemente usado para contas de terceirizados ou de elevação temporária com data de término planejada. O KDC se recusa a emitir um ticket-granting ticket após essa data, então a conta para de funcionar para logon interativo ou de rede — mas accountExpires também não altera a associação de grupo. Se a intenção real era "o acesso de admin desta pessoa termina nesta data", definir uma data de expiração sem também remover a associação de grupo só bloqueia a porta da frente.

A Conta Bloqueada

lockoutTime é diferente de zero, e a duração de bloqueio da conta ainda não passou. O Windows nunca define um bit UF_LOCKOUT no valor armazenado de userAccountControl; o estado real de bloqueado/desbloqueado é exposto pelo atributo construído msDS-User-Account-Control-Computed. (MS-ADLS: lockoutTime, MS-ADTS: msDS-User-Account-Control-Computed) Diferente de desativar ou expirar, o bloqueio não é uma decisão administrativa — é um efeito colateral de tentativas de logon falhas atingindo a política de bloqueio de conta. Uma conta privilegiada pode estar bloqueada porque alguém realmente digitou a senha errada, ou porque está sendo alvo no momento: uma execução de password spray ou brute-force que alcança uma conta privilegiada e está prestes a ter sucesso pode produzir exatamente essa mesma assinatura pouco antes de autenticar.

O Flag adminCount Órfão

adminCount=1 marca membros de grupos protegidos pelo AdminSDHolder, mas uma conta pode carregar esse flag mesmo sem mais pertencer a nenhum grupo protegido — o caso inverso: não é privilégio vivo com uma conta morta, mas um marcador morto deixado por um privilégio que já foi removido. O mecanismo por trás disso é o processo SDProp, que roda no controlador de domínio que detém a role de PDC Emulator (por padrão, cerca de uma vez por hora), percorre a associação dos grupos protegidos, define adminCount=1 em cada membro, copia a ACL do AdminSDHolder para o objeto e desativa a herança de ACL. (Microsoft Community Hub: Five common questions about AdminSDHolder and SDProp) Quando a conta é removida depois do grupo protegido, o SDProp simplesmente para de tocá-la — ele não reverte adminCount para 0 nem restaura a herança. O flag e a ACL desconectada ficam para trás como um marcador silencioso e aparentemente permanente de um privilégio que a conta não tem mais.

Detecção

Atributos e Consultas PowerShell

Consultas diretas de associação com o módulo AD PowerShell revelam rapidamente as quatro condições:

# Contas desativadas ainda em um grupo privilegiado
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
    Get-ADUser -Properties Enabled, userAccountControl |
    Where-Object { -not $_.Enabled }

# Contas expiradas (accountExpires definido e no passado — 0 e o sentinel
# de int64 máximo significam ambos "nunca expira")
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
    Get-ADUser -Properties accountExpires |
    Where-Object {
        $_.accountExpires -gt 0 -and
        $_.accountExpires -lt 9223372036854775807 -and
        [datetime]::FromFileTime($_.accountExpires) -lt (Get-Date)
    }

# Contas atualmente bloqueadas, cruzadas com grupos privilegiados
Search-ADAccount -LockedOut -UsersOnly |
    Where-Object { (Get-ADPrincipalGroupMembership $_.SamAccountName).Name -contains "Domain Admins" }

# adminCount=1 sem associação atual em um grupo protegido (flag órfão)
Get-ADUser -LDAPFilter "(adminCount=1)" -Properties adminCount, memberOf, Enabled

Filtro LDAP para Ferramentas de Bind Direto

Para ferramentas que não passam pelo módulo AD PowerShell, a verificação do bit de desativado usa a OID LDAP_MATCHING_RULE_BIT_AND contra userAccountControl:

(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))

Isso corresponde à própria semântica de AND bit a bit do AD: a cláusula só é satisfeita se o segundo bit (0x2, ACCOUNTDISABLE) estiver definido no valor armazenado. (MS-ADTS: LDAP_MATCHING_RULE_BIT_AND)

Event IDs do Windows para Correlacionar

Esses eventos são registrados nos controladores de domínio sob a auditoria de Account Management — veja a referência completa de event IDs de monitoramento do Active Directory para a configuração de logging mais ampla:

Event IDGatilhoO que correlacionar
4725Uma conta de usuário foi desativadaEla ainda era membro de um grupo privilegiado nesse momento?
4740Uma conta de usuário foi bloqueadaNome do computador/estação de trabalho chamador — um padrão de spray aparece como várias contas diferentes sendo bloqueadas pela mesma origem em uma janela curta
4767Uma conta de usuário foi desbloqueadaQuem realizou o desbloqueio, e quão rápido depois do 4740
4738Uma conta de usuário foi alteradaCobre alterações em accountExpires — uma data de expiração adiada ou removida em uma conta privilegiada
4728Membro adicionado a um grupo global com segurança habilitadaDomain Admins é um grupo global; este é o evento para novos membros
4756Membro adicionado a um grupo universal com segurança habilitadaEnterprise Admins e Schema Admins são grupos universais, com escopo em toda a floresta

Fontes: Event ID 4725, Event ID 4740, Event ID 4767, Event ID 4738, Event ID 4728, Event ID 4756.

⚠️

⚠️ Aviso: um número incomum de bloqueios em várias contas em uma janela curta de tempo — privilegiadas ou não — é uma assinatura documentada de password spray, não ruído de rotina. Trate um bloqueio que atinge especificamente uma conta Tier 0 como um alerta de prioridade mais alta do que o mesmo evento em um usuário padrão.

Remediation

💡

💡 Vitória Rápida: execute as quatro consultas acima contra cada grupo protegido pelo AdminSDHolder hoje mesmo. É uma verificação de cinco minutos que a maioria dos ambientes nunca rodou de forma programada. Para o processo recorrente mais amplo em que isso deve se encaixar, veja como auditar a segurança do Active Directory.

Para Contas Desativadas e Expiradas

  1. Torne a verificação recorrente, não apenas parte do offboarding. Um processo de desligamento que desativa a conta quando alguém sai não vai pegar uma data de expiração que já passou há seis meses. Programe as consultas acima, ou uma regra equivalente de SIEM/EASM, para rodar regularmente.
  2. Vincule o offboarding à remoção do grupo, não apenas à desativação da conta. Desativar bloqueia o logon; não revoga a associação de grupo que os grafos de attack path, direitos delegados e parte da lógica de autorização de aplicações ainda leem. Quando o acesso deve terminar, remova a conta explicitamente do grupo privilegiado.
  3. Trate datas de expiração como um gatilho para revisão de associação, não como um substituto dela. Se uma conta foi incluída com prazo definido em um grupo privilegiado, defina um lembrete correspondente para remover a associação na data de expiração ou antes dela — não confie apenas em accountExpires para representar "esta pessoa não é mais admin".

Para Contas Privilegiadas Bloqueadas

Como desbloquear uma conta é uma operação barata, rápida e delegável — uma permissão do AD distinta de redefinir a senha —, uma conta Tier 0 bloqueada está a apenas um desbloqueio de voltar a ser totalmente utilizável. Direcione o Event ID 4740 em membros de grupos protegidos para um caminho de alerta próprio, separado do ruído rotineiro de bloqueio do helpdesk, e confirme que o desbloqueio (Event ID 4767) veio de um administrador esperado antes de tratar o incidente como encerrado.

Para Flags adminCount Órfãos

Para cada conta com adminCount=1, mas sem associação atual em um grupo protegido, confirme que ela genuinamente não é mais privilegiada — verifique também as associações aninhadas, não apenas as diretas, já que a remoção de um grupo atribuído diretamente ainda pode deixar privilégio indireto no lugar. Depois de confirmar que está limpa, redefina adminCount e reative a herança de ACL em vez de deixar o flag obsoleto e a ACL desconectada no lugar; deixá-los assim compromete todas as futuras auditorias de permissões nesse objeto.

Como o EtcSec Detecta Isso

O EtcSec verifica as quatro condições em todas as auditorias de Active Directory: DISABLED_ACCOUNT_IN_ADMIN_GROUP e EXPIRED_ACCOUNT_IN_ADMIN_GROUP sinalizam membros de grupos privilegiados cujo próprio estado de conta já deveria ter bloqueado o acesso, LOCKED_ACCOUNT_ADMIN revela contas privilegiadas atualmente bloqueadas para o cenário de password spray descrito acima, e ADMIN_COUNT_ORPHANED captura o caso inverso — o marcador residual adminCount=1 deixado para trás depois que uma associação protegida já foi removida.

ℹ️

ℹ️ Observação: o EtcSec verifica automaticamente esse conjunto de vulnerabilidades em todas as auditorias de AD. Execute uma auditoria gratuita para verificar seu ambiente.

Explore as paginas de identidade que sustentam este tema