
Un script PowerShell pour aider à trouver les paramètres vulnérables dans les stratégies de groupe AD. (déprécié, utilisez Grouper2 à la place !)
N'UTILISEZ PLUS GROUPER. UTILISEZ GROUPER2 ! https://github.com/l0ss/Grouper2
Un script PowerShell pour aider à trouver les paramètres vulnérables dans la stratégie de groupe Active Directory.

Grouper est un module PowerShell conçu pour les pentesters et les redteamers (bien que probablement aussi utile pour les administrateurs système) qui passe au crible la sortie XML (généralement très bruyante) de l'applet de commande Get-GPOReport (partie du module Stratégie de groupe de Microsoft) et identifie tous les paramètres définis dans les objets de stratégie de groupe (GPO) qui pourraient s'avérer utiles à quelqu'un essayant de faire quelque chose d'amusant/de malveillant.
Exemples du genre de choses qu'il trouve dans les GPO :
Oui, c'est assez rudimentaire, mais cela me fait gagner énormément de temps à lire ces horribles rapports GPO HTML de 150 Mo, et si ça marche pour moi, ça pourrait marcher pour vous.
Remarque : Bien que certains noms de fonctions puissent inclure le mot audit, Grouper n'est explicitement PAS destiné à être un audit exhaustif des configurations de meilleures pratiques, etc. Si vous voulez ça, vous devriez utiliser Microsoft SCT et LGPO.exe ou quelque chose du genre.
Générez un rapport GPO sur une machine Windows avec les applets de commande Stratégie de groupe installées. Ceux-ci sont installés par défaut sur les contrôleurs de domaine, peuvent être installés sur les clients Windows à l'aide de RSAT, ou peuvent être activés via l'assistant « Ajouter une fonctionnalité » sur les serveurs Windows.
Get-GPOReport -All -ReportType xml -Path C:\temp\gporeport.xml
Importez le module Grouper.
Import-Module .\grouper.psm1
Exécutez Grouper.
Invoke-AuditGPOReport -Path C:\temp\gporeport.xml
Il y a aussi quelques paramètres que vous pouvez modifier pour modifier les paramètres de stratégie que Grouper vous montrera :
-showDisabled
Par défaut, Grouper ne vous montrera que les GPO actuellement activés et liés à une unité d'organisation dans AD. Cela bascule ce comportement.
-Online
Par défaut, Grouper fonctionne uniquement avec la sortie XML réelle de Get-GPOReport et n'effectue aucune communication réseau, ce qui le rend assez « sûr sur le plan opérationnel », même si je déteste ce terme.
Si vous l'invoquez avec -Online, Grouper activera les vérifications qui nécessitent de communiquer avec (au moins) le domaine AD à partir duquel le rapport a été généré, mais impliqueront probablement aussi de parler, par exemple, aux serveurs de fichiers. Cela permettra à Grouper de faire des choses pratiques comme signaler les ACL sur les fichiers ciblés par les GPO et de vérifier si, par exemple, l'utilisateur actuel peut écrire dans le fichier en question.
-Level
Grouper dispose de 3 niveaux de filtrage que vous pouvez appliquer à sa sortie.
L'utilisation est simple. -Level 3, -Level 2, etc.
Get-GPOReport fonctionne parfaitement sur les machines non jointes à un domaine via runas /netonly. Vous aurez besoin d'identifiants à faibles privilèges, mais c'est à prévoir.
Faites comme ceci :
runas /netonly /user:domaine\utilisateur powershell.exe
sur une machine non jointe à un domaine qui peut communiquer avec un contrôleur de domaine.
Ensuite, dans la session PowerShell résultante, faites comme ceci :
Get-GpoReport -Domain exemple.com -All -ReportType xml -Path C:\temp\gporeport.xml
Facile.
Tout ce dont Grouper a besoin pour fonctionner est PowerShell 2.0 et le fichier xml de sortie de Get-GPOReport. Vous pouvez l'exécuter sur une VM sans carte réseau si vous êtes inquiet et cela fonctionnera toujours très bien.
Cela dit, le code est assez basique, donc il ne devrait pas être difficile de voir qu'il ne fait rien de louche.
Réponse courte : Oui.
Réponse longue : Oui, faire l'une de ces choses serait mieux, mais il y a quelques choses qui m'ont empêché de les faire ENCORE.
Idéalement, j'aimerais analyser les fichiers de stratégie directement depuis SYSVOL, mais ils sont stockés dans différents formats de fichiers, certains sont propriétaires, ils sont vraiment pénibles à lire, et je n'ai ni le temps ni l'envie d'écrire plusieurs analyseurs pour eux à partir de zéro alors que Microsoft fournit déjà des applets de commande qui font le travail très bien.
Dans un avenir pas trop lointain, j'aimerais intégrer le Get-GPOReport de Microsoft dans Grouper, afin que vous n'ayez pas besoin de RSAT du tout, mais je dois déterminer si cela va être une sorte de violation du droit d'auteur. Je dois aussi comprendre comment faire cette chose que je viens de dire.
Grouper n'est pas un scanner de vulnérabilités. Grouper filtre simplement l'énorme quantité de superflu et de bruit dans les rapports de stratégie de groupe pour vous montrer uniquement les paramètres de stratégie qui POURRAIENT être configurés de manière exploitable.
Dans la mesure du possible, je travaille sur chacune des catégories de vérifications pour ajouter un filtrage supplémentaire afin de supprimer les configurations évidemment non vulnérables et réduire encore le bruit, mais la stratégie de groupe est extrêmement flexible et il est assez difficile d'anticiper toutes les erreurs possibles qu'un administrateur pourrait commettre.
Cool, vous venez de trouver un moyen d'améliorer Grouper ! Faites défiler vers le bas et vous verrez où j'ai fourni un petit guide pour ajouter de nouvelles vérifications à Grouper.
Je vous couvre, mon ami. Il y a un test_report.xml dans le dépôt que vous pouvez essayer. Il contient un tas de mauvais paramètres pour que vous puissiez voir à quoi ça ressemble.
Vous devrez l'exécuter avec le drapeau -showDisabled parce qu'il contient tellement de configurations vraiment horribles que je n'ai même pas voulu activer le GPO dans un environnement de laboratoire.
OK.

Réponse courte : PowerView fera un bon travail là-dessus.
Réponse plus longue : J'essaierai d'ajouter cette fonctionnalité à un moment donné, mais en attendant, taisez-vous et utilisez PowerView.
Cool, facile à résoudre.
Ouvrez grouper.ps1, trouvez le tableau "$polchecks" et commentez simplement la ligne où cette vérification est ajoutée au tableau.
Fait.
Bien sûr, d'accord.
Obtenez une sortie XML GPOReport qui inclut le type de stratégie/paramètre que vous voulez que Grouper soit capable de trouver. Cela peut nécessiter de créer une stratégie appropriée dans un environnement de laboratoire.
Trouvez l'objet XML <GPO> qui correspond à votre stratégie cible.
Trouvez la sous-section du XML qui correspond aux informations que vous voulez extraire de la stratégie. Les paramètres de stratégie sont divisés en stratégie Utilisateur ou Ordinateur, donc cela se trouvera généralement dans :
GPO.Computer.ExtensionData.Extension
ou
GPO.User.ExtensionData.Extension
Voici la partie ennuyeuse - la raison pour laquelle ce code est un tel fouillis est que chaque section de paramètre de stratégie est structurée différemment et utilise des conventions de dénomination très différentes, donc vous allez devoir comprendre comment votre stratégie cible est structurée. Bonne chance ?
Voici un squelette de fonction de vérification que vous pouvez utiliser pour commencer. Assurez-vous qu'elle ne retourne rien du tout ou retourne $null si rien d'intéressant n'est trouvé.
Function Get-GPOThing {
[cmdletbinding()]
Param (
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] [System.Xml.XmlElement]$polXML,
[Parameter(Mandatory=$true)][ValidateSet(1,2,3)][int]$level
)
######
# Description: Vérifie les trucs.
# Vulnérable: Description de ce qu'il montre si Level -eq 3
# Intéressant: Description de ce qu'il montre si Level -eq 2
# Ennuyeux: Tous les trucs.
######
$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
""
}
}
}
}
Merci beaucoup à :
En parlant de code de merde, oui je sais que c'est un peu désordonné. J'ai essayé de le rendre aussi modulaire que possible pour que d'autres puissent ajouter des vérifications supplémentaires sans trop de tracas, mais il a encore besoin de beaucoup d'amour. Si vous voyez une erreur que j'ai faite et qui doit absolument être corrigée, faites-le moi savoir.
Ctrl-f jusqu'à "$polchecks" et ajoutez-le au tableau de vérifications avec les autres.
Testez-le.
Si ça marche, soumettez une pull request !
Si vous êtes bloqué, contactez-moi. J'essaierai d'aider si je peux trouver quelques minutes.