Skip to content

PowerView — Enumerating AD Groups

Enumerar todos los grupos del dominio

c
# Listar todos los grupos
Get-DomainGroup -Properties Name
Get-DomainGroup | select name

# Contar grupos
(Get-DomainGroup).count

# Ver ayuda de Get-DomainGroupMember en SharpView
.\SharpView.exe Get-DomainGroupMember -Help

Grupos de alto valor a identificar durante la enumeración: Exchange Trusted Subsystem, Exchange Windows Permissions, Protected Users, LAPS Admins, Help Desk, Security Operations, Backup Operators, Print Operators, Account Operators, Server Operators.

La presencia de grupos de Exchange indica que hay un servidor Exchange en el entorno, que suele tener privilegios elevados sobre el dominio.


Miembros de un grupo específico

c
# Miembros directos
.\SharpView.exe Get-DomainGroupMember -Identity 'Help Desk'
Get-DomainGroupMember -Identity 'Help Desk'

# Miembros recursivos (incluye grupos anidados)
Get-DomainGroupMember -Identity 'Domain Admins' -Recurse

# Miembros de un grupo en otro dominio
Get-DomainGroupMember -Identity 'Administrators' -Domain freightlogistics.local

Grupos protegidos (adminCount=1)

c
.\SharpView.exe Get-DomainGroup -AdminCount
Get-DomainGroup -AdminCount | select name

Los grupos con adminCount=1 están protegidos por AdminSDHolder. Sus miembros tienen ACLs propagadas automáticamente por el sistema y son los objetivos más críticos en un dominio.


Grupos con manager asignado (Managed Security Groups)

c
# Listar grupos con manager
Find-ManagedSecurityGroups | select GroupName

# Ver detalles del manager de cada grupo
Get-DomainManagedSecurityGroup

Si un grupo tiene manager asignado y ese manager tiene GenericWrite o WriteDacl sobre el grupo, controlando al manager puedes agregarte a ese grupo y heredar sus privilegios.

Verificar qué permisos tiene el manager sobre el grupo

c
# Convertir nombre del manager a SID
$sid = ConvertTo-SID joe.evans

# Ver ACLs del grupo donde es manager
Get-DomainObjectAcl -Identity 'Security Operations' | ?{ $_.SecurityIdentifier -eq $sid}

Si ves GenericWrite en ActiveDirectoryRights puedes modificar la membresía del grupo con ese usuario.


Grupos locales en hosts remotos

c
# Listar grupos locales en un host
Get-NetLocalGroup -ComputerName WS01 | select GroupName
.\SharpView.exe Get-NetLocalGroup -ComputerName WS01

# Miembros de un grupo local específico
Get-NetLocalGroupMember -ComputerName WS01 -GroupName Administrators
.\SharpView.exe Get-NetLocalGroupMember -ComputerName WS01

# Miembros del grupo Remote Management Users
Get-NetLocalGroupMember -ComputerName WS01 -GroupName "Remote Management Users"

Si aparece un SID sin resolver en la salida, conviértelo con:

c
Convert-SidToName S-1-5-21-2974783224-3764228556-2640795941-2040

Encontrar en qué hosts tiene admin local un usuario específico

c
$sid = Convert-NameToSid harry.jones
$computers = Get-DomainComputer -Properties dnshostname | select -ExpandProperty dnshostname
foreach ($line in $computers) {Get-NetLocalGroupMember -ComputerName $line | ? {$_.SID -eq $sid}}

Itera sobre todos los hosts del dominio y busca al usuario en el grupo de administradores local de cada uno. Más ruidoso que Find-LocalAdminAccess pero da más detalle.


Fecha en que un usuario fue agregado a un grupo

PowerView no tiene esta función nativa pero se puede usar el módulo Get-ADGroupMemberDate:

c
# Ver todos los miembros con fecha
Get-ADGroupMemberDate -Group "Help Desk" -DomainController DC01.INLANEFREIGHT.LOCAL

# Filtrar por usuario específico y estado activo
Get-ADGroupMemberDate -Group "Help Desk" -DomainController DC01.INLANEFREIGHT.LOCAL | ? { ($_.Username -match 'harry.jones') -And ($_.State -NotMatch 'ABSENT') }

Útil para informes de IR (Incident Response). Si ves un usuario sospechoso en un grupo, con la fecha puedes buscar Event ID 4728 o 4738 en los logs para saber quién lo agregó, y Event ID 4624 desde esa fecha para ver si alguien inició sesión.


Flujo recomendado al enumerar grupos

c
# 1. Ver todos los grupos
Get-DomainGroup | select name

# 2. Identificar grupos de alto valor y ver sus miembros
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Get-DomainGroupMember -Identity "Backup Operators"
Get-DomainGroupMember -Identity "LAPS Admins"

# 3. Ver grupos protegidos
Get-DomainGroup -AdminCount | select name

# 4. Ver grupos con manager asignado
Get-DomainManagedSecurityGroup

# 5. Verificar grupos locales en hosts clave
Get-NetLocalGroupMember -ComputerName WS01 -GroupName Administrators
Get-NetLocalGroupMember -ComputerName WS01 -GroupName "Remote Management Users"

# 6. Buscar grupos foráneos
Find-ForeignGroup
Get-DomainForeignGroupMember