¿Qué son el endurecimiento de NetSessionEnum y del SAM remoto frente al reconocimiento de BloodHound en Active Directory?
NetSessionEnum, el endurecimiento del SAM remoto, el reconocimiento de BloodHound, los grafos de ataque de Active Directory: estos cuatro temas se reducen a los tres mismos ajustes, y ninguno de ellos tiene un número CVE — precisamente la razón por la que casi nadie los endurece.
Los dos tipos de arista más valiosos de BloodHound, HasSession y AdminTo, no se construyen a partir de un exploit. Provienen de dos llamadas RPC de Windows corrientes: NetSessionEnum (¿quién está conectado aquí ahora mismo?) y una consulta SAMR contra la base de datos SAM local (¿quién es administrador local aquí?). Que una cuenta de dominio con pocos privilegios pueda realizarlas depende por completo de dos valores predeterminados que cambiaron en momentos distintos — y que hoy siguen dejando una brecha considerable. NetSessionEnum estaba abierto a Authenticated Users hasta Windows 10 1703 y Windows Server 2016, y el SAM remoto no tenía restricciones antes de Windows 10 1607 y Windows Server 2016; en las versiones actuales ambos están restringidos en servidores miembro y estaciones de trabajo, pero el SAM remoto sigue abierto a Everyone en todos los controladores de dominio, por diseño documentado. Un atacante con un único punto de apoyo con pocos privilegios recorre el parque haciendo ambas preguntas allí donde todavía obtienen respuesta, y SharpHound convierte las respuestas en un grafo que apunta directamente a Domain Admin.
Los tres ajustes siguientes son las palancas que eliminan esas dos preguntas del grafo: el descriptor de seguridad SrvsvcSessionInfo que controla NetSessionEnum, la directiva RestrictRemoteSam que controla la consulta SAM/SAMR, y si SMBv1 —el protocolo cuya época precede a ambos valores de endurecimiento— sigue instalado en algún lugar del parque.
Cómo funciona
La enumeración de sesiones y de administradores locales es una de varias debilidades de identidad de máquina que alimentan el grafo de ataque de BloodHound — véase también la superficie de ataque de los objetos de equipo en Active Directory, más amplia, para el lado de delegación y DCSync del mismo problema.
NetSessionEnum y la arista HasSession
NetSessionEnum es una API heredada del servicio Server (\\host\srvsvc a través del recurso administrativo IPC$) que enumera las sesiones de red actualmente conectadas a una máquina — en la práctica, «qué cuentas están conectadas o tienen una unidad asignada hacia mí en este momento». SharpHound la invoca durante el método de recolección Session por defecto, resuelve las IP/nombres de host devueltos hacia objetos de equipo, y traza una arista HasSession desde ese equipo hacia cada cuenta encontrada. Una arista HasSession es una promesa de oportunidad, no una garantía: si el atacante puede alcanzar esa máquina con derechos de administrador (u otra ruta hacia ella), las credenciales o el token de un usuario real actualmente conectado pueden estar en memoria, listos para robarse.
Quién puede invocar NetSessionEnum lo controla un descriptor de seguridad almacenado en el valor de registro SrvsvcSessionInfo, bajo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity. Compass Security probó esta ACL concreta build a build y publicó la matriz: Windows 10 1607 (14393) y 1703 (15063), así como Windows Server 2016 (14393), conceden a Authenticated Users el derecho a invocarla, mientras que Windows 10 1709 (16299) y versiones posteriores, Windows Server 2019 (17763) y Windows Server 2022 (20348) no lo hacen. En esos builds más recientes, el descriptor concede ese derecho de forma remota a Administradores, Server Operators y Power Users, además de las sesiones de inicio Interactive, Service y Batch localmente — que es, casi exactamente, la ACL que el script de endurecimiento NetCease fue escrito para aplicar. Compass también señala que las actualizaciones acumulativas no cambiaron el comportamiento dentro de una misma versión, y que no existe documentación pública clara de Microsoft sobre el cambio, por lo que la única forma de saber qué comportamiento tiene un host concreto es leer el valor, no deducirlo de la versión de sistema operativo en el inventario de activos.
El acceso SAM remoto y la arista AdminTo
El método de recolección LocalAdmin de SharpHound (también usado por los métodos RDP, DCOM y PSRemote) enumera los grupos locales de un equipo a través de la tubería con nombre SAMR (\\host\samr, también sobre IPC$) para averiguar quién es miembro de Administradores locales — la fuente de la arista AdminTo. El protocolo SAMRPC permite a un llamador con pocos privilegios enumerar usuarios, grupos y pertenencia a grupos desde el SAM local y desde Active Directory, exactamente el paso de reconocimiento que los atacantes usaban mucho antes de que existiera BloodHound para encontrar dónde una cuenta privilegiada tiene derechos de administrador local permanentes.
Esto está controlado por la directiva Acceso de red: restringir a los clientes autorizados a realizar llamadas remotas a SAM (valor de registro RestrictRemoteSam, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\RestrictRemoteSam, REG_SZ). La propia documentación de Microsoft es explícita sobre el valor predeterminado aquí, y ese valor predeterminado es desigual por diseño:
| Rol | SDDL predeterminado | Comportamiento efectivo |
|---|---|---|
| Servidor que no es controlador de dominio (Windows 10 1607+ / Server 2016+) | O:SYG:SYD:(A;;RC;;;BA) | Solo el grupo Administradores locales puede consultar SAM de forma remota |
| Controlador de dominio con Windows Server 2016 (o posterior) (leyendo Active Directory) | "" (en blanco) | Everyone tiene acceso de lectura, para preservar la compatibilidad de aplicaciones heredadas |
| Cualquier versión de SO anterior | No se realiza ninguna comprobación de acceso | Totalmente abierto por defecto |
Esa fila central es el matiz que importa: el relato de «seguro por defecto desde 2016» solo se aplica a servidores miembro y estaciones de trabajo. Los controladores de dominio —las máquinas cuyos datos de administrador local un atacante más desea— se entregan con lecturas SAMR abiertas a Everyone, en todas las versiones de Windows Server compatibles, por razones de compatibilidad que Microsoft expone explícitamente y no por descuido.
Dónde encaja SMBv1
SMBv1 no es el transporte que lleva las llamadas NetSessionEnum o SAMR — esos RPC circulan por tuberías con nombre sobre IPC$ sin importar el dialecto SMB. Lo que SMBv1 revela es historia. Microsoft no lo instala por defecto desde Windows 10 y Windows Server, versión 1709, y Windows Server 2019 y versiones posteriores se entregan sin él tras una instalación limpia. Un host que todavía responde a SMBv1 cae, por tanto, en una de tres categorías, y la tercera es la que más parques olvidan: es anterior a la fecha de corte, alguien lo reinstaló deliberadamente, o se actualizó in situ. Microsoft es explícito en que las actualizaciones in situ no eliminan SMBv1 automáticamente, y que en Windows 10 Enterprise, Education y Pro for Workstations «un administrador debe decidir desinstalar SMBv1 en estos entornos gestionados» — allí no se aplica ninguna eliminación automática a los 15 días. Por tanto, SMBv1 no demuestra que el host sea antiguo; demuestra que nunca se volvió a establecer su línea base. Es la misma condición bajo la cual sobrevive un descriptor SrvsvcSessionInfo anterior a 1709, lo que lo convierte en un atajo de inventario útil — «ir a leer a mano las ACL de sesión y SAM de este host» — en lugar de un primitivo de ataque independiente.
Esta superficie de reconocimiento de sesiones y administradores locales se sitúa junto a otras rutas de reconocimiento ya cubiertas en este blog: la firma SMB dejada deshabilitada, que habilita el relay NTLM, las cadenas de ataque de relay NTLM contra Active Directory de forma más amplia, y el acceso LDAP anónimo mediante un valor dsHeuristics permisivo, que cubre la enumeración del lado del directorio. Este artículo no repite nada de eso — trata específicamente de la superficie de enumeración de sesiones y administradores locales que alimenta HasSession y AdminTo.
La cadena de ataque
Paso 1 — Cualquier punto de apoyo de dominio
El atacante no necesita nada más que una credencial de dominio válida (o un token de sesión desatendido) — sin exploit, y sin derechos de administrador local en los controladores de dominio que está a punto de enumerar.
Paso 2 — Recolección predeterminada de SharpHound
# -c All ejecuta todos los métodos de recolección, incluidos Session y LocalAdmin
.\SharpHound.exe -c All -d corp.local
Para cada host activo, SharpHound invoca NetSessionEnum a través de \\host\srvsvc para las sesiones y una consulta de grupo local SAMR a través de \\host\samr para los administradores locales. Las dos llamadas no fallan ni tienen éxito conjuntamente. La consulta SAMR tiene éxito contra todos los controladores de dominio sin importar la versión de Windows, debido al valor predeterminado en blanco mencionado antes; la llamada de sesión tiene éxito en cualquier host cuyo descriptor SrvsvcSessionInfo sea todavía el anterior a 1709, o se haya relajado después. Una sola cuenta con pocos privilegios basta para ambas.
Paso 3 — BloodHound construye la ruta
BloodHound Community Edition correlaciona las aristas HasSession y AdminTo devueltas con la pertenencia a grupos existente para calcular una ruta más corta como: cuenta con pocos privilegios comprometida → tiene una sesión en el host X → una cuenta Domain Admin también está conectada en el host X → el atacante toma el control del host X → vuelca LSASS o roba el token del Domain Admin.
Paso 4 — Robo de credenciales en el host objetivo
Si el atacante también tiene (o puede obtener) derechos de administrador local en el host que aloja la sesión —a menudo cierto, ya que la enumeración AdminTo del mismo barrido con pocos privilegios ya revela qué hosts tienen una pertenencia a administradores locales permisiva—, la sesión se convierte en una oportunidad de robo de credenciales mediante el acceso a LSASS o la suplantación de token.
Detección
Ni NetSessionEnum ni una lectura SAMR generan por defecto un evento de Windows dedicado a «alguien me enumeró», y ambos dependen de la misma configuración de directiva de auditoría avanzada que la mayoría de los dominios dejan en su estado incompleto de fábrica. Los siguientes eventos ofrecen la cobertura más cercana:
| ID de evento | Origen | Qué muestra | Requiere |
|---|---|---|---|
| 16965 | Directory-Service-SAM (registro System) | Una llamada remota a SAM fue denegada — incluye el SID del llamador y su dirección de red | Nada: también se dispara bajo el descriptor predeterminado codificado, sin ningún valor de registro configurado |
| 16968 | Directory-Service-SAM (registro System) | Modo solo auditoría: muestra qué se habría denegado, sin romper nada | RestrictRemoteSamAuditOnlyMode = 1 |
| 5145 | Microsoft-Windows-Security-Auditing (Detailed File Share) | Comprobación de acceso contra una tubería con nombre IPC$ — Share Name = \\*\IPC$, Relative Target Name = srvsvc, samr o lsarpc | Subcategoría de auditoría avanzada «Audit Detailed File Share» habilitada |
No construya la detección basada en volumen únicamente sobre 16965. Microsoft lo limita: por defecto, el evento solo se escribe la primera vez que se deniega el acceso tras el arranque, y cada denegación posterior dentro de una ventana de 15 minutos se cuenta simplemente y se reporta en bloque mediante el evento 16969 («se han denegado N llamadas remotas a la base de datos SAM durante la ventana de limitación de los últimos X segundos»). La ventana se define mediante RestrictRemoteSamEventThrottlingWindow (REG_DWORD, en segundos, bajo HKLM\System\CurrentControlSet\Control\Lsa); configúrela en 0 para desactivar la limitación y registrar cada denegación. El modo solo auditoría no está limitado, otra razón para ejecutarlo primero.
Una búsqueda práctica: filtre el ID de evento 5145 por Share Name = \\*\IPC$ y Relative Target Name entre srvsvc, samr, lsarpc, y luego marque cualquier cuenta de origen que no sea controlador de dominio que toque más de un puñado de hosts de destino distintos en una ventana corta — una única cuenta de estación de trabajo que invoca srvsvc/samr contra decenas de hosts en minutos es el comportamiento de recolección predeterminado de SharpHound, no actividad de usuario normal. El evento 5145 proviene de la subcategoría Audit Detailed File Share, deshabilitada por defecto y de alto volumen, así que acótela deliberadamente.
Remediación
- Haga inventario antes de restringir. Active
RestrictRemoteSamAuditOnlyMode(REG_DWORD, valor1, bajoHKLM\SYSTEM\CurrentControlSet\Control\Lsa) y revise el evento 16968 durante unos días para identificar a los llamadores legítimos de SAM remoto antes de configurar la directiva en producción. - Configure explícitamente
RestrictRemoteSamen los controladores de dominio. El valor predeterminado allí es «Everyone» por compatibilidad — no se vuelve seguro solo porque la máquina ejecute la última versión de Windows Server. Defina un SDDL que permita solo a las cuentas y grupos que realmente necesitan lecturas SAM remotas (SAMRi10, de los mismos investigadores de Microsoft que NetCease, crea un grupo dedicado «Remote SAM Users» y escribe el SDDL por usted en lugar de editar la cadena a mano). No se requieren reinicios: Microsoft indica que el ajuste surte efecto al guardarse localmente o al aplicarse mediante directiva de grupo. - Endurezca
NetSessionEnumcon un cambio de ACL enSrvsvcSessionInfo— en los builds que todavía lo necesitan. El script NetCease eliminaAuthenticated Usersdel descriptor de seguridadSrvsvcSessionInfoy añade los SID de inicio de sesión Interactive, Service y Batch, dejando en su lugar a Administradores, Power Users y Server Operators. Su propia documentación es explícita en que hay que «reiniciar el servicio 'Server' para que los cambios surtan efecto» (Restart-Service -Name LanmanServer -Force). Observe lo que esto significa en un parque moderno: Windows 10 1709+ y Windows Server 2019+ ya incluyen esa ACL, por lo que NetCease es prácticamente un no-op allí — su valor está en los hosts anteriores a 1709 y en Server 2016, y en cualquier host cuyo descriptor se haya relajado posteriormente. Pruebe primero en un grupo de auditoría/preproducción — las mismas herramientas administrativas que se rompen bajoRestrictRemoteSamtambién pueden romperse aquí. - No dé por hecho que la versión del SO indica el estado actual. Consulte directamente
SrvsvcSessionInfoyRestrictRemoteSamen lugar de confiar en «estamos en Server 2019/2022 así que estamos bien»:Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RestrictRemoteSam -ErrorAction SilentlyContinue - Confirme que SMBv1 realmente ha desaparecido, no que simplemente se asume que ha desaparecido.
Trate cualquier host que todavía responda a SMBv1 como una señal para verificar manualmente su estado de
# Requiere elevación; deshabilitarlo provoca un reinicio salvo que se use -NoRestart Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol # Si State es Enabled: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart # Alternativa no elevada de Microsoft, más adecuada para barrer un parque: Get-SmbServerConfiguration | Format-List EnableSMB1ProtocolSrvsvcSessionInfoyRestrictRemoteSam— no porque SMBv1 demuestre que el host es antiguo, sino porque demuestra que nunca se volvió a establecer su línea base, la misma condición que preserva un descriptor de sesión o SAM obsoleto. Esto complementa la lista más amplia de prioridades de endurecimiento de Active Directory, que indica dónde encaja esto respecto a otras correcciones. - Vuelva a ejecutar SharpHound tras el endurecimiento y compare el recuento de aristas. Una caída en las aristas
HasSessionyAdminTosobre el mismo dominio, con los mismos métodos de recolección, es la única prueba de que el cambio realmente redujo el grafo de ataque y no solo la lista de cumplimiento.
Cómo lo detecta EtcSec
La auditoría de Active Directory de EtcSec cubre los tres ajustes en el nivel donde se gobiernan de forma centralizada: la directiva de grupo. NET_SESSION_HARDENING_MISSING se dispara cuando ninguna directiva configura el endurecimiento de sesión SrvsvcSessionInfo en absoluto — el ajuste equivalente a NetCease está simplemente ausente del conjunto de directivas del dominio. SAM_REMOTE_ACCESS_OPEN se dispara cuando RestrictRemoteSam está sin definir o contiene un SDDL sin DACL, el estado que deja en su sitio el valor predeterminado del controlador de dominio. SMB_V1_ENABLED se dispara cuando la directiva deja SMBv1 habilitado.
Interprete esos tres hallazgos por lo que son: le indican si el dominio tiene una directiva que cierra estas brechas, no si cada máquina individual la cumple. Esa distinción es todo el sentido de este artículo. Una línea base de GPO limpia sigue dejando el trabajo por host descrito arriba — leer SrvsvcSessionInfo y RestrictRemoteSam en los propios hosts, y volver a ejecutar SharpHound para comparar el recuento de aristas — porque una actualización in situ, una escritura de directiva local o un script de endurecimiento de terceros pueden divergir de la directiva sin modificarla.
Explore las páginas de identidad que apoyan este tema
