
Windows用の権限昇格列挙スクリプト
一般的なセキュリティ標準では必ずしもカバーされていない、Windows の一般的な脆弱性や設定の問題を迅速に特定し、攻撃や攻撃後(post-exploitation)のタスクに役立つ情報を収集します。
[!IMPORTANT] このツールを使用する際に注意すべき重要な点は、すべてのアクセス制御チェックが現在のユーザーのコンテキストで実行されることです。したがって、管理者権限で実行した場合、誤った検出結果を生成しないように、多くの脆弱性チェックは実際にはスキップされます。
スクリプトはこちらからダウンロードしてください: PrivescCheck.ps1
[!TIP] 上記のリンクは、PowerShell ターミナルで
(New-Object Net.WebClient).DownloadString(...)を使用して直接利用することもできます。
ローカルで権限昇格を行う明白な方法はありますか?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck"
攻撃後(post-exploitation)やサードパーティ製ソフトウェアの脆弱性発見に活用できる追加情報はありますか?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML"
一般的なセキュリティ標準ではカバーされていない設定の問題はありますか?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Audit -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML,CSV,XML"
Invoke-PrivescCheck [-Extended] [-Audit] [-Experimental] [-Report <PREFIX>]
[-Format <FORMAT>[,...]] [-Risky] [-Silent] [-Force]
-Extended
スキャンにすべての「拡張」チェックを含めます(README を参照)。
-Audit
スキャンにすべての「監査」チェックを含めます。
-Experimental
スキャンにすべての「実験的」チェックを含めます。内容を理解している場合にのみ使用してください。
-Report <PREFIX>
少なくとも 1 つのレポートファイルを生成します。出力ファイル名はデフォルトで
"PREFIX.txt" になります。拡張子はレポート形式に基づいて自動的に追加されます
(「-Format <FORMAT>[,...]」を参照)。
-Format <FORMAT>[,...]
出力レポートファイルの形式を指定します。設定しない場合、デフォルト値は
"TXT" です。サポートされている形式は、"TXT"、"HTML"、"CSV"、
"XML" です。
-Risky
「リスクあり」とマークされたチェックを含めます。つまり、エンドポイント保護ソリューションによって
ブロックアクションがトリガーされる可能性が高いチェックです。注意して使用してください。
-Silent
ターミナル出力を抑制します。これは、バッチファイルの一部として、たとえば
スケジュールされたタスクでスクリプトを実行する場合に役立ちます。
-Force
実行を強制し、警告を無視します。通常、スクリプトは管理者権限で実行されると停止します。
このオプションを使用すると、それでも実行できます。
-Format TXT)テキスト形式のレポートを生成する場合は、オプション -Report <PREFIX>(-Format TXT を指定)を使用します。出力はターミナルで表示されるものと似ていますが、すべてのテキストエディタとの(レトロな)互換性を高めるために ASCII 文字のみが含まれています。

-Format HTML)HTML レポートを生成する場合は、オプション -Report <PREFIX> と -Format HTML を使用します。出力ファイルは Web ブラウザで開くことができます。テキスト形式のレポートよりもデータの視覚化に便利です。さらに、並べ替えとフィルタリング機能も備えています。

-Format CSV)および XML(-Format XML)CSV または XML レポートを生成する場合は、オプション -Report <PREFIX> と -Format CSV または -Format XML を使用します。出力ファイルは、自動化されたレポートツールによる結果の解析を容易にすることを目的としています。
[!NOTE] 出力形式は(まだ)文書化されていませんが、生成されたファイルの構造を分析することで簡単に理解できます。各チェックの
Id値を使用して、チェックを一意に識別できます。
Base タイプのチェックは、スクリプトが管理者として実行されない限り、常に実行されます。これらは主に、権限昇格の脆弱性やその他の重要な問題を特定することを目的としています。
-Extended)Extended タイプのチェックは、コマンドラインで -Extended オプションが指定された場合にのみ実行できます。これらは主に、エクスプロイト開発や攻撃後(post-exploitation)に役立つ可能性のある追加情報を提供することを目的としています。
-Audit)Audit タイプのチェックは、コマンドラインで -Audit オプションが指定された場合にのみ実行できます。これらは主に、構成監査のコンテキストで関連する情報を提供することを目的としています。
デフォルトでは、新しい powershell.exe プロセスが開始されると、PowerShell の実行ポリシーは、クライアントでは Restricted、サーバーでは RemoteSigned に設定されています。これらのポリシーは(署名されていない)スクリプトの実行をブロックしますが、次のように現在のスコープ内で上書きできます。
Set-ExecutionPolicy Bypass -Scope Process -Force
. .\PrivescCheck.ps1
ただし、この方法は、実行ポリシーが GPO によって強制されている場合には機能しません。この場合、新しい PowerShell セッションを開始した後、次のようにスクリプトを読み込むことができます。
Get-Content .\PrivescCheck.ps1 | Out-String | Invoke-Expression
Constrained Language Mode をバイパスする一般的な方法は、この保護を実装していない PSv2 を使用することです。そのため、開発作業のかなりの部分が、このレトロ互換性の維持に費やされています。
[!NOTE] PowerShell バージョン 2 は、
最近のバージョンの Windows ではデフォルトで有効のままですが(Windows からの PowerShell 2.0 の削除)、.Net Framework バージョン 2.0 なしでは実行できず、手動インストールが必要です。
Meterpreter セッション内でこのスクリプトを実行すると、「タイムアウト」エラーが発生する可能性があります。これは、Metasploit がデフォルトのタイムアウト値を 15 秒に設定しているためであり、スクリプトの一般的な実行が完了するには十分な時間ではありません。
meterpreter > load powershell
Loading extension powershell...Success.
meterpreter > powershell_import /local/path/to/PrivescCheck.ps1
[+] File successfully imported. No result was returned.
meterpreter > powershell_execute "Invoke-PrivescCheck"
[-] Error running command powershell_execute: Rex::TimeoutError Operation timed out.
sessions コマンドの -t オプションを使用して、異なるタイムアウトを設定できます(ドキュメント)。次の例では、ID 1 のセッションに 2 分のタイムアウトが設定されていますが、さらに高い値を設定することもできます。
msf6 exploit(multi/handler) > sessions -t 120 -i 1
[*] Starting interaction with 1...
meterpreter > powershell_execute "Invoke-PrivescCheck"
一部のチェックはオンラインデータ(例: LOL ドライバーデータベース)に依存していますが、スクリプトはオフラインで動作することを目的としています。この問題を解決するために、データはスクリプトに埋め込まれており、定期的に更新する必要があります。このプロセスは公式リリースでは完全に自動化されていますが、スクリプトをローカルでビルドする場合は、必要に応じて手動で行うこともできます。
powershell -ep bypass ". .\build\Build.ps1; Update-LolDriverFile"
スクリプトのビルドは、以下のコマンドを実行するだけです。出力ファイルは .\dist\ フォルダーに保存されます。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck"
ビルドスクリプトは、各モジュールの変数名を選択するために、ランダムに生成されたシードを持つ擬似乱数ジェネレーターを使用します。ビルド間で再現可能な結果を生成したい場合は、-NoNewSeed オプションを使用して、以前に生成されたシードを再利用できます。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewSeed"
ビルドスクリプトは、各モジュールのコンテンツを難読化するために、ランダムに生成されたキーを持つ AES 暗号化を使用します。ビルド間で再現可能な結果を生成したい場合は、-NoNewKey オプションを使用して、以前に生成されたキーを再利用できます。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewKey"