Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Grouper — AD グループポリシー内の脆弱な設定を見つけるのに役立つ PowerShell スクリプト。(非推奨、代わりに Grouper2 を使用してください!) | Kitploit
ツール/GitHubGitHub/l0ss/grouper
特権昇格脆弱性分析構成監査ペネトレーションテスト
GitHubl0ss/grouper

Grouper

AD グループポリシー内の脆弱な設定を見つけるのに役立つ PowerShell スクリプト。(非推奨、代わりに Grouper2 を使用してください!)

リポジトリを見る
73211617年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Grouper

GROUPERをもう使わないでください。GROUPER2を使ってください! https://github.com/l0ss/Grouper2

ADグループポリシー内の脆弱な設定を見つけるためのPowerShellスクリプトです。

魚の写真

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

概要

Grouperは、ペネトレーションテスターやレッドチーム向けに設計されたPowerShellモジュールです(おそらくシステム管理者にも役立ちます)。Get-GPOReportコマンドレット(Microsoftのグループポリシーモジュールの一部)から出力される(通常非常にノイズの多い)XML出力をふるいにかけ、グループポリシーオブジェクト(GPO)で定義されている設定の中で、何か楽しいこと/悪いことをしようとする人に役立つ可能性のあるものをすべて特定します。

GrouperがGPOで見つけるものの例:

  • GPO自体への変更権限を非デフォルトユーザーに許可するGPO。
  • 起動およびシャットダウンスクリプト
    • 引数やスクリプト自体に認証情報が含まれていることが多い。
    • スクリプトは多くの場合、変更を許可する権限で保存されている。
  • 自動的に展開されるMSIインストーラー
    • 同様に、変更権限を与える場所に保存されていることが多い。
  • 昔ながらのグループポリシー基本設定パスワード。
  • 資格情報を含む自動ログオンレジストリエントリ。
  • VNCなどのためにレジストリに保存されているその他の認証情報。
  • 保存された資格情報を持つスケジュールタスク。
    • また、セキュリティが不十分なファイル共有からプログラムを実行することが多い。
  • ユーザー権限
    • 管理者が誤って「ドメインユーザー」にRDPアクセスを許可したり、フル管理者権限がなくてもmimikatzを実行できる楽しい権限を見つけるのに便利。
  • ローカルファイル権限の変更
    • 管理者が"C:\Program Files"に「Everyone」に対して「フルコントロール」を設定したマシンを見つけるのに役立つ。
  • ファイル共有
  • INIファイル
  • 環境変数
  • ... その他多数!(まあ、それほど多くはないが、いくつか)

はい、かなり荒削りですが、あのひどい150MBのHTML GPOレポートを読む膨大な時間を節約してくれます。私にとってうまくいったので、あなたにもうまくいくかもしれません。

注:一部の関数名にはauditという単語が含まれているかもしれませんが、Grouperは明示的にベストプラクティス構成などを網羅的に監査するためのものではありません。もしそれが目的なら、Microsoft SCTやLGPO.exeなどを使用すべきです。

使い方

グループポリシーコマンドレットがインストールされたWindowsマシンでGPOレポートを生成します。 これらはデフォルトでドメインコントローラーにインストールされており、RSATを使用してWindowsクライアントにインストールするか、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は現在有効でADのOUにリンクされているGPOのみを表示します。このパラメータはその動作を切り替えます。

root@kitploit:~
-Online

デフォルトでは、GrouperはGet-GPOReportの実際のXML出力のみを扱い、ネットワーク通信を一切行わないため、かなり「opsecセーフ」です(ただし、この言葉は嫌いですが)。

-Onlineを指定して呼び出すと、Grouperはレポートが生成されたADドメインとの通信を必要とするチェックを有効にしますが、ファイルサーバーなどとの通信も含まれる可能性があります。これにより、GrouperはGPOが対象とするファイルのACLを報告したり、現在のユーザーがそのファイルに書き込み可能かどうかを確認したりするなどの便利な機能を実行できます。

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とGet-GPOReportから出力されたXMLファイルだけです。心配なら、ネットワークカードなしのVMで実行しても問題なく動作します。

とはいえ、コードは非常に基本的なので、何か怪しいことをしているかどうかは簡単に確認できるはずです。

GrouperのためにMSのグループポリシーコマンドレット/RSATに依存しているのは馬鹿げていると思います。ドメインに直接クエリを実行するか、SYSVOLからポリシーファイルを直接解析するように書くべきです。

短い答え:その通りです。

長い答え:その通りで、どちらかの方法の方が良いでしょうが、まだそれを行うのを妨げるいくつかの理由があります。

理想的にはSYSVOLから直接ポリシーファイルを解析したいところですが、それらはさまざまなファイル形式で保存されており、一部はプロプライエタリで、読み取りが非常に面倒です。Microsoftが既に非常にうまく機能するコマンドレットを提供しているのに、それらのパーサーをゼロから書く時間も気力もありません。

遠くない将来に、MicrosoftのGet-GPOReportをGrouperに組み込んで、RSATを必要としないようにしたいと考えていますが、それが著作権侵害になるかどうかを確認する必要があります。また、その方法を実際に理解する必要もあります。


予想される質問

Grouperが脆弱でない設定をすべて表示しています。偽陽性が多いのでは?

Grouperは脆弱性スキャナーではありません。Grouperは単にグループポリシーレポート内の膨大なノイズをフィルタリングし、悪用可能な方法で構成される可能性があるポリシー設定のみを表示します。

可能な限り、各チェックカテゴリに対して、明らかに脆弱でない構成を除去し、ノイズレベルをさらに低減するための追加フィルタリングを追加していますが、グループポリシーは非常に柔軟であり、管理者が犯す可能性のあるすべてのミスを予測することは非常に困難です。

Grouperがグループポリシー内で完全に脆弱だと分かっているものを表示しませんでした。偽陰性が多いのでは?

良いですね。Grouperを改善する方法を見つけたということです!下にスクロールすると、Grouperに新しいチェックを追加するための簡単なガイドがあります。

ラボ環境もGPOレポートファイルも手元にありません!しかも非常にせっかちです!

任せてください。リポジトリにtest_report.xmlがあるので、試してみてください。これには多数の悪い設定が含まれているので、どのような出力になるか確認できます。

あまりにもひどい構成だらけで、ラボ環境でもGPOを有効にしたくなかったため、-showDisabledフラグを付けて実行する必要があります。

前の奴よりもっとせっかちで、すぐにきれいな画像が欲しい!

わかりました。

テスト出力のスクリーンショット

でも待って、これらのポリシーがどのユーザー/コンピューターに適用されるかをどうやって調べればいいの?あなたのツールは役に立たない!

短い答え:PowerViewを使えばこれがうまくできます。

長い答え:いずれこの機能を追加しようとしていますが、それまでは黙ってPowerViewを使ってください。

Grouperのチェックのうち1つが嫌いで、二度と見たくありません。

簡単に修正できます。

grouper.ps1を開き、"$polchecks"配列を見つけて、そのチェックが配列に追加される行をコメントアウトしてください。

完了です。

Grouperをより良くしたいが、あなたのひどいスパゲッティコードを理解できません。助けてください。あなたを助けたいのです。

もちろん、そうしましょう。

  1. Grouperに検出させたいポリシー/設定の種類を含むGPOReport XML出力を取得します。これには、ラボ環境で適切なポリシーを作成する必要があるかもしれません。

  2. 対象のポリシーに一致する<GPO> XMLオブジェクトを見つけます。

  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" まで移動し、他のチェックと一緒に配列に追加します。

  • テストします。

  • うまくいけば、プルリクエストを送信してください!

  • 行き詰まったら、連絡してください。数分の時間を捻出できれば、手助けできるかもしれません。