
Un script de PowerShell para ayudar a encontrar configuraciones vulnerables en la Directiva de Grupo de AD. (obsoleto, ¡use Grouper2 en su lugar!)
NO USES MÁS GROUPER. ¡USA GROUPER2! https://github.com/l0ss/Grouper2
Un script de PowerShell para ayudar a encontrar configuraciones vulnerables en la Directiva de Grupo de Active Directory.

Grouper es un módulo de PowerShell diseñado para pentesters y redteamers (aunque probablemente también útil para administradores de sistemas) que examina el (normalmente muy ruidoso) resultado XML del cmdlet Get-GPOReport (parte del módulo de Directiva de Grupo de Microsoft) e identifica todas las configuraciones definidas en Objetos de Directiva de Grupo (GPO) que podrían resultar útiles para alguien que intente hacer algo divertido/maligno.
Ejemplos del tipo de cosas que encuentra en las GPO:
Sí, es bastante tosco, pero me ahorra una enorme cantidad de tiempo leyendo esos horribles informes HTML de GPO de 150MB, y si funciona para mí, puede que funcione para ti.
Nota: Aunque algunos nombres de funciones puedan incluir la palabra auditoría, Groper NO pretende ser una auditoría exhaustiva de configuraciones de mejores prácticas, etc. Si quieres eso, deberías usar Microsoft SCT y LGPO.exe o algo similar.
Genera un informe de GPO en una máquina Windows con los cmdlets de Directiva de Grupo instalados. Estos están instalados por defecto en los Controladores de Dominio, se pueden instalar en clientes Windows usando RSAT, o se pueden habilitar mediante el asistente "Agregar característica" en servidores Windows.
Get-GPOReport -All -ReportType xml -Path C:\temp\gporeport.xml
Importa el módulo Grouper.
Import-Module .\grouper.psm1
Ejecuta Grouper.
Invoke-AuditGPOReport -Path C:\temp\gporeport.xml
También hay un par de parámetros que puedes modificar y que alteran qué configuraciones de directiva te mostrará Grouper:
-showDisabled
Por defecto, Grouper solo te mostrará las GPO que están actualmente habilitadas y vinculadas a una OU en AD. Esto cambia ese comportamiento.
-Online
Por defecto, Grouper solo trabaja con el resultado XML real de Get-GPOReport, y no realiza comunicaciones de red en absoluto, lo que lo hace bastante "seguro para opsec", aunque odio ese término.
Si lo invocas con -Online, Grouper activará comprobaciones que requieren hablar (al menos) con el dominio de AD desde el cual se generó el informe, pero también implicará probablemente hablar con servidores de archivos, por ejemplo. Esto permitirá a Grouper hacer cosas útiles como informar sobre las ACL de los archivos objetivo de las GPO y comprobar si, por ejemplo, el usuario actual puede escribir en el archivo en cuestión.
-Level
Grouper tiene 3 niveles de filtrado que puedes aplicar a su salida.
El uso es sencillo. -Level 3, -Level 2, etc.
Get-GPOReport funciona perfectamente en máquinas no unidas al dominio mediante runas /netonly. Necesitarás algunas credenciales de bajo privilegio, pero eso es de esperar.
Haz esto:
runas /netonly /user:dominio\usuario powershell.exe
en una máquina no unida al dominio que pueda comunicarse con un controlador de dominio.
Luego, en la sesión de PowerShell resultante, haz esto:
Get-GpoReport -Domain example.com -All -ReportType xml -Path C:\temp\gporeport.xml
Fácil.
Todo lo que necesita Grouper para funcionar es PowerShell 2.0 y el archivo xml de salida de Get-GPOReport. Puedes ejecutarlo en una VM sin tarjeta de red si estás preocupado y seguirá funcionando bien.
Dicho esto, es código bastante básico, así que no debería ser difícil ver que no está haciendo nada remotamente sospechoso.
Respuesta corta: Sí.
Respuesta larga: Sí, hacer una de esas cosas sería mejor, pero hay un par de cosas que me impidieron hacerlas TODAVÍA.
Idealmente, me gustaría analizar los archivos de directiva directamente desde SYSVOL, pero se almacenan en varios formatos de archivo diferentes, algunos son propietarios, son realmente difíciles de leer, y no tengo ni el tiempo ni la inclinación para escribir un montón de analizadores desde cero cuando Microsoft ya proporciona cmdlets que hacen el trabajo muy bien.
En un futuro no muy lejano, me gustaría integrar Get-GPOReport de Microsoft en Grouper, para que no necesites RSAT en absoluto, pero necesito averiguar si eso será algún tipo de violación de derechos de autor. También necesito descubrir cómo hacer eso que acabo de decir.
Grouper no es un escáner de vulnerabilidades. Grouper simplemente filtra la enorme cantidad de paja y ruido en los informes de Directiva de Grupo para mostrarte solo las configuraciones de directiva que PODRÍAN estar configuradas de formas explotables.
En la medida de lo posible, estoy trabajando en cada una de las categorías de comprobaciones para agregar filtrado adicional que elimine configuraciones obviamente no vulnerables y reduzca aún más los niveles de ruido, pero la Directiva de Grupo es extremadamente flexible y es bastante difícil anticipar cada posible error que un administrador pueda cometer.
Genial, acabas de encontrar una manera de mejorar Grouper. Desplázate hacia abajo y verás donde he proporcionado una pequeña guía para agregar nuevas comprobaciones a Grouper.
Te cubro, chico. Hay un test_report.xml en el repositorio con el que puedes probarlo. Tiene un montón de configuraciones malas para que puedas ver cómo se ve.
Necesitarás ejecutarlo con la bandera -showDisabled porque está tan lleno de configuraciones realmente horribles que ni siquiera quise habilitar la GPO en un entorno de laboratorio.
OK.

Respuesta corta: PowerView hará un buen trabajo en esto.
Respuesta larga: Intentaré agregar esta funcionalidad en algún momento, pero mientras tanto, cállate y usa PowerView.
Genial, fácil de arreglar.
Abre grouper.ps1, encuentra el array "$polchecks" y simplemente comenta la línea donde se agrega esa comprobación al array.
Listo.
Claro, suena bien.
Obtén algo de salida XML de GPOReport que incluya el tipo de directiva/configuración que quieres que Grouper pueda encontrar. Esto puede requerir crear una directiva adecuada en un entorno de laboratorio.
Encuentra el objeto XML <GPO> que coincida con tu directiva objetivo.
Encuentra la subsección del XML que coincida con la información que quieres extraer de la directiva. Las configuraciones de directiva se dividen en directiva de Usuario o de Equipo, por lo que normalmente estará en:
GPO.Computer.ExtensionData.Extension
o
GPO.User.ExtensionData.Extension
Ahora viene la parte molesta: la razón por la que este código es un desastre es que cada sección de configuración de directiva está estructurada de manera diferente y usan convenciones de nomenclatura muy distintas, así que vas a tener que descubrir cómo está estructurada tu directiva objetivo. ¡Buena suerte!
Aquí tienes un esqueleto de una función de comprobación que puedes usar para empezar. Asegúrate de que no devuelva nada o devuelva $null si no se encuentra nada interesante.
Function Get-GPOThing {
[cmdletbinding()]
Param (
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] [System.Xml.XmlElement]$polXML,
[Parameter(Mandatory=$true)][ValidateSet(1,2,3)][int]$level
)
######
# Descripción: Comprueba Cosas.
# Vulnerable: Descripción de lo que muestra si Level -eq 3
# Interesante: Descripción de lo que muestra si Level -eq 2
# Aburrido: Todas las Cosas.
######
$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
""
}
}
}
}
Muchas gracias a:
Hablando de código de mierda, sí, sé que esto es un poco desastre. He intentado hacerlo lo más modular posible para que otros puedan agregar comprobaciones adicionales sin demasiada molestia, pero todavía necesita mucho cariño. Si ves un error que he cometido y que necesita arreglarse desesperadamente, por favor dímelo.
Ctrl-f hasta "$polchecks" y agrégalo al array de comprobaciones junto con las demás.
Pruébalo.
Si funciona, ¡envía un pull request!
Si te atascas, contáctame. Intentaré ayudar si puedo encontrar unos minutos.