【Windowsローカル権限昇格編】サービス・レジストリ・MSIを巡る攻防|CTF思考フレームワーク P03
こんにちは、アンペンです!権限昇格ルートP03はWindowsローカル権限昇格編。Linuxとは作法ががらりと変わり、サービスの設定ミス・レジストリ・MSIといったWindows特有の入口を扱います。目標は『一般ユーザーからSYSTEM』。攻撃の理屈と、管理者としての守り方をセットで学びましょう。
Linuxの権限昇格を学んだあとだと、Windowsは『勝手が違って難しそう』に感じるかもしれません。でも、安心してください。狙う頂点が root から SYSTEM に変わり、見る場所がサービスやレジストリに変わるだけ。根っこの発想は前回までと同じ『列挙して、設定の隙を探す』です。土地が変われば地図の見方は変わりますが、宝探しのやり方そのものは変わらない——そんな気楽さで読み進めてください。

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

そう、最強権限がSYSTEMなんだ。狙う場所も違って、Windowsはサービス・レジストリ・MSIの設定の甘さを突く。たとえば引用符なしサービスパスや書き換え可能なサービス。発想はLinuxと同じ『列挙が9割』。WinPEASやPowerUpで隙間を洗い出すよ。
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の役割
- 守る側の「設定の甘さを消す」チェックリスト
📖 はじめての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)のcpassword・cmdkey /listの保存資格情報・メモリ上の資格情報 - ④トークンの悪用:
SeImpersonate権限などを使ったトークン昇格(詳細は次回P04) - ⑤未パッチの脆弱性:PrintNightmare等の既知のローカル昇格脆弱性
ベクターは5つありますが、共通するのは『列挙が9割』という、Linuxと同じ大原則です。違うのは“どこを見るか”だけ。Linuxがsudoやcronを見たように、Windowsではサービス・レジストリ・保存された資格情報を見る。だから道具も、LinPEASがWinPEASに変わるだけで、やることは同じ——『隅々まで観察して、設定の甘い場所を見つける』なんです。

ここで覚える用語:引用符なしサービスパス(Unquoted Service Path)
意味:サービスの実行ファイルパスにスペースが含まれ、引用符で囲まれていないと、Windowsはパスを空白で区切って先頭から順に実行を試みます。途中に書込み可能な場所があると、そこに置いた実行ファイルが先に動いてしまいます。
例:C:\Program Files\My Service\svc.exeが引用符なし→WindowsはまずC:\Program.exeを探す→そこが書込み可能なら、攻撃者のProgram.exeがSYSTEM権限で実行される。
使いどころ:守る側はサービスパスを必ず引用符で囲み、上位ディレクトリへの書込み権限を厳格化します。
なぜ「設定の甘さ」が突かれるのか
引用符なしサービスパスは、住所が曖昧な配達伝票のようなものです。伝票に「東京都港区 山田ビル」と空白入りで書くと、配達員は几帳面に「まず『東京都港区』という宛先はないか?」と手前から確認していきます。もしそこに攻撃者が用意したニセの受取先(=書込み可能な場所のニセ実行ファイル)があれば、本来の山田ビルに届く前に、大事な荷物(=SYSTEM権限)がそちらへ渡ってしまう。Windowsの権限昇格は、こうした『設定の几帳面さの隙』を突きます。だから守る側は、宛先を引用符でカッチリ囲んで曖昧さを消し、途中の受取先(ディレクトリ)に勝手な物を置けないようにするのです。

AlwaysInstallElevated:MSIがSYSTEMで走る設定
サービスと並んで頻出なのがAlwaysInstallElevatedというグループポリシー設定です。これが有効だと、一般ユーザーが用意したインストーラ(MSI)がSYSTEM権限で実行されてしまいます。なぜ既定で無効なのか、有効化が危険なのかを理解しましょう。
なぜこの設定が既定でオフなのか。それは、有効にした瞬間に『一般ユーザーが、SYSTEM権限でなんでもインストールできる』という、とんでもない状態になるからです。本来インストールは管理者の仕事。それを“誰でもできる”ようにするのは、玄関の鍵を全員に配るようなもの。たまに『社員が自分でソフトを入れられて便利だから』と有効化する組織がありますが、その利便性は、重大な昇格経路と引き換えなんです。
ここで覚える用語:AlwaysInstallElevatedとMSI
意味:MSIはWindowsのインストーラパッケージ形式。AlwaysInstallElevatedはグループポリシー設定で、有効にすると一般ユーザーでもMSIをSYSTEM権限でインストールできるようになります。
例:レジストリのHKLMとHKCU両方でAlwaysInstallElevated=1→攻撃者が作った悪意あるMSIをmsiexecで実行→SYSTEM権限でコードが走る。
使いどころ:この設定は既定で無効です。利便性のために有効化すると重大な昇格経路になるため、守る側は絶対に有効化しないのが鉄則です。
CTFでやってみよう:自分のWindows VMで隙間を洗う
「Windows特有の設定の甘さ」を列挙して、修正まで体験する
対象は必ず自分で構築したWindows VMかCTFです。攻撃者がSYSTEMを狙う順で、自分の環境の隙間を点検し、最後に塞ぎます。各ステップに「なぜやるか」を添えました。
whoami /privとwhoami /groupsで権限を確認 → なぜ:出発点と保有権限を知るためWinPEAS/PowerUpで自動列挙 → なぜ:隙間を広く検出するため- 引用符なしサービスパスを
wmic service/sc qcで確認 → なぜ:サービスの隙を探すため accesschkで書込み可能なサービス・ディレクトリを確認 → なぜ:置換可能かを判定するためAlwaysInstallElevatedレジストリを確認 → なぜ:MSI昇格の可否を見るため- 保存資格情報(
cmdkey /list)やunattend.xmlを探す → なぜ:認証情報の置き忘れを見るため autorunsで自動起動項目の書込み可否を確認 → なぜ:永続化&昇格の余地を見るため- 見つけた経路を修正(引用符付与・権限是正・ポリシー無効化) → なぜ:守りを手で確認するため
では守り方。ここまでの攻撃はどれも『設定のちょっとした甘さ』が原因でした。だから守りも、派手な対策ではなく“甘さを一つずつ締める”作業になります。サービスのパスを引用符で囲む、危ない設定をオフにする、資格情報を残さない——次のチェックリストは、その“締め直し”を漏れなくやるための一覧です。
守る側:設定の甘さを消す
- サービスパスを引用符で囲む:Unquoted Service Pathを解消する
- サービス/ディレクトリ権限を厳格化:一般ユーザーに書込み・変更を与えない(
accesschkで確認) - AlwaysInstallElevatedを無効化:MSIのSYSTEM実行経路を塞ぐ
- 認証情報を残さない:
unattend.xml・GPPのcpassword・保存資格情報を掃除する - サービス実行アカウントを最小権限に:不要なLocalSystem運用を避ける
- LAPSでローカル管理者を管理:端末ごとにパスワードを自動ローテーション
- パッチ適用:PrintNightmare等の既知ローカル昇格脆弱性を塞ぐ
- 定期的に自己点検:WinPEAS/PowerUp相当の検査を運用に組み込む


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バイパスの発想を、守りの視点で掘り下げます。
