Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Grouper — Скрипт PowerShell, помогающий находить уязвимые настройки в групповых политиках AD. (устарел, используйте Grouper2 вместо него!) | Kitploit
Инструменты/GitHubGitHub/l0ss/grouper
Повышение привилегийАнализ уязвимостейАудит конфигурацииТестирование на Проникновение
GitHubl0ss/grouper

Grouper

Скрипт PowerShell, помогающий находить уязвимые настройки в групповых политиках AD. (устарел, используйте Grouper2 вместо него!)

Репозиторий
7321167 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Grouper

НЕ ИСПОЛЬЗУЙТЕ GROUPER БОЛЬШЕ. ИСПОЛЬЗУЙТЕ GROUPER2! https://github.com/l0ss/Grouper2

Скрипт PowerShell для поиска уязвимых настроек в групповых политиках Active Directory.

Изображение рыбы

Фото: Jon Hanson - https://www.flickr.com/people/61952179@N00?rb=1 - https://creativecommons.org/licenses/by-sa/2.0/

Краткое описание

Grouper — это модуль PowerShell, предназначенный для пентестеров и редтимеров (хотя, вероятно, также полезен для сисадминов). Он просеивает (обычно очень шумный) XML-вывод командлета Get-GPOReport (часть модуля групповых политик Microsoft) и выявляет все настройки, определённые в объектах групповой политики (GPO), которые могут оказаться полезными для того, кто пытается сделать что-то весёлое/зловредное.

Примеры того, что он находит в GPO:

  • GPO, предоставляющие права на изменение самого GPO нестандартным пользователям.
  • Скрипты запуска и завершения работы
    • аргументы и сами скрипты часто содержат учётные данные.
    • скрипты часто хранятся с правами, позволяющими их изменить.
  • Автоматически развёртываемые MSI-установщики
    • опять же, часто хранятся в местах, где вы получите права на изменение.
  • Старые добрые пароли Group Policy Preferences.
  • Записи реестра автовхода, содержащие учётные данные.
  • Другие учётные данные, хранящиеся в реестре для забавных вещей вроде VNC.
  • Плановые задания с сохранёнными учётными данными.
    • Также часто запускают программы из плохо защищённых файловых ресурсов.
  • Права пользователей
    • Удобно замечать, где администраторы случайно предоставили «Domain Users» доступ по RDP или те забавные права, которые позволяют запускать mimikatz даже без полных прав администратора.
  • Изменения локальных прав доступа к файлам
    • Хорошо для поиска машин, где администраторы просто выдали «Полный доступ» для «Всех» на «C:\Program Files».
  • Файловые ресурсы
  • INI-файлы
  • Переменные окружения
  • ... и многое другое! (ну, не очень много, но кое-что)

Да, это довольно грубо, но это экономит мне огромное количество времени, которое я тратил на чтение тех ужасных 150-мегабайтных HTML-отчётов GPO, и если это работает для меня, может сработать и для вас.

Примечание: Хотя некоторые имена функций могут содержать слово «audit», Groper НЕ предназначен для исчерпывающего аудита на соответствие лучшим практикам и т.д. Если вам нужно это, используйте Microsoft SCT и LGPO.exe или что-то подобное.

Использование

Создайте отчёт GPO на машине Windows с установленными командлетами групповых политик. Они установлены на контроллерах домена по умолчанию, могут быть установлены на клиентах Windows через RSAT или включены через мастер «Добавление компонентов» на серверах Windows.

root@kitploit:~
Get-GPOReport -All -ReportType xml -Path C:\temp\gporeport.xml

Импортируйте модуль Grouper.

root@kitploit:~
Import-Module .\grouper.psm1

Запустите Grouper.

root@kitploit:~
Invoke-AuditGPOReport -Path C:\temp\gporeport.xml

Параметры

Также есть несколько параметров, которые можно менять, чтобы изменить, какие настройки политик будет показывать Grouper:

root@kitploit:~
-showDisabled

По умолчанию Grouper показывает только GPO, которые в данный момент включены и привязаны к подразделению в AD. Этот параметр переключает это поведение.

root@kitploit:~
-Online

По умолчанию Grouper работает только с фактическим XML-выводом из Get-GPOReport и не выполняет никаких сетевых взаимодействий, что делает его довольно «безопасным с точки зрения OPSEC», хотя я ненавижу этот термин.

Если запустить его с параметром -Online, Grouper включит проверки, требующие связи (как минимум) с доменом AD, из которого был создан отчёт, но, вероятно, также потребуется связь с, например, файловыми серверами. Это позволит Grouper выполнять полезные действия, такие как отчёт о ACL для файлов, на которые ссылаются GPO, и проверка, может ли текущий пользователь записывать в этот файл.

root@kitploit:~
-Level

Grouper имеет 3 уровня фильтрации, которые можно применить к его выводу.

  1. Показать все возможные настройки.
  2. (По умолчанию) Показать только настройки, которые кажутся «интересными», но могут быть не уязвимы.
  3. Показать только настройки, которые определённо являются очень плохой идеей и, скорее всего, содержат учётные данные или иным образом дадут мне права администратора на хосте.

Использование простое. -Level 3, -Level 2 и т.д.


Часто задаваемые вопросы

Я работаю на задании и не могу найти машину, входящую в домен, к которой у меня есть доступ и на которой установлены командлеты групповых политик. Я не хочу их устанавливать, потому что это шумно и грязно!

Get-GPOReport отлично работает на машинах, не входящих в домен, через runas /netonly. Вам понадобятся учётные данные с низкими привилегиями, но это ожидаемо.

Сделайте так:

root@kitploit:~
runas /netonly /user:domain\user powershell.exe

на машине, не входящей в домен, но имеющей связь с контроллером домена.

Затем в полученном сеансе PowerShell сделайте так:

root@kitploit:~
Get-GpoReport -Domain example.com -All -ReportType xml -Path C:\temp\gporeport.xml

Легко.

Я вам не доверяю, поэтому не хочу запускать ваш подозрительный скрипт на машине, входящей в домен, но хочу попробовать Grouper.

Для работы Grouper нужен только PowerShell 2.0 и xml-файл, выводимый из Get-GPOReport. Вы можете запустить его на виртуальной машине без сетевой карты, если беспокоитесь, и он всё равно будет работать.

Тем не менее, это довольно простой код, поэтому не составит труда убедиться, что он не делает ничего подозрительного.

Я считаю глупым, что вы полагаетесь на командлеты групповых политик MS/RSAT для Grouper. Вам следовало бы написать его так, чтобы он напрямую запрашивал домен или разбирал файлы политик прямо из SYSVOL.

Короткий ответ: Ага.

Длинный ответ: Да, сделать что-то из этого было бы лучше, но есть пара вещей, которые пока мешают мне это сделать.

В идеале я хотел бы разбирать файлы политик прямо из SYSVOL, но они хранятся в множестве разных форматов, некоторые из них проприетарные, их очень трудно читать, и у меня нет ни времени, ни желания писать с нуля наборы парсеров для них, когда Microsoft уже предоставляет командлеты, которые отлично справляются с этой задачей.

В не столь отдалённом будущем я хотел бы встроить Get-GPOReport от Microsoft в Grouper, чтобы вам вообще не понадобился RSAT, но нужно выяснить, не будет ли это нарушением авторских прав. Также нужно разобраться, как реализовать то, что я только что сказал.


Вопросы, которые я ожидаю

Grouper показывает мне все эти настройки, которые не являются уязвимыми. ЧЁРТ, ЛОЖНОЕ СРАБАТЫВАНИЕ?

Grouper — это не сканер уязвимостей. Grouper просто фильтрует огромное количество мусора и шума в отчётах групповых политик, показывая только те настройки, которые МОГУТ быть сконфигурированы эксплуатируемым образом.

Насколько это возможно, я работаю над каждой категорией проверок, добавляя дополнительную фильтрацию для удаления очевидно не уязвимых конфигураций и ещё больше снижая уровень шума, но групповые политики чрезвычайно гибки, и довольно трудно предугадать каждую возможную ошибку администратора.

Grouper не показал мне то, что я точно знаю, что оно уязвимо в групповых политиках. ЧЁРТ, ЛОЖНОЕ НЕСРАБАТЫВАНИЕ?

Отлично, вы только что нашли способ улучшить Grouper! Прокрутите вниз, и вы увидите небольшое руководство по добавлению новых проверок в Grouper.

У меня нет лабораторной среды и нет под рукой файла отчёта GPO! К тому же я очень нетерпелив!

Я прикрою тебя, парень. В репозитории есть файл test_report.xml, с которым можно попробовать. Он содержит кучу плохих настроек, так что вы сможете увидеть, как это выглядит.

Вам нужно будет запустить его с флагом -showDisabled, потому что в нём так много действительно ужасных конфигураций, что я даже не стал включать этот GPO в лабораторной среде.

Я ещё более нетерпелив, чем предыдущий парень, и требую красивых картинок немедленно!

ОК.

Скриншот тестового вывода

Но постойте, как мне понять, к каким пользователям/компьютерам применяются эти политики? Ваша штука бесполезна!

Короткий ответ: PowerView неплохо справится с этим.

Более длинный ответ: Я попытаюсь добавить эту функциональность когда-нибудь, а пока заткнитесь и используйте PowerView.

Я ненавижу одну из проверок, которые делает Grouper, и не хочу её больше видеть.

Отлично, легко исправить.

Откройте grouper.ps1, найдите массив "$polchecks" и просто закомментируйте строку, где эта проверка добавляется в массив.

Готово.

Я хочу сделать Grouper лучше, но не могу разобраться в вашем ужасном спагетти-коде. Помогите мне помочь вам.

Конечно, звучит хорошо.

  1. Получите XML-вывод GPOReport, включающий тип политики/настройки, которую вы хотите, чтобы Grouper умел находить. Для этого может потребоваться создать соответствующую политику в лабораторной среде.

  2. Найдите XML-объект <GPO>, соответствующий вашей целевой политике.

  3. Найдите подраздел XML, соответствующий информации, которую вы хотите извлечь из политики. Настройки политик делятся на политики пользователя и компьютера, поэтому это обычно будет либо:

    root@kitploit:~
    GPO.Computer.ExtensionData.Extension
    или
    GPO.User.ExtensionData.Extension
    
  4. Теперь самая раздражающая часть — причина, по которой этот код такой запутанный, в том, что каждый раздел настроек политики структурирован по-разному, и в них используются совершенно разные соглашения об именах, так что вам нужно разобраться, как структурирована ваша целевая политика. Удачи!

  5. Вот скелет функции проверки, который вы можете использовать для начала. Убедитесь, что она либо ничего не возвращает, либо возвращает $null, если ничего интересного не найдено.

    root@kitploit:~
    Function Get-GPOThing {
        [cmdletbinding()]
        Param (
            [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()]  [System.Xml.XmlElement]$polXML,
            [Parameter(Mandatory=$true)][ValidateSet(1,2,3)][int]$level
        )
    
        ######
        # Description: Checks for Things.
        # Vulnerable: Description of what it shows if Level -eq 3
        # Interesting: Description of what it shows if Level -eq 2
        # Boring: All Things.
        ######
    
    	$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
                    ""
                }
            }
        }
    }
    
    

Благодарности, жалобы, комментарии, угрозы, исправления

Большое спасибо:

  • @harmj0y за его вспомогательную функцию расшифровки паролей GPP.
  • @sysop_host и @prashant3535 за их помощь и поддержку. Я полагаю, что в этой штуке всё ещё есть строка или две, украденные у @sysop_host, но я действительно не уверен, где именно, и я бы не хотел обвинять его в моём ужасном коде.

Говоря об ужасном коде, да, я знаю, что это немного бардак. Я постарался сделать его как можно более модульным, чтобы другие могли добавлять дополнительные проверки без особых хлопот, но ему всё ещё нужно много доработок. Если вы заметили ошибку, которую я сделал и которая отчаянно нуждается в исправлении, пожалуйста, дайте мне знать.

Скачать инструмент
  • Нажмите Ctrl-F, чтобы добраться до "$polchecks", и добавьте его в массив проверок вместе с остальными.

  • Протестируйте.

  • Если работает, отправьте pull request!

  • Если застрянете, пишите мне. Постараюсь помочь, если выкрою несколько минут.