Saltar a contenido

Domain Reconnaissance

Domain Reconnaissance

Ahora que tenemos algunas credenciales obtenidas gracias a nuestro acceso elevado en Workstation 2, deberíamos realizar reconocimiento de dominio para ver dónde podríamos aprovecharlas.

Esta sección revisará parte de la información que puedes enumerar desde el dominio actual como un usuario estándar del dominio. Cubriremos muchas de estas áreas (por ejemplo, domain trusts y abusos de GPO) con mucho más detalle cuando lleguemos a esos capítulos específicos. Por ahora, veremos algunas de las herramientas que se pueden usar para consultar el dominio y cómo podemos obtener información específica.

Vale la pena mencionar que realizar reconocimiento de dominio en un proceso de alta integridad no es necesario y, en algunos casos (como SYSTEM), puede ser perjudicial.


PowerView

PowerView ha sido durante mucho tiempo la herramienta estándar para la enumeración de dominios. Una de sus mayores fortalezas es que las consultas devuelven objetos PowerShell adecuados, los cuales pueden ser canalizados a otros cmdlets. Esto te permite encadenar múltiples comandos para formar consultas complejas y potentes.

beacon> powershell-import C:\Tools\PowerSploit\Recon\PowerView.ps1

Get-Domain

Devuelve un objeto de dominio para el dominio actual o el dominio especificado con -Domain. La información útil incluye el nombre del dominio, el nombre del forest y los controladores de dominio.

beacon> powershell Get-Domain

Forest                  : cyberbotic.io
DomainControllers       : {dc-2.dev.cyberbotic.io}
Children                : {}
DomainMode              : Unknown
DomainModeLevel         : 7
Parent                  : cyberbotic.io
PdcRoleOwner            : dc-2.dev.cyberbotic.io
RidRoleOwner            : dc-2.dev.cyberbotic.io
InfrastructureRoleOwner : dc-2.dev.cyberbotic.io
Name                    : dev.cyberbotic.io

Get-DomainController

Devuelve los controladores de dominio para el dominio actual o especificado.

beacon> powershell Get-DomainController | select Forest, Name, OSVersion | fl

Forest    : cyberbotic.io
Name      : dc-2.dev.cyberbotic.io
OSVersion : Windows Server 2022 Datacenter

Get-ForestDomain

Devuelve todos los dominios para el forest actual o el forest especificado por -Forest.

beacon> powershell Get-ForestDomain

Forest                  : cyberbotic.io
DomainControllers       : {dc-1.cyberbotic.io}
Children                : {dev.cyberbotic.io}
DomainMode              : Unknown
DomainModeLevel         : 7
Parent                  : 
PdcRoleOwner            : dc-1.cyberbotic.io
RidRoleOwner            : dc-1.cyberbotic.io
InfrastructureRoleOwner : dc-1.cyberbotic.io
Name                    : cyberbotic.io

Forest                  : cyberbotic.io
DomainControllers       : {dc-2.dev.cyberbotic.io}
Children                : {}
DomainMode              : Unknown
DomainModeLevel         : 7
Parent                  : cyberbotic.io
PdcRoleOwner            : dc-2.dev.cyberbotic.io
RidRoleOwner            : dc-2.dev.cyberbotic.io
InfrastructureRoleOwner : dc-2.dev.cyberbotic.io
Name                    : dev.cyberbotic.io

Get-DomainPolicyData

Devuelve la política de dominio predeterminada o la política del controlador de dominio para el dominio actual o un dominio/controlador de dominio especificado. Útil para encontrar información como la política de contraseñas del dominio.

beacon> powershell Get-DomainPolicyData | select -expand SystemAccess

MinimumPasswordAge           : 1
MaximumPasswordAge           : 42
MinimumPasswordLength        : 7
PasswordComplexity           : 1
PasswordHistorySize          : 24
LockoutBadCount              : 0
RequireLogonToChangePassword : 0
ForceLogoffWhenHourExpire    : 0
ClearTextPassword            : 0
LSAAnonymousNameLookup       : 0

Get-DomainUser

Devuelve todos los usuarios (o usuarios específicos). Para devolver solo propiedades específicas, utiliza -Properties. Por defecto, se devuelven todos los objetos de usuario para el dominio actual; usa -Identity para devolver un usuario específico.

beacon> powershell Get-DomainUser -Identity jking -Properties DisplayName, MemberOf | fl

displayname : John King
memberof    : {CN=Internet Users,CN=Users,DC=dev,DC=cyberbotic,DC=io, CN=Support 
              Engineers,CN=Users,DC=dev,DC=cyberbotic,DC=io}

Info

Esto muestra que jking es miembro del grupo Support Engineers. La mayoría de los privilegios en un dominio se delegan a grupos de dominio, en lugar de a usuarios individuales. Por lo tanto, si podemos encontrar dónde este grupo de dominio tiene acceso privilegiado, sabremos que los miembros también tendrán esos privilegios.

Si ejecutas este comando sin el parámetro -Identity, prepárate para esperar un tiempo mientras se devuelve toda la información.

Get-DomainComputer

Devuelve todas las computadoras o objetos específicos de computadoras.

beacon> powershell Get-DomainComputer -Properties DnsHostName | sort -Property DnsHostName

dnshostname              
-----------              
dc-2.dev.cyberbotic.io
fs.dev.cyberbotic.io
sql-2.dev.cyberbotic.io
web.dev.cyberbotic.io
wkstn-1.dev.cyberbotic.io
wkstn-2.dev.cyberbotic.io

Get-DomainOU

Busca todas las unidades organizativas (OUs) o objetos específicos de OU.

beacon> powershell Get-DomainOU -Properties Name | sort -Property Name

name              
----              
Domain Controllers
File Servers
Servers           
SQL Servers       
Web Servers       
Workstations

Get-DomainGroup

Devuelve todos los grupos de dominio o objetos específicos de grupos de dominio.

beacon> powershell Get-DomainGroup | where Name -like "*Admins*" | select SamAccountName

samaccountname
--------------
Domain Admins 
Key Admins    
DnsAdmins     
MS SQL Admins 
Studio Admins

Get-DomainGroupMember

Devuelve los miembros de un grupo de dominio específico.

beacon> powershell Get-DomainGroupMember -Identity "Domain Admins" | select MemberDistinguishedName

MemberDistinguishedName                             
-----------------------                             
CN=Nina Lamb,CN=Users,DC=dev,DC=cyberbotic,DC=io    
CN=Administrator,CN=Users,DC=dev,DC=cyberbotic,DC=io

Get-DomainGPO

Devuelve todos los Group Policy Objects (GPOs) o objetos específicos de GPO. Para enumerar todos los GPOs que se aplican a una máquina en particular, utiliza -ComputerIdentity.

beacon> powershell Get-DomainGPO -Properties DisplayName | sort -Property DisplayName

displayname                      
-----------                      
Computer Certificates
Default Domain Controllers Policy
Default Domain Policy
LAPS
Proxy Settings
Server Admins
Vulnerable GPO
Windows Defender
Windows Firewall
Workstation Admins

Get-DomainGPOLocalGroup

Devuelve todos los GPOs que modifican la membresía de grupos locales a través de Restricted Groups o Group Policy Preferences. Puedes encontrar manualmente a qué OUs, y por extensión a qué computadoras, se aplican estos GPOs.

beacon> powershell Get-DomainGPOLocalGroup | select GPODisplayName, GroupName

GPODisplayName     GroupName            
--------------     ---------            
Workstation Admins DEV\Support Engineers
Server Admins      DEV\Support Engineers

Info

Esto muestra que el grupo Support Engineers está siendo asignado algún tipo de acceso local a las máquinas a las que se aplican estos GPOs. Aunque la convención de nombres del GPO sugiere que este es acceso de administrador local, también podría ser un grupo local diferente como Remote Desktop Users.

Get-DomainGPOUserLocalGroupMapping

Enumera las máquinas donde un usuario/grupo específico del dominio es miembro de un grupo local específico. Esto es útil para encontrar dónde los grupos de dominio tienen acceso de administrador local, lo cual es una forma más automatizada de realizar la referencia cruzada manual descrita anteriormente.

beacon> powershell Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName | fl

ObjectName     : Support Engineers
GPODisplayName : Server Admins
ContainerName  : {OU=Servers,DC=dev,DC=cyberbotic,DC=io}
ComputerName   : {web.dev.cyberbotic.io, sql-2.dev.cyberbotic.io, fs.dev.cyberbotic.io}

ObjectName     : Support Engineers
GPODisplayName : Workstation Admins
ContainerName  : {OU=Workstations,DC=dev,DC=cyberbotic,DC=io}
ComputerName   : {wkstn-1.dev.cyberbotic.io, wkstn-2.dev.cyberbotic.io}

Info

Esta salida confirma que el grupo de dominio Support Engineers es miembro del grupo local Administrators en las máquinas: web, sql-2, fs, wkstn-1 y wkstn-2.

Get-DomainTrust

Devuelve todos los trusts de dominio para el dominio actual o especificado.

beacon> powershell Get-DomainTrust

SourceName      : dev.cyberbotic.io
TargetName      : cyberbotic.io
TrustType       : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes : WITHIN_FOREST
TrustDirection  : Bidirectional
WhenCreated     : 8/15/2022 4:00:00 PM
WhenChanged     : 8/15/2022 4:00:00 PM

SourceName      : dev.cyberbotic.io
TargetName      : dev-studio.com
TrustType       : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes : 
TrustDirection  : Inbound
WhenCreated     : 8/16/2022 9:52:37 AM
WhenChanged     : 8/16/2022 9:52:37 AM

Sharpview

SharpView fue diseñado como un port en C# de PowerView y, por lo tanto, tiene prácticamente la misma funcionalidad. Sin embargo, una desventaja es que no tiene la misma capacidad de piping que PowerShell.

beacon> execute-assembly C:\Tools\SharpView\SharpView\bin\Release\SharpView.exe Get-Domain

Forest                         : cyberbotic.io
DomainControllers              : {dc-2.dev.cyberbotic.io}
Children                       : {}
DomainMode                     : Unknown
DomainModeLevel                : 7
Parent                         : cyberbotic.io
PdcRoleOwner                   : dc-2.dev.cyberbotic.io
RidRoleOwner                   : dc-2.dev.cyberbotic.io
InfrastructureRoleOwner        : dc-2.dev.cyberbotic.io
Name                           : dev.cyberbotic.io

ADSearch

ADSearch tiene menos búsquedas integradas en comparación con PowerView y SharpView, pero permite especificar búsquedas personalizadas de Lightweight Directory Access Protocol (LDAP). Estas pueden usarse para identificar entradas en el directorio que coincidan con un criterio determinado.

Por ejemplo, podemos buscar todos los objetos cuya categoría sea "user" (es decir, usuarios de dominio).

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "objectCategory=user"

[*] No domain supplied. This PC's domain will be used instead
[*] LDAP://DC=dev,DC=cyberbotic,DC=io
[*] CUSTOM SEARCH: 

[*] TOTAL NUMBER OF SEARCH RESULTS: 10
    [+] cn : Administrator
    [+] cn : Guest
    [+] cn : krbtgt
    [+] cn : CYBER$
    [+] cn : Bob Farmer
    [+] cn : John King
    [+] cn : Nina Lamb
    [+] cn : MS SQL Service
    [+] cn : Squid Proxy
    [+] cn : STUDIO$

Los filtros pueden utilizarse para limitar aún más el resultado de la búsqueda. Por ejemplo, buscar todos los grupos de dominio que terminan con la palabra "admins".

 beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=*Admins))"

[*] No domain supplied. This PC's domain will be used instead
[*] LDAP://DC=dev,DC=cyberbotic,DC=io
[*] CUSTOM SEARCH: 
[*] TOTAL NUMBER OF SEARCH RESULTS: 5
    [+] cn : Domain Admins
    [+] cn : Key Admins
    [+] cn : DnsAdmins
    [+] cn : MS SQL Admins
    [+] cn : Studio Admins

Estas búsquedas pueden hacerse más complejas con condiciones adicionales como AND, OR y NOT. Todos los atributos pueden devolverse usando el parámetro --full, o atributos específicos con el parámetro --attributes.

beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=MS SQL Admins))" --attributes cn,member

[*] TOTAL NUMBER OF SEARCH RESULTS: 1
    [+] cn     : MS SQL Admins
    [+] member : CN=Developers,CN=Users,DC=dev,DC=cyberbotic,DC=io

Adicionalmente, el parámetro --json puede ser usado para formatear la salida en JSON.

[
  {
    "cn": "MS SQL Admins",
    "member": "CN=Developers,CN=Users,DC=dev,DC=cyberbotic,DC=io"
  }
]