※こちらの記事は2021年1月12日公開note版「ラック・セキュリティごった煮ブログ」に一部加筆した内容です
デジタルペンテスト部の北原です。ここ数年で日本国内でも情報セキュリティに対する関心が高まり、日本語のセキュリティ技術書が増え、サイバー攻撃手法の勉強がやりやすくなりました。趣味でやる分には、自分で作成した仮想マシンに対して、特に深いことを考えずに攻撃検証ツールを実行しても問題は少ないですが、いざ実務ともなるとそうはいかないことが増えます。例えば、仕事で顧客に対してペネトレーションテストをやる際に、性質を理解せずにDoS攻撃につながる脆弱性を検証してしまい、顧客のネットワークやシステムを不能にして経済的な損失を発生させてしまっていてはただでは済みません。勉強した手法を実務で使う際にそうした事態を防ぐためにも、攻撃検証ツールが何をやっているのかを理解しておくことはとても大切でしょう。
前置きが長くなりましたが、実務でセキュリティをやりたい人や専門書に書いてある以上の知識が欲しい人に向けて、今回はMicrosoft Windows OSで管理者権限アカウントからSYSTEM権限を利用する手法について解説します。攻撃検証ツールとして有名なMetasploitを使った経験がある人は、Metasploitの一部であるMeterpreterのgetsystemコマンドで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権限アカウントを利用する手法であり、手順として箇条書きすると以下の通りです。
- サーバプログラムはNamed Pipeを作成。作成したNamed Pipeに接続し、クライアントからの接続が来るまで待機
- SYSTEM権限で起動されているクライアントから、サーバプログラムが作成したNamed Pipeに接続
- サーバプログラムは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で作成された攻撃検証スクリプト集であるPowerSploitのGet-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 SuiteのPsExecを用いて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権限アカウントを利用する手法の原理について解説しました。手法の詳細の理解により、ペネトレーションテストをする立場の技術者はより安全にペネトレーションテストを実施できますし、システムやネットワークを守る立場の人は攻撃の検知や痕跡の調査を効率的にできるようになります。本記事がセキュリティ対策の一助になれば幸いです。