Come integrazione all'articolo relativo alle vulnerabilità password [1] vorrei spendere una pagina del mio blog al fine di spiegarvi come utilizzare due utilissimi script WSH che potete trovare anche nella mia sezione scripts [2].
Lo script principale (List Clients Local Administrators [3]) ho lo scopo di passare al setaccio tutti i computer client della rete (anche i server se volete) al fine di leggere e registrare all'interno di un file di log tutti quegli account che ne possiedono i privilegi amministrativi.
Lo script secondario (List All Computers And Users Within An OU And Subous [4]) invece è di supporto e servirà per estrapolare agevolmente da Active Directory la lista di tutti i computer da sottoporre al "trattamento" descritto sopra.
Coglierò l'occasione per segnalarvi inoltre due piccole modifiche che possono essere apportate allo script principale in modo da renderlo ancora più efficace in determinate situazioni.
Preparazione
Prima di tutto tenete presente che le operazioni andranno eseguite utilizzando un account di dominio che possieda almeno diritti amministrativi locali sui computer client della rete.
Il passo successivo è, se già non lo avete fatto, procurarsi gli script sopra citati ed estrarli in una cartella qualsiasi, per comodità diciamo che dovete estrarli nella cartella "C:\Scripts".
Siccome questi script sono studiati per poter essere eseguiti tramite il motore WSH "cscript.exe" vi consiglio di aprire un prompt dei comandi e recarvi all'interno della suddetta cartella "C:\Scripts".
Estrazione degli account computer da Active Directory
"List Clients Local Administrators" necessita di avere come input un file di testo denominato computers.txt contenente tutti i nomi dei computer da controllare, sarà quindi necessario ottenere a priori queste informazioni. Farlo è molto semplice:
Modificate lo script "List All Computers And Users Within An OU And Subous" e modificate i due parametri che vedete cerchiati in rosso nell'immagine seguente:
Const ADS_SCOPE_SUBTREE = valore_numerico
è la variabile con la quale impostare la profondità della ricerca, cioè il numero di sottolivelli a partire dal Base Dn (la prossima variabile) nei quali verrà effettuata la ricerca degli oggetti. Questa variabile è utile nel caso in cui vi interessi estrarre soltanto una parte di tutti i computer contenuti in un albero di unità organizzative. In qualsiasi altro caso è sufficiente impostare questa variabile ad un numero abbastanza alto da garantire l'elaborazione di tutte le unità organizzative.
"SELECT Name FROM 'LDAP://ou=Computer,ou=Radice,dc=dominio,dc=lan' WHERE objectCategory='Computer'"
rappresenta il percorso LDAP [7] che lo script utilizzerà come punto di partenza (base dn) per l'estrazione degli account. Per chi non lo sapesse OU serve a dichiarare il nome di una Organizational Unit (unità organizzativa) e DC serve a dichiarare le Domain Component (le componenti del nome di dominio). Di seguito potete vedere la struttura di un dominio fittizio da prendere come riferimento per l'impostazione delle due variabili appena citate:
Se volete approfondire l'argomento LDAP vi consiglio di leggere LDAP per Amministratori Active Directory - LDAP for Active Directory Administrators [9]
Salvate e chiudete la modifica dello script quando pensate che sia corretto ed adeguato alle vostre esigenze. Eseguitelo (dal prompt dei comandi aperto in precedenza) mediante il comando:
cscript list_all_computers_and_users_within_an_ou_and_subous.vbs > computers.txt
la parte finale > computers.txt si occuperà di reindirizzare completamente l'output dello script all'interno del file di testo "computers.txt" (se non esiste verrà creato)
Se aprite questo file vi renderete conto che è quasi perfetto per il nostro scopo:
Le prime tre righe mostrano la versione di WSH e non ci servono, cancellatele e salvate il file. Ora computers.txt è pronto per poter essere fornito in input a "List Clients Local Administrators".
Vi faccio notare che questo script può essere eseguito con successo da un qualsiasi utente di dominio di Active Directory.
Elencare gli amministratori locali dei computer client
Ora che abbiamo creato il file computers.txt tutto il lavoro è già fatto. Non resta che eseguire lo script "List Clients Local Administrators" tramite cscript (in questo caso per l'avvio potrebbe bastare anche Wscript e quindi un semplice doppio clic sul file vbs).
cscript list_clients_local_administrators.vbs
Attendete fino alla comparsa della finestra che vi avvisa che l'esecuzione dello script è terminata. Potrete quindi accedere ai due files di log: errors.txt e lcladmns.txt.
Nel primo troverete il resoconto degli eventuali errori riscontrati durante l'esecuzione dei comandi
Il secondo invece costituisce il famigerato elenco degli amministratori locali dei computer client
Nell'esempio sopra potete chiaramente notare che il PC10 e il PC12 sono fuori standard, nel primo caso è presente un utente di dominio denominato "utente.prova" mentre nel secondo si vede un gruppo di dominio denominato "Local Admins". Soltanto per chiarezza vi faccio notare che all'interno di "lcladmns.txt" gli account locali vengono preceduti da: NOME_DOMINIO/NOME_MACCHINA/ mentre quelli di dominio vengono preceduti soltanto da NOME_DOMINIO/
Utenti potenti?
In un articolo della Knowledge Base [15] Microsoft invita a non utilizzare il gruppo power users in quanto concede agli utenti diritti sufficienti a compromettere il sistema, potreste quindi voler ottenere anche un elenco di questi ultimi. Per farlo sarà sufficiente modificare una semplice parola contenuta nello script "List Clients Local Administrators":
Dovete semplicemente sostituire la parola "Administrators", la potete vedere evidenziata nella soprastante figura, con la parola "Power Users", salvare lo script e rieseguirlo nuovamente.
Migliorare la leggibilità dell'output
Utilizzando "List Clients Local Administrators" in reti di grandi dimensioni mi sono reso conto che il file lcladmns.txt risulta difficile da leggere in presenza di tanti computer. Vi mostro quindi un piccolo hack che mira a migliorarne la leggibilità riportando in output soltanto i sistemi che possiedono account amministrativi locali diversi da quelli che andremo a specificare.
Scaricate il file list_clients_local_administrators_with_exclusions.zip [17], estraetelo in "C:\Scripts" ed apritelo in modifica:
Potete chiaramente notare delle differenze sostanziali nella routine che si occupa di generare il file di log. Tutto quello che dovete fare è specificare nella posizione evidenziata in rosso i nomi di gruppi ed utenti che volete escludere dall'output, vi avviso che un computer verrà totalmente escluso dal log qualora non abbia nient'altro che questi come amministratori locali.
L'unica cosa da tener presente quando modificate la suddetta riga:
If (sAdmGrpUser <> "administrator") And (sAdmGrpUser <> "domain admins") Then
è che i nomi degli utenti o dei gruppi da escludere devono essere riportati rigorosamente in soli caratteri minuscoli. Come potete vedere lo script da me fornito si preoccupa già di escludere i "classici" "Administrator" e "Domain Admins", presenti come amministratori locali delle macchine in qualsiasi dominio Windows. Facendo finta di voler aggiungere l'esclusione di un gruppo denominato "Client Admins" (potrebbe trattarsi di un gruppo che per politica aziendale viene aggiunto in tutti i computer del dominio), la riga in questione diventerebbe così:
If (sAdmGrpUser <> "administrator") And (sAdmGrpUser <> "domain admins") And (sAdmGrpUser <> "Client Admins") Then
Penso di aver detto tutto.
Conclusioni
Spero che questo articolo possa aver fornito spunti interessanti alla necessità di tenere sotto controllo l'assegnazione dei diritti amministrativi sui computer del dominio. Poiché questo argomento a mio avviso è strettamente collegato alla sicurezza delle password assegnate agli amministratori locali ai client vi consiglio di approfondirlo mediante la lettura di Proteggere la rete Windows dalle vulnerabilità password - Windows password hacking tools for Penetration Testing [1].
Autore
Mirko Iodice
mirko -at- notageek (.dot) it