Magic Quadrant™ para la gestión de acceso privilegiado 2025: Netwrix reconocida por cuarto año consecutivo. Descarga el informe.

Plataforma
Centro de recursosBlog
Fundamentos de la Reconocimiento LDAP con PowerShell

Fundamentos de la Reconocimiento LDAP con PowerShell

Aug 31, 2022

En la publicación introductoria de esta serie, revisamos lo que es una cuenta de servicio de Active Directory (AD), explicamos por qué estas cuentas privilegiadas representan un serio riesgo de seguridad y prometimos detallar 4 tipos de ataques a cuentas de servicio en publicaciones futuras. Esta publicación explora el primero de esos ataques: reconocimiento LDAP, que los atacantes pueden utilizar para descubrir cuentas de servicio en un entorno de TI mientras evitan ser detectados.

Específicamente, en esta publicación, exploraremos cómo un atacante sin permisos especiales, como derechos de Administrador de Dominio o incluso de Administrador local, puede usar consultas simples de PowerShell para encontrar cuentas de servicio, sin necesidad de instalar o aprender herramientas especializadas como Bloodhound.

Encontrar cuentas privilegiadas

Active Directory ofrece muchos beneficios de seguridad y gestión, pero también puede facilitarle las cosas a un atacante curioso. Debido a la arquitectura de AD, una vez que un atacante ha infiltrado cualquier computadora unida al dominio, pueden consultar el directorio y sus objetos. Y porque por defecto Active Directory no proporciona un mecanismo para auditar y alertar sobre la actividad sospechosa, a menudo pueden evitar ser detectados.

Aquí hay algunas de las formas en que un atacante puede descubrir cuentas de servicio consultando LDAP.

Descubrimiento de Service Principal Name (SPN)

Las cuentas de servicio utilizan SPNs para soportar la autenticación Kerberos. Aunque esto proporciona una seguridad mejorada, también deja un rastro exacto de dónde se utilizan estas cuentas y para qué se utilizan. Esta información puede ser fácilmente explotada por un atacante. Los SPNs se utilizan comúnmente para ejecutar servicios que soportan aplicaciones como Microsoft SQL Server y SharePoint.

En otro blog post, demostramos cómo realizar un reconocimiento avanzado de AD; sin embargo, existen formas más sencillas de obtener la información que necesitamos para nuestros propósitos aquí. Utilizando la siguiente consulta LDAP simple, un atacante puede obtener una lista de cuentas de AD que tienen SPN registrados, así como las computadoras, aplicaciones y datos a los que proporcionan acceso:

      #Build LDAP filters to look for users with SPN values registered for current domain
$ldapFilter = "(&(objectclass=user)(objectcategory=user)(servicePrincipalName=*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
#Execute Search
$results = $search.FindAll()
#Display SPN values from the returned objects
foreach ($result in $results)
{
    $userEntry = $result.GetDirectoryEntry()
    Write-Host "User Name = " $userEntry.name
    foreach ($SPN in $userEntry.servicePrincipalName)
    {
        Write-Host "SPN = " $SPN      
    }
    Write-Host ""   
}
      

Los valores de SPN en los resultados revelarán dónde está registrado cada cuenta y para qué servicio está registrado en ese sistema. Por ejemplo, aquí está el valor de SPN para una cuenta de servicio SQL:

Image

Descubrimiento de cuentas de servicio utilizando atributos de objeto genéricos

Aunque los SPN son muy fiables e informativos, no producirán una lista exhaustiva de cuentas de servicio porque muchas cuentas no se integran con Kerberos a través de los SPN y no tendrán valores de SPN establecidos. Sin embargo, los atacantes sin derechos de dominio a menudo aún pueden descubrir cuentas de servicio por otros medios. En particular, la mayoría de las organizaciones utilizan convenciones de nomenclatura, como que todos los nombres de cuentas de servicio comiencen con “SVC” o algo similar, y las cuentas de servicio suelen colocarse en sus propias unidades organizativas (OUs) o grupos.

Encontrar cuentas de servicio basadas en convenciones de nomenclatura de cuentas

Aquí hay un script de PowerShell que encontrará todas las cuentas que contienen “svc” en el nombre:

      #Build LDAP filter to find service accounts based on naming conventions
$ldapFilter = "(&(objectclass=Person)(cn=*svc*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"

#Add list of properties to search for
$objProperties = "name"
Foreach ($i in $objProperties){$search.PropertiesToLoad.Add($i)}

#Execute Search
$results = $search.FindAll()
#Display values from the returned objects
foreach ($result in $results)
{
    $userEntry = $result.GetDirectoryEntry()
    Write-Host "User Name = " $userEntry.name
    Write-Host ""   
}
      

Encontrar cuentas de servicio basadas en OU

Y aquí hay un filtro LDAP que se puede sustituir en el script anterior para encontrar cualquier OU que contenga “Service” o “svc” en el nombre:

      $ldapFilter = "(&(objectClass=organizationalUnit)(|name=*Service*)(name=*svc*)))"

The attacker can then search those OUs for all user objects to find your service accounts. This script focuses on one OU with “Service” in its name:

$search = New-Object System,DirecoryServices.DirectorySearcher
$search.SearchRoot = "LDAP://OU=Service Accounts,OU=JEFFLAB,DC=local"
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
      

Descubrimiento de cuentas de servicio a través del control de cuentas de usuario

Otra forma astuta de buscar cuentas de servicio en Active Directory es investigar la configuración de control de cuentas, ya que las cuentas de servicio a menudo tienen configuraciones diferentes a las cuentas de usuario regulares. El mejor ejemplo de esto es la configuración de “password never expires” — las cuentas de servicio pueden tener contraseñas configuradas para nunca expirar porque el acto de restablecerlas puede ser tedioso y resultar en interrupciones de aplicaciones o servicios.

Image

Con PowerShell, es posible encontrar todas las cuentas con este valor habilitado, utilizando un filtro LDAP un poco más complicado:

      $ldapFilter = "(&(objectclass=user)(objectcategory=user)(useraccountcontrol:1.2.840.113556.1.4.803:=65536))"
      

Descubrimiento de privilegios

Aunque esta publicación se centró únicamente en formas de encontrar cuentas de servicio sin aprovechar ningún privilegio, si un atacante encuentra una cuenta que tiene privilegios en uno o más sistemas dentro de la red, hay muchas otras formas efectivas de descubrir cuentas de servicio. Incluyen:

  • Enumerando servicios en endpoints y extrayendo la cuenta de startname
  • Buscando cadenas de conexión en web.config, scripts y otros lugares donde las cuentas de servicio pueden estar codificadas de manera fija
  • Explorando la política local para usuarios a los que se les ha concedido el derecho de “Iniciar sesión como un servicio”
  • Extracción de registros de eventos para tipos de inicio de sesión no interactivos
  • Encontrar cuentas de servicio de aplicación web y otros servicios de aplicación pool

Explotando las cuentas descubiertas

Una vez que un adversario tiene una lista de cuentas de servicio, su siguiente paso es explotarlas. Descubre algunas de sus opciones en las siguientes publicaciones:

Aprenda más sobre el reconocimiento LDAP y otras técnicas de ataque en el Netwrix attack catalog.

Compartir en

Aprende más

Acerca del autor

Un hombre con una chaqueta azul y camisa a cuadros sonre para la cmara

Jeff Warren

Director de Producto

Jeff Warren supervisa el portafolio de productos de Netwrix, aportando más de una década de experiencia en gestión y desarrollo de productos enfocados en la seguridad. Antes de unirse a Netwrix, Jeff lideró la organización de productos en Stealthbits Technologies, donde utilizó su experiencia como ingeniero de software para desarrollar soluciones de seguridad innovadoras y escalables para empresas. Con un enfoque práctico y un talento para resolver desafíos de seguridad complejos, Jeff se centra en construir soluciones prácticas que funcionen. Tiene un BS en Sistemas de Información de la Universidad de Delaware.