> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/active-directory/credentialed-enumeration-from-windows.md).

# Credentialed Enumeration - from Windows

#### Modulo ActiveDirectory de Powershell

El módulo ActiveDirectory de PowerShell es un conjunto de cmdlets de PowerShell para administrar un entorno de Active Directory desde la línea de comandos. Al momento de escribir este texto, consta de 147 cmdlets diferentes. No podemos cubrirlos todos aquí, pero veremos algunos que son particularmente útiles para enumerar entornos de AD. Siéntase libre de explorar otros cmdlets incluidos en el módulo en el laboratorio creado para esta sección y vea qué combinaciones y resultados interesantes puede generar.

Antes de poder utilizar el módulo, debemos asegurarnos de que esté importado. El cmdlet Get-Module, que forma parte del módulo Microsoft.PowerShell.Core, mostrará todos los módulos disponibles, su versión y los comandos potenciales que se pueden usar. Esta es una excelente manera de ver si hay instalados programas como Git o scripts de administrador personalizados. Si el módulo no está cargado, ejecute Import-Module ActiveDirectory para cargarlo.

#### Descubriendo modulos

```powershell
Get-Module
```

#### Cargando el modulo de ActiveDirectory

```powershell
Import-Module ActiveDirectory
Get-Module
```

Ahora que nuestros módulos están cargados, comencemos. Primero, enumeraremos información básica sobre el dominio con el cmdlet Get-ADDomain.

#### Info get-addomain

```powershell
Get-ADDomain
```

Esto imprimirá información útil como el SID del dominio, el nivel funcional del dominio, los subdominios y más. A continuación, utilizaremos el cmdlet Get-ADUser. Filtraremos las cuentas con la propiedad ServicePrincipalName completa. Esto nos proporcionará una lista de cuentas que podrían ser vulnerables a un ataque Kerberoasting, tema que abordaremos en detalle en la siguiente sección.

#### Get-ADUser

```powershell
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
```

Otra comprobación interesante que podemos realizar utilizando el módulo ActiveDirectory sería verificar las relaciones de confianza del dominio mediante el cmdlet Get-ADTrust.

#### Verificando relaciones de confianza

```powershell
Get-ADTrust -Filter *
```

Este cmdlet mostrará las relaciones de confianza del dominio. Podemos determinar si se trata de relaciones dentro de nuestro bosque o con dominios de otros bosques, el tipo de confianza, su dirección y el nombre del dominio con el que se establece la relación. Esto será útil más adelante para aprovechar las relaciones de confianza entre dominios secundarios y principales, así como para realizar ataques entre diferentes bosques. A continuación, podemos recopilar información sobre grupos de Active Directory mediante el cmdlet Get-ADGroup.

#### Enumeración de Grupos

```powershell
Get-ADGroup -Filter * | select name
```

Podemos tomar los resultados e introducir nombres interesantes en el cmdlet para obtener información más detallada sobre un grupo en particular, como por ejemplo:

```powershell
Get-ADGroup -Identity "Backup Operators"
```

Ahora que conocemos mejor el grupo, vamos a obtener una lista de miembros utilizando el cmdlet Get-ADGroupMember.

#### Group Membership

```powershell
Get-ADGroupMember -Identity "Backup Operators"
```

Podemos observar que una cuenta, backupagent, pertenece a este grupo. Es importante tenerlo en cuenta, ya que si logramos acceder a esta cuenta de servicio mediante un ataque, podríamos usar su pertenencia al grupo de Operadores de Copia de Seguridad para tomar el control del dominio. Podemos repetir este proceso con los demás grupos para comprender completamente la configuración de pertenencia al dominio. Intente repetir el proceso con varios grupos diferentes. Verá que este proceso puede ser tedioso y que nos quedaremos con una enorme cantidad de datos que analizar. Debemos saber cómo hacerlo con herramientas integradas como el módulo ActiveDirectory de PowerShell, pero más adelante en esta sección veremos cómo herramientas como BloodHound pueden acelerar este proceso y hacer que nuestros resultados sean mucho más precisos y organizados.

Utilizar el módulo ActiveDirectory en un host puede ser una forma más discreta de realizar acciones que instalar una herramienta en un host o cargarla en memoria e intentar usarla. De esta manera, nuestras acciones podrían pasar más desapercibidas. A continuación, analizaremos la herramienta PowerView, que cuenta con numerosas funciones para simplificar la enumeración y profundizar en el dominio.

## Powerview Capabilities

| ***Command***                         | ***Description***                                                                          |
| ------------------------------------- | ------------------------------------------------------------------------------------------ |
| `Export-PowerViewCSV`                 | Append results to a CSV file                                                               |
| `ConvertTo-SID`                       | Convert a User or group name to its SID value                                              |
| `Get-DomainSPNTicket`                 | Requests the Kerberos ticket for a specified Service Principal Name (SPN) account          |
| ***Domain/LDAP Functions:***          |                                                                                            |
| `Get-Domain`                          | Will return the AD object for the current (or specified) domain                            |
| `Get-DomainController`                | Return a list of the Domain Controllers for the specified domain                           |
| `Get-DomainUser`                      | Will return all users or specific user objects in AD                                       |
| `Get-DomainComputer`                  | Will return all computers or specific computer objects in AD                               |
| `Get-DomainGroup`                     | Will return all groups or specific group objects in AD                                     |
| `Get-DomainOU`                        | Search for all or specific OU objects in AD                                                |
| `Find-InterestingDomainAcl`           | Finds object ACLs in the domain with modification rights set to non-built in objects       |
| `Get-DomainGroupMember`               | Will return the members of a specific domain group                                         |
| `Get-DomainFileServer`                | Returns a list of servers likely functioning as file servers                               |
| `Get-DomainDFSShare`                  | Returns a list of all distributed file systems for the current (or specified) domain       |
| ***GPO Functions:***                  |                                                                                            |
| `Get-DomainGPO`                       | Will return all GPOs or specific GPO objects in AD                                         |
| `Get-DomainPolicy`                    | Returns the default domain policy or the domain controller policy for the current domain   |
| ***Computer Enumeration Functions:*** |                                                                                            |
| `Get-NetLocalGroup`                   | Enumerates local groups on the local or a remote machine                                   |
| `Get-NetLocalGroupMember`             | Enumerates members of a specific local group                                               |
| `Get-NetShare`                        | Returns open shares on the local (or a remote) machine                                     |
| `Get-NetSession`                      | Will return session information for the local (or a remote) machine                        |
| `Test-AdminAccess`                    | Tests if the current user has administrative access to the local (or a remote) machine     |
| ***Threaded 'Meta'-Functions:***      |                                                                                            |
| `Find-DomainUserLocation`             | Finds machines where specific users are logged in                                          |
| `Find-DomainShare`                    | Finds reachable shares on domain machines                                                  |
| `Find-InterestingDomainShareFile`     | Searches for files matching specific criteria on readable shares in the domain             |
| `Find-LocalAdminAccess`               | Find machines on the local domain where the current user has local administrator access    |
| ***Domain Trust Functions:***         |                                                                                            |
| `Get-DomainTrust`                     | Returns domain trusts for the current domain or a specified domain                         |
| `Get-ForestTrust`                     | Returns all forest trusts for the current forest or a specified forest                     |
| `Get-DomainForeignUser`               | Enumerates users who are in groups outside of the user's domain                            |
| `Get-DomainForeignGroupMember`        | Enumerates groups with users outside of the group's domain and returns each foreign member |
| `Get-DomainTrustMapping`              | Will enumerate all trusts for the current domain and any others seen.                      |

Esta tabla no abarca todas las funciones que ofrece PowerView, pero incluye muchas de las que utilizaremos con frecuencia. Para obtener más información sobre PowerView, consulte el módulo de Active Directory PowerView. A continuación, experimentaremos con algunas de ellas.

Primero, la función Get-DomainUser. Esta nos proporcionará información sobre todos los usuarios o sobre usuarios específicos que indiquemos. Más adelante, la utilizaremos para obtener información sobre un usuario específico: mmorgan.

#### Informacion de usuario de dominio

```powershell
Get-DomainUser -Identity mmorgan -Domain inlanefreight.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,useraccountcontrol
```

Hemos visto información básica de usuario con PowerView. Ahora vamos a enumerar información de grupos de dominio. Podemos usar la función Get-DomainGroupMember para recuperar información específica de grupos. Al agregar el modificador -Recurse, le indicamos a PowerView que, si encuentra algún grupo que forme parte del grupo objetivo (pertenencia a grupos anidados), debe listar los miembros de esos grupos. Por ejemplo, el siguiente resultado muestra que el grupo Secadmins forma parte del grupo Administradores de dominio mediante la pertenencia a grupos anidados. En este caso, podremos ver todos los miembros de ese grupo que heredan derechos de administrador de dominio a través de su pertenencia a grupos.

#### Group membership recursivo

```powershell
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
```

Anteriormente, realizamos una búsqueda recursiva en el grupo Administradores de dominio para listar sus miembros. Ahora sabemos a quién dirigirnos para una posible elevación de privilegios. Al igual que con el módulo de PowerShell de Active Directory, también podemos enumerar las asignaciones de confianza de dominio.

#### Enumeracion de Confianzas

```powershell
Get-DomainTrustMapping
```

Podemos utilizar la función Test-AdminAccess para comprobar el acceso de administrador local tanto en la máquina actual como en una remota.

#### Prueba de acceso local en ususario admin

```powershell
Test-AdminAccess -ComputerName ACADEMY-EA-MS01
```

Anteriormente, determinamos que el usuario que estamos utilizando actualmente es administrador en el host ACADEMY-EA-MS01. Podemos realizar la misma función para cada host para ver dónde tenemos acceso administrativo. Más adelante veremos qué tan bien realiza BloodHound este tipo de verificación. Ahora podemos buscar usuarios con el atributo SPN activado, lo que indica que la cuenta podría ser objeto de un ataque Kerberoasting.

#### Buscando usuarios con SPN configurado

```powershell
Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName
```

## SharpView

Aquí podemos usar SharpView para enumerar información sobre un usuario específico, como el usuario forend, que controlamos.

```powershell
.\SharpView.exe Get-DomainUser -Identity forend
```

Si bien la evasión no es el objetivo de este módulo, SharpView puede ser útil cuando un cliente ha implementado medidas de seguridad contra el uso de PowerShell o cuando necesitamos evitar su uso.

## Snaffler

```powershell
Snaffler.exe -s -d inlanefreight.local -o snaffler.log -v data
```

La opción -s indica que se impriman los resultados en la consola, la opción -d especifica el dominio de búsqueda y la opción -o indica a Snaffler que escriba los resultados en un archivo de registro. La opción -v define el nivel de detalle. Generalmente, el modo "data" es el más adecuado, ya que solo muestra los resultados en pantalla, lo que facilita la revisión de las ejecuciones de la herramienta. Snaffler puede generar una cantidad considerable de datos, por lo que normalmente se recomienda guardar la salida en un archivo, dejar que se ejecute y revisarla posteriormente. También puede ser útil proporcionar la salida sin procesar de Snaffler a los clientes como datos complementarios durante una prueba de penetración, ya que puede ayudarles a identificar los recursos compartidos de alto valor que deben protegerse primero.

```powershell
.\Snaffler.exe  -d INLANEFREIGHT.LOCAL -s -v data
```

Podemos encontrar contraseñas, claves SSH, archivos de configuración u otros datos que nos permitan ampliar nuestro acceso. Snaffler codifica por colores la salida y nos proporciona un resumen de los tipos de archivos encontrados en los recursos compartidos.

## BloodHound&#x20;

Como se mencionó en la sección anterior, BloodHound es una herramienta de código abierto excepcional que permite identificar rutas de ataque en un entorno de Active Directory (AD) mediante el análisis de las relaciones entre objetos. Tanto los pentesters como los blue teamers pueden beneficiarse al aprender a usar BloodHound para visualizar las relaciones en el dominio. Si se usa correctamente y se combina con consultas de cifrado personalizadas, BloodHound puede encontrar vulnerabilidades de alto impacto, pero difíciles de detectar, que han estado presentes en el dominio durante años.

Primero, debemos autenticarnos como usuario del dominio desde un host de ataque Windows ubicado en la red (pero no unido al dominio) o transferir la herramienta a un host unido al dominio. Existen varias maneras de lograr esto, como se explica en el módulo de Transferencia de Archivos. Para nuestros propósitos, trabajaremos con SharpHound.exe ya instalado en el host de ataque, pero vale la pena experimentar transfiriendo la herramienta al host de ataque desde Pwnbox o nuestra propia máquina virtual utilizando métodos como un servidor HTTP de Python, smbserver.py de Impacket, etc.

```powershell
.\SharpHound.exe -c All --zipfilename ILFREIGHT
```

A continuación, podemos extraer el conjunto de datos a nuestra propia máquina virtual o importarlo a la herramienta gráfica BloodHound en MS01. Para ello, en MS01, escriba "bloodhound" en una consola de CMD o PowerShell. Guarde las credenciales, pero si aparece una solicitud, escriba "neo4j: HTB\_@cademy\_stdnt!". Luego, haga clic en el botón "Cargar datos" a la derecha, seleccione el archivo zip recién generado y haga clic en "Abrir". Aparecerá una ventana de progreso de la carga. Una vez que todos los archivos .json muestren el 100 % de la carga completada, haga clic en la "X" en la parte superior de esa ventana.

Comenzamos escribiendo "dominio:" en la barra de búsqueda superior izquierda y seleccionando INLANEFREIGHT.LOCAL de los resultados. Dedique un momento a explorar la pestaña de información del nodo. Como podemos ver, se trata de una empresa bastante grande con más de 550 hosts objetivo y relaciones de confianza con otros dos dominios.

Ahora, veamos algunas consultas predefinidas en la pestaña "Análisis". La consulta "Buscar equipos con sistemas operativos no compatibles" es ideal para encontrar sistemas operativos obsoletos y sin soporte que ejecutan software antiguo. Estos sistemas son relativamente comunes en redes empresariales (especialmente en entornos antiguos), ya que suelen ejecutar algún producto que aún no se puede actualizar ni reemplazar. Mantener estos equipos puede ahorrar dinero, pero también puede añadir vulnerabilidades innecesarias a la red. Los equipos más antiguos pueden ser susceptibles a vulnerabilidades antiguas de ejecución remota de código, como MS08-067. Si encontramos estos equipos antiguos durante una evaluación, debemos tener cuidado antes de atacarlos (o incluso consultar con nuestro cliente), ya que pueden ser frágiles y ejecutar una aplicación o servicio crítico. Podemos aconsejar a nuestro cliente que aísle estos equipos del resto de la red en la medida de lo posible si aún no puede eliminarlos, pero también deberíamos recomendarle que comience a elaborar un plan para su desmantelamiento y reemplazo.

Esta consulta muestra dos equipos: uno con Windows 7 y otro con Windows Server 2008 (ambos fuera de producción en nuestro laboratorio). En ocasiones, observaremos hosts que ya no están encendidos, pero que aún aparecen como registros en Active Directory. Siempre debemos verificar si están activos o no antes de formular recomendaciones en nuestros informes. Podemos incluir un hallazgo de alto riesgo para sistemas operativos heredados o una recomendación de buenas prácticas para la limpieza de registros antiguos en Active Directory.

#### OS no soportados

<figure><img src="/files/L24iE8YPvqPUkyrpkdeZ" alt=""><figcaption></figcaption></figure>

A menudo vemos usuarios con derechos de administrador local en su equipo (quizás temporalmente para instalar algún software, y estos derechos nunca se eliminaron), o bien ocupan un puesto lo suficientemente alto en la organización como para exigir estos derechos (independientemente de si los necesitan o no). Otras veces, observamos una distribución excesiva de derechos de administrador local en toda la organización, como por ejemplo, varios grupos del departamento de TI con permisos de administrador local sobre grupos de servidores, o incluso todo el grupo de Usuarios del Dominio con permisos de administrador local sobre uno o más equipos. Esto puede resultarnos beneficioso si tomamos el control de una cuenta de usuario con estos derechos sobre una o más máquinas. Podemos ejecutar la consulta «Buscar equipos donde Usuarios del Dominio sean Administradores Locales» para comprobar rápidamente si existen equipos donde todos los usuarios tengan derechos de administrador local. En ese caso, cualquier cuenta que controlemos podrá utilizarse para acceder a los equipos en cuestión, y podríamos recuperar credenciales de la memoria o encontrar otros datos confidenciales.

#### Administradores Locales

<figure><img src="/files/81VdNTDB5WQqB2ODRcGU" alt=""><figcaption></figcaption></figure>

Esta es solo una muestra de las consultas útiles que podemos ejecutar. A medida que avancemos en este módulo, verá varias más que pueden ser útiles para encontrar otras vulnerabilidades en el dominio. Para un estudio más profundo de BloodHound, consulte el módulo Active Directory Bloodhound. Tómese un tiempo para probar cada una de las consultas en la pestaña Análisis y familiarizarse con la herramienta. También vale la pena experimentar con consultas Cypher personalizadas pegándolas en el cuadro de Consulta sin formato en la parte inferior de la pantalla.

Tenga en cuenta que, durante el proyecto, debemos documentar cada archivo que se transfiera hacia y desde los hosts del dominio y su ubicación en el disco. Esta es una buena práctica si necesitamos resolver conflictos con el cliente. Además, según el alcance del proyecto, es importante asegurarse de borrar cualquier rastro y eliminar todo lo que se haya colocado en el entorno al finalizar el proyecto.

Tenemos una visión clara de la estructura, las fortalezas y las debilidades del dominio. Tenemos credenciales para varios usuarios y hemos enumerado una gran cantidad de información, como usuarios, grupos, equipos, GPO, ACL, derechos de administrador local, derechos de acceso (RDP, WinRM, etc.), cuentas configuradas con nombres principales de servicio (SPN) y más. Tenemos notas detalladas y una gran cantidad de resultados, y hemos experimentado con muchas herramientas diferentes para practicar la enumeración de AD con y sin credenciales desde hosts de ataque Linux y Windows. ¿Qué sucede si estamos restringidos con la shell que tenemos o no tenemos la capacidad de importar herramientas? Nuestro cliente puede pedirnos que realicemos todo el trabajo desde un host administrado dentro de su red sin acceso a Internet y sin forma de cargar nuestras herramientas. Podríamos llegar a un host como SYSTEM después de un ataque exitoso, pero encontrarnos en una posición donde sea muy difícil o imposible cargar herramientas. ¿Qué hacemos entonces? En la siguiente sección, veremos cómo realizar acciones mientras "vivimos de la tierra".


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/active-directory/credentialed-enumeration-from-windows.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
