コンテンツにスキップ

ローカル権限昇格の経路

ローカル環境で見つかる権限昇格の経路を、出発点となる権限や操作ごとにまとめています。各手法の前提を確認してから、該当する節を参照してください。

SYSTEM 権限のプロセスが開いたハンドルを、低権限の子プロセスが継承する場合があります。継承したハンドルに強いアクセス権が残っていれば、その対象プロセスへの操作に利用できる可能性があります。確認方法は Leaked Handle Exploitation と プロセス・スレッドハンドルの分析 を参照してください。

名前付きパイプのクライアント偽装

Section titled “名前付きパイプのクライアント偽装”

名前付きパイプは、プロセス間でデータをやり取りする仕組みです。パイプのサーバーは、SeImpersonatePrivilege などの条件を満たすと、接続したクライアントの権限で処理できます。高い権限のプロセスが接続するパイプを制御できる場合、権限昇格の経路になります。詳しくは名前付きパイプのクライアント偽装と高整合性から SYSTEM への経路を参照してください。

さらに、named pipe 通信を Burp のようなツールでインターセプトする pipe-intercept や、パイプを列挙・確認して privesc を探す PipeViewer もあります。

https://filesec.io/ を参照してください。

コマンドラインに残るパスワード

Section titled “コマンドラインに残るパスワード”

ユーザーとしてシェルを取得した際、スケジュール タスク等がコマンドラインに資格情報を渡して実行されることがあります。以下のスクリプトは 2 秒ごとにプロセスのコマンドラインを取得し、前回との差分を出力します。

ターミナルウィンドウ
while($true)
{
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}

低権限ユーザーから SYSTEM へ:CVE-2019-1388

Section titled “低権限ユーザーから SYSTEM へ:CVE-2019-1388”

GUI(コンソールや RDP)にアクセスでき、UAC が有効な場合、Windows の一部バージョンでは非特権ユーザーから “NT\AUTHORITY SYSTEM” の端末や他プロセスを起動できることがあります。

これにより、同一の脆弱性で特権昇格と UAC バイパスを同時に実現できます。さらに、何もインストールする必要はなく、プロセス中で使うバイナリは Microsoft 署名のものです。

影響を受けるシステム例:

SERVER
======
Windows 2008r2 7601 ** link OPENED AS SYSTEM **
Windows 2012r2 9600 ** link OPENED AS SYSTEM **
Windows 2016 14393 ** link OPENED AS SYSTEM **
Windows 2019 17763 link NOT opened
WORKSTATION
===========
Windows 7 SP1 7601 ** link OPENED AS SYSTEM **
Windows 8 9200 ** link OPENED AS SYSTEM **
Windows 8.1 9600 ** link OPENED AS SYSTEM **
Windows 10 1511 10240 ** link OPENED AS SYSTEM **
Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened

悪用手順:

1) HHUPD.EXE を右クリックし、管理者として実行する。
2) UAC プロンプトが表示されたら "Show more details" を選ぶ。
3) "Show publisher certificate information" をクリック。
4) 脆弱なシステムでは "Issued by" の URL リンクをクリックすると既定のブラウザが起動する。
5) サイトが完全に読み込まれるまで待ち、"Save as" を選ぶと explorer.exe ウィンドウが開く。
6) explorer のアドレス パスに cmd.exe / powershell.exe などを入力する。
7) "NT\AUTHORITY SYSTEM" のコマンド プロンプトが得られる。
8) セットアップと UAC プロンプトをキャンセルしてデスクトップに戻る。

必要なファイルと情報は以下の GitHub にあります:

https://github.com/jas502n/CVE-2019-1388

管理者の中整合性から高整合性へ

Section titled “管理者の中整合性から高整合性へ”

**Integrity Levels(整合性レベル)**についてはこちら:

Integrity Levels

UAC と UAC バイパスについてはこちら:

UAC: User Account Control

フォルダーの削除・移動・改名権限から SYSTEM へ

Section titled “フォルダーの削除・移動・改名権限から SYSTEM へ”

このブログ記事に記載された手法で、こちらに exploit code があります。

攻撃は、Windows Installer の rollback 機能を悪用し、アンインストール中に正規ファイルを悪意あるファイルへ置き換えるものです。そのため攻撃者は、悪意のある MSI インストーラを作成し、C:\Config.Msi フォルダを乗っ取る必要があります。C:\Config.Msi は Windows Installer が他の MSI パッケージをアンインストールする際に rollback ファイルを保存する場所であり、そこで rollback ファイルを改ざんしてペイロードを含めます。

要約した手順:

  1. Stage 1 – ハイジャック準備(C:\Config.Msi を空にする)
  • Step 1: MSI をインストール

    • 書き込み可能フォルダ(TARGETDIR)に無害なファイル(例: dummy.txt)をインストールする .msi を作成。
    • インストーラを “UAC Compliant” としてマークし、非管理者でも実行できるようにする。
    • インストール後、ファイルへの**ハンドル(handle)**を開いたまま保持。
  • Step 2: アンインストール開始

    • 同じ .msi をアンインストールする。
    • アンインストール処理が C:\Config.Msi にファイルを移動し、.rbf(rollback backup)へリネームし始める。
    • GetFinalPathNameByHandle で開いているファイル ハンドルをポーリングし、ファイルが C:\Config.Msi\<random>.rbf になるのを検知。
  • Step 3: カスタム同期

    • .msi に**カスタム アンインストール アクション(SyncOnRbfWritten)**を含める:
      • .rbf が書き込まれたらシグナル。
      • その後、別のイベントを待ってアンインストールを継続。
  • Step 4: .rbf の削除をブロック

    • シグナルを受けたら FILE_SHARE_DELETE なしで .rbf を開く → 削除を防止。
    • その後シグナルを返してアンインストールを完了させる。
    • Windows Installer は .rbf を削除できず、内容をすべて削除できないため C:\Config.Msi が削除されない。
  • Step 5: .rbf を手動削除

    • 攻撃者が .rbf を手動で削除。
    • C:\Config.Msi は空となり、ハイジャックの準備が整う。

この時点で SYSTEM レベルの任意フォルダ削除脆弱性を発動し C:\Config.Msi を削除する。

  1. Stage 2 – Rollback スクリプトを悪意のあるものに置換
  • Step 6: 弱い ACL で C:\Config.Msi を再作成

    • 自分で C:\Config.Msi を再作成。
    • 弱い DACL(例: Everyone:F)を設定し、WRITE_DAC でハンドルを開いたままにする。
  • Step 7: 別のインストールを実行

    • .msi を再度インストール(条件):
      • TARGETDIR: 書き込み可能な場所。
      • ERROROUT: 強制失敗を引き起こす変数。
    • これにより rollback が再びトリガーされ、.rbs / .rbf が読み込まれる。
  • Step 8: .rbs を監視

    • ReadDirectoryChangesW で C:\Config.Msi を監視し、新しい .rbs を検知。
    • ファイル名を取得。
  • Step 9: Rollback 前に同期

    • .msi に**カスタム インストール アクション(SyncBeforeRollback)**を含める:
      • .rbs 作成時にイベントをシグナル。
      • その後、待機して継続。
  • Step 10: 弱い ACL を再適用

    • .rbs created イベントを受けた後:
      • Windows Installer が C:\Config.Msi に強い ACLを再適用。
      • しかし WRITE_DAC で開いたハンドルがあるため、弱い ACL を再適用できる。

ACL はハンドルを開く時点でしか強制されないため、フォルダへの書き込みは継続できる。

  • Step 11: 偽の .rbs / .rbf を配置

    • .rbs を偽の rollback スクリプトに上書きし、Windows に次を実行させる:
      • .rbf(悪意 DLL)を特権パスへ復元(例: C:\Program Files\Common Files\microsoft shared\ink\HID.DLL)。
    • 悪意のある SYSTEM レベルの payload DLL を含む偽 .rbf を配置。
  • Step 12: Rollback をトリガー

    • 同期イベントをシグナルし、インストーラを再開。
    • type 19 custom action(ErrorOut) を、既知のタイミングで意図的にインストール失敗させるよう設定。
    • これにより rollback が開始される。
  • Step 13: SYSTEM が DLL をインストール

    • Windows Installer が:
      • 悪意の .rbs を読み込む。
      • .rbf DLL を対象の場所へコピー。
    • SYSTEM が読み込むパスに悪意 DLL が配置される。
  • Final Step: SYSTEM コードを実行

    • 信頼された auto-elevated binary(例: osk.exe)を実行し、ハイジャックした DLL をロード。
    • Boom: SYSTEM としてコードが実行される。

ファイルの削除・移動・改名権限から SYSTEM へ

Section titled “ファイルの削除・移動・改名権限から SYSTEM へ”

前述の MSI rollback 手法はフォルダ全体(例: C:\Config.Msi)を削除できる前提です。では、脆弱性が任意ファイル削除のみを許す場合はどうでしょうか?

NTFS 内部を悪用できます。すべてのフォルダには隠し代替データ ストリームがあり、次の名前を持ちます:

C:\SomeFolder::$INDEX_ALLOCATION

このストリームはフォルダのインデックス メタデータを保存します。

したがって、フォルダの ::$INDEX_ALLOCATION ストリームを削除すると、NTFS はフォルダ全体を削除します。

次のような標準のファイル削除 API を使えます:

DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");

ファイル削除 API を呼んでいても、フォルダ自体が削除されます。

フォルダー内の削除権限から SYSTEM へ

Section titled “フォルダー内の削除権限から SYSTEM へ”

任意のファイル/フォルダ削除はできないが、攻撃者が制御するフォルダの内容を削除できる場合はどうでしょうか?

  1. Step 1: 罠フォルダとファイルを作成
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. Step 2: file1.txt に oplock を設定
  • oplock は特権プロセスが file1.txt を削除しようとすると実行を一時停止します。
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. Step 3: SYSTEM プロセス(例: SilentCleanup)をトリガー
  • このプロセスはフォルダ(例: %TEMP%)をスキャンして内容を削除しようとします。
  • file1.txt に到達すると oplock が発動し、コールバックに制御が戻ります。
  1. Step 4: oplock コールバック内で削除先をリダイレクト
  • Option A: file1.txt を別の場所へ移動

    • これにより folder1 は空になるが oplock は維持される。
    • file1.txt を直接削除すると oplock が早期解放されるため避ける。
  • Option B: folder1 を junction に変換:

ターミナルウィンドウ
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
  • Option C: \RPC Control に symlink を作成:
ターミナルウィンドウ
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

これはフォルダのメタデータを保存する NTFS 内部ストリームを狙っています。削除するとフォルダが削除されます。

  1. Step 5: oplock を解放
  • SYSTEM プロセスは続行し file1.txt を削除しようとする。
  • しかし junction + symlink により、実際には次を削除している:
C:\Config.Msi::$INDEX_ALLOCATION

結果: C:\Config.Msi は SYSTEM により削除される。

任意のフォルダー作成から永続的な DoS へ

Section titled “任意のフォルダー作成から永続的な DoS へ”

SYSTEM/admin として任意のフォルダを作成できるプリミティブを悪用します(ファイル書き込みや弱い権限設定ができなくても良い)。

重要な Windows ドライバ名でフォルダ(ファイルではない)を作成します。例:

C:\Windows\System32\cng.sys
  • 通常このパスは cng.sys カーネルモード ドライバを指す。
  • 先にフォルダを作成すると、Windows は起動時に実ドライバを読み込めず失敗。
  • Windows は起動時に cng.sys を読み込もうとする。
  • フォルダがあるため実ドライバを解決できず、クラッシュまたは起動停止。
  • フォールバック無しで、外部介入(ブート修復やディスクアクセス)なしに復旧できない。

すでに High Integrity プロセスで動作している場合、SYSTEM への経路は新しいサービスを作成して実行するだけで簡単な場合があります:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

[!TIP] サービス バイナリを作成する際は、それが有効なサービスであること、または必要な処理を十分速く実行することを確認してください。無効なサービスの場合は 20 秒で kill されます。

High Integrity プロセスから AlwaysInstallElevated のレジストリ エントリを有効にし、.msi ラッパーでリバース シェルをインストールできる可能性があります。
該当レジストリ キーと .msi パッケージのインストール方法はこちら。

高整合性と SeImpersonatePrivilege から SYSTEM へ

Section titled “高整合性と SeImpersonatePrivilege から SYSTEM へ”

コードはこちら: https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/seimpersonate-from-high-to-system.html

SeDebugPrivilege と SeImpersonatePrivilege から完全なトークン権限へ

Section titled “SeDebugPrivilege と SeImpersonatePrivilege から完全なトークン権限へ”

これらのトークン権限がある場合(すでに High Integrity プロセスで見つかることが多い)、SeDebug 権限で保護されていないほぼすべてのプロセスを開き、プロセスのトークンをコピーして、そのトークンで任意プロセスを作成できます。
この手法では、通常 すべてのトークン権限を持つ SYSTEM プロセスを対象に選びます(すべてのトークン権限を持たない SYSTEM プロセスも存在します)。
実装例はこちら: https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.html

この手法は meterpreter の getsystem に使われます。パイプを作成し、サービスを作成/悪用してパイプへ書き込ませることで、SeImpersonate 権限を持つサーバーがパイプ クライアント(サービス)のトークンを impersonateし、SYSTEM 権限を取得します。
name pipes の詳細はこちら: Named Pipe Client Impersonation。
High Integrity から System へ移行する例はこちら: https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/from-high-integrity-to-system-with-name-pipes.html

SYSTEM で動作するプロセスが読み込む DLLをハイジャックできれば、その権限で任意コードを実行できます。したがって DLL Hijacking はこの種の特権昇格に有用であり、さらに High Integrity プロセスでは DLL 読み込みフォルダに書き込み権限があるためより容易です。
詳細はこちら: https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dll-hijacking/index.html

Administrator または Network Service から SYSTEM へ

Section titled “Administrator または Network Service から SYSTEM へ”

LOCAL SERVICE / NETWORK SERVICE から権限を広げる

Section titled “LOCAL SERVICE / NETWORK SERVICE から権限を広げる”

Read: https://github.com/itm4n/FullPowers