Che cosa sono l'hardening di NetSessionEnum, del SAM remoto e la ricognizione BloodHound su Active Directory?
NetSessionEnum, l'hardening del SAM remoto, la ricognizione BloodHound, i grafi di attacco di Active Directory: questi quattro argomenti si riducono alle stesse tre impostazioni, e nessuna di esse porta un numero CVE — motivo esatto per cui quasi nessuno le mette in sicurezza.
I due tipi di edge più preziosi di BloodHound, HasSession e AdminTo, non derivano da un exploit. Provengono da due normali chiamate RPC di Windows: NetSessionEnum (chi è attualmente connesso qui?) e una query SAMR contro il database SAM locale (chi è amministratore locale qui?). Il fatto che un account di dominio con pochi privilegi possa eseguirle dipende interamente da due impostazioni predefinite cambiate in momenti diversi — e che oggi lasciano ancora un'ampia apertura. NetSessionEnum era aperto a Authenticated Users fino a Windows 10 1703 e Windows Server 2016, e il SAM remoto non aveva restrizioni prima di Windows 10 1607 e Windows Server 2016; sulle build attuali entrambi sono limitati su server membri e workstation, ma il SAM remoto resta aperto a Everyone su ogni controller di dominio, per progettazione documentata. Un attaccante con un solo punto d'appoggio a bassi privilegi percorre il parco macchine ponendo entrambe le domande ovunque ottengano ancora risposta, e SharpHound trasforma le risposte in un grafo che punta dritto a Domain Admin.
Le tre impostazioni seguenti sono le leve che rimuovono queste due domande dal grafo: il descrittore di sicurezza SrvsvcSessionInfo che regola NetSessionEnum, il criterio RestrictRemoteSam che regola la query SAM/SAMR, e se SMBv1 — il protocollo la cui epoca precede entrambe le impostazioni di hardening — è ancora installato da qualche parte nel parco macchine.
Come funziona
L'enumerazione di sessioni e amministratori locali è una delle diverse debolezze di identità delle macchine che alimentano il grafo di attacco di BloodHound — vedi anche la superficie di attacco degli oggetti computer in Active Directory, più ampia, per il lato delega e DCSync dello stesso problema.
NetSessionEnum e l'edge HasSession
NetSessionEnum è un'API legacy del servizio Server (\\host\srvsvc tramite la condivisione amministrativa IPC$) che elenca le sessioni di rete attualmente connesse a una macchina — in pratica, "quali account sono connessi o hanno un'unità mappata verso di me in questo momento". SharpHound la richiama durante il metodo di raccolta Session predefinito, risolve gli IP/hostname restituiti in oggetti computer, e traccia un edge HasSession da quel computer verso ogni account trovato. Un edge HasSession è una promessa di opportunità, non una garanzia: se l'attaccante può raggiungere quella macchina con diritti admin (o un altro percorso verso di essa), le credenziali o il token di un utente realmente connesso potrebbero trovarsi in memoria, pronti per essere rubati.
Chi può richiamare NetSessionEnum è controllato da un descrittore di sicurezza memorizzato nel valore di registro SrvsvcSessionInfo, sotto HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity. Compass Security ha testato questa specifica ACL build per build e ha pubblicato la matrice: Windows 10 1607 (14393) e 1703 (15063), così come Windows Server 2016 (14393), concedono a Authenticated Users il diritto di richiamarla, mentre Windows 10 1709 (16299) e versioni successive, Windows Server 2019 (17763) e Windows Server 2022 (20348) non lo fanno. Su queste build più recenti, il descrittore concede tale diritto da remoto ad Administrators, Server Operators e Power Users, oltre alle sessioni di accesso Interactive, Service e Batch localmente — il che corrisponde, quasi esattamente, all'ACL che lo script di hardening NetCease è stato scritto per applicare. Compass segnala inoltre che gli aggiornamenti cumulativi non hanno modificato il comportamento all'interno di una stessa versione, e che non esiste una documentazione pubblica Microsoft chiara sul cambiamento — l'unico modo per sapere quale comportamento presenti un determinato host è leggere il valore, non dedurlo dalla versione del sistema operativo nell'inventario.
L'accesso SAM remoto e l'edge AdminTo
Il metodo di raccolta LocalAdmin di SharpHound (usato anche dai metodi RDP, DCOM e PSRemote) enumera i gruppi locali di un computer tramite la named pipe SAMR (\\host\samr, anch'essa su IPC$) per scoprire chi è membro del gruppo Administrators locale — la fonte dell'edge AdminTo. Il protocollo SAMRPC consente a un chiamante con pochi privilegi di enumerare utenti, gruppi e appartenenza ai gruppi dal SAM locale e da Active Directory, esattamente il passo di ricognizione che gli attaccanti usavano ben prima che BloodHound esistesse per scoprire dove un account privilegiato dispone di diritti di amministratore locale permanenti.
Questo è regolato dal criterio Accesso alla rete: limita i client autorizzati a effettuare chiamate remote a SAM (valore di registro RestrictRemoteSam, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\RestrictRemoteSam, REG_SZ). La documentazione ufficiale Microsoft è esplicita sul valore predefinito qui, e tale valore predefinito è volutamente disomogeneo:
| Ruolo | SDDL predefinito | Comportamento effettivo |
|---|---|---|
| Server non controller di dominio (Windows 10 1607+ / Server 2016+) | O:SYG:SYD:(A;;RC;;;BA) | Solo il gruppo Administrators locale può interrogare SAM da remoto |
| Controller di dominio Windows Server 2016 (o successivo) (in lettura su Active Directory) | "" (vuoto) | Everyone ha accesso in lettura, per preservare la compatibilità con le applicazioni legacy |
| Qualsiasi versione di SO precedente | Nessun controllo di accesso eseguito | Completamente aperto per impostazione predefinita |
Quella riga centrale è la sfumatura che conta: il racconto "sicuro per impostazione predefinita dal 2016" si applica solo a server membri e workstation. I controller di dominio — le macchine i cui dati di amministratore locale un attaccante desidera di più — vengono forniti con letture SAMR aperte a Everyone, su ogni versione di Windows Server supportata, per ragioni di compatibilità che Microsoft dichiara esplicitamente, non per svista.
Dove si colloca SMBv1
SMBv1 non è il trasporto che veicola le chiamate NetSessionEnum o SAMR — questi RPC viaggiano su named pipe attraverso IPC$ a prescindere dal dialetto SMB. Ciò che SMBv1 rivela è la storia. Microsoft non lo installa più per impostazione predefinita a partire da Windows 10 e Windows Server, versione 1709, e Windows Server 2019 e versioni successive vengono forniti senza di esso dopo un'installazione pulita. Un host che risponde ancora a SMBv1 rientra quindi in una di tre categorie, e la terza è quella che la maggior parte dei parchi macchine dimentica: precede la data di taglio, qualcuno lo ha reinstallato deliberatamente, oppure è stato aggiornato in-place. Microsoft dichiara esplicitamente che gli aggiornamenti in-place non rimuovono automaticamente SMBv1, e che su Windows 10 Enterprise, Education e Pro for Workstations "un amministratore deve decidere di disinstallare SMBv1 in questi ambienti gestiti" — lì non si applica alcuna rimozione automatica dopo 15 giorni. Quindi SMBv1 non dimostra che l'host sia vecchio; dimostra che non è mai stato riportato a una baseline aggiornata. È la stessa condizione in cui sopravvive un descrittore SrvsvcSessionInfo precedente al 1709, il che lo rende una scorciatoia utile per l'inventario — "vai a leggere a mano le ACL di sessione e SAM di questo host" — piuttosto che un primitivo di attacco a sé stante.
Questa superficie di ricognizione delle sessioni e degli amministratori locali si affianca ad altri percorsi di ricognizione già trattati su questo blog: la firma SMB lasciata disabilitata, che abilita il relay NTLM, le catene di attacco relay NTLM contro Active Directory più in generale, e l'accesso LDAP anonimo tramite un valore dsHeuristics permissivo, che copre l'enumerazione lato directory. Questo articolo non ripete nulla di ciò — riguarda specificamente la superficie di enumerazione delle sessioni e degli amministratori locali che alimenta HasSession e AdminTo.
La catena di attacco
Passo 1 — Un punto d'appoggio di dominio qualsiasi
L'attaccante non ha bisogno di altro che una singola credenziale di dominio valida (o un token di sessione incustodito) — nessun exploit, e nessun diritto di amministratore locale sui controller di dominio che sta per enumerare.
Passo 2 — Raccolta SharpHound predefinita
# -c All esegue tutti i metodi di raccolta, incluse Session e LocalAdmin
.\SharpHound.exe -c All -d corp.local
Per ogni host attivo, SharpHound richiama NetSessionEnum tramite \\host\srvsvc per le sessioni e una query di gruppo locale SAMR tramite \\host\samr per gli amministratori locali. Le due chiamate non falliscono né riescono insieme. La query SAMR riesce contro ogni controller di dominio indipendentemente dalla versione di Windows, a causa del valore predefinito vuoto descritto sopra; la chiamata di sessione riesce su qualsiasi host il cui descrittore SrvsvcSessionInfo sia ancora quello pre-1709, o sia stato allentato successivamente. Un solo account a bassi privilegi è sufficiente per entrambe.
Passo 3 — BloodHound costruisce il percorso
BloodHound Community Edition correla gli edge HasSession e AdminTo restituiti con l'appartenenza ai gruppi esistente per calcolare un percorso più breve come: account a bassi privilegi compromesso → ha una sessione sull'host X → un account Domain Admin è anch'esso connesso sull'host X → l'attaccante prende il controllo dell'host X → dump di LSASS o furto del token del Domain Admin.
Passo 4 — Furto di credenziali sull'host target
Se l'attaccante ha anche (o può ottenere) diritti di amministratore locale sull'host che ospita la sessione — spesso vero, poiché l'enumerazione AdminTo proveniente dalla stessa scansione a bassi privilegi rivela già quali host hanno un'appartenenza permissiva al gruppo amministratori locale — la sessione diventa un'opportunità di furto di credenziali tramite l'accesso a LSASS o l'impersonificazione del token.
Rilevamento
Né NetSessionEnum né una lettura SAMR producono per impostazione predefinita un evento Windows dedicato del tipo "qualcuno mi ha enumerato", ed entrambi si basano sulla stessa configurazione dei criteri di controllo avanzati che la maggior parte dei domini lascia nel suo stato incompleto di fabbrica. I seguenti eventi offrono la copertura più vicina:
| ID evento | Origine | Cosa mostra | Richiede |
|---|---|---|---|
| 16965 | Directory-Service-SAM (log System) | Una chiamata remota a SAM è stata negata — include il SID del chiamante e il suo indirizzo di rete | Nulla: si attiva anche con il descrittore predefinito hard-coded, senza alcun valore di registro impostato |
| 16968 | Directory-Service-SAM (log System) | Modalità solo controllo: mostra cosa sarebbe stato negato, senza rompere nulla | RestrictRemoteSamAuditOnlyMode = 1 |
| 5145 | Microsoft-Windows-Security-Auditing (Detailed File Share) | Verifica di accesso su una named pipe IPC$ — Share Name = \\*\IPC$, Relative Target Name = srvsvc, samr o lsarpc | Sottocategoria di controllo avanzata "Audit Detailed File Share" abilitata |
Non costruite un rilevamento basato sul volume solo sull'evento 16965. Microsoft lo limita: per impostazione predefinita l'evento viene scritto solo la prima volta che l'accesso viene negato dopo l'avvio, e ogni negazione successiva entro una finestra di 15 minuti viene semplicemente conteggiata e riportata in blocco dall'evento 16969 ("N chiamate remote al database SAM sono state negate nella finestra di limitazione degli ultimi X secondi"). La finestra è impostata da RestrictRemoteSamEventThrottlingWindow (REG_DWORD, in secondi, sotto HKLM\System\CurrentControlSet\Control\Lsa); impostatela su 0 per disabilitare la limitazione e registrare ogni negazione. La modalità solo controllo non è soggetta a limitazione, un motivo in più per eseguirla per prima.
Una ricerca pratica: filtrate l'ID evento 5145 per Share Name = \\*\IPC$ e Relative Target Name tra srvsvc, samr, lsarpc, quindi segnalate qualsiasi account di origine non controller di dominio che tocca più di una manciata di host di destinazione distinti in una breve finestra — un singolo account workstation che richiama srvsvc/samr contro decine di host in pochi minuti è il comportamento di raccolta predefinito di SharpHound, non un'attività utente normale. L'evento 5145 proviene dalla sottocategoria Audit Detailed File Share, disabilitata per impostazione predefinita e ad alto volume, quindi delimitatela deliberatamente.
Correzione
- Fate l'inventario prima di limitare. Abilitate
RestrictRemoteSamAuditOnlyMode(REG_DWORD, valore1, sottoHKLM\SYSTEM\CurrentControlSet\Control\Lsa) e rivedete l'evento 16968 per alcuni giorni per identificare i chiamanti legittimi del SAM remoto prima di configurare il criterio in produzione. - Configurate esplicitamente
RestrictRemoteSamsui controller di dominio. Il valore predefinito lì è "Everyone" per compatibilità — non diventa sicuro solo perché la macchina esegue l'ultima versione di Windows Server. Definite un SDDL che consenta solo agli account e ai gruppi che hanno effettivamente bisogno di letture SAM remote (SAMRi10, degli stessi ricercatori Microsoft di NetCease, crea un gruppo dedicato "Remote SAM Users" e scrive l'SDDL al posto vostro invece di modificare la stringa a mano). Non sono richiesti riavvii: Microsoft dichiara che l'impostazione ha effetto al salvataggio locale o all'applicazione tramite Criteri di gruppo. - Rafforzate
NetSessionEnumcon una modifica dell'ACLSrvsvcSessionInfo— sulle build che ne hanno ancora bisogno. Lo script NetCease rimuoveAuthenticated Usersdal descrittore di sicurezzaSrvsvcSessionInfoe aggiunge i SID di accesso Interactive, Service e Batch, lasciando al loro posto Administrators, Power Users e Server Operators. La sua stessa documentazione dichiara esplicitamente che occorre "riavviare il servizio 'Server' perché le modifiche abbiano effetto" (Restart-Service -Name LanmanServer -Force). Notate cosa significa questo su un parco macchine moderno: Windows 10 1709+ e Windows Server 2019+ forniscono già quell'ACL, quindi NetCease è vicino a un no-op lì — il suo valore sta sugli host precedenti al 1709 e su Server 2016, oltre che su qualsiasi host il cui descrittore sia stato allentato successivamente. Testate prima in un gruppo di audit/staging — gli stessi strumenti amministrativi che si rompono sottoRestrictRemoteSampossono rompersi anche qui. - Non presumete che la versione del sistema operativo indichi lo stato attuale. Interrogate direttamente
SrvsvcSessionInfoeRestrictRemoteSaminvece di fidarvi di "siamo su Server 2019/2022 quindi va tutto bene":Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RestrictRemoteSam -ErrorAction SilentlyContinue - Confermate che SMBv1 sia davvero assente, non solo presunto assente.
Trattate qualsiasi host che risponda ancora a SMBv1 come un segnale da verificare manualmente per il suo stato di
# Richiede l'elevazione; la disabilitazione attiva un riavvio a meno che non si usi -NoRestart Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol # Se State è Enabled: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart # Alternativa non elevata di Microsoft, più adatta a scansionare un intero parco macchine: Get-SmbServerConfiguration | Format-List EnableSMB1ProtocolSrvsvcSessionInfoeRestrictRemoteSam— non perché SMBv1 dimostri che l'host è vecchio, ma perché dimostra che non è mai stato riportato a una baseline aggiornata, la stessa condizione che preserva un descrittore di sessione o SAM obsoleto. Questo completa l'elenco più ampio delle priorità di hardening di Active Directory, che indica dove questo si colloca rispetto alle altre correzioni. - Rieseguite SharpHound dopo l'hardening e confrontate il conteggio degli edge. Un calo degli edge
HasSessioneAdminTosullo stesso dominio, con gli stessi metodi di raccolta, è l'unica prova che la modifica ha effettivamente ridotto il grafo di attacco e non solo la checklist di conformità.
Come EtcSec rileva questo
L'audit Active Directory di EtcSec copre tutte e tre le impostazioni al livello in cui sono governate centralmente: Criteri di gruppo. NET_SESSION_HARDENING_MISSING si attiva quando nessun criterio configura affatto l'hardening di sessione SrvsvcSessionInfo — l'impostazione equivalente a NetCease è semplicemente assente dal set di criteri del dominio. SAM_REMOTE_ACCESS_OPEN si attiva quando RestrictRemoteSam non è impostato oppure porta un SDDL privo di DACL, lo stato che lascia in vigore il valore predefinito del controller di dominio. SMB_V1_ENABLED si attiva quando il criterio lascia SMBv1 abilitato.
Interpretate questi tre riscontri per quello che sono: indicano se il dominio dispone di un criterio che chiude queste lacune, non se ogni singola macchina vi si conforma. Questa distinzione è l'intero senso di questo articolo. Una baseline GPO pulita lascia comunque il lavoro per singolo host descritto sopra — leggere SrvsvcSessionInfo e RestrictRemoteSam sugli host stessi, e rieseguire SharpHound per confrontare il conteggio degli edge — perché un aggiornamento in-place, una scrittura di criterio locale o uno script di hardening di terze parti possono divergere dal criterio senza modificarlo.
Esplora le pagine di identity security collegate a questo tema
