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
# 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
# PowerView
ConvertTo-SID -Name sally.jones
# SharpView
.\SharpView.exe ConvertTo-SID -Name sally.jonesConvertir SID a nombre de usuario
# 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
# 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 -showallTabla 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 67108864Para calcular un valor combinado simplemente suma los valores de los flags activos. Ejemplo: 66048 = 512 + 65536 = NORMAL_ACCOUNT + DONT_EXPIRE_PASSWORD.
Kerberoasting
# Obtener tickets TGS de todas las cuentas con SPN
Invoke-Kerberoast
# En formato Hashcat
Invoke-Kerberoast -OutputFormat Hashcat | flImpersonación de usuario (token impersonation)
# Impersonar con credenciales
Invoke-UserImpersonation -Credential $cred
# Revertir impersonación
Invoke-RevertToSelfGenera un evento de logon, usar con cuidado en entornos monitoreados.
Otras funciones misc
# 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.csvFunciones de Dominio / LDAP
Información del dominio
# 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 nativaEnumerar OUs del dominio
# 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
# 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 userEnumerar grupos
# 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-DomainForeignGroupMemberEnumerar computadoras
# 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 displaynameEnumerar GPOs
# 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-DomainPolicyEnumerar objetos y ACLs
# 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)
# 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 WS01Funciones Meta (Threaded)
Estas funciones hacen búsquedas en múltiples hosts del dominio en paralelo. Pueden ser ruidosas pero muy efectivas.
# 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 AdministratorsFunciones de Domain Trust
# 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.LOCALCasos prácticos
Encontrar el SID de un usuario
ConvertTo-SID -Name <name>
Get-DomainUser -Identity <name> | select objectsidIdentificar a qué usuario corresponde un SID
Convert-ADName -ObjectName <sid>Ver el dominio hijo del dominio actual
Get-Domain | select Children
# O
Get-ForestDomain | select NameVer estructura de OUs del dominio
.\SharpView.exe Get-DomainOU | findstr /b "name"
Get-DomainOU | select name, distinguishednameEncontrar dónde está logueado un usuario específico
Find-DomainUserLocation -UserIdentity "administrator"Verificar acceso admin en hosts del dominio
Find-LocalAdminAccess
Test-AdminAccess -ComputerName SQL01Ver shares disponibles en un DC
.\SharpView.exe Get-NetShare -ComputerName DC01
Get-NetShare -ComputerName DC01