Windows サービスによる権限昇格のメモ

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\SYSTEMLocalSystemに属するアカウントで、ローカルマシンに対して高度な権限を有している。

先述したように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\unsafeC:\program files\myapp.exeというファイルを参照しており、ファイルへのパスがクォーテーションで囲われていなかったとする。もし、この時システムにC:\program.exeというファイルが存在していた場合、Windows サービス unsafeC:\program files\myapp.exeではなくC:\program.exeを実行する。
詳しくはこちら

Leave a Reply

Your email address will not be published.