
Uno script PowerShell per aiutare a trovare impostazioni vulnerabili nei Criteri di Gruppo AD. (deprecato, usa Grouper2 invece!)
NON USARE PIÙ GROUPER. USA GROUPER2! https://github.com/l0ss/Grouper2
Uno script PowerShell per aiutare a trovare impostazioni vulnerabili nelle Criteri di Gruppo AD.

Grouper è un modulo PowerShell progettato per pentester e red team (anche se probabilmente utile anche per sysadmin) che setaccia l'output XML (di solito molto rumoroso) del cmdlet Get-GPOReport (parte del modulo Criteri di Gruppo di Microsoft) e identifica tutte le impostazioni definite negli Oggetti Criteri di Gruppo (GPO) che potrebbero essere utili a qualcuno che cerca di fare qualcosa di divertente/malvagio.
Esempi del tipo di cose che trova nei GPO:
Sì, è piuttosto grezzo, ma mi risparmia un'enorme quantità di tempo nella lettura di quei terribili report GPO HTML da 150 MB, e se funziona per me, potrebbe funzionare anche per te.
Nota: anche se alcuni nomi di funzioni potrebbero includere la parola audit, Grouper NON è assolutamente pensato per essere un audit esaustivo delle configurazioni best practice, ecc. Se vuoi quello, dovresti usare Microsoft SCT e LGPO.exe o simili.
Genera un report GPO su una macchina Windows con i cmdlet dei Criteri di Gruppo installati. Questi sono installati per impostazione predefinita sui controller di dominio, possono essere installati su client Windows tramite RSAT o abilitati tramite la procedura guidata "Aggiungi funzionalità" sui server Windows.
Get-GPOReport -All -ReportType xml -Path C:\temp\gporeport.xml
Importa il modulo Grouper.
Import-Module .\grouper.psm1
Esegui Grouper.
Invoke-AuditGPOReport -Path C:\temp\gporeport.xml
Ci sono anche un paio di parametri con cui puoi giocare che alterano quali impostazioni dei criteri Grouper ti mostrerà:
-showDisabled
Per impostazione predefinita, Grouper ti mostrerà solo i GPO attualmente abilitati e collegati a un'unità organizzativa in AD. Questo attiva/disattiva questo comportamento.
-Online
Per impostazione predefinita, Grouper funziona solo con l'output XML vero e proprio di Get-GPOReport e non effettua alcuna comunicazione di rete, il che lo rende piuttosto "opsec safe", anche se odio quel termine.
Se lo invochi con -Online, Grouper attiverà dei controlli che richiedono di comunicare (almeno) con il dominio AD da cui è stato generato il report, ma probabilmente comporteranno anche la comunicazione con, ad esempio, file server. Questo permetterà a Grouper di fare cose utili come riportare gli ACL sui file presi di mira dai GPO e verificare se, ad esempio, l'utente corrente può scrivere sul file in questione.
-Level
Grouper ha 3 livelli di filtro che puoi applicare al suo output.
L'utilizzo è semplice. -Level 3, -Level 2, ecc.
Get-GPOReport funziona perfettamente su macchine non unite al dominio tramite runas /netonly. Avrai bisogno di alcune credenziali con privilegi bassi, ma è normale.
Fai così:
runas /netonly /user:dominio\utente powershell.exe
su una macchina non unita al dominio che possa comunicare con un controller di dominio.
Poi, nella sessione PowerShell risultante, fai così:
Get-GpoReport -Domain example.com -All -ReportType xml -Path C:\temp\gporeport.xml
Facile.
Tutto ciò di cui Grouper ha bisogno per funzionare è PowerShell 2.0 e il file xml generato da Get-GPOReport. Puoi eseguirlo su una VM senza scheda di rete se sei preoccupato e funzionerà comunque bene.
Detto questo, è un codice piuttosto semplice, quindi non dovrebbe essere difficile vedere che non fa nulla di losco.
Risposta breve: Sì.
Risposta lunga: Sì, fare una di queste cose sarebbe meglio, ma ci sono un paio di cose che mi hanno impedito di farle ANCORA.
Idealmente vorrei analizzare i file dei criteri direttamente da SYSVOL, ma sono memorizzati in vari formati di file, alcuni sono proprietari, sono davvero fastidiosi da leggere, e non ho né il tempo né l'inclinazione per scrivere una serie di parser da zero quando Microsoft fornisce già cmdlet che fanno il lavoro molto bene.
In un futuro non troppo lontano vorrei incorporare Get-GPOReport di Microsoft in Grouper, così non avresti bisogno di RSAT, ma devo capire se questo costituirebbe una violazione del copyright. Devo anche capire come fare effettivamente quella cosa che ho appena detto.
Grouper non è uno scanner di vulnerabilità. Grouper si limita a filtrare l'enorme quantità di fuffa e rumore nei report dei Criteri di Gruppo per mostrarti solo le impostazioni dei criteri che POTREBBERO essere configurate in modi sfruttabili.
Per quanto possibile, sto lavorando su ciascuna delle categorie di controlli per aggiungere filtri extra che rimuovano le configurazioni chiaramente non vulnerabili e riducano ulteriormente il rumore, ma i Criteri di Gruppo sono estremamente flessibili ed è piuttosto difficile anticipare ogni possibile errore che un amministratore potrebbe fare.
Figo, hai appena trovato un modo per migliorare Grouper! Scorri in basso e vedrai dove ho fornito una piccola guida per aggiungere nuovi controlli a Grouper.
Ti copro le spalle, ragazzo. Nel repository c'è un test_report.xml con cui puoi provarlo. Contiene un sacco di impostazioni errate, così puoi vedere come appare.
Dovrai eseguirlo con il flag -showDisabled perché è così pieno di configurazioni terribili che non ho nemmeno voluto abilitare il GPO in un ambiente di laboratorio.
OK.

Risposta breve: PowerView farà un buon lavoro in questo.
Risposta più lunga: Proverò ad aggiungere questa funzionalità a un certo punto, ma nel frattempo, stai zitto e usa PowerView.
Figo, facile da risolvere.
Apri grouper.ps1, trova l'array "$polchecks" e commenta semplicemente la riga in cui quel controllo viene aggiunto all'array.
Fatto.
Certo, sembra buona idea.
Ottieni un output XML di GPOReport che includa il tipo di criterio/impostazione che vuoi che Grouper sia in grado di trovare. Potrebbe essere necessario creare un criterio adatto in un ambiente di laboratorio.
Trova l'oggetto XML <GPO> che corrisponde al criterio target.
Trova la sottosezione dell'xml che corrisponde alle informazioni che vuoi estrarre dal criterio. Le impostazioni dei criteri sono divise in criteri Utente o Computer, quindi di solito si trovano in:
GPO.Computer.ExtensionData.Extension
oppure
GPO.User.ExtensionData.Extension
Ora arriva la parte fastidiosa: il motivo per cui questo codice è così incasinato è che ogni sezione di impostazione dei criteri è strutturata in modo diverso e usa convenzioni di denominazione molto diverse, quindi dovrai capire come è strutturato il tuo criterio target. Buona fortuna?
Ecco lo scheletro di una funzione di controllo che puoi usare per iniziare. Assicurati che non restituisca nulla o che restituisca $null se non viene trovato nulla di interessante.
Function Get-GPOThing {
[cmdletbinding()]
Param (
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] [System.Xml.XmlElement]$polXML,
[Parameter(Mandatory=$true)][ValidateSet(1,2,3)][int]$level
)
######
# Descrizione: Verifica la presenza di Cose.
# Vulnerabile: Descrizione di ciò che mostra se Level -eq 3
# Interessante: Descrizione di ciò che mostra se Level -eq 2
# Noioso: Tutte le Cose.
######
$settingsThings = ($polXml.Thing.ExtensionData.Extension.Thing | Sort-Object GPOSettingOrder)
if ($settingsThings) {
foreach ($setting in $settingsThings) {
if ($level -eq 1) {
$output = @{}
$output.Add("Name", $setting.Name)
if ($setting.SettingBoolean) {
$output.Add("SettingBoolean", $setting.SettingBoolean)
}
if ($setting.SettingNumber) {
$output.Add("SettingNumber", $setting.SettingNumber)
}
$output.Add("Type", $setting.Type.InnerText)
Write-Output $output
""
}
}
}
}
Con Ctrl-F scendi fino a "$polchecks" e aggiungilo all'array dei controlli insieme agli altri.
Provalo.
Se funziona, invia una pull request!
Se ti blocchi, contattami. Cercherò di aiutare se riesco a racimolare qualche minuto.
Grazie mille a:
A proposito di codice schifoso, sì, so che è un po' un casino. Ho cercato di renderlo il più modulare possibile in modo che altri possano aggiungere ulteriori controlli senza troppe difficoltà, ma ha ancora bisogno di molto amore. Se vedi un errore che ho fatto e che necessita disperatamente di una correzione, per favore fammelo sapere.