Skip to content

PowerView & SharpView

¿Qué son?

PowerView es una herramienta de enumeración de AD escrita en PowerShell incluida en el toolkit PowerSploit (ya deprecado). SharpView es suport a .NET/C#, más sigiloso porque C# es menos transparente para los productos de seguridad que PowerShell.

Diferencia clave: SharpView usa strings en lugar de objetos PowerShell, por lo que no puedes usar Select-Object o piping para filtrar propiedades de la misma forma. PowerView sí admite piping completo.


Carga y uso básico

c
# Cargar PowerView
Import-Module .\PowerView.ps1
. .\PowerView.ps1

# Conectar via RDP al lab
xfreerdp /v:<TARGET IP> /u:htb-student /p:Academy_student_AD!

Funciones Misc

Conversión de formatos, impersonación, Kerberoasting y utilidades generales.

Convertir nombre de usuario a SID

c
# PowerView
ConvertTo-SID -Name sally.jones

# SharpView
.\SharpView.exe ConvertTo-SID -Name sally.jones

Convertir SID a nombre de usuario

c
# PowerView
Convert-ADName -ObjectName S-1-5-21-2974783224-3764228556-2640795941-1724

# SharpView
.\SharpView.exe Convert-ADName -ObjectName S-1-5-21-2974783224-3764228556-2640795941-1724

Útil cuando BloodHound o ACLs muestran SIDs sin resolver o cuando necesitas identificar a qué cuenta corresponde un SID encontrado en logs.

Convertir valor UAC numérico a flags legibles

c
# Ver solo los flags activos del usuario
Get-DomainUser harry.jones | ConvertFrom-UACValue

# Ver todos los flags posibles marcando cuáles están activos con +
Get-DomainUser harry.jones | ConvertFrom-UACValue -showall

Tabla completa de flags UAC:

SCRIPT                         1
ACCOUNTDISABLE                 2
HOMEDIR_REQUIRED               8
LOCKOUT                        16
PASSWD_NOTREQD                 32
PASSWD_CANT_CHANGE             64
ENCRYPTED_TEXT_PWD_ALLOWED     128
TEMP_DUPLICATE_ACCOUNT         256
NORMAL_ACCOUNT                 512
INTERDOMAIN_TRUST_ACCOUNT      2048
WORKSTATION_TRUST_ACCOUNT      4096
SERVER_TRUST_ACCOUNT           8192
DONT_EXPIRE_PASSWORD           65536
MNS_LOGON_ACCOUNT              131072
SMARTCARD_REQUIRED             262144
TRUSTED_FOR_DELEGATION         524288
NOT_DELEGATED                  1048576
USE_DES_KEY_ONLY               2097152
DONT_REQ_PREAUTH               4194304
PASSWORD_EXPIRED               8388608
TRUSTED_TO_AUTH_FOR_DELEGATION 16777216
PARTIAL_SECRETS_ACCOUNT        67108864

Para calcular un valor combinado simplemente suma los valores de los flags activos. Ejemplo: 66048 = 512 + 65536 = NORMAL_ACCOUNT + DONT_EXPIRE_PASSWORD.

Kerberoasting

c
# Obtener tickets TGS de todas las cuentas con SPN
Invoke-Kerberoast

# En formato Hashcat
Invoke-Kerberoast -OutputFormat Hashcat | fl

Impersonación de usuario (token impersonation)

c
# Impersonar con credenciales
Invoke-UserImpersonation -Credential $cred

# Revertir impersonación
Invoke-RevertToSelf

Genera un evento de logon, usar con cuidado en entornos monitoreados.

Otras funciones misc

c
# Resolver hostname a IP
Resolve-IPAddress -ComputerName DC01

# ACLs de un path local o remoto
Get-PathAcl -Path "\\DC01\Department Shares"

# Exportar resultados a CSV (thread-safe)
Get-DomainUser | Export-PowerViewCSV -Path C:\output.csv

Funciones de Dominio / LDAP

Información del dominio

c
# Info general del dominio actual
Get-Domain
.\SharpView.exe Get-Domain

# Domain Controllers del dominio
Get-DomainController
Get-DomainController -Domain LOGISTICS.INLANEFREIGHT.LOCAL

# Info del bosque
Get-Forest
Get-ForestDomain
Get-ForestGlobalCatalog

# SID del dominio actual
Get-DomainSID

# Política del dominio (contraseñas, Kerberos, etc.)
Get-DomainPolicy
net accounts   # alternativa nativa

Enumerar OUs del dominio

c
# Listar todas las OUs
Get-DomainOU
.\SharpView.exe Get-DomainOU | findstr /b "name"

# Info de una OU específica
Get-DomainOU -Identity "IT"

Útil para mapear la estructura del dominio y saber dónde buscar usuarios o computadoras específicas.

Enumerar usuarios

c
# Todos los usuarios
Get-DomainUser

# Usuario específico con todos sus atributos
Get-DomainUser -Identity forend
Get-DomainUser -Identity forend -Domain INLANEFREIGHT.LOCAL

# Propiedades específicas
Get-DomainUser | select samaccountname, description, memberof, pwdlastset, lastlogon

# Usuarios con descripción (buscar contraseñas)
Get-DomainUser * | Select-Object samaccountname,description | Where-Object {$_.Description -ne $null}

# Usuarios con SPN (Kerberoasteables)
Get-DomainUser -SPN
Get-DomainUser * -spn | select samaccountname

# Usuarios ASREPRoasteables
Get-DomainUser -PreauthNotRequired
.\SharpView.exe Get-DomainUser -KerberosPreauthNotRequired

# Usuarios con PASSWD_NOTREQD
Get-DomainUser -UACFilter PASSWD_NOTREQD | select samaccountname

# Usuarios admin (adminCount=1)
Get-DomainUser * -AdminCount | select samaccountname,useraccountcontrol

# Usuarios con Unconstrained Delegation
Get-DomainUser -TrustedToAuth | select samaccountname

# Buscar outliers (propiedades inusuales en objetos)
Find-DomainObjectPropertyOutlier -ClassName user

Enumerar grupos

c
# Todos los grupos
Get-DomainGroup
Get-DomainGroup | select Name

# Grupo específico
Get-DomainGroup -Identity "Domain Admins"

# Miembros de un grupo
Get-DomainGroupMember -Identity "Domain Admins"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse

# Grupos con adminCount=1 (protegidos por AdminSDHolder)
Get-DomainGroup -AdminCount | select Name

# Grupos administrados (con manager asignado)
Get-DomainManagedSecurityGroup

# Grupos con miembros de fuera del dominio (foreign members)
Get-DomainForeignGroupMember

Enumerar computadoras

c
# Todas las computadoras
Get-DomainComputer
Get-DomainComputer | select dnshostname, operatingsystem, useraccountcontrol

# Computadora específica
Get-DomainComputer -Identity SQL01

# Computadoras con Unconstrained Delegation
Get-DomainComputer -Unconstrained | select dnshostname

# Computadoras con Constrained Delegation
Get-DomainComputer -TrustedToAuth | select dnshostname,msds-allowedtodelegateto

# GPOs aplicadas a una computadora específica
Get-DomainGPO -ComputerIdentity WS01 | select displayname

Enumerar GPOs

c
# Todas las GPOs
Get-DomainGPO
.\SharpView.exe Get-DomainGPO | findstr displayname

# GPOs que modifican grupos locales
Get-DomainGPOLocalGroup

# Máquinas donde un usuario tiene admin local via GPO
Get-DomainGPOUserLocalGroupMapping -Identity forend

# Política de dominio
Get-DomainPolicy

Enumerar objetos y ACLs

c
# Objeto específico por DN, GUID, SID o nombre
Get-DomainObject -Identity "CN=forend,OU=IT,DC=INLANEFREIGHT,DC=LOCAL"

# ACLs de un objeto específico
Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs

# Encontrar ACLs interesantes en todo el dominio
Find-InterestingDomainAcl
Find-InterestingDomainAcl -ResolveGUIDs

# ACLs de un usuario específico sobre objetos del dominio
$sid = Convert-NameToSid forend
Get-DomainObjectACL -ResolveGUIDs -Identity * | Where-Object {$_.SecurityIdentifier -eq $sid}

Funciones de Enumeración de Computadoras (Computer Enum)

c
# Grupos locales en un host remoto
Get-NetLocalGroup -ComputerName SQL01
Get-NetLocalGroup -ComputerName DC01

# Miembros de un grupo local en un host remoto
Get-NetLocalGroupMember -ComputerName SQL01 -GroupName Administrators

# Shares abiertos en un host remoto
Get-NetShare -ComputerName DC01
.\SharpView.exe Get-NetShare -ComputerName DC01

# Usuarios con sesión activa en un host
Get-NetLoggedon -ComputerName SQL01
Get-NetSession -ComputerName DC01

# Último usuario que inició sesión en un host
Get-WMIRegLastLoggedOn -ComputerName WS01

# Procesos corriendo en un host remoto
Get-WMIProcess -ComputerName SQL01

# Verificar si tenemos admin local en un host
Test-AdminAccess -ComputerName SQL01
Test-AdminAccess -ComputerName DC01

# Conexiones RDP salientes de un host
Get-WMIRegCachedRDPConnection -ComputerName WS01

# Unidades de red montadas en un host
Get-WMIRegMountedDrive -ComputerName WS01

Funciones Meta (Threaded)

Estas funciones hacen búsquedas en múltiples hosts del dominio en paralelo. Pueden ser ruidosas pero muy efectivas.

c
# Encontrar dónde están logueados usuarios específicos
Find-DomainUserLocation
Find-DomainUserLocation -UserIdentity "harry.jones"

# Encontrar dónde tenemos admin local
Find-LocalAdminAccess

# Buscar shares accesibles en el dominio
Find-DomainShare
Find-DomainShare -CheckShareAccess

# Buscar archivos interesantes en shares del dominio
Find-InterestingDomainShareFile
Find-InterestingDomainShareFile -Include *.txt,*.ps1,*.bat,*.xml

# Buscar procesos específicos corriendo en hosts del dominio
Find-DomainProcess -ProcessName lsass

# Miembros de grupos locales en múltiples hosts
Find-DomainLocalGroupMember -GroupName Administrators

Funciones de Domain Trust

c
# Trusts del dominio actual
Get-DomainTrust
Get-DomainTrust -Domain LOGISTICS.INLANEFREIGHT.LOCAL

# Trusts del bosque
Get-ForestTrust

# Mapeo completo de todos los trusts
Get-DomainTrustMapping

# Usuarios foráneos (en grupos fuera de su dominio)
Get-DomainForeignUser

# Grupos con miembros foráneos
Get-DomainForeignGroupMember -Domain FREIGHTLOGISTICS.LOCAL

Casos prácticos

Encontrar el SID de un usuario

c
ConvertTo-SID -Name <name>
Get-DomainUser -Identity <name> | select objectsid

Identificar a qué usuario corresponde un SID

c
Convert-ADName -ObjectName <sid>

Ver el dominio hijo del dominio actual

c
Get-Domain | select Children
# O
Get-ForestDomain | select Name

Ver estructura de OUs del dominio

c
.\SharpView.exe Get-DomainOU | findstr /b "name"
Get-DomainOU | select name, distinguishedname

Encontrar dónde está logueado un usuario específico

c
Find-DomainUserLocation -UserIdentity "administrator"

Verificar acceso admin en hosts del dominio

c
Find-LocalAdminAccess
Test-AdminAccess -ComputerName SQL01

Ver shares disponibles en un DC

c
.\SharpView.exe Get-NetShare -ComputerName DC01
Get-NetShare -ComputerName DC01