Windows サービスによる権限昇格のメモ。
使用しているアカウントがローカルマシンに対して管理者権限を有している場合、ユーザーは任意のファイルをWindows サービスに登録することにより、そのファイルを昇格された権限で実行することができる。
「任意のファイル」と言ったものの、DLLやEXEをサービスに登録して実行するにはファイルがサービス・アプリケーションとして作成されていなければならない。具体的にはWindows Service APIを通してサービスがファイルとやり取りできるように設計されていなければならない。
以下、検証の結果。
コマンドプロンプトを管理者権限で実行して、以下のコマンドでNotepadを実行するWindows サービス Privilege Escalation Test
を作成する。
sc create priv_escalation_test type= own start= auto binpath= "%Systemroot%\System32\notepad.exe" displayname= "Privilege Escalation Test"
C:\Windows\system32>sc create priv_escalation_test type= own start= auto binpath
= "%Systemroot%\System32\notepad.exe" displayname= "Privilege Escalation Test"
[SC] CreateService SUCCESS
上述したようにNotepadはサービス・アプリケーションとして設計されていないので、この Windows サービスの実行は最終的に失敗するのだが、Notepadのプロセスが昇格された権限で生成されている様子は確認できるので、検証には差し支えないものとする。
以下のコマンドでサービスが登録されたことを確認する。
sc query priv_escalation_test
C:\Windows\system32>sc query priv_escalation_test
SERVICE_NAME: priv_escalation_test
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
また、HKLM\System\CurrentControlSet\services
のレジストリキーも確認しておく。
以下のコマンドでサービスを実行する。
sc start priv_escalation_test
サービスの実行直後にProcess Explorerを確認するとサービス・プロセスのservices.exe
(PID: 444)によってNotepadのプロセスnotepad.exe
(PID: 2336)が NT AUTHORITY\SYSTEM
の権限で生成されたことが確認できた。
Process Explorerの見方についてはこちら。
こちらで言及されているが、NT AUTHORITY\SYSTEM
はLocalSystem
に属するアカウントで、ローカルマシンに対して高度な権限を有している。
先述したようにNotepadはサービス・アプリケーションとして設計されていないので、Notepadのウィンドウは立ち上がらず、十数秒ほどするとNotepadのプロセスは終了し、サービスの実行が失敗した旨のエラー・メッセージが表示されたが、もしファイルをサービス・アプリケーションとして設計すれば Windows サービスに登録して実行するだけで、ファイルを昇格された権限で実行することができる。
ちなみにCobalt Strikeのelevate svc-exeはこのWindows サービスの性質を利用してペイロードを昇格された権限で実行する。
また、Windows サービスを利用した権限昇格には他にUnquoted Service Pathという手法がある。HKLM\System\CurrentControlSet\services
が参照しているプログラムへのパスが空白を含んでおり、かつパスがクォーテーションで囲われていない場合 (C:\unsafe path with space\program.exe
vs. "C:\safe path with space\program.exe"
)、本来サービスが実行するべきファイルとは別のファイルを実行させることができる。
例えばHKLM\System\CurrentControlSet\services\unsafe
がC:\program files\myapp.exe
というファイルを参照しており、ファイルへのパスがクォーテーションで囲われていなかったとする。もし、この時システムにC:\program.exe
というファイルが存在していた場合、Windows サービス unsafe
はC:\program files\myapp.exe
ではなくC:\program.exe
を実行する。
詳しくはこちら。