_____
 / ____|
| |  __
| | |_ |
| |__| |
 \_____|
  ___
 / _ \
| (_) |
 \___/
 _ __
| '__|
| |
|_|
 _
| |
| |
| |
| |
|_|
  __ _ 
 / _` |
| (_| |
 \__,_|
 _ __  
| '_ \ 
| | | |
|_| |_|
 _ 
(_)
 _ 
| |
| |
|_|
      ___    ___    _ __ ___  
     / __|  / _ \  | '_ ` _ \ 
 _  | (__  | (_) | | | | | | |
(_)  \___|  \___/  |_| |_| |_|
Reverse, Repurpose, Resolve

Controllare i permessi su AdminSDHolder

2020-07-05

Here is a link to the english version

Alla ricerca degli ospiti non invitati in AD: controlliamo i permessi su AdminSDHolder


Se conosci AD saprai anche cosa è il container AdminSDHolder e che che viene spesso usato per garantirsi persistenza in ambienti compromessi. In rete si trova di tutto, ma consiglio di partire da qui o leggere la documentazione di Microsoft qui.
In due parole: questo container ha applicate delle ACL (o, per i più precisi una ACL con diverse ACE dentro). Regolarmente il servizio Security Descriptor Propagation (or SDPROP) legge questa ACL e la usa come template per applicarla agli oggetti contenuti nei Protected Groups di AD.
Questo perché le ACL di questi gruppi protetti/importanti vengono di solito compromesse col fine di garantirsi un accesso poco visibile: ad esempio garantire ad un utente ordinario e non privilegiato di poter aggiungere account al gruppo Domain Admins oppure consentire di operare come Account Operator.
Il problema è che se viene compromessa l'ACL di AdminSDHolder il risultato è l'opposto di quanto vorremmo: un gruppo protetto con le permission buone potrebbe trovarsele modificate con quelle corrotte e non c'è verso di ricambiarle a mano: SDPROP rimetterà sempre quelle del container compromesso.
Quindi l'idea è quella di controllare che i permessi sul container non vengano modificati o, quantomeno, di essere avvisati se avviene un cambiamento. Ho scritto questa libreria Powershell per automatizzare questo lavoro. L'operazione avviene in due fasi:
  1. Si salva la ACL "sana"
  2. Si controlla ad intervalli regolari che la ACL sia sempre quella prevista e in caso di anomalie è possibile inviare degli allarmi.
Ho usato il termine "sana" tra virgolette perché quello che possiamo salvare è lo stato corrente della ACL, sperando che sia sana nel momento in cui lo facciamo. Le ACL variano con le versioni di Windows e le applicazioni installate, quindi una configurazione potrebbe essere sana con 16 ACE così come potrebbe esserlo con 80. Leggendo la documentazione in rete potete farvi un'idea di come controllare quella attuale e verificare ragionare sul fatto che sia valida nel vostro ambiente.
Il modulo comprende diverse funzioni è l'idea è quella di fare dot-sourcing del file e chiamare le funzioni contenute. Questo può essere fatto con 4 righe di Powershell pianificate con lo Scheduler di Windows oppure inserite negli script di monitoraggio di Zabbix, LibreNMS, Cacti, Nagios, SNMP ecc...
Tutte le funzioni possono essere usate con Get-Help per vedere parametri ed esempi d'uso, uno degli scopi che mi ha portato a scrivere questo codice è proprio il recupero di alcune competenze su Powershell e scoprire nuovi modi di scrivere il codice. In breve, due fasi:
  1. Salvare la configurazione attuale con:
    Output-SDH-ACL
    Questo commando salva la ACL in un file XML che per default di chiama sdh-original-acl.xml.
    Nome e percorso possono essere modificati con il parametro -XmlOutputFile parameter. Questo file va mantenuto in una posizione sicura essendo il riferimento per i controlli successivi. Ad esempio potrebbe stare su una share in read-only per tutti. Il salvataggio della ACL "buona" dovrebbe essere fatto una volta sola, o comunque raramente quando avvengono cambiamenti che modificano legittimamente AdminSDHolder.
  2. Questa funzione invece va chiamata regolarmente (una volta ogni ora, giorno, ...):
    Compare-SDH-ACL
    Per default legge lo stesso file di output della funzione precedente, ma può essere indicato un file qualsiasi puntandolo con -XmlInputFile

Compare-SDH-ACL ritorna True se tutto va bene, False altrimenti. Lo script di controllo può essere quindi molto semplice, ad esempio:
. .\sdh-check.ps1
if (Compare-SDH-ACL) {
    Write-Console "Tutto sembra a posto"
    } else {
    # Invio una mail di allarme ad esempio con Send-MailMessage
}
Ci sono diverse funzioni usate internamente che possono essere usate, basta leggere codice o documentazione. Nello specifico ce n'è una ad uso generale che si chiama Compare-SDH-Files e che serve a verificare le ACL in due file invece del normale controllo file/AD live.
Tutti i comandi supportano il parametro -Verbose per avere qualche informazione in più.

Se questo script ti è utile o vuoi mandarmi qualche suggerimento, anche su come scrivere meglio codice Powershell, usa questo link.

Download

V. 0.75p, 2020-07-05, SHA1: C61635FC110B310103A52C5F71A79B2316AAF697