PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【Windowsローカル権限昇格編】サービス・レジストリ・MSIを巡る攻防|CTF思考フレームワーク P03

かも次郎とアンペンが「Windows権限昇格」を解説するマスコットイラスト
安全に生きたい編集部

こんにちは、アンペンです!権限昇格ルートP03はWindowsローカル権限昇格編。Linuxとは作法ががらりと変わり、サービスの設定ミス・レジストリ・MSIといったWindows特有の入口を扱います。目標は『一般ユーザーからSYSTEM』。攻撃の理屈と、管理者としての守り方をセットで学びましょう。

Linuxの権限昇格を学んだあとだと、Windowsは『勝手が違って難しそう』に感じるかもしれません。でも、安心してください。狙う頂点が root から SYSTEM に変わり、見る場所がサービスやレジストリに変わるだけ。根っこの発想は前回までと同じ『列挙して、設定の隙を探す』です。土地が変われば地図の見方は変わりますが、宝探しのやり方そのものは変わらない——そんな気楽さで読み進めてください。

Windowsだとrootじゃなくて『SYSTEM』を狙うの?Linuxと何が違うの?

そう、最強権限がSYSTEMなんだ。狙う場所も違って、Windowsはサービス・レジストリ・MSIの設定の甘さを突く。たとえば引用符なしサービスパス書き換え可能なサービス。発想はLinuxと同じ『列挙が9割』。WinPEASPowerUpで隙間を洗い出すよ。

まず結論

Windowsローカル権限昇格とは「一般ユーザーから最強権限SYSTEM(またはAdministrator)を得ること」。狙うのはWindows特有の3系統——①サービスの設定ミス(引用符なしパス・弱い権限・DLLハイジャック)②レジストリ(AlwaysInstallElevated・autoruns)③保存された認証情報(unattend.xml・GPP・cmdkey)。発想はLinuxと同じく列挙が9割で、WinPEAS/PowerUp/accesschkが定番。守る側は『サービスパスを引用符で囲む+サービス/ディレクトリ権限を厳格化+AlwaysInstallElevatedを無効化+認証情報を残さない+LAPSとパッチ』

この記事で分かること

  • WindowsとLinuxで権限昇格の作法がどう違うか
  • Windows特有の攻撃面3系統(サービス/レジストリ/認証情報)
  • 引用符なしサービスパスとAlwaysInstallElevatedの仕組み
  • WinPEAS/PowerUp/accesschkの役割
  • 守る側の「設定の甘さを消す」チェックリスト
難易度:中級 所要時間:13分 体験:自分のWindows VM・CTFのみ おすすめ:P02の後

📖 はじめてのWebセキュリティP03|Windowsローカル権限昇格編
サービス・レジストリ・MSIの隙を読み、SYSTEMへの道を塞ぐ。 シリーズ一覧を見る →

⚠️ 大事なお約束
権限昇格は侵入後の手法です。他人のPCやサーバで試すのは不正アクセス禁止法に直結します。本記事の手順は自分で構築したWindows VM・CTF・書面で許可された検証環境に限定してください。本記事の目的は管理者・防御側の理解です。「できる」と「やってよい」は全く別です。

Windows特有の攻撃面:3系統

  • ①サービスの設定ミス:引用符なしサービスパス(Unquoted Service Path)、書き換え可能なサービスバイナリ/設定DLLハイジャック。多くのサービスがSYSTEMで動くため昇格に直結
  • ②レジストリ:AlwaysInstallElevated(MSIをSYSTEMでインストール可能に)、書込み可能なautoruns/サービスキー
  • ③保存された認証情報:unattend.xml・Group Policy Preferences(GPP)のcpasswordcmdkey /listの保存資格情報・メモリ上の資格情報
  • ④トークンの悪用:SeImpersonate権限などを使ったトークン昇格(詳細は次回P04)
  • ⑤未パッチの脆弱性:PrintNightmare等の既知のローカル昇格脆弱性

ベクターは5つありますが、共通するのは『列挙が9割』という、Linuxと同じ大原則です。違うのは“どこを見るか”だけ。Linuxがsudoやcronを見たように、Windowsではサービス・レジストリ・保存された資格情報を見る。だから道具も、LinPEASがWinPEASに変わるだけで、やることは同じ——『隅々まで観察して、設定の甘い場所を見つける』なんです。

サービス設定ミス・レジストリ・認証情報・トークン・未パッチの5ベクターを階段で示すWindows権限昇格の図
図1:一般ユーザーからSYSTEMへ上がる特有の攻撃面

ここで覚える用語:引用符なしサービスパス(Unquoted Service Path)
意味:サービスの実行ファイルパスにスペースが含まれ、引用符で囲まれていないと、Windowsはパスを空白で区切って先頭から順に実行を試みます。途中に書込み可能な場所があると、そこに置いた実行ファイルが先に動いてしまいます。
例:C:\Program Files\My Service\svc.exeが引用符なし→WindowsはまずC:\Program.exeを探す→そこが書込み可能なら、攻撃者のProgram.exeSYSTEM権限で実行される。
使いどころ:守る側はサービスパスを必ず引用符で囲み、上位ディレクトリへの書込み権限を厳格化します。

なぜ「設定の甘さ」が突かれるのか

📦 たとえるなら、住所表記が曖昧な配達伝票

引用符なしサービスパスは、住所が曖昧な配達伝票のようなものです。伝票に「東京都港区 山田ビル」と空白入りで書くと、配達員は几帳面に「まず『東京都港区』という宛先はないか?」と手前から確認していきます。もしそこに攻撃者が用意したニセの受取先(=書込み可能な場所のニセ実行ファイル)があれば、本来の山田ビルに届く前に、大事な荷物(=SYSTEM権限)がそちらへ渡ってしまう。Windowsの権限昇格は、こうした『設定の几帳面さの隙』を突きます。だから守る側は、宛先を引用符でカッチリ囲んで曖昧さを消し、途中の受取先(ディレクトリ)に勝手な物を置けないようにするのです。

空白入りの曖昧な住所で配達員が手前のニセ宛先に荷物を届ける引用符なしサービスパスのたとえ図
図2:住所が曖昧だと手前のニセ宛先に届く

AlwaysInstallElevated:MSIがSYSTEMで走る設定

サービスと並んで頻出なのがAlwaysInstallElevatedというグループポリシー設定です。これが有効だと、一般ユーザーが用意したインストーラ(MSI)がSYSTEM権限で実行されてしまいます。なぜ既定で無効なのか、有効化が危険なのかを理解しましょう。

なぜこの設定が既定でオフなのか。それは、有効にした瞬間に『一般ユーザーが、SYSTEM権限でなんでもインストールできる』という、とんでもない状態になるからです。本来インストールは管理者の仕事。それを“誰でもできる”ようにするのは、玄関の鍵を全員に配るようなもの。たまに『社員が自分でソフトを入れられて便利だから』と有効化する組織がありますが、その利便性は、重大な昇格経路と引き換えなんです。

ここで覚える用語:AlwaysInstallElevatedとMSI
意味:MSIはWindowsのインストーラパッケージ形式。AlwaysInstallElevatedはグループポリシー設定で、有効にすると一般ユーザーでもMSIをSYSTEM権限でインストールできるようになります。
例:レジストリのHKLMHKCU両方でAlwaysInstallElevated=1→攻撃者が作った悪意あるMSIをmsiexecで実行→SYSTEM権限でコードが走る
使いどころ:この設定は既定で無効です。利便性のために有効化すると重大な昇格経路になるため、守る側は絶対に有効化しないのが鉄則です。

CTFでやってみよう:自分のWindows VMで隙間を洗う

やってみよう / 自分のWindows VM・CTFのみ

「Windows特有の設定の甘さ」を列挙して、修正まで体験する

対象は必ず自分で構築したWindows VMかCTFです。攻撃者がSYSTEMを狙う順で、自分の環境の隙間を点検し、最後に塞ぎます。各ステップに「なぜやるか」を添えました。

  1. whoami /privwhoami /groupsで権限を確認 → なぜ:出発点と保有権限を知るため
  2. WinPEAS/PowerUpで自動列挙 → なぜ:隙間を広く検出するため
  3. 引用符なしサービスパスをwmic service/sc qcで確認 → なぜ:サービスの隙を探すため
  4. accesschkで書込み可能なサービス・ディレクトリを確認 → なぜ:置換可能かを判定するため
  5. AlwaysInstallElevatedレジストリを確認 → なぜ:MSI昇格の可否を見るため
  6. 保存資格情報(cmdkey /list)やunattend.xmlを探す → なぜ:認証情報の置き忘れを見るため
  7. autorunsで自動起動項目の書込み可否を確認 → なぜ:永続化&昇格の余地を見るため
  8. 見つけた経路を修正(引用符付与・権限是正・ポリシー無効化) → なぜ:守りを手で確認するため
対象は必ず自分のWindows VM・CTFのみ。他人のPCでの試行は不正アクセスです。「できる」と「やってよい」は別です。

では守り方。ここまでの攻撃はどれも『設定のちょっとした甘さ』が原因でした。だから守りも、派手な対策ではなく“甘さを一つずつ締める”作業になります。サービスのパスを引用符で囲む、危ない設定をオフにする、資格情報を残さない——次のチェックリストは、その“締め直し”を漏れなくやるための一覧です。

守る側:設定の甘さを消す

Windowsローカル権限昇格対策チェックリスト
  • サービスパスを引用符で囲む:Unquoted Service Pathを解消する
  • サービス/ディレクトリ権限を厳格化:一般ユーザーに書込み・変更を与えない(accesschkで確認)
  • AlwaysInstallElevatedを無効化:MSIのSYSTEM実行経路を塞ぐ
  • 認証情報を残さない:unattend.xml・GPPのcpassword・保存資格情報を掃除する
  • サービス実行アカウントを最小権限に:不要なLocalSystem運用を避ける
  • LAPSでローカル管理者を管理:端末ごとにパスワードを自動ローテーション
  • パッチ適用:PrintNightmare等の既知ローカル昇格脆弱性を塞ぐ
  • 定期的に自己点検:WinPEAS/PowerUp相当の検査を運用に組み込む
引用符付与・権限厳格化・ポリシー無効化・認証情報排除・LAPSとパッチの守り側チェックリスト図
図3:設定の甘さを消す守り側チェックリスト

Linuxと狙う場所は違っても『列挙して設定の隙を探す』のは同じなんだね。伝票はカッチリ書く、覚えたよ!

その通り!次はP04、Windows Token・UAC編。今回ちらっと出たトークンの悪用(SeImpersonate等)と、UACバイパスの発想を掘り下げる。SYSTEMへの最後のひと押しを、守りの視点で読み解くよ。

まとめ:Windowsは『設定の几帳面さの隙』を突かれる

今回のポイント
  • Windowsの目標は最強権限SYSTEM。発想はLinux同様列挙が9割
  • 攻撃面はサービス・レジストリ・認証情報の3系統
  • 引用符なしサービスパスAlwaysInstallElevatedが典型
  • 列挙はWinPEAS/PowerUp/accesschkが定番
  • 守りは引用符・権限厳格化・ポリシー無効化・認証情報排除・LAPS・パッチ

今日の持ち帰りは『土地は違っても、宝探しのやり方は同じ』。WindowsもLinuxも、攻撃者は“列挙して設定の隙を探す”、守る側は“その隙を残さない”。OSが変わるたびに身構えず、『見る場所が変わるだけ』と捉えれば、新しい環境も怖くありません。次回はいよいよ、SYSTEMへの最後のひと押し——トークンとUACの世界です。

次はP04、Windows Token・UAC編。トークンの悪用とUACバイパスの発想を、守りの視点で掘り下げます。

次に読みたい記事

参考資料

記事URLをコピーしました