ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

getsystemの中身

※こちらの記事は2021年1月12日公開note版「ラック・セキュリティごった煮ブログ」に一部加筆した内容です

デジタルペンテスト部の北原です。ここ数年で日本国内でも情報セキュリティに対する関心が高まり、日本語のセキュリティ技術書が増え、サイバー攻撃手法の勉強がやりやすくなりました。趣味でやる分には、自分で作成した仮想マシンに対して、特に深いことを考えずに攻撃検証ツールを実行しても問題は少ないですが、いざ実務ともなるとそうはいかないことが増えます。例えば、仕事で顧客に対してペネトレーションテストをやる際に、性質を理解せずにDoS攻撃につながる脆弱性を検証してしまい、顧客のネットワークやシステムを不能にして経済的な損失を発生させてしまっていてはただでは済みません。勉強した手法を実務で使う際にそうした事態を防ぐためにも、攻撃検証ツールが何をやっているのかを理解しておくことはとても大切でしょう。
前置きが長くなりましたが、実務でセキュリティをやりたい人や専門書に書いてある以上の知識が欲しい人に向けて、今回はMicrosoft Windows OSで管理者権限アカウントからSYSTEM権限を利用する手法について解説します。攻撃検証ツールとして有名なMetasploitを使った経験がある人は、Metasploitの一部であるMeterpretergetsystemコマンドでSYSTEM権限への昇格を試した経験があるでしょう。Metasploitのgetsystemには複数の手法が実装されていますが、その中の1つとしてNamed Pipe(名前付きパイプ)を用いた手法が実装されています。今回はこのNamed Pipeを用いた手法に焦点を当てて解説します。

本記事は攻撃者の手法を理解して防御や攻撃検知に役立てるために記述しています。当然ですが悪用は厳禁です。

SYSTEM権限

SYSTEM権限アカウントMicrosoft Windows OSにおける管理者権限アカウントであり、アカウント名はNT AUTHORITY\SYSTEMです。Microsoft Windows OSが内部的に利用するアカウントであり、User Managerによっては管理されず、ユーザグループに追加することはできません。主にサービスの起動などに用いられています。通常の管理者権限アカウントとは異なり、ファイルシステムへのフルアクセス権限などの高い権限が割り当てられているため、Microsoft Windowsのシステムへの侵入に成功した攻撃者が管理者権限への昇格に成功した際に、SYSTEM権限の悪用を試みる場合があります。

Metasploitに実装されている手法

2024年2月時点でMetasploitのgetsystemコマンドに実装されているSYSTEM権限取得の手法は、大きく分けると以下の3種類です。

・Named Pipeを利用する手法
・SYSTEM権限で実行されているプロセスからアクセストークンを複製して利用する手法
・NTLM認証を利用する手法

本記事では、Named Pipeを用いてSYSTEM権限を利用する手法について解説します。

Named Pipe Impersonation

Named Pipeは、システムにおいてプロセス間通信に用いられる手法です。Microsoft Windows OSでは、サーバがNamed Pipeを作成し、作成されたNamed Pipeのハンドルにクライアントが接続することで、Named Pipeによる通信が実現されます。
Microsoft Windows OSでは、Named Pipeを作成したサーバが、Named Pipeに接続したクライアントの権限を借用する機能があります。advapi32.dllに実装されているImpersonateNamedPipeClientというWindows API関数を用いることにより、サーバプログラムはNamed Pipeに接続してきたクライアントの権限を借用することが可能です。Named Pipe Impersonationはその機能を利用して、管理者権限アカウントからSYSTEM権限アカウントを利用する手法であり、手順として箇条書きすると以下の通りです。

  1. サーバプログラムはNamed Pipeを作成。作成したNamed Pipeに接続し、クライアントからの接続が来るまで待機
  2. SYSTEM権限で起動されているクライアントから、サーバプログラムが作成したNamed Pipeに接続
  3. サーバプログラムはImpersonateNamedPipeClientの実行により、Named Pipeに接続したクライアントからSYSTEM権限を借用

以上の手順を図示したものが以下の図です。

以上の手法は Named Pipe Impersonation と呼ばれています。

SeImpersonatePrivilege

Named Pipe Impersonationを実行するには、SeImpersonatePrivilegeという権限が必要になります。SeImpersonatePrivilegeはサーバがクライアントの権限を借用することを許可する権限です。この権限は主に管理者権限のプロセスに割り当てられています。cmd.exeなどでは whoami /priv と実行すると、起動中のcmd.exeに割り当てられている権限を確認できます。

C:\Windows\system32>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                            Description                                                        State
========================================= ================================================================== ========
SeIncreaseQuotaPrivilege                  Adjust memory quotas for a process                                 Disabled
SeSecurityPrivilege                       Manage auditing and security log                                   Disabled
SeTakeOwnershipPrivilege                  Take ownership of files or other objects                           Disabled
SeLoadDriverPrivilege                     Load and unload device drivers                                     Disabled
SeSystemProfilePrivilege                  Profile system performance                                         Disabled
SeSystemtimePrivilege                     Change the system time                                             Disabled
SeProfileSingleProcessPrivilege           Profile single process                                             Disabled
SeIncreaseBasePriorityPrivilege           Increase scheduling priority                                       Disabled
SeCreatePagefilePrivilege                 Create a pagefile                                                  Disabled
SeBackupPrivilege                         Back up files and directories                                      Disabled
SeRestorePrivilege                        Restore files and directories                                      Disabled
SeShutdownPrivilege                       Shut down the system                                               Disabled
SeDebugPrivilege                          Debug programs                                                     Disabled
SeSystemEnvironmentPrivilege              Modify firmware environment values                                 Disabled
SeChangeNotifyPrivilege                   Bypass traverse checking                                           Enabled
SeRemoteShutdownPrivilege                 Force shutdown from a remote system                                Disabled
SeUndockPrivilege                         Remove computer from docking station                               Disabled
SeManageVolumePrivilege                   Perform volume maintenance tasks                                   Disabled
SeImpersonatePrivilege                    Impersonate a client after authentication                          Enabled
SeCreateGlobalPrivilege                   Create global objects                                              Enabled
SeIncreaseWorkingSetPrivilege             Increase a process working set                                     Disabled
SeTimeZonePrivilege                       Change the time zone                                               Disabled
SeCreateSymbolicLinkPrivilege             Create symbolic links                                              Disabled
SeDelegateSessionUserImpersonatePrivilege Obtain an impersonation token for another user in the same session Disabled

C:\Windows\system32>

実験

雑ではありますが、Named Pipe Impersonationを実験するために、以下のPowerShellスクリプト(NamedPipeTest.ps1)を作成しました。悪用を防ぐために、スクリプトには原理を理解するために必要な最低限の機能しか持たせておらず、そのまま攻撃には使えないように配慮しています。

NamedPipeTest.ps1
https://gist.github.com/rnkgm/ef40b20691d7ab22220e4fe487e42264

コメントアウトとして、スクリプト中に大まかな手順を記載しています。多くの部分は、PowerShellで作成された攻撃検証スクリプト集であるPowerSploitGet-System.ps1のコードを再利用しています。興味がある人は、Get-System.ps1のソースコードを読むと、管理者権限アカウントからSYSTEM権限を利用する手法への理解が深まるでしょう。

実験手順1: Named Pipeの作成と起動

まずは管理者権限でcmd.exeを起動しましょう。cd コマンドで実験用のPowerShellスクリプト(NamedPipeTest.ps1)が配置されているパスに移動し、以下のコマンドによりNamedPipeTest.ps1を実行します。

C:\Users\admin\Desktop>powershell -exec bypass .\NamedPipeTest.ps1
[>] Running as admin
[>] Named Pipe @ \\.\pipe\PipeSVC
[>] Waiting for pipe connection.

実行すると \\.\pipe\PipeSVC というパスにNamed Pipeが作成され、データの待ち受け状態に入ります。別ウインドウでpowershell.exeを起動して Get-ChildItem コマンドレットを実行すると \\.\pipe\PipeSVC の存在を確認できます。

PS C:\Users\admin> Get-ChildItem \\.\pipe\

...

   Directory: \\.\pipe
   

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------         1/1/1601   9:00 AM              1 PSHost.132494464218479575.2964.DefaultAppDomain.powershell
------         1/1/1601   9:00 AM              1 AppContracts_x027E5D88-1E25-4136-BCE7-0C08BB00E0F5y
------         1/1/1601   9:00 AM              1 AppContracts_x19C4B32A-0560-4B3D-AF09-D637091849D4y
------         1/1/1601   9:00 AM              1 PSHost.132494492176015064.4188.DefaultAppDomain.powershell
------         1/1/1601   9:00 AM              1 PipeSVC

この際にGet-ChildItem \\.\pipe\PipeSVC とNamed Pipeのパスを直接指定すると \\.\pipe\PipeSVC にデータが送信されてしまい、Named Pipeが終了して存在確認ができないため、注意してください。

実験手順2: SYSTEM権限でのデータ送信

原理を理解しやすくするため、本記事ではMicrosoft Windows OSの管理者用トラブルシュートツール集であるSysinternals SuitePsExecを用いてSYSTEM権限アカウント(NT AUTHORITY\SYSTEM)の権限で動作するcmd.exeを起動します。PsExecでは -S オプションを指定することによりSYSTEM権限でのコマンド実行が可能です。別ウインドウでcmd.exeを起動して、以下のコマンドを実行しましょう。

C:\Users\admin\Desktop>PsExec64.exe -accepteula -S \\127.0.0.1 cmd.exe

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Microsoft Windows [Version 10.0.18362.30]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami /user

USER INFORMATION
----------------

User Name           SID
=================== ========
nt authority\system S-1-5-18

C:\Windows\system32>

続けて、PsExec(PsExec64.exe)で起動したcmd.exeからNamedPipeTest.ps1により作成された \\.\pipe\PipeSVC にデータを送信します。何かしらのデータを送信すればいいので、送信するデータはなんでも良いですが、本記事では「hi」にしておきます。Named Pipeに対するデータ送信は echo コマンドでNamed Pipeのパスにリダイレクトするだけで可能です。

C:\Windows\system32>echo hi > \\.\pipe\PipeSVC

C:\Windows\system32>

実験手順3: 結果確認

実験用のスクリプトNamedPipeTest.ps1を実行しているcmd.exeの出力を確認してみましょう。Named Pipe Impersonationに成功している場合は、以下のように [>] Running as SYSTEM と表示され、SYSTEM権限の借用に成功していることが確認できます。

C:\Users\admin\Desktop>powershell -exec bypass .\NamedPipeTest.ps1
[>] Running as admin
[>] Named Pipe @ \\.\pipe\PipeSVC
[>] Waiting for pipe connection.
[+] Impersonation is successful.
[>] Running as SYSTEM

C:\Users\admin\Desktop>

実際の手法と検知

本記事ではSYSTEM権限を利用するためにPsExecを利用しましたが、実際のツールでは別の手法を用いてSYSTEM権限でのコマンド実行をしています(そもそもPsExecがSYSTEM権限を借用する際にもNamed Pipeを利用しています)。管理者権限アカウントがSYSTEM権限のコマンドを発行するにはいくつかの手法がありますが、PowerSploitのGet-System.ps1などでは以下のように、作成したNamed Pipeにデータをリダイレクトするコマンドを設定したサービスを起動することにより、Named Pipe ImpersonationによるSYSTEM権限の取得をしています。

C:\Windows\system32>sc qc TestSVC
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: TestSVC
       TYPE               : 10  WIN32_OWN_PROCESS
       START_TYPE         : 3   DEMAND_START
       ERROR_CONTROL      : 1   NORMAL
       BINARY_PATH_NAME   : C:\Windows\system32\cmd.exe /C start C:\Windows\system32\cmd.exe /C "timeout /t 3 >nul&&echo TestSVC > \\.\pipe\TestSVC"
       LOAD_ORDER_GROUP   :
       TAG                : 0
       DISPLAY_NAME       : TestSVC
       DEPENDENCIES       :
       SERVICE_START_NAME : LocalSystem
       
C:\Windows\system32>

管理者権限であれば、スケジュールタスクやサービスを登録してSYSTEM権限でコマンドを発行させることが可能であるため、こうしたツールではサービスの登録によるSYSTEM権限でのコマンド発行が用いられます。よって、Named Pipe Impersonationが悪用されてしまった場合には、こうしたコマンドを含むスケジュールタスクやサービスなどが登録された痕跡が残ります。Named PipeによるSYSTEM権限の悪用の検知に関しては、以下の記事が参考になるでしょう。
securityintelligence.com

まとめ

今回はNamed Pipe Impersonationにより、管理者権限アカウントからSYSTEM権限アカウントを利用する手法の原理について解説しました。手法の詳細の理解により、ペネトレーションテストをする立場の技術者はより安全にペネトレーションテストを実施できますし、システムやネットワークを守る立場の人は攻撃の検知や痕跡の調査を効率的にできるようになります。本記事がセキュリティ対策の一助になれば幸いです。